@fnndsc/brasa 0.31.5 → 0.32.1
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/dist/buildinfo.json +1 -1
- package/dist/builtins/games/bytes.d.ts +21 -0
- package/dist/builtins/games/bytes.js +224 -0
- package/dist/builtins/games/bytes.js.map +1 -0
- package/dist/builtins/games/chimes.d.ts +64 -0
- package/dist/builtins/games/chimes.js +223 -0
- package/dist/builtins/games/chimes.js.map +1 -0
- package/dist/builtins/games/cowsay.d.ts +36 -0
- package/dist/builtins/games/cowsay.js +127 -0
- package/dist/builtins/games/cowsay.js.map +1 -0
- package/dist/builtins/games/figlet.d.ts +25 -0
- package/dist/builtins/games/figlet.js +109 -0
- package/dist/builtins/games/figlet.js.map +1 -0
- package/dist/builtins/games/lab.d.ts +51 -0
- package/dist/builtins/games/lab.js +161 -0
- package/dist/builtins/games/lab.js.map +1 -0
- package/dist/builtins/games/lolcat.d.ts +26 -0
- package/dist/builtins/games/lolcat.js +71 -0
- package/dist/builtins/games/lolcat.js.map +1 -0
- package/dist/builtins/games/morse.d.ts +18 -0
- package/dist/builtins/games/morse.js +46 -0
- package/dist/builtins/games/morse.js.map +1 -0
- package/dist/builtins/games/numbers.d.ts +55 -0
- package/dist/builtins/games/numbers.js +270 -0
- package/dist/builtins/games/numbers.js.map +1 -0
- package/dist/builtins/games/play.d.ts +53 -0
- package/dist/builtins/games/play.js +228 -0
- package/dist/builtins/games/play.js.map +1 -0
- package/dist/builtins/games/qr.d.ts +40 -0
- package/dist/builtins/games/qr.js +336 -0
- package/dist/builtins/games/qr.js.map +1 -0
- package/dist/builtins/games/shelf.d.ts +27 -0
- package/dist/builtins/games/shelf.js +71 -0
- package/dist/builtins/games/shelf.js.map +1 -0
- package/dist/builtins/games/show.d.ts +38 -0
- package/dist/builtins/games/show.js +75 -0
- package/dist/builtins/games/show.js.map +1 -0
- package/dist/builtins/games/sky.d.ts +69 -0
- package/dist/builtins/games/sky.js +190 -0
- package/dist/builtins/games/sky.js.map +1 -0
- package/dist/builtins/games/stdin.d.ts +34 -0
- package/dist/builtins/games/stdin.js +48 -0
- package/dist/builtins/games/stdin.js.map +1 -0
- package/dist/builtins/games/text.d.ts +46 -0
- package/dist/builtins/games/text.js +133 -0
- package/dist/builtins/games/text.js.map +1 -0
- package/dist/builtins/games/wtf.d.ts +13 -0
- package/dist/builtins/games/wtf.data.d.ts +12 -0
- package/dist/builtins/games/wtf.data.js +70 -0
- package/dist/builtins/games/wtf.data.js.map +1 -0
- package/dist/builtins/games/wtf.js +45 -0
- package/dist/builtins/games/wtf.js.map +1 -0
- package/dist/builtins/help.d.ts +8 -0
- package/dist/builtins/help.js +303 -1
- package/dist/builtins/help.js.map +1 -1
- package/dist/core/dispatch.js +125 -9
- package/dist/core/dispatch.js.map +1 -1
- package/dist/core/engine.js +1 -0
- package/dist/core/engine.js.map +1 -1
- package/dist/core/surface.d.ts +14 -0
- package/dist/core/surface.js.map +1 -1
- package/dist/lib/vfs/providers/static.js +15 -1
- package/dist/lib/vfs/providers/static.js.map +1 -1
- package/dist/lib/vfs/providers/static_content.js +2 -2
- package/dist/lib/vfs/providers/static_content.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Games played by question and answer: `quiz`, `hangman`, `2048`.
|
|
3
|
+
*
|
|
4
|
+
* Each turn is a question the kernel asks the surface — the console in a
|
|
5
|
+
* terminal, the console's ask bar in ARGUS — so the same game plays
|
|
6
|
+
* anywhere a question can be answered. The boards and the scoring are pure
|
|
7
|
+
* functions, tested apart from the asking.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import { envelope_ok, envelope_error } from '@fnndsc/cumin';
|
|
12
|
+
import chalk from 'chalk';
|
|
13
|
+
import { repl_question } from '../../core/question.js';
|
|
14
|
+
import { sink_dataLine } from '../../core/sink.js';
|
|
15
|
+
/** The bank: the lab's own vocabulary. */
|
|
16
|
+
export const QUIZ_BANK = [
|
|
17
|
+
{ q: 'What does CUBE stand for?', a: ['chris ultron back end', 'chris ultron backend'] },
|
|
18
|
+
{ q: 'Which DICOM service asks a PACS what it holds: C-FIND, C-MOVE or C-STORE?', a: ['c-find', 'cfind', 'c find'] },
|
|
19
|
+
{ q: 'Which DICOM service tells a PACS to send a series?', a: ['c-move', 'cmove', 'c move'] },
|
|
20
|
+
{ q: 'What is the DICOM tag name for the hospital\'s patient identifier (the MRN)?', a: ['patientid', 'patient id'] },
|
|
21
|
+
{ q: 'Which service receives DICOM files for ChRIS and reports progress over LONK?', a: ['oxidicom'] },
|
|
22
|
+
{ q: 'Which service does `pull` go through to reach a PACS?', a: ['pfdcm'] },
|
|
23
|
+
{ q: 'A plugin that takes data in and gives data out is of which kind: fs, ds or ts?', a: ['ds'] },
|
|
24
|
+
{ q: 'A plugin that joins several parents is of which kind: fs, ds or ts?', a: ['ts'] },
|
|
25
|
+
{ q: 'What is one analysis in ChRIS called (a tree of plugin instances on some data)?', a: ['feed', 'a feed'] },
|
|
26
|
+
{ q: 'What does the K in LONK stand for? (spelling counts)', a: ['notifikations', 'notifications'] },
|
|
27
|
+
{ q: 'Which file format do most neuroimaging tools read: NIfTI or DICOM?', a: ['nifti'] },
|
|
28
|
+
{ q: 'In SeaGaP, what does the P stand for?', a: ['process'] },
|
|
29
|
+
{ q: 'What is the mise kernel package called?', a: ['brasa'] },
|
|
30
|
+
{ q: 'What is the mise daemon called?', a: ['calypso'] },
|
|
31
|
+
{ q: 'At 0 Hounsfield units, what are you looking at?', a: ['water'] },
|
|
32
|
+
];
|
|
33
|
+
/** How many a round asks. */
|
|
34
|
+
export const QUIZ_ROUND = 5;
|
|
35
|
+
/** Whether an answer matches: case, spaces and punctuation set aside. */
|
|
36
|
+
export function answer_matches(given, accepted) {
|
|
37
|
+
const norm = (s) => s.toLowerCase().replace(/[^a-z0-9]+/g, '');
|
|
38
|
+
const g = norm(given);
|
|
39
|
+
return g.length > 0 && accepted.some((a) => norm(a) === g);
|
|
40
|
+
}
|
|
41
|
+
/** `quiz`: five questions from the bank; the score at the end. */
|
|
42
|
+
export async function builtin_quiz(_args) {
|
|
43
|
+
const asked = [...QUIZ_BANK].sort(() => Math.random() - 0.5).slice(0, QUIZ_ROUND);
|
|
44
|
+
let right = 0;
|
|
45
|
+
const results = [];
|
|
46
|
+
try {
|
|
47
|
+
for (const [i, item] of asked.entries()) {
|
|
48
|
+
const answer = await repl_question(`${i + 1}/${asked.length} ${item.q} `);
|
|
49
|
+
if (answer.trim().toLowerCase() === 'q')
|
|
50
|
+
break;
|
|
51
|
+
const ok = answer_matches(answer, item.a);
|
|
52
|
+
if (ok)
|
|
53
|
+
right++;
|
|
54
|
+
results.push({ q: item.q, right: ok });
|
|
55
|
+
sink_dataLine(ok ? chalk.green(' right') : chalk.yellow(` no — ${item.a[0]}`));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
return envelope_error('', undefined, `quiz: cannot ask here (${error instanceof Error ? error.message : String(error)})\n`);
|
|
60
|
+
}
|
|
61
|
+
const verdict = right === results.length && results.length === asked.length ? 'perfect' : right >= Math.ceil(results.length / 2) ? 'not bad' : 'wtf -l will help';
|
|
62
|
+
return envelope_ok(`\n${right} of ${results.length} — ${verdict}\n`, { kind: 'games.quiz', data: { right, asked: results.length, results } });
|
|
63
|
+
}
|
|
64
|
+
/* ------------------------------------------------------------- hangman */
|
|
65
|
+
/** The words: the lab's. */
|
|
66
|
+
export const HANGMAN_WORDS = ['oxidicom', 'pipeline', 'dicom', 'cohort', 'feed', 'plugin', 'calypso', 'brasa', 'accession', 'series', 'modality', 'nifti', 'hounsfield', 'lonk', 'pfdcm', 'stardate'];
|
|
67
|
+
/** The gallows, by misses. */
|
|
68
|
+
export const GALLOWS = [
|
|
69
|
+
[' +---+', ' | |', ' |', ' |', ' |', ' |', '========='],
|
|
70
|
+
[' +---+', ' | |', ' O |', ' |', ' |', ' |', '========='],
|
|
71
|
+
[' +---+', ' | |', ' O |', ' | |', ' |', ' |', '========='],
|
|
72
|
+
[' +---+', ' | |', ' O |', ' /| |', ' |', ' |', '========='],
|
|
73
|
+
[' +---+', ' | |', ' O |', ' /|\\ |', ' |', ' |', '========='],
|
|
74
|
+
[' +---+', ' | |', ' O |', ' /|\\ |', ' / |', ' |', '========='],
|
|
75
|
+
[' +---+', ' | |', ' O |', ' /|\\ |', ' / \\ |', ' |', '========='],
|
|
76
|
+
];
|
|
77
|
+
/** The word with the letters not yet guessed hidden. */
|
|
78
|
+
export function word_mask(word, guessed) {
|
|
79
|
+
return [...word].map((c) => (guessed.has(c) ? c : '_')).join(' ');
|
|
80
|
+
}
|
|
81
|
+
/** `hangman`: a word from the lab, six misses allowed. */
|
|
82
|
+
export async function builtin_hangman(_args) {
|
|
83
|
+
const word = HANGMAN_WORDS[Math.floor(Math.random() * HANGMAN_WORDS.length)];
|
|
84
|
+
const guessed = new Set();
|
|
85
|
+
let misses = 0;
|
|
86
|
+
try {
|
|
87
|
+
while (misses < GALLOWS.length - 1) {
|
|
88
|
+
const mask = word_mask(word, guessed);
|
|
89
|
+
if (!mask.includes('_'))
|
|
90
|
+
break;
|
|
91
|
+
sink_dataLine(`${GALLOWS[misses].join('\n')}\n\n ${mask} missed: ${[...guessed].filter((c) => !word.includes(c)).join(' ') || '—'}`);
|
|
92
|
+
const answer = (await repl_question('letter (or the word, or q): ')).trim().toLowerCase();
|
|
93
|
+
if (answer === 'q')
|
|
94
|
+
return envelope_ok(`\nthe word was ${word}\n`, { kind: 'games.hangman', data: { word, won: false, quit: true } });
|
|
95
|
+
if (answer.length > 1) {
|
|
96
|
+
if (answer === word) {
|
|
97
|
+
for (const c of word)
|
|
98
|
+
guessed.add(c);
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
misses++;
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (!/^[a-z]$/.test(answer) || guessed.has(answer))
|
|
105
|
+
continue;
|
|
106
|
+
guessed.add(answer);
|
|
107
|
+
if (!word.includes(answer))
|
|
108
|
+
misses++;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
return envelope_error('', undefined, `hangman: cannot ask here (${error instanceof Error ? error.message : String(error)})\n`);
|
|
113
|
+
}
|
|
114
|
+
const won = !word_mask(word, guessed).includes('_');
|
|
115
|
+
const end = won ? chalk.green(`\n ${word} — saved, with ${misses} miss${misses === 1 ? '' : 'es'}\n`) : `${GALLOWS[GALLOWS.length - 1].join('\n')}\n\n ${chalk.red('hanged')} — the word was ${word}\n`;
|
|
116
|
+
return envelope_ok(end, { kind: 'games.hangman', data: { word, won, misses } });
|
|
117
|
+
}
|
|
118
|
+
/** Slides and merges one row to the left; returns the row and the points scored. */
|
|
119
|
+
export function row_slide(row) {
|
|
120
|
+
const tiles = row.filter((v) => v !== 0);
|
|
121
|
+
const out = [];
|
|
122
|
+
let score = 0;
|
|
123
|
+
for (let i = 0; i < tiles.length; i++) {
|
|
124
|
+
if (i + 1 < tiles.length && tiles[i] === tiles[i + 1]) {
|
|
125
|
+
out.push(tiles[i] * 2);
|
|
126
|
+
score += tiles[i] * 2;
|
|
127
|
+
i++;
|
|
128
|
+
}
|
|
129
|
+
else
|
|
130
|
+
out.push(tiles[i]);
|
|
131
|
+
}
|
|
132
|
+
while (out.length < row.length)
|
|
133
|
+
out.push(0);
|
|
134
|
+
return { row: out, score };
|
|
135
|
+
}
|
|
136
|
+
/** Moves the whole board; returns the new board, the points, and whether anything moved. */
|
|
137
|
+
export function board_move(board, direction) {
|
|
138
|
+
const n = board.length;
|
|
139
|
+
const get = (r, c) => {
|
|
140
|
+
if (direction === 'left')
|
|
141
|
+
return board[r][c];
|
|
142
|
+
if (direction === 'right')
|
|
143
|
+
return board[r][n - 1 - c];
|
|
144
|
+
if (direction === 'up')
|
|
145
|
+
return board[c][r];
|
|
146
|
+
return board[n - 1 - c][r];
|
|
147
|
+
};
|
|
148
|
+
const next = board.map((row) => [...row]);
|
|
149
|
+
let score = 0;
|
|
150
|
+
let moved = false;
|
|
151
|
+
for (let r = 0; r < n; r++) {
|
|
152
|
+
const line = Array.from({ length: n }, (_, c) => get(r, c));
|
|
153
|
+
const slid = row_slide(line);
|
|
154
|
+
score += slid.score;
|
|
155
|
+
for (let c = 0; c < n; c++) {
|
|
156
|
+
const v = slid.row[c];
|
|
157
|
+
if (v !== line[c])
|
|
158
|
+
moved = true;
|
|
159
|
+
if (direction === 'left')
|
|
160
|
+
next[r][c] = v;
|
|
161
|
+
else if (direction === 'right')
|
|
162
|
+
next[r][n - 1 - c] = v;
|
|
163
|
+
else if (direction === 'up')
|
|
164
|
+
next[c][r] = v;
|
|
165
|
+
else
|
|
166
|
+
next[n - 1 - c][r] = v;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return { board: next, score, moved };
|
|
170
|
+
}
|
|
171
|
+
/** Puts a 2 (or, one time in ten, a 4) on an empty cell; false when there is none. */
|
|
172
|
+
export function board_spawn(board, random = Math.random) {
|
|
173
|
+
const empty = [];
|
|
174
|
+
board.forEach((row, r) => row.forEach((v, c) => { if (v === 0)
|
|
175
|
+
empty.push([r, c]); }));
|
|
176
|
+
if (empty.length === 0)
|
|
177
|
+
return false;
|
|
178
|
+
const [r, c] = empty[Math.floor(random() * empty.length)];
|
|
179
|
+
board[r][c] = random() < 0.1 ? 4 : 2;
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
/** Whether any move is left. */
|
|
183
|
+
export function board_canMove(board) {
|
|
184
|
+
return ['left', 'right', 'up', 'down'].some((d) => board_move(board, d).moved);
|
|
185
|
+
}
|
|
186
|
+
/** The board drawn. */
|
|
187
|
+
export function board_render(board, score) {
|
|
188
|
+
const cell = (v) => (v === 0 ? ' .' : String(v).padStart(5));
|
|
189
|
+
return `${board.map((row) => row.map(cell).join('')).join('\n')}\n score ${score}`;
|
|
190
|
+
}
|
|
191
|
+
/** `2048`: w/a/s/d (or h/j/k/l) by question, q to stop. */
|
|
192
|
+
export async function builtin_2048(_args) {
|
|
193
|
+
let board = Array.from({ length: 4 }, () => [0, 0, 0, 0]);
|
|
194
|
+
board_spawn(board);
|
|
195
|
+
board_spawn(board);
|
|
196
|
+
let score = 0;
|
|
197
|
+
const keys = { a: 'left', h: 'left', d: 'right', l: 'right', w: 'up', k: 'up', s: 'down', j: 'down' };
|
|
198
|
+
try {
|
|
199
|
+
for (;;) {
|
|
200
|
+
sink_dataLine(board_render(board, score));
|
|
201
|
+
if (board.some((row) => row.includes(2048))) {
|
|
202
|
+
sink_dataLine(chalk.green(' 2048 — you have it'));
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
if (!board_canMove(board)) {
|
|
206
|
+
sink_dataLine(chalk.yellow(' no move left'));
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
const answer = (await repl_question('move (w a s d, q to stop): ')).trim().toLowerCase();
|
|
210
|
+
if (answer === 'q')
|
|
211
|
+
break;
|
|
212
|
+
const direction = keys[answer[0] ?? ''];
|
|
213
|
+
if (direction === undefined)
|
|
214
|
+
continue;
|
|
215
|
+
const moved = board_move(board, direction);
|
|
216
|
+
if (!moved.moved)
|
|
217
|
+
continue;
|
|
218
|
+
board = moved.board;
|
|
219
|
+
score += moved.score;
|
|
220
|
+
board_spawn(board);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
return envelope_error('', undefined, `2048: cannot ask here (${error instanceof Error ? error.message : String(error)})\n`);
|
|
225
|
+
}
|
|
226
|
+
return envelope_ok(`final score ${score}\n`, { kind: 'games.2048', data: { board, score } });
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=play.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"play.js","sourceRoot":"","sources":["../../../src/builtins/games/play.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAmB,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOnD,0CAA0C;AAC1C,MAAM,CAAC,MAAM,SAAS,GAA4B;IAChD,EAAE,CAAC,EAAE,2BAA2B,EAAE,CAAC,EAAE,CAAC,uBAAuB,EAAE,sBAAsB,CAAC,EAAE;IACxF,EAAE,CAAC,EAAE,2EAA2E,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE;IACpH,EAAE,CAAC,EAAE,oDAAoD,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE;IAC7F,EAAE,CAAC,EAAE,8EAA8E,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE;IACrH,EAAE,CAAC,EAAE,8EAA8E,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE;IACtG,EAAE,CAAC,EAAE,uDAAuD,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;IAC5E,EAAE,CAAC,EAAE,gFAAgF,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;IAClG,EAAE,CAAC,EAAE,qEAAqE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;IACvF,EAAE,CAAC,EAAE,iFAAiF,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE;IAC/G,EAAE,CAAC,EAAE,sDAAsD,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,eAAe,CAAC,EAAE;IACpG,EAAE,CAAC,EAAE,oEAAoE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;IACzF,EAAE,CAAC,EAAE,uCAAuC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE;IAC9D,EAAE,CAAC,EAAE,yCAAyC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;IAC9D,EAAE,CAAC,EAAE,iCAAiC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE;IACxD,EAAE,CAAC,EAAE,iDAAiD,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;CACvE,CAAC;AAEF,6BAA6B;AAC7B,MAAM,CAAC,MAAM,UAAU,GAAW,CAAC,CAAC;AAEpC,yEAAyE;AACzE,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,QAA+B;IAC3E,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IAC/E,MAAM,CAAC,GAAW,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAS,EAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,kEAAkE;AAClE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAe;IAChD,MAAM,KAAK,GAAe,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,GAAW,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACtG,IAAI,KAAK,GAAW,CAAC,CAAC;IACtB,MAAM,OAAO,GAAyC,EAAE,CAAC;IACzD,IAAI,CAAC;QACH,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YACxC,MAAM,MAAM,GAAW,MAAM,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACnF,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG;gBAAE,MAAM;YAC/C,MAAM,EAAE,GAAY,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YACnD,IAAI,EAAE;gBAAE,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YACvC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9H,CAAC;IACD,MAAM,OAAO,GAAW,KAAK,KAAK,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAC1K,OAAO,WAAW,CAAC,KAAK,KAAK,OAAO,OAAO,CAAC,MAAM,MAAM,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;AAChJ,CAAC;AAED,2EAA2E;AAE3E,4BAA4B;AAC5B,MAAM,CAAC,MAAM,aAAa,GAA0B,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AAE7N,8BAA8B;AAC9B,MAAM,CAAC,MAAM,OAAO,GAAyC;IAC3D,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC;IAC/E,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC;IAC/E,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC;IAC/E,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC;IAC/E,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC;IAChF,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC;IAChF,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC;CAClF,CAAC;AAEF,wDAAwD;AACxD,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,OAA4B;IAClE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpF,CAAC;AAED,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAe;IACnD,MAAM,IAAI,GAAW,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,CAAW,CAAC;IAC/F,MAAM,OAAO,GAAgB,IAAI,GAAG,EAAE,CAAC;IACvC,IAAI,MAAM,GAAW,CAAC,CAAC;IACvB,IAAI,CAAC;QACH,OAAO,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,GAAW,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,MAAM;YAC/B,aAAa,CAAC,GAAI,OAAO,CAAC,MAAM,CAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,eAAe,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAS,EAAW,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;YACrL,MAAM,MAAM,GAAW,CAAC,MAAM,aAAa,CAAC,8BAA8B,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAClG,IAAI,MAAM,KAAK,GAAG;gBAAE,OAAO,WAAW,CAAC,kBAAkB,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YACtI,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;oBAAC,KAAK,MAAM,CAAC,IAAI,IAAI;wBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAAC,MAAM;gBAAC,CAAC;gBACrE,MAAM,EAAE,CAAC;gBAAC,SAAS;YACrB,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,SAAS;YAC7D,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,MAAM,EAAE,CAAC;QACvC,CAAC;IACH,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjI,CAAC;IACD,MAAM,GAAG,GAAY,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAW,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,kBAAkB,MAAM,QAAQ,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,mBAAmB,IAAI,IAAI,CAAC;IAC7O,OAAO,WAAW,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;AAClF,CAAC;AAOD,oFAAoF;AACpF,MAAM,UAAU,SAAS,CAAC,GAAa;IACrC,MAAM,KAAK,GAAa,GAAG,CAAC,MAAM,CAAC,CAAC,CAAS,EAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,KAAK,GAAW,CAAC,CAAC;IACtB,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAAC,GAAG,CAAC,IAAI,CAAE,KAAK,CAAC,CAAC,CAAY,GAAG,CAAC,CAAC,CAAC;YAAC,KAAK,IAAK,KAAK,CAAC,CAAC,CAAY,GAAG,CAAC,CAAC;YAAC,CAAC,EAAE,CAAC;QAAC,CAAC;;YACjI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAW,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM;QAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,UAAU,CAAC,KAAY,EAAE,SAA2C;IAClF,MAAM,CAAC,GAAW,KAAK,CAAC,MAAM,CAAC;IAC/B,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE;QAC3C,IAAI,SAAS,KAAK,MAAM;YAAE,OAAQ,KAAK,CAAC,CAAC,CAAc,CAAC,CAAC,CAAW,CAAC;QACrE,IAAI,SAAS,KAAK,OAAO;YAAE,OAAQ,KAAK,CAAC,CAAC,CAAc,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAW,CAAC;QAC9E,IAAI,SAAS,KAAK,IAAI;YAAE,OAAQ,KAAK,CAAC,CAAC,CAAc,CAAC,CAAC,CAAW,CAAC;QACnE,OAAQ,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAc,CAAC,CAAC,CAAW,CAAC;IACrD,CAAC,CAAC;IACF,MAAM,IAAI,GAAU,KAAK,CAAC,GAAG,CAAC,CAAC,GAAa,EAAY,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACrE,IAAI,KAAK,GAAW,CAAC,CAAC;IAAC,IAAI,KAAK,GAAY,KAAK,CAAC;IAClD,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,GAAa,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAU,EAAE,CAAS,EAAU,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/F,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;QACpB,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,MAAM,CAAC,GAAW,IAAI,CAAC,GAAG,CAAC,CAAC,CAAW,CAAC;YACxC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;gBAAE,KAAK,GAAG,IAAI,CAAC;YAChC,IAAI,SAAS,KAAK,MAAM;gBAAG,IAAI,CAAC,CAAC,CAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;iBAClD,IAAI,SAAS,KAAK,OAAO;gBAAG,IAAI,CAAC,CAAC,CAAc,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;iBAChE,IAAI,SAAS,KAAK,IAAI;gBAAG,IAAI,CAAC,CAAC,CAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;;gBACpD,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACvC,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,WAAW,CAAC,KAAY,EAAE,SAAuB,IAAI,CAAC,MAAM;IAC1E,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,KAAK,CAAC,OAAO,CAAC,CAAC,GAAa,EAAE,CAAS,EAAQ,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAS,EAAE,CAAS,EAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrI,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAqB,CAAC;IAC7E,KAAK,CAAC,CAAC,CAAc,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,aAAa,CAAC,KAAY;IACxC,OAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAW,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACrG,CAAC;AAED,uBAAuB;AACvB,MAAM,UAAU,YAAY,CAAC,KAAY,EAAE,KAAa;IACtD,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAa,EAAU,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,KAAK,EAAE,CAAC;AACxG,CAAC;AAED,2DAA2D;AAC3D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAe;IAChD,IAAI,KAAK,GAAU,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,GAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3E,WAAW,CAAC,KAAK,CAAC,CAAC;IAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,KAAK,GAAW,CAAC,CAAC;IACtB,MAAM,IAAI,GAAqD,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACxJ,IAAI,CAAC;QACH,SAAS,CAAC;YACR,aAAa,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YAC1C,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,GAAa,EAAW,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;gBAAC,MAAM;YAAC,CAAC;YAC9H,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBAAC,MAAM;YAAC,CAAC;YACpF,MAAM,MAAM,GAAW,CAAC,MAAM,aAAa,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACjG,IAAI,MAAM,KAAK,GAAG;gBAAE,MAAM;YAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACxC,IAAI,SAAS,KAAK,SAAS;gBAAE,SAAS;YACtC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC3C,IAAI,CAAC,KAAK,CAAC,KAAK;gBAAE,SAAS;YAC3B,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;YAC1C,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9H,CAAC;IACD,OAAO,WAAW,CAAC,eAAe,KAAK,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;AAC/F,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file `qr`: a QR code in the console, for a phone to read off the screen.
|
|
3
|
+
*
|
|
4
|
+
* A small encoder of its own — byte mode, error correction level L,
|
|
5
|
+
* versions 1 to 10 (up to 271 bytes) — drawn in half-block characters so a
|
|
6
|
+
* code is half as tall as it is wide, with the light modules bright: on a
|
|
7
|
+
* dark console that is what a camera reads. No library: the whole of it
|
|
8
|
+
* is below, and a surface may draw the matrix in the model its own way.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import { CommandEnvelope } from '@fnndsc/cumin';
|
|
13
|
+
/** The most bytes the biggest version here carries. */
|
|
14
|
+
export declare const QR_MAX_BYTES: number;
|
|
15
|
+
/** The Reed–Solomon remainder of `data` for `ec` check codewords. */
|
|
16
|
+
export declare function rs_remainder(data: number[], ec: number): number[];
|
|
17
|
+
/** The penalty of a drawn matrix, by the four rules; lower is better. */
|
|
18
|
+
export declare function penalty_of(dark: boolean[][]): number;
|
|
19
|
+
/**
|
|
20
|
+
* Encodes bytes as a QR matrix.
|
|
21
|
+
*
|
|
22
|
+
* @param text - The text (UTF-8).
|
|
23
|
+
* @param maskForced - A mask to use instead of the least-penalty one (a test's seam).
|
|
24
|
+
* @returns The dark/light matrix, its version and the mask chosen; null when too long.
|
|
25
|
+
*/
|
|
26
|
+
export declare function qr_encode(text: string, maskForced?: number): {
|
|
27
|
+
size: number;
|
|
28
|
+
dark: boolean[][];
|
|
29
|
+
version: number;
|
|
30
|
+
mask: number;
|
|
31
|
+
} | null;
|
|
32
|
+
/**
|
|
33
|
+
* Draws a matrix in half blocks, light modules bright, a quiet zone round it.
|
|
34
|
+
*
|
|
35
|
+
* @param dark - The matrix.
|
|
36
|
+
* @returns The lines.
|
|
37
|
+
*/
|
|
38
|
+
export declare function qr_render(dark: boolean[][]): string[];
|
|
39
|
+
/** `qr <text>` */
|
|
40
|
+
export declare function builtin_qr(args: string[]): Promise<CommandEnvelope>;
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file `qr`: a QR code in the console, for a phone to read off the screen.
|
|
3
|
+
*
|
|
4
|
+
* A small encoder of its own — byte mode, error correction level L,
|
|
5
|
+
* versions 1 to 10 (up to 271 bytes) — drawn in half-block characters so a
|
|
6
|
+
* code is half as tall as it is wide, with the light modules bright: on a
|
|
7
|
+
* dark console that is what a camera reads. No library: the whole of it
|
|
8
|
+
* is below, and a surface may draw the matrix in the model its own way.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import { envelope_ok, envelope_error } from '@fnndsc/cumin';
|
|
13
|
+
import { text_input } from './stdin.js';
|
|
14
|
+
/** Data codewords per version at level L (1..10). */
|
|
15
|
+
const DATA_CODEWORDS = [0, 19, 34, 55, 80, 108, 136, 156, 194, 232, 274];
|
|
16
|
+
/** Error-correction codewords per block, and the block counts, per version at level L. */
|
|
17
|
+
const EC_PER_BLOCK = [0, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18];
|
|
18
|
+
const BLOCKS = [0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4];
|
|
19
|
+
/** Alignment pattern centres per version. */
|
|
20
|
+
const ALIGNMENT = [[], [], [6, 18], [6, 22], [6, 26], [6, 30], [6, 34], [6, 22, 38], [6, 24, 42], [6, 26, 46], [6, 28, 50]];
|
|
21
|
+
/** Version information bits for versions 7..10. */
|
|
22
|
+
const VERSION_BITS = { 7: 0x07c94, 8: 0x085bc, 9: 0x09a99, 10: 0x0a4d3 };
|
|
23
|
+
/** Format information bits for level L, by mask. */
|
|
24
|
+
const FORMAT_BITS = [0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976];
|
|
25
|
+
/** The most bytes the biggest version here carries. */
|
|
26
|
+
export const QR_MAX_BYTES = 271;
|
|
27
|
+
/* -------------------------------------------------- Galois field */
|
|
28
|
+
const EXP = new Array(512).fill(0);
|
|
29
|
+
const LOG = new Array(256).fill(0);
|
|
30
|
+
(() => {
|
|
31
|
+
let x = 1;
|
|
32
|
+
for (let i = 0; i < 255; i++) {
|
|
33
|
+
EXP[i] = x;
|
|
34
|
+
LOG[x] = i;
|
|
35
|
+
x <<= 1;
|
|
36
|
+
if (x & 0x100)
|
|
37
|
+
x ^= 0x11d;
|
|
38
|
+
}
|
|
39
|
+
for (let i = 255; i < 512; i++)
|
|
40
|
+
EXP[i] = EXP[i - 255];
|
|
41
|
+
})();
|
|
42
|
+
const gf_mul = (a, b) => (a === 0 || b === 0 ? 0 : EXP[(LOG[a] + LOG[b]) % 255]);
|
|
43
|
+
/** The Reed–Solomon remainder of `data` for `ec` check codewords. */
|
|
44
|
+
export function rs_remainder(data, ec) {
|
|
45
|
+
let gen = [1];
|
|
46
|
+
for (let i = 0; i < ec; i++) {
|
|
47
|
+
const next = new Array(gen.length + 1).fill(0);
|
|
48
|
+
for (let j = 0; j < gen.length; j++) {
|
|
49
|
+
next[j] ^= gen[j];
|
|
50
|
+
next[j + 1] ^= gf_mul(gen[j], EXP[i]);
|
|
51
|
+
}
|
|
52
|
+
gen = next;
|
|
53
|
+
}
|
|
54
|
+
const rem = new Array(ec).fill(0);
|
|
55
|
+
for (const byte of data) {
|
|
56
|
+
const factor = byte ^ rem.shift();
|
|
57
|
+
rem.push(0);
|
|
58
|
+
for (let j = 0; j < ec; j++)
|
|
59
|
+
rem[j] ^= gf_mul(gen[j + 1], factor);
|
|
60
|
+
}
|
|
61
|
+
return rem;
|
|
62
|
+
}
|
|
63
|
+
function matrix_make(size) {
|
|
64
|
+
return { size, dark: Array.from({ length: size }, () => new Array(size).fill(false)), fixed: Array.from({ length: size }, () => new Array(size).fill(false)) };
|
|
65
|
+
}
|
|
66
|
+
function module_set(m, r, c, dark) {
|
|
67
|
+
m.dark[r][c] = dark;
|
|
68
|
+
m.fixed[r][c] = true;
|
|
69
|
+
}
|
|
70
|
+
function finder_draw(m, r0, c0) {
|
|
71
|
+
for (let r = -1; r <= 7; r++) {
|
|
72
|
+
for (let c = -1; c <= 7; c++) {
|
|
73
|
+
const rr = r0 + r;
|
|
74
|
+
const cc = c0 + c;
|
|
75
|
+
if (rr < 0 || cc < 0 || rr >= m.size || cc >= m.size)
|
|
76
|
+
continue;
|
|
77
|
+
const ring = Math.max(Math.abs(r - 3), Math.abs(c - 3));
|
|
78
|
+
module_set(m, rr, cc, ring !== 2 && ring !== 4);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function functions_draw(m, version) {
|
|
83
|
+
finder_draw(m, 0, 0);
|
|
84
|
+
finder_draw(m, 0, m.size - 7);
|
|
85
|
+
finder_draw(m, m.size - 7, 0);
|
|
86
|
+
for (let i = 8; i < m.size - 8; i++) {
|
|
87
|
+
module_set(m, 6, i, i % 2 === 0);
|
|
88
|
+
module_set(m, i, 6, i % 2 === 0);
|
|
89
|
+
}
|
|
90
|
+
const centres = ALIGNMENT[version] ?? [];
|
|
91
|
+
const outer = centres[centres.length - 1] ?? -1;
|
|
92
|
+
for (const r of centres) {
|
|
93
|
+
for (const c of centres) {
|
|
94
|
+
// The three that would sit on a finder (the first and the outermost
|
|
95
|
+
// centres, paired) are left out; one on the timing pattern is drawn
|
|
96
|
+
// over it, as the standard has it.
|
|
97
|
+
if ((r === 6 && c === 6) || (r === 6 && c === outer) || (r === outer && c === 6))
|
|
98
|
+
continue;
|
|
99
|
+
for (let dr = -2; dr <= 2; dr++)
|
|
100
|
+
for (let dc = -2; dc <= 2; dc++)
|
|
101
|
+
module_set(m, r + dr, c + dc, Math.max(Math.abs(dr), Math.abs(dc)) !== 1);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// The format areas are reserved now and written after the mask is chosen.
|
|
105
|
+
for (let i = 0; i < 9; i++) {
|
|
106
|
+
if (i !== 6) {
|
|
107
|
+
module_set(m, 8, i, false);
|
|
108
|
+
module_set(m, i, 8, false);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
for (let i = 0; i < 8; i++) {
|
|
112
|
+
module_set(m, 8, m.size - 1 - i, false);
|
|
113
|
+
module_set(m, m.size - 1 - i, 8, false);
|
|
114
|
+
}
|
|
115
|
+
module_set(m, m.size - 8, 8, true);
|
|
116
|
+
if (version >= 7) {
|
|
117
|
+
const bits = VERSION_BITS[version];
|
|
118
|
+
for (let i = 0; i < 18; i++) {
|
|
119
|
+
const dark = ((bits >> i) & 1) === 1;
|
|
120
|
+
module_set(m, Math.floor(i / 3), m.size - 11 + (i % 3), dark);
|
|
121
|
+
module_set(m, m.size - 11 + (i % 3), Math.floor(i / 3), dark);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function format_draw(m, mask) {
|
|
126
|
+
const bits = FORMAT_BITS[mask];
|
|
127
|
+
const bit = (i) => ((bits >> i) & 1) === 1;
|
|
128
|
+
// First copy: down column 8 beside the top-left finder, then along row 8.
|
|
129
|
+
for (let i = 0; i <= 5; i++)
|
|
130
|
+
module_set(m, i, 8, bit(i));
|
|
131
|
+
module_set(m, 7, 8, bit(6));
|
|
132
|
+
module_set(m, 8, 8, bit(7));
|
|
133
|
+
module_set(m, 8, 7, bit(8));
|
|
134
|
+
for (let i = 9; i < 15; i++)
|
|
135
|
+
module_set(m, 8, 14 - i, bit(i));
|
|
136
|
+
// Second copy: along row 8 under the top-right finder, down column 8 beside the bottom-left.
|
|
137
|
+
for (let i = 0; i < 8; i++)
|
|
138
|
+
module_set(m, 8, m.size - 1 - i, bit(i));
|
|
139
|
+
for (let i = 8; i < 15; i++)
|
|
140
|
+
module_set(m, m.size - 15 + i, 8, bit(i));
|
|
141
|
+
}
|
|
142
|
+
function mask_bit(mask, r, c) {
|
|
143
|
+
switch (mask) {
|
|
144
|
+
case 0: return (r + c) % 2 === 0;
|
|
145
|
+
case 1: return r % 2 === 0;
|
|
146
|
+
case 2: return c % 3 === 0;
|
|
147
|
+
case 3: return (r + c) % 3 === 0;
|
|
148
|
+
case 4: return (Math.floor(r / 2) + Math.floor(c / 3)) % 2 === 0;
|
|
149
|
+
case 5: return ((r * c) % 2) + ((r * c) % 3) === 0;
|
|
150
|
+
case 6: return (((r * c) % 2) + ((r * c) % 3)) % 2 === 0;
|
|
151
|
+
default: return (((r + c) % 2) + ((r * c) % 3)) % 2 === 0;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
function data_place(m, codewords, mask) {
|
|
155
|
+
let bitIndex = 0;
|
|
156
|
+
const total = codewords.length * 8;
|
|
157
|
+
let upward = true;
|
|
158
|
+
for (let right = m.size - 1; right >= 1; right -= 2) {
|
|
159
|
+
if (right === 6)
|
|
160
|
+
right = 5;
|
|
161
|
+
for (let step = 0; step < m.size; step++) {
|
|
162
|
+
const r = upward ? m.size - 1 - step : step;
|
|
163
|
+
for (const c of [right, right - 1]) {
|
|
164
|
+
if (m.fixed[r][c])
|
|
165
|
+
continue;
|
|
166
|
+
let dark = false;
|
|
167
|
+
if (bitIndex < total) {
|
|
168
|
+
dark = (codewords[bitIndex >> 3] >> (7 - (bitIndex & 7)) & 1) === 1;
|
|
169
|
+
bitIndex++;
|
|
170
|
+
}
|
|
171
|
+
if (mask_bit(mask, r, c))
|
|
172
|
+
dark = !dark;
|
|
173
|
+
m.dark[r][c] = dark;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
upward = !upward;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/** The penalty of a drawn matrix, by the four rules; lower is better. */
|
|
180
|
+
export function penalty_of(dark) {
|
|
181
|
+
const n = dark.length;
|
|
182
|
+
let score = 0;
|
|
183
|
+
const run = (line) => {
|
|
184
|
+
let count = 1;
|
|
185
|
+
for (let i = 1; i <= n; i++) {
|
|
186
|
+
if (i < n && line[i] === line[i - 1]) {
|
|
187
|
+
count++;
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (count >= 5)
|
|
191
|
+
score += 3 + (count - 5);
|
|
192
|
+
count = 1;
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
for (let i = 0; i < n; i++) {
|
|
196
|
+
run(dark[i]);
|
|
197
|
+
run(dark.map((row) => row[i]));
|
|
198
|
+
}
|
|
199
|
+
for (let r = 0; r < n - 1; r++)
|
|
200
|
+
for (let c = 0; c < n - 1; c++) {
|
|
201
|
+
const v = dark[r][c];
|
|
202
|
+
if (v === dark[r][c + 1] && v === dark[r + 1][c] && v === dark[r + 1][c + 1])
|
|
203
|
+
score += 3;
|
|
204
|
+
}
|
|
205
|
+
const pattern = [true, false, true, true, true, false, true, false, false, false, false];
|
|
206
|
+
const matches = (line, start, p) => p.every((v, i) => line[start + i] === v);
|
|
207
|
+
const reversed = [...pattern].reverse();
|
|
208
|
+
for (let i = 0; i < n; i++) {
|
|
209
|
+
const row = dark[i];
|
|
210
|
+
const col = dark.map((r) => r[i]);
|
|
211
|
+
for (let s = 0; s + 11 <= n; s++) {
|
|
212
|
+
if (matches(row, s, pattern) || matches(row, s, reversed))
|
|
213
|
+
score += 40;
|
|
214
|
+
if (matches(col, s, pattern) || matches(col, s, reversed))
|
|
215
|
+
score += 40;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
let darkCount = 0;
|
|
219
|
+
for (const row of dark)
|
|
220
|
+
for (const v of row)
|
|
221
|
+
if (v)
|
|
222
|
+
darkCount++;
|
|
223
|
+
const percent = (darkCount * 100) / (n * n);
|
|
224
|
+
score += Math.floor(Math.abs(percent - 50) / 5) * 10;
|
|
225
|
+
return score;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Encodes bytes as a QR matrix.
|
|
229
|
+
*
|
|
230
|
+
* @param text - The text (UTF-8).
|
|
231
|
+
* @param maskForced - A mask to use instead of the least-penalty one (a test's seam).
|
|
232
|
+
* @returns The dark/light matrix, its version and the mask chosen; null when too long.
|
|
233
|
+
*/
|
|
234
|
+
export function qr_encode(text, maskForced) {
|
|
235
|
+
const bytes = Buffer.from(text, 'utf-8');
|
|
236
|
+
let version = 0;
|
|
237
|
+
for (let v = 1; v <= 10; v++) {
|
|
238
|
+
const capacity = DATA_CODEWORDS[v] - (v >= 10 ? 3 : 2);
|
|
239
|
+
if (bytes.length <= capacity) {
|
|
240
|
+
version = v;
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
if (version === 0)
|
|
245
|
+
return null;
|
|
246
|
+
const dataCount = DATA_CODEWORDS[version];
|
|
247
|
+
// The bit stream: mode 0100, the count (8 bits below version 10, 16 at it), the bytes, a terminator, padding.
|
|
248
|
+
const bits = [];
|
|
249
|
+
const push = (value, width) => { for (let i = width - 1; i >= 0; i--)
|
|
250
|
+
bits.push((value >> i) & 1); };
|
|
251
|
+
push(0b0100, 4);
|
|
252
|
+
push(bytes.length, version >= 10 ? 16 : 8);
|
|
253
|
+
for (const b of bytes)
|
|
254
|
+
push(b, 8);
|
|
255
|
+
push(0, Math.min(4, dataCount * 8 - bits.length));
|
|
256
|
+
while (bits.length % 8 !== 0)
|
|
257
|
+
bits.push(0);
|
|
258
|
+
const data = [];
|
|
259
|
+
for (let i = 0; i < bits.length; i += 8)
|
|
260
|
+
data.push(bits.slice(i, i + 8).reduce((a, b) => (a << 1) | b, 0));
|
|
261
|
+
for (let pad = 0; data.length < dataCount; pad++)
|
|
262
|
+
data.push(pad % 2 === 0 ? 0xec : 0x11);
|
|
263
|
+
// Blocks: the short ones first, then the long; interleaved for the stream.
|
|
264
|
+
const blocks = BLOCKS[version];
|
|
265
|
+
const ec = EC_PER_BLOCK[version];
|
|
266
|
+
const shortLength = Math.floor(dataCount / blocks);
|
|
267
|
+
const longBlocks = dataCount % blocks;
|
|
268
|
+
const dataBlocks = [];
|
|
269
|
+
const ecBlocks = [];
|
|
270
|
+
let at = 0;
|
|
271
|
+
for (let b = 0; b < blocks; b++) {
|
|
272
|
+
const length = shortLength + (b >= blocks - longBlocks ? 1 : 0);
|
|
273
|
+
const block = data.slice(at, at + length);
|
|
274
|
+
at += length;
|
|
275
|
+
dataBlocks.push(block);
|
|
276
|
+
ecBlocks.push(rs_remainder(block, ec));
|
|
277
|
+
}
|
|
278
|
+
const codewords = [];
|
|
279
|
+
for (let i = 0; i <= shortLength; i++)
|
|
280
|
+
for (const block of dataBlocks)
|
|
281
|
+
if (i < block.length)
|
|
282
|
+
codewords.push(block[i]);
|
|
283
|
+
for (let i = 0; i < ec; i++)
|
|
284
|
+
for (const block of ecBlocks)
|
|
285
|
+
codewords.push(block[i]);
|
|
286
|
+
// Every mask drawn; the one with the least penalty stands.
|
|
287
|
+
const size = 17 + version * 4;
|
|
288
|
+
let best = null;
|
|
289
|
+
for (let mask = 0; mask < 8; mask++) {
|
|
290
|
+
if (maskForced !== undefined && mask !== maskForced)
|
|
291
|
+
continue;
|
|
292
|
+
const m = matrix_make(size);
|
|
293
|
+
functions_draw(m, version);
|
|
294
|
+
data_place(m, codewords, mask);
|
|
295
|
+
format_draw(m, mask);
|
|
296
|
+
const penalty = penalty_of(m.dark);
|
|
297
|
+
if (best === null || penalty < best.penalty)
|
|
298
|
+
best = { dark: m.dark, mask, penalty };
|
|
299
|
+
}
|
|
300
|
+
return { size, dark: best.dark, version, mask: best.mask };
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Draws a matrix in half blocks, light modules bright, a quiet zone round it.
|
|
304
|
+
*
|
|
305
|
+
* @param dark - The matrix.
|
|
306
|
+
* @returns The lines.
|
|
307
|
+
*/
|
|
308
|
+
export function qr_render(dark) {
|
|
309
|
+
const n = dark.length;
|
|
310
|
+
const quiet = 2;
|
|
311
|
+
const light = (r, c) => r < 0 || c < 0 || r >= n || c >= n ? true : !dark[r][c];
|
|
312
|
+
const lines = [];
|
|
313
|
+
for (let r = -quiet; r < n + quiet; r += 2) {
|
|
314
|
+
let line = '';
|
|
315
|
+
for (let c = -quiet; c < n + quiet; c++) {
|
|
316
|
+
const top = light(r, c);
|
|
317
|
+
const bottom = light(r + 1, c);
|
|
318
|
+
line += top && bottom ? '█' : top ? '▀' : bottom ? '▄' : ' ';
|
|
319
|
+
}
|
|
320
|
+
lines.push(line);
|
|
321
|
+
}
|
|
322
|
+
return lines;
|
|
323
|
+
}
|
|
324
|
+
/** `qr <text>` */
|
|
325
|
+
export async function builtin_qr(args) {
|
|
326
|
+
const text = text_input(args);
|
|
327
|
+
if (text === null)
|
|
328
|
+
return envelope_error('', undefined, 'qr: usage: qr <text or URL> (up to 271 bytes)\n');
|
|
329
|
+
const said = text.replace(/\n$/, '');
|
|
330
|
+
const code = qr_encode(said);
|
|
331
|
+
if (code === null)
|
|
332
|
+
return envelope_error('', undefined, `qr: too long for the codes drawn here (${Buffer.byteLength(said, 'utf-8')} bytes; at most ${QR_MAX_BYTES})\n`);
|
|
333
|
+
const rows = code.dark.map((row) => row.map((d) => (d ? '1' : '0')).join(''));
|
|
334
|
+
return envelope_ok(`${qr_render(code.dark).join('\n')}\n`, { kind: 'games.qr', data: { text: said, version: code.version, size: code.size, rows } });
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=qr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr.js","sourceRoot":"","sources":["../../../src/builtins/games/qr.ts"],"names":[],"mappings":"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"}
|