lean-qr
Version:
minimal QR code generation
2 lines (1 loc) • 1.37 kB
JavaScript
const t="http://www.w3.org/2000/svg",e=/[^-a-zA-Z0-9 .,:/#%()]/g,n=(e,n,o,i=[],r=e.createElementNS(t,n))=>(Object.entries(o).forEach((([t,e])=>r.setAttribute(t,e))),r.replaceChildren(...i),r),o=(t,n,o=[])=>[`<${t}`,...Object.entries(n).map((([t,n])=>` ${t}="${`${n}`.replaceAll(e,"")}"`)),">",...o,`</${t}>`].join(""),i=t=>{const e=new Map,n=[],o=t=>{const n=e.get(t);return e.delete(t),n};for(let i=0;i<=t.size;++i)for(let r=0;r<=t.size;++r){const s=t.get(r,i),a=t.get(r,i-1),c=[t.get(r-1,i)!==s&&r+" "+(i+1),r+" "+i,a!==s&&r+1+" "+i].filter((t=>t));if(c.length>1){s||c.reverse();const t=c.pop(),i=o(c[0])||[],r=o(t);i.push(...c),i===r?n.push(i):(r?r.unshift(...i):e.set(t,i),e.set(i[0],r||i))}}return n.map((t=>`M${t.join("L")}Z`)).join("")},r=(e,{on:n="black",off:o,padX:r=4,padY:s=4,width:a,height:c,scale:l=1},g,h)=>{const d=e.size+2*r,$=e.size+2*s;return g("svg",{xmlns:t,version:"1.1",viewBox:`${-r} ${-s} ${d} ${$}`,width:a??d*l,height:c??$*l,"shape-rendering":"crispedges"},[o?g("rect",{x:-r,y:-s,width:d,height:$,fill:o}):"",g("path",{d:i(e),fill:n})],h)},s=(t,e,o={})=>e.body?r(t,o,n.bind(0,e)):r(t,o,n.bind(0,e.ownerDocument),e),a=(t,e={})=>(e.xmlDeclaration?'<?xml version="1.0" encoding="UTF-8" ?>':"")+r(t,e,o),c=(t,e)=>"data:image/svg+xml;base64,"+btoa(a(t,{xmlDeclaration:1,...e}));export{s as toSvg,c as toSvgDataURL,i as toSvgPath,a as toSvgSource};