1 var Utils = require('./utils')
3 function getColorAttrib (color, attrib) {
4 var alpha = color.a / 255
5 var str = attrib + '="' + color.hex + '"'
8 ? str + ' ' + attrib + '-opacity="' + alpha.toFixed(2).slice(1) + '"'
12 function svgCmd (cmd, x, y) {
14 if (typeof y !== 'undefined') str += ' ' + y
19 function qrToPath (data, size, margin) {
25 for (var i = 0; i < data.length; i++) {
26 var col = Math.floor(i % size)
27 var row = Math.floor(i / size)
29 if (!col && !newRow) newRow = true
34 if (!(i > 0 && col > 0 && data[i - 1])) {
36 ? svgCmd('M', col + margin, 0.5 + row + margin)
37 : svgCmd('m', moveBy, 0)
43 if (!(col + 1 < size && data[i + 1])) {
44 path += svgCmd('h', lineLength)
55 exports.render = function render (qrData, options, cb) {
56 var opts = Utils.getOptions(options)
57 var size = qrData.modules.size
58 var data = qrData.modules.data
59 var qrcodesize = size + opts.margin * 2
61 var bg = !opts.color.light.a
63 : '<path ' + getColorAttrib(opts.color.light, 'fill') +
64 ' d="M0 0h' + qrcodesize + 'v' + qrcodesize + 'H0z"/>'
67 '<path ' + getColorAttrib(opts.color.dark, 'stroke') +
68 ' d="' + qrToPath(data, size, opts.margin) + '"/>'
70 var viewBox = 'viewBox="' + '0 0 ' + qrcodesize + ' ' + qrcodesize + '"'
72 var width = !opts.width ? '' : 'width="' + opts.width + '" height="' + opts.width + '" '
74 var svgTag = '<svg xmlns="http://www.w3.org/2000/svg" ' + width + viewBox + ' shape-rendering="crispEdges">' + bg + path + '</svg>\n'
76 if (typeof cb === 'function') {