1 | var QRCode = require('./../vendor/QRCode'),
|
2 | QRErrorCorrectLevel = require('./../vendor/QRCode/QRErrorCorrectLevel'),
|
3 | black = "\033[40m \033[0m",
|
4 | white = "\033[47m \033[0m",
|
5 | toCell = function (isBlack) {
|
6 | return isBlack ? black : white;
|
7 | },
|
8 | repeat = function (color) {
|
9 | return {
|
10 | times: function (count) {
|
11 | return new Array(count).join(color);
|
12 | }
|
13 | };
|
14 | },
|
15 | fill = function(length, value) {
|
16 | var arr = new Array(length);
|
17 | for (var i = 0; i < length; i++) {
|
18 | arr[i] = value;
|
19 | }
|
20 | return arr;
|
21 | };
|
22 |
|
23 | module.exports = {
|
24 |
|
25 | error: QRErrorCorrectLevel.L,
|
26 |
|
27 | generate: function (input, opts, cb) {
|
28 | if (typeof opts === 'function') {
|
29 | cb = opts;
|
30 | opts = {};
|
31 | }
|
32 |
|
33 | var qrcode = new QRCode(-1, this.error);
|
34 | qrcode.addData(input);
|
35 | qrcode.make();
|
36 |
|
37 | var output = '';
|
38 | if (opts && opts.small) {
|
39 | var BLACK = true, WHITE = false;
|
40 | var moduleCount = qrcode.getModuleCount();
|
41 | var moduleData = qrcode.modules.slice();
|
42 |
|
43 | var oddRow = moduleCount % 2 === 1;
|
44 | if (oddRow) {
|
45 | moduleData.push(fill(moduleCount, WHITE));
|
46 | }
|
47 |
|
48 | var platte= {
|
49 | WHITE_ALL: '\u2588',
|
50 | WHITE_BLACK: '\u2580',
|
51 | BLACK_WHITE: '\u2584',
|
52 | BLACK_ALL: ' ',
|
53 | };
|
54 |
|
55 | var borderTop = repeat(platte.BLACK_WHITE).times(moduleCount + 3);
|
56 | var borderBottom = repeat(platte.WHITE_BLACK).times(moduleCount + 3);
|
57 | output += borderTop + '\n';
|
58 |
|
59 | for (var row = 0; row < moduleCount; row += 2) {
|
60 | output += platte.WHITE_ALL;
|
61 |
|
62 | for (var col = 0; col < moduleCount; col++) {
|
63 | if (moduleData[row][col] === WHITE && moduleData[row + 1][col] === WHITE) {
|
64 | output += platte.WHITE_ALL;
|
65 | } else if (moduleData[row][col] === WHITE && moduleData[row + 1][col] === BLACK) {
|
66 | output += platte.WHITE_BLACK;
|
67 | } else if (moduleData[row][col] === BLACK && moduleData[row + 1][col] === WHITE) {
|
68 | output += platte.BLACK_WHITE;
|
69 | } else {
|
70 | output += platte.BLACK_ALL;
|
71 | }
|
72 | }
|
73 |
|
74 | output += platte.WHITE_ALL + '\n';
|
75 | }
|
76 |
|
77 | if (!oddRow) {
|
78 | output += borderBottom;
|
79 | }
|
80 | } else {
|
81 | var border = repeat(white).times(qrcode.getModuleCount() + 3);
|
82 |
|
83 | output += border + '\n';
|
84 | qrcode.modules.forEach(function (row) {
|
85 | output += white;
|
86 | output += row.map(toCell).join('');
|
87 | output += white + '\n';
|
88 | });
|
89 | output += border;
|
90 | }
|
91 |
|
92 | if (cb) cb(output);
|
93 | else console.log(output);
|
94 | },
|
95 |
|
96 | setErrorLevel: function (error) {
|
97 | this.error = QRErrorCorrectLevel[error] || this.error;
|
98 | }
|
99 |
|
100 | };
|