3 let Qr = module.exports;
5 let Fs = require("fs").promises;
7 let QrCode = require("qrcode-svg");
11 * @property {String} [background]
12 * @property {String} [color]
13 * @property {String} [ecl]
14 * @property {Number} [height]
15 * @property {Number} [indent]
16 * @property {Number} [padding]
17 * @property {"mini" | "micro"} [size]
18 * @property {Number} [width]
22 * @param {String} data
23 * @param {QrOpts} opts
25 Qr._create = function (data, opts) {
28 padding: opts?.padding || 4,
29 width: opts?.width || 256,
30 height: opts?.height || 256,
31 color: opts?.color || "#000000",
32 background: opts?.background || "#ffffff",
33 ecl: opts?.ecl || "M",
38 * @type {Object.<String, String>}
41 // top-left, top-right, bottom-left, bottom-right
76 * @param {String} data
77 * @param {QrOpts} opts
79 Qr.microAscii = function (data, opts) {
80 let qrcode = Qr._create(data, opts);
81 let indent = opts?.indent ?? 4;
82 let modules = qrcode.qrcode.modules;
84 let ascii = ``.padStart(indent, " ");
85 let length = modules.length;
86 for (let y = 0; y < length; y += 2) {
87 for (let x = 0; x < length; x += 2) {
89 // qr codes can be odd numbers
91 ascii += microMap[count];
97 if (modules[x][y + 1]) {
101 if (x + 1 >= length) {
102 ascii += microMap[count];
105 if (modules[x + 1][y]) {
108 if (modules[x + 1][y + 1]) {
111 ascii += microMap[count];
113 ascii += `\n`.padEnd(indent, " ");
115 return " ".padEnd(indent - 1, " ") + ascii.trim();
119 * @param {String} data
120 * @param {QrOpts} opts
122 Qr.ascii = function (data, opts) {
123 if ("micro" === opts.size) {
124 return Qr.microAscii(data, opts);
127 let qrcode = Qr._create(data, opts);
128 let indent = opts?.indent ?? 4;
129 let modules = qrcode.qrcode.modules;
131 let ascii = ``.padStart(indent - 1, " ");
132 let length = modules.length;
133 for (let y = 0; y < length; y += 1) {
134 for (let x = 0; x < length; x += 1) {
141 ascii += `\n`.padEnd(indent, " ");
147 * @param {String} data
148 * @param {QrOpts} opts
150 Qr.svg = function (data, opts) {
151 let qrcode = Qr._create(data, opts);
156 * @param {String} filepath
157 * @param {String} data
158 * @param {QrOpts} opts
160 Qr.save = async function (filepath, data, opts) {
161 let qrcode = Qr.svg(data, opts);
162 await Fs.writeFile(filepath, qrcode, "utf8");