feat: add 'mini' (double quad-blocks) ascii QR output origin/mini-qr
authorAJ ONeal <coolaj86@gmail.com>
Sat, 25 Jun 2022 06:54:54 +0000 (00:54 -0600)
committerAJ ONeal <coolaj86@gmail.com>
Sat, 25 Jun 2022 06:55:40 +0000 (00:55 -0600)
bin/crowdnode.js
lib/qr.js

index d8697d95594b95dfdae417e12cba0b8f909953fa..7815cbf5c329d4873cc679abfc48e13a4c3c6ed7 100755 (executable)
@@ -337,7 +337,7 @@ function showQr(addr, duffs = 0) {
     dashUri += `?amount=${dashAmount}`;
   }
 
-  let dashQr = Qr.ascii(dashUri, { indent: 4, size: "micro" });
+  let dashQr = Qr.ascii(dashUri, { indent: 4, size: "mini" });
   let addrPad = Math.ceil((qrWidth - dashUri.length) / 2);
 
   console.info(dashQr);
index 632218b6e87ab9969684c9c7b75ef4f367977876..9469b47efadeaf02ffdc935e6bc68cc5c968971a 100644 (file)
--- a/lib/qr.js
+++ b/lib/qr.js
@@ -35,60 +35,70 @@ Qr._create = function (data, opts) {
 };
 
 /**
- * @type {Object.<String, String>}
+ * @typedef {Object.<String, String>} BlockMap
  */
-let microMap = {
-  // top-left, top-right, bottom-left, bottom-right
-  0b0000: " ",
-  //
-  0b0001: "▗",
-  //
-  0b0010: "▖",
-  //
-  0b0011: "▄",
-  //
-  0b0100: "▝",
-  //
-  0b0101: "▐",
-  //
-  0b0110: "▞",
-  //
-  0b0111: "▟",
-  //
-  0b1000: "▘",
-  //
-  0b1001: "▚",
-  //
-  0b1010: "▌",
-  //
-  0b1011: "▙",
-  //
-  0b1100: "▀",
-  //
-  0b1101: "▜",
-  //
-  0b1110: "▛",
-  //
-  0b1111: "█",
+
+/**
+ * Encoded as top-left, top-right, bottom-left, bottom-right
+ * @type {Object.<"mini" | "micro", BlockMap>}
+ */
+let charMaps = {
+  micro: {
+    0b0000: " ",
+    0b0001: "▗",
+    0b0010: "▖",
+    0b0011: "▄",
+    0b0100: "▝",
+    0b0101: "▐",
+    0b0110: "▞",
+    0b0111: "▟",
+    0b1000: "▘",
+    0b1001: "▚",
+    0b1010: "▌",
+    0b1011: "▙",
+    0b1100: "▀",
+    0b1101: "▜",
+    0b1110: "▛",
+    0b1111: "█",
+  },
+  mini: {
+    0b0000: "  ",
+    0b0001: " ▄",
+    0b0010: "▄ ",
+    0b0011: "▄▄",
+    0b0100: " ▀",
+    0b0101: " █",
+    0b0110: "▄▀",
+    0b0111: "▄█",
+    0b1000: "▀ ",
+    0b1001: "▀▄",
+    0b1010: "█ ",
+    0b1011: "█▄",
+    0b1100: "▀▀",
+    0b1101: "▀█",
+    0b1110: "█▀",
+    0b1111: "██",
+  },
 };
 
 /**
  * @param {String} data
  * @param {QrOpts} opts
  */
-Qr.microAscii = function (data, opts) {
+Qr.quadAscii = function (data, opts) {
+  let charMap = charMaps[opts.size || "mini"];
   let qrcode = Qr._create(data, opts);
   let indent = opts?.indent ?? 4;
   let modules = qrcode.qrcode.modules;
 
-  let ascii = ``.padStart(indent, " ");
+  let ascii = ``.padStart(indent - 1, " ");
   let length = modules.length;
   for (let y = 0; y < length; y += 2) {
     for (let x = 0; x < length; x += 2) {
       let count = 0;
       // qr codes can be odd numbers
       if (x >= length) {
-        ascii += microMap[count];
+        ascii += charMap[count];
         continue;
       }
       if (modules[x][y]) {
@@ -99,7 +109,7 @@ Qr.microAscii = function (data, opts) {
       }
 
       if (x + 1 >= length) {
-        ascii += microMap[count];
+        ascii += charMap[count];
         continue;
       }
       if (modules[x + 1][y]) {
@@ -108,11 +118,11 @@ Qr.microAscii = function (data, opts) {
       if (modules[x + 1][y + 1]) {
         count += 1;
       }
-      ascii += microMap[count];
+      ascii += charMap[count];
     }
     ascii += `\n`.padEnd(indent, " ");
   }
-  return " ".padEnd(indent - 1, " ") + ascii.trim();
+  return ascii.replace(/\s+$/, "");
 };
 
 /**
@@ -120,8 +130,8 @@ Qr.microAscii = function (data, opts) {
  * @param {QrOpts} opts
  */
 Qr.ascii = function (data, opts) {
-  if ("micro" === opts.size) {
-    return Qr.microAscii(data, opts);
+  if (opts.size) {
+    return Qr.quadAscii(data, opts);
   }
 
   let qrcode = Qr._create(data, opts);