WireguardConfigGen/qr/qr.js

122 lines
2.8 KiB
JavaScript

"use strict";
var Readable = require('stream').Readable;
var QR = require('./qr-base').QR;
var png = require('./png');
var vector = require('./vector');
var fn_noop = function() {};
var BITMAP_OPTIONS = {
parse_url: false,
ec_level: 'M',
size: 5,
margin: 4,
customize: null
};
var VECTOR_OPTIONS = {
parse_url: false,
ec_level: 'M',
margin: 1,
size: 0
};
function get_options(options, force_type) {
if (typeof options === 'string') {
options = { 'ec_level': options }
} else {
options = options || {};
}
var _options = {
type: String(force_type || options.type || 'png').toLowerCase()
};
var defaults = _options.type == 'png' ? BITMAP_OPTIONS : VECTOR_OPTIONS;
for (var k in defaults) {
_options[k] = k in options ? options[k] : defaults[k];
}
return _options;
}
function qr_image(text, options) {
options = get_options(options);
var matrix = QR(text, options.ec_level, options.parse_url);
var stream = new Readable();
stream._read = fn_noop;
switch (options.type) {
case 'svg':
case 'pdf':
case 'eps':
process.nextTick(function() {
vector[options.type](matrix, stream, options.margin, options.size);
});
break;
case 'svgpath':
// deprecated, use svg_object method
process.nextTick(function() {
var obj = vector.svg_object(matrix, options.margin, options.size);
stream.push(obj.path);
stream.push(null);
});
break;
case 'png':
default:
process.nextTick(function() {
var bitmap = png.bitmap(matrix, options.size, options.margin);
if (options.customize) {
options.customize(bitmap);
}
png.png(bitmap, stream);
});
}
return stream;
}
function qr_image_sync(text, options) {
options = get_options(options);
var matrix = QR(text, options.ec_level, options.parse_url);
var stream = [];
var result;
switch (options.type) {
case 'svg':
case 'pdf':
case 'eps':
vector[options.type](matrix, stream, options.margin, options.size);
result = stream.filter(Boolean).join('');
break;
case 'png':
default:
var bitmap = png.bitmap(matrix, options.size, options.margin);
if (options.customize) {
options.customize(bitmap);
}
png.png(bitmap, stream);
result = Buffer.concat(stream.filter(Boolean));
}
return result;
}
function svg_object(text, options) {
options = get_options(options, 'svg');
var matrix = QR(text, options.ec_level);
return vector.svg_object(matrix, options.margin);
}
module.exports = {
matrix: QR,
image: qr_image,
imageSync: qr_image_sync,
svgObject: svg_object
};