qr-min 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,4 +1,9 @@
1
- # qr-gen
1
+ # qr-min
2
+
3
+ [![npm](https://img.shields.io/npm/v/qr-min.svg)](https://www.npmjs.com/package/qr-min)
4
+ [![npm](https://img.shields.io/npm/dt/qr-min.svg)](https://www.npmjs.com/package/qr-min)
5
+ [![build](https://github.com/jazz-soft/qr-min/actions/workflows/build.yml/badge.svg)](https://github.com/jazz-soft/qr-min/actions)
6
+ [![Coverage Status](https://coveralls.io/repos/github/jazz-soft/qr-min/badge.svg?branch=main)](https://coveralls.io/github/jazz-soft/qr-min?branch=main)
2
7
 
3
8
  Minimal implementation to generate a QR code from a UTF-8 string.
4
9
  This is all you need for 99.9% of applications.
@@ -8,7 +8,7 @@
8
8
  }
9
9
  else {
10
10
  if (!global) global = window;
11
- if (global.QR && global.QR.MIDI) return;
11
+ if (global.QR) return;
12
12
  global.QR = factory();
13
13
  }
14
14
  })(this, function() {
@@ -65,9 +65,17 @@
65
65
  for (_nxt(p, d.length); r[p[0]][p[1]]; _nxt(p, d.length)) ;
66
66
  }
67
67
  }
68
- _format(d, 0, 0);
69
- _mask(d, r, 0);
70
- return d;
68
+ for (i = 0; i < 8; i++) {
69
+ b = _dup(d);
70
+ _format(b, 0, i);
71
+ _mask(b, r, i);
72
+ j = _score(b);
73
+ if (!i || j < k) {
74
+ k = j;
75
+ bbb = b;
76
+ }
77
+ }
78
+ return bbb;
71
79
  };
72
80
  function _nxt(p, sz) {
73
81
  var d = (p[1] > 5 ? p[1] - 1 : p[1]) % 4;
@@ -180,15 +188,70 @@
180
188
  for (i = 0; i < d.length; i++) for (j = 0; j < d.length; j++) {
181
189
  if (r[i][j]) continue;
182
190
  k = !m ? k = (i + j) % 2 :
183
- m == 1 ? j % 2 :
184
- m == 2 ? i % 3 :
191
+ m == 1 ? i % 2 :
192
+ m == 2 ? j % 3 :
185
193
  m == 3 ? (i + j) % 3 :
186
- m == 4 ? (Math.floor(i / 3) + Math.floor(j / 2)) % 2 :
194
+ m == 4 ? (Math.floor(j / 3) + Math.floor(i / 2)) % 2 :
187
195
  m == 5 ? i * j % 2 + i * j % 3 :
188
196
  m == 6 ? (i * j % 2 + i * j % 3) % 2 : ((i + j) % 2 + i * j % 3) % 2;
189
197
  if (!k) d[i][j] = 1 - d[i][j];
190
198
  }
191
199
  }
200
+ function _score(d) {
201
+ var i, j, k, n, x;
202
+ k = 0;
203
+ for (i = 0; i < d.length; i++) for (j = 0; j < d.length; j++) k += d[i][j];
204
+ n = d.length * d.length;
205
+ x = Math.floor(Math.abs(n - 2 * k) / n * 10) * 10;
206
+ for (i = 0; i < d.length - 1; i++) for (j = 0; j < d.length - 1; j++) {
207
+ if (d[i][j] == d[i][j + 1] && d[i][j] == d[i + 1][j] && d[i][j] == d[i + 1][j + 1]) x += 3;
208
+ }
209
+ for (i = 0; i < d.length; i++) {
210
+ k = d[i][0];
211
+ n = 1;
212
+ for (j = 1; j < d.length; j++) {
213
+ if (k != d[i][j]) {
214
+ k = d[i][j];
215
+ n = 1;
216
+ }
217
+ else {
218
+ n++;
219
+ if (n == 5) x += 3;
220
+ if (n > 5) x++;
221
+ }
222
+ }
223
+ }
224
+ for (i = 0; i < d.length; i++) {
225
+ k = d[0][i];
226
+ n = 1;
227
+ for (j = 1; j < d.length; j++) {
228
+ if (k != d[j][i]) {
229
+ k = d[j][i];
230
+ n = 1;
231
+ }
232
+ else {
233
+ n++;
234
+ if (n == 5) x += 3;
235
+ if (n > 5) x++;
236
+ }
237
+ }
238
+ }
239
+ for (i = 0; i < d.length; i++) for (j = 0; j < d.length - 6; j++) {
240
+ if (d[i][j] && !d[i][j + 1] && d[i][j + 2] && d[i][j + 3] && d[i][j + 4] && !d[i][j + 5] && d[i][j + 6]) {
241
+ for (k = 0; k < 4; k++) if (j - 1 - k >= 0 && d[i][j - 1 - k]) break;
242
+ if (k == 4 && (j + 7 >= d.length || !d[i][j + 7])) x += 40;
243
+ for (k = 0; k < 4; k++) if (j + 7 + k < d.length && d[i][j + 7 + k]) break;
244
+ if (k == 4 && (!j || !d[i][j - 1])) x += 40;
245
+ }
246
+ if (d[j][i] && !d[j + 1][i] && d[j + 2][i] && d[j + 3][i] && d[j + 4][i] && !d[j + 5][i] && d[j + 6][i]) {
247
+ for (k = 0; k < 4; k++) if (j - 1 - k >= 0 && d[j - 1 - k][i]) break;
248
+ if (k == 4 && (j + 7 >= d.length || !d[j + 7][i])) x += 40;
249
+ for (k = 0; k < 4; k++) if (j + 7 + k < d.length && d[j + 7 + k][i]) break;
250
+ if (k == 4 && (!j || !d[j - 1][i])) x += 40;
251
+ }
252
+ }
253
+ return x;
254
+ }
192
255
  function _dots(v) {
193
256
  var i, d = [], sz = v * 4 + 17;
194
257
  for (i = 0; i < sz; i++) d.push(Array(sz).fill(0));
package/package.json CHANGED
@@ -1,16 +1,26 @@
1
1
  {
2
2
  "name": "qr-min",
3
- "version": "0.0.1",
4
- "description": "coming soon...",
3
+ "version": "0.0.2",
4
+ "description": "Minimal implementation to generate a QR code from a UTF-8 string",
5
5
  "main": "javascript/qr-min.js",
6
6
  "scripts": {
7
- "test": "echo \"Error: no test specified\" && exit 1"
7
+ "test": "nyc mocha",
8
+ "lint": "eslint javascript test",
9
+ "coverage": "nyc report --reporter=lcov"
8
10
  },
9
11
  "keywords": [
10
12
  "qr",
11
13
  "qr-code"
12
14
  ],
13
15
  "author": "jazz-soft (https://jazz-soft.net/)",
16
+ "devDependencies": {
17
+ "eslint": "^9.39.2",
18
+ "grunt": "^1.6.1",
19
+ "grunt-contrib-jshint": "^3.2.0",
20
+ "grunt-contrib-uglify": "^5.2.2",
21
+ "mocha": "^11.7.5",
22
+ "nyc": "^17.1.0"
23
+ },
14
24
  "repository": {
15
25
  "type": "git",
16
26
  "url": "git+https://github.com/jazz-soft/qr-min.git"
package/test/mocha.js ADDED
@@ -0,0 +1,48 @@
1
+ var assert = require('assert');
2
+ var QR = require('..');
3
+
4
+ function text(qr) {
5
+ var i, j, s = '';
6
+ for (i = 0; i < qr.length; i += 2) {
7
+ for (j = 0; j < qr.length; j++) s += i + 1 < qr.length && qr[i + 1][j] ? qr[i][j] ? '█' : '▄' : qr[i][j] ? '▀' : ' ';
8
+ s += '\n';
9
+ }
10
+ return s;
11
+ }
12
+
13
+ describe('qr', function() {
14
+ it('short', function() {
15
+ assert.equal(text(QR('a')),`
16
+ █▀▀▀▀▀█ █▄█▀ █▀▀▀▀▀█
17
+ █ ███ █ ▀█ █▀ █ ███ █
18
+ █ ▀▀▀ █ ▀ █ █ ▀▀▀ █
19
+ ▀▀▀▀▀▀▀ █▄▀▄█ ▀▀▀▀▀▀▀
20
+ ▀▀█ ██▀█▀▀█▀ ▀█ █▄
21
+ ▄▄ ▄▀▄▀▀▀██ ▀ ▄ ▀ ▄ ▀
22
+ ▀▀ ▀▀▀▀▄▄ ▄▀▄▀▄▀▄▀▄█
23
+ █▀▀▀▀▀█ █▄▄█▄█▀█▄█▀▀▀
24
+ █ ███ █ ▀ █▀ ▀█▀ ▀█▄▀
25
+ █ ▀▀▀ █ ██ ▀ ▄ ▀ ▄▄▀
26
+ ▀▀▀▀▀▀▀ ▀▀ ▀ ▀ ▀ ▀▀▀
27
+ `.substring(1));
28
+ });
29
+ it('medium', function() {
30
+ assert.equal(text(QR('https://github.com/jazz-soft/qr-min')),`
31
+ █▀▀▀▀▀█ ▄▀ ▄▀ ▀ █ █▀▀▀▀▀█
32
+ █ ███ █ ▀▄ ▀▄▄ ▀ ▀▀█ █ ███ █
33
+ █ ▀▀▀ █ ▀▄▄█▀▄▄▀███▄ █ ▀▀▀ █
34
+ ▀▀▀▀▀▀▀ █ ▀▄▀ ▀ █▄█▄▀ ▀▀▀▀▀▀▀
35
+ █▀▀▄██▀▀█▄ ▄█▄ ▀██▄ █▀█ ▄▀ ▄
36
+ █ ▄ █▄▀ ▄▄█▀█▄█▄ ██ ▀▀▀▄█ ▀█▀
37
+ █▄ ▄ █▀▀ ██ █▀█▀ ▀███ █ ▀█
38
+ ▀█▀█▄▀▀█▄ ▀▄ ▀ ▄▄█▄ ▄▄█ ▀█ █▀
39
+ █▄▀█▀ ▄ ▄█▄ ▀██ ▀▀▄█▀ █▄▀█
40
+ ▀▄▄▄ █▀ ▄▀ ▀█▄█▄▄█ ▄▄█▄██▄ █▀
41
+ ▀ ▀ ▀ ▄▀██ █▀▀█▄██▀▀▀█ ▄▄▄
42
+ █▀▀▀▀▀█ █ █▄ ▀ ▀▄ ▀█ ▀ ██ ▀█
43
+ █ ███ █ ▀▀█▄█▄ ▄▀▀ █▀▀██ ▄▄█
44
+ █ ▀▀▀ █ █▄ ▀█▄█▄ █▄█▄▄ ▀█▀ ▄▀
45
+ ▀▀▀▀▀▀▀ ▀▀▀▀ ▀ ▀ ▀▀▀ ▀▀ ▀▀
46
+ `.substring(1));
47
+ });
48
+ });