exports.renderBits = function renderBits (bits, width, options) { if (typeof bits === 'undefined' || !(bits instanceof Array)) { throw new Error('"bits" must be a valid Array') } if (typeof bits === 'undefined' || isNaN(width)) { throw new Error('"width" must be a valid number') } var dotsize = options.scale || 4 var margin = options.margin || 20 var qrcodesize = width * dotsize + margin * 2 var lightColor = options.lightColor || '#ffffff' var darkColor = options.darkColor || '#000000' var xmlStr = '<?xml version="1.0" encoding="utf-8"?>\n' xmlStr += '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n' xmlStr += '<svg version="1.1" baseProfile="full"' xmlStr += ' width="' + qrcodesize + '" height="' + qrcodesize + '"' xmlStr += ' viewBox="0 0 ' + qrcodesize + ' ' + qrcodesize + '"' xmlStr += ' xmlns="http://www.w3.org/2000/svg"' xmlStr += ' xmlns:xlink="http://www.w3.org/1999/xlink"' xmlStr += ' xmlns:ev="http://www.w3.org/2001/xml-events">\n' xmlStr += '<rect x="0" y="0" width="' + qrcodesize + '" height="' + qrcodesize + '" fill="' + lightColor + '" />\n' xmlStr += '<defs><rect id="p" width="' + dotsize + '" height="' + dotsize + '" /></defs>\n' xmlStr += '<g fill="' + darkColor + '">\n' xmlStr = bits.reduce(function (xml, bit, index) { if (!bit) return xml var x = margin + (index % width) * dotsize var y = margin + Math.floor(index / width) * dotsize xml += '<use x="' + x + '" y="' + y + '" xlink:href="#p" />\n' return xml }, xmlStr) xmlStr += '</g>\n' xmlStr += '</svg>' return xmlStr }