101 lines
3.0 KiB
JavaScript
101 lines
3.0 KiB
JavaScript
var QRCode = require('./../vendor/QRCode'),
|
|
QRErrorCorrectLevel = require('./../vendor/QRCode/QRErrorCorrectLevel'),
|
|
black = "\033[40m \033[0m",
|
|
white = "\033[47m \033[0m",
|
|
toCell = function (isBlack) {
|
|
return isBlack ? black : white;
|
|
},
|
|
repeat = function (color) {
|
|
return {
|
|
times: function (count) {
|
|
return new Array(count).join(color);
|
|
}
|
|
};
|
|
},
|
|
fill = function(length, value) {
|
|
var arr = new Array(length);
|
|
for (var i = 0; i < length; i++) {
|
|
arr[i] = value;
|
|
}
|
|
return arr;
|
|
};
|
|
|
|
module.exports = {
|
|
|
|
error: QRErrorCorrectLevel.L,
|
|
|
|
generate: function (input, opts, cb) {
|
|
if (typeof opts === 'function') {
|
|
cb = opts;
|
|
opts = {};
|
|
}
|
|
|
|
var qrcode = new QRCode(-1, this.error);
|
|
qrcode.addData(input);
|
|
qrcode.make();
|
|
|
|
var output = '';
|
|
if (opts && opts.small) {
|
|
var BLACK = true, WHITE = false;
|
|
var moduleCount = qrcode.getModuleCount();
|
|
var moduleData = qrcode.modules.slice();
|
|
|
|
var oddRow = moduleCount % 2 === 1;
|
|
if (oddRow) {
|
|
moduleData.push(fill(moduleCount, WHITE));
|
|
}
|
|
|
|
var platte= {
|
|
WHITE_ALL: '\u2588',
|
|
WHITE_BLACK: '\u2580',
|
|
BLACK_WHITE: '\u2584',
|
|
BLACK_ALL: ' ',
|
|
};
|
|
|
|
var borderTop = repeat(platte.BLACK_WHITE).times(moduleCount + 3);
|
|
var borderBottom = repeat(platte.WHITE_BLACK).times(moduleCount + 3);
|
|
output += borderTop + '\n';
|
|
|
|
for (var row = 0; row < moduleCount; row += 2) {
|
|
output += platte.WHITE_ALL;
|
|
|
|
for (var col = 0; col < moduleCount; col++) {
|
|
if (moduleData[row][col] === WHITE && moduleData[row + 1][col] === WHITE) {
|
|
output += platte.WHITE_ALL;
|
|
} else if (moduleData[row][col] === WHITE && moduleData[row + 1][col] === BLACK) {
|
|
output += platte.WHITE_BLACK;
|
|
} else if (moduleData[row][col] === BLACK && moduleData[row + 1][col] === WHITE) {
|
|
output += platte.BLACK_WHITE;
|
|
} else {
|
|
output += platte.BLACK_ALL;
|
|
}
|
|
}
|
|
|
|
output += platte.WHITE_ALL + '\n';
|
|
}
|
|
|
|
if (!oddRow) {
|
|
output += borderBottom;
|
|
}
|
|
} else {
|
|
var border = repeat(white).times(qrcode.getModuleCount() + 3);
|
|
|
|
output += border + '\n';
|
|
qrcode.modules.forEach(function (row) {
|
|
output += white;
|
|
output += row.map(toCell).join('');
|
|
output += white + '\n';
|
|
});
|
|
output += border;
|
|
}
|
|
|
|
if (cb) cb(output);
|
|
else console.log(output);
|
|
},
|
|
|
|
setErrorLevel: function (error) {
|
|
this.error = QRErrorCorrectLevel[error] || this.error;
|
|
}
|
|
|
|
};
|