• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1var 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
23module.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};
101