@twin.org/qr 0.0.2-next.8 → 0.0.3-next.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/es/data/qrAlphaNumeric.js +79 -0
- package/dist/es/data/qrAlphaNumeric.js.map +1 -0
- package/dist/es/data/qrByte8.js +63 -0
- package/dist/es/data/qrByte8.js.map +1 -0
- package/dist/es/data/qrDataBase.js +102 -0
- package/dist/es/data/qrDataBase.js.map +1 -0
- package/dist/es/data/qrNumber.js +73 -0
- package/dist/es/data/qrNumber.js.map +1 -0
- package/dist/es/helpers/bitBuffer.js +79 -0
- package/dist/es/helpers/bitBuffer.js.map +1 -0
- package/dist/es/helpers/mathHelper.js +71 -0
- package/dist/es/helpers/mathHelper.js.map +1 -0
- package/dist/es/helpers/polynomial.js +117 -0
- package/dist/es/helpers/polynomial.js.map +1 -0
- package/dist/es/helpers/qrHelper.js +269 -0
- package/dist/es/helpers/qrHelper.js.map +1 -0
- package/dist/es/helpers/rsBlock.js +293 -0
- package/dist/es/helpers/rsBlock.js.map +1 -0
- package/dist/es/index.js +12 -0
- package/dist/es/index.js.map +1 -0
- package/dist/es/models/IBitmapRendererOptions.js +2 -0
- package/dist/es/models/IBitmapRendererOptions.js.map +1 -0
- package/dist/es/models/IRendererOptions.js +4 -0
- package/dist/es/models/IRendererOptions.js.map +1 -0
- package/dist/es/models/ITextRendererOptions.js +2 -0
- package/dist/es/models/ITextRendererOptions.js.map +1 -0
- package/dist/es/models/errorCorrectLevel.js +26 -0
- package/dist/es/models/errorCorrectLevel.js.map +1 -0
- package/dist/es/models/maskPattern.js +42 -0
- package/dist/es/models/maskPattern.js.map +1 -0
- package/dist/es/models/qrCellData.js +2 -0
- package/dist/es/models/qrCellData.js.map +1 -0
- package/dist/es/models/qrDataMode.js +22 -0
- package/dist/es/models/qrDataMode.js.map +1 -0
- package/dist/es/qr.js +551 -0
- package/dist/es/qr.js.map +1 -0
- package/dist/es/renderers/jpegRenderer.js +80 -0
- package/dist/es/renderers/jpegRenderer.js.map +1 -0
- package/dist/es/renderers/pngRenderer.js +80 -0
- package/dist/es/renderers/pngRenderer.js.map +1 -0
- package/dist/es/renderers/textRenderer.js +65 -0
- package/dist/es/renderers/textRenderer.js.map +1 -0
- package/dist/types/data/qrAlphaNumeric.d.ts +6 -2
- package/dist/types/data/qrByte8.d.ts +2 -2
- package/dist/types/{models → data}/qrDataBase.d.ts +7 -4
- package/dist/types/data/qrNumber.d.ts +6 -2
- package/dist/types/helpers/mathHelper.d.ts +4 -0
- package/dist/types/helpers/polynomial.d.ts +1 -1
- package/dist/types/helpers/qrHelper.d.ts +7 -3
- package/dist/types/helpers/rsBlock.d.ts +5 -1
- package/dist/types/index.d.ts +9 -9
- package/dist/types/models/IBitmapRendererOptions.d.ts +1 -1
- package/dist/types/models/ITextRendererOptions.d.ts +1 -1
- package/dist/types/qr.d.ts +6 -2
- package/dist/types/renderers/jpegRenderer.d.ts +6 -2
- package/dist/types/renderers/pngRenderer.d.ts +6 -2
- package/dist/types/renderers/textRenderer.d.ts +6 -2
- package/docs/changelog.md +295 -0
- package/docs/reference/classes/JpegRenderer.md +8 -0
- package/docs/reference/classes/PngRenderer.md +8 -0
- package/docs/reference/classes/QR.md +8 -0
- package/docs/reference/classes/TextRenderer.md +8 -0
- package/locales/en.json +9 -9
- package/package.json +20 -11
- package/dist/cjs/index.cjs +0 -1999
- package/dist/esm/index.mjs +0 -1993
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// Copyright 2024 IOTA Stiftung.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0.
|
|
3
|
+
/* eslint-disable no-mixed-operators */
|
|
4
|
+
import { GeneralError } from "@twin.org/core";
|
|
5
|
+
import { QRDataBase } from "./qrDataBase.js";
|
|
6
|
+
import { QRDataMode } from "../models/qrDataMode.js";
|
|
7
|
+
/**
|
|
8
|
+
* QR Data for representing a alpha numeric.
|
|
9
|
+
* Based on https://github.com/kazuhikoarase/qrcode-generator/ .
|
|
10
|
+
*/
|
|
11
|
+
export class QRAlphaNumeric extends QRDataBase {
|
|
12
|
+
/**
|
|
13
|
+
* Runtime name for the class.
|
|
14
|
+
*/
|
|
15
|
+
static CLASS_NAME = "QRAlphaNumeric";
|
|
16
|
+
/**
|
|
17
|
+
* Create a new instance of QRAlphaNumeric.
|
|
18
|
+
* @param data The data for the qr alpha numeric.
|
|
19
|
+
*/
|
|
20
|
+
constructor(data) {
|
|
21
|
+
super(QRDataMode.AlphaNumeric, data);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get the length of the data.
|
|
25
|
+
* @returns The length of the data.
|
|
26
|
+
*/
|
|
27
|
+
getLength() {
|
|
28
|
+
return this.getData().length;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Write data into the buffer.
|
|
32
|
+
* @param buffer The buffer to write into.
|
|
33
|
+
*/
|
|
34
|
+
write(buffer) {
|
|
35
|
+
const s = this.getData();
|
|
36
|
+
let i = 0;
|
|
37
|
+
while (i + 1 < s.length) {
|
|
38
|
+
buffer.put(this.getCode(s.charAt(i)) * 45 + this.getCode(s.charAt(i + 1)), 11);
|
|
39
|
+
i += 2;
|
|
40
|
+
}
|
|
41
|
+
if (i < s.length) {
|
|
42
|
+
buffer.put(this.getCode(s.charAt(i)), 6);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* @internal
|
|
47
|
+
*/
|
|
48
|
+
getCode(c) {
|
|
49
|
+
if (c >= "0" && c <= "9") {
|
|
50
|
+
return c.charCodeAt(0) - "0".charCodeAt(0);
|
|
51
|
+
}
|
|
52
|
+
if (c >= "A" && c <= "Z") {
|
|
53
|
+
return c.charCodeAt(0) - "A".charCodeAt(0) + 10;
|
|
54
|
+
}
|
|
55
|
+
switch (c) {
|
|
56
|
+
case " ":
|
|
57
|
+
return 36;
|
|
58
|
+
case "$":
|
|
59
|
+
return 37;
|
|
60
|
+
case "%":
|
|
61
|
+
return 38;
|
|
62
|
+
case "*":
|
|
63
|
+
return 39;
|
|
64
|
+
case "+":
|
|
65
|
+
return 40;
|
|
66
|
+
case "-":
|
|
67
|
+
return 41;
|
|
68
|
+
case ".":
|
|
69
|
+
return 42;
|
|
70
|
+
case "/":
|
|
71
|
+
return 43;
|
|
72
|
+
case ":":
|
|
73
|
+
return 44;
|
|
74
|
+
default:
|
|
75
|
+
throw new GeneralError(QRAlphaNumeric.CLASS_NAME, "illegalCharacter", { value: c });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=qrAlphaNumeric.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qrAlphaNumeric.js","sourceRoot":"","sources":["../../../src/data/qrAlphaNumeric.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,uCAAuC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,UAAU;IAC7C;;OAEG;IACI,MAAM,CAAU,UAAU,oBAAoC;IAErE;;;OAGG;IACH,YAAY,IAAY;QACvB,KAAK,CAAC,UAAU,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAED;;;OAGG;IACI,SAAS;QACf,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,MAAiB;QAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/E,CAAC,IAAI,CAAC,CAAC;QACR,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC;IACF,CAAC;IAED;;OAEG;IACK,OAAO,CAAC,CAAS;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;YAC1B,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;YAC1B,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACjD,CAAC;QACD,QAAQ,CAAC,EAAE,CAAC;YACX,KAAK,GAAG;gBACP,OAAO,EAAE,CAAC;YACX,KAAK,GAAG;gBACP,OAAO,EAAE,CAAC;YACX,KAAK,GAAG;gBACP,OAAO,EAAE,CAAC;YACX,KAAK,GAAG;gBACP,OAAO,EAAE,CAAC;YACX,KAAK,GAAG;gBACP,OAAO,EAAE,CAAC;YACX,KAAK,GAAG;gBACP,OAAO,EAAE,CAAC;YACX,KAAK,GAAG;gBACP,OAAO,EAAE,CAAC;YACX,KAAK,GAAG;gBACP,OAAO,EAAE,CAAC;YACX,KAAK,GAAG;gBACP,OAAO,EAAE,CAAC;YACX;gBACC,MAAM,IAAI,YAAY,CAAC,cAAc,CAAC,UAAU,EAAE,kBAAkB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACtF,CAAC;IACF,CAAC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n/* eslint-disable no-mixed-operators */\nimport { GeneralError } from \"@twin.org/core\";\nimport { nameof } from \"@twin.org/nameof\";\nimport { QRDataBase } from \"./qrDataBase.js\";\nimport type { BitBuffer } from \"../helpers/bitBuffer.js\";\nimport { QRDataMode } from \"../models/qrDataMode.js\";\n\n/**\n * QR Data for representing a alpha numeric.\n * Based on https://github.com/kazuhikoarase/qrcode-generator/ .\n */\nexport class QRAlphaNumeric extends QRDataBase {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<QRAlphaNumeric>();\n\n\t/**\n\t * Create a new instance of QRAlphaNumeric.\n\t * @param data The data for the qr alpha numeric.\n\t */\n\tconstructor(data: string) {\n\t\tsuper(QRDataMode.AlphaNumeric, data);\n\t}\n\n\t/**\n\t * Get the length of the data.\n\t * @returns The length of the data.\n\t */\n\tpublic getLength(): number {\n\t\treturn this.getData().length;\n\t}\n\n\t/**\n\t * Write data into the buffer.\n\t * @param buffer The buffer to write into.\n\t */\n\tpublic write(buffer: BitBuffer): void {\n\t\tconst s = this.getData();\n\t\tlet i = 0;\n\n\t\twhile (i + 1 < s.length) {\n\t\t\tbuffer.put(this.getCode(s.charAt(i)) * 45 + this.getCode(s.charAt(i + 1)), 11);\n\t\t\ti += 2;\n\t\t}\n\n\t\tif (i < s.length) {\n\t\t\tbuffer.put(this.getCode(s.charAt(i)), 6);\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tprivate getCode(c: string): number {\n\t\tif (c >= \"0\" && c <= \"9\") {\n\t\t\treturn c.charCodeAt(0) - \"0\".charCodeAt(0);\n\t\t}\n\t\tif (c >= \"A\" && c <= \"Z\") {\n\t\t\treturn c.charCodeAt(0) - \"A\".charCodeAt(0) + 10;\n\t\t}\n\t\tswitch (c) {\n\t\t\tcase \" \":\n\t\t\t\treturn 36;\n\t\t\tcase \"$\":\n\t\t\t\treturn 37;\n\t\t\tcase \"%\":\n\t\t\t\treturn 38;\n\t\t\tcase \"*\":\n\t\t\t\treturn 39;\n\t\t\tcase \"+\":\n\t\t\t\treturn 40;\n\t\t\tcase \"-\":\n\t\t\t\treturn 41;\n\t\t\tcase \".\":\n\t\t\t\treturn 42;\n\t\t\tcase \"/\":\n\t\t\t\treturn 43;\n\t\t\tcase \":\":\n\t\t\t\treturn 44;\n\t\t\tdefault:\n\t\t\t\tthrow new GeneralError(QRAlphaNumeric.CLASS_NAME, \"illegalCharacter\", { value: c });\n\t\t}\n\t}\n}\n"]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// Copyright 2024 IOTA Stiftung.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0.
|
|
3
|
+
/* eslint-disable no-bitwise */
|
|
4
|
+
import { QRDataBase } from "./qrDataBase.js";
|
|
5
|
+
import { QRDataMode } from "../models/qrDataMode.js";
|
|
6
|
+
/**
|
|
7
|
+
* QR Data for representing a 8 bit data.
|
|
8
|
+
* Based on https://github.com/kazuhikoarase/qrcode-generator/ .
|
|
9
|
+
*/
|
|
10
|
+
export class QRByte8 extends QRDataBase {
|
|
11
|
+
/**
|
|
12
|
+
* Create a new instance of QRByte8.
|
|
13
|
+
* @param data The data for the qr 8 bit data.
|
|
14
|
+
*/
|
|
15
|
+
constructor(data) {
|
|
16
|
+
super(QRDataMode.Byte8, data);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get the length of the data.
|
|
20
|
+
* @returns The length of the data.
|
|
21
|
+
*/
|
|
22
|
+
getLength() {
|
|
23
|
+
return this.stringToBytes(this.getData()).length;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Write data into the buffer.
|
|
27
|
+
* @param buffer The buffer to write into.
|
|
28
|
+
*/
|
|
29
|
+
write(buffer) {
|
|
30
|
+
const data = this.stringToBytes(this.getData());
|
|
31
|
+
for (let i = 0; i < data.length; i++) {
|
|
32
|
+
buffer.put(data[i], 8);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* @internal
|
|
37
|
+
*/
|
|
38
|
+
stringToBytes(str) {
|
|
39
|
+
const utf8 = [];
|
|
40
|
+
for (let i = 0; i < str.length; i++) {
|
|
41
|
+
let charCode = str.charCodeAt(i);
|
|
42
|
+
if (charCode < 0x80) {
|
|
43
|
+
utf8.push(charCode);
|
|
44
|
+
}
|
|
45
|
+
else if (charCode < 0x800) {
|
|
46
|
+
utf8.push(0xc0 | (charCode >> 6), 0x80 | (charCode & 0x3f));
|
|
47
|
+
}
|
|
48
|
+
else if (charCode < 0xd800 || charCode >= 0xe000) {
|
|
49
|
+
utf8.push(0xe0 | (charCode >> 12), 0x80 | ((charCode >> 6) & 0x3f), 0x80 | (charCode & 0x3f));
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
i++;
|
|
53
|
+
// UTF-16 encodes 0x10000-0x10FFFF by
|
|
54
|
+
// subtracting 0x10000 and splitting the
|
|
55
|
+
// 20 bits of 0x0-0xFFFFF into two halves
|
|
56
|
+
charCode = 0x10000 + (((charCode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));
|
|
57
|
+
utf8.push(0xf0 | (charCode >> 18), 0x80 | ((charCode >> 12) & 0x3f), 0x80 | ((charCode >> 6) & 0x3f), 0x80 | (charCode & 0x3f));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return utf8;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=qrByte8.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qrByte8.js","sourceRoot":"","sources":["../../../src/data/qrByte8.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,+BAA+B;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD;;;GAGG;AACH,MAAM,OAAO,OAAQ,SAAQ,UAAU;IACtC;;;OAGG;IACH,YAAY,IAAY;QACvB,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACI,SAAS;QACf,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;IAClD,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,MAAiB;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxB,CAAC;IACF,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,GAAW;QAChC,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,QAAQ,GAAG,IAAI,EAAE,CAAC;gBACrB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrB,CAAC;iBAAM,IAAI,QAAQ,GAAG,KAAK,EAAE,CAAC;gBAC7B,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC;YAC7D,CAAC;iBAAM,IAAI,QAAQ,GAAG,MAAM,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;gBACpD,IAAI,CAAC,IAAI,CACR,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EACvB,IAAI,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,EAC/B,IAAI,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,CACxB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACP,CAAC,EAAE,CAAC;gBACJ,qCAAqC;gBACrC,wCAAwC;gBACxC,yCAAyC;gBACzC,QAAQ,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;gBAChF,IAAI,CAAC,IAAI,CACR,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EACvB,IAAI,GAAG,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,EAChC,IAAI,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,EAC/B,IAAI,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,CACxB,CAAC;YACH,CAAC;QACF,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;CACD","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n/* eslint-disable no-bitwise */\nimport { QRDataBase } from \"./qrDataBase.js\";\nimport type { BitBuffer } from \"../helpers/bitBuffer.js\";\nimport { QRDataMode } from \"../models/qrDataMode.js\";\n\n/**\n * QR Data for representing a 8 bit data.\n * Based on https://github.com/kazuhikoarase/qrcode-generator/ .\n */\nexport class QRByte8 extends QRDataBase {\n\t/**\n\t * Create a new instance of QRByte8.\n\t * @param data The data for the qr 8 bit data.\n\t */\n\tconstructor(data: string) {\n\t\tsuper(QRDataMode.Byte8, data);\n\t}\n\n\t/**\n\t * Get the length of the data.\n\t * @returns The length of the data.\n\t */\n\tpublic getLength(): number {\n\t\treturn this.stringToBytes(this.getData()).length;\n\t}\n\n\t/**\n\t * Write data into the buffer.\n\t * @param buffer The buffer to write into.\n\t */\n\tpublic write(buffer: BitBuffer): void {\n\t\tconst data = this.stringToBytes(this.getData());\n\t\tfor (let i = 0; i < data.length; i++) {\n\t\t\tbuffer.put(data[i], 8);\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tprivate stringToBytes(str: string): number[] {\n\t\tconst utf8: number[] = [];\n\t\tfor (let i = 0; i < str.length; i++) {\n\t\t\tlet charCode = str.charCodeAt(i);\n\t\t\tif (charCode < 0x80) {\n\t\t\t\tutf8.push(charCode);\n\t\t\t} else if (charCode < 0x800) {\n\t\t\t\tutf8.push(0xc0 | (charCode >> 6), 0x80 | (charCode & 0x3f));\n\t\t\t} else if (charCode < 0xd800 || charCode >= 0xe000) {\n\t\t\t\tutf8.push(\n\t\t\t\t\t0xe0 | (charCode >> 12),\n\t\t\t\t\t0x80 | ((charCode >> 6) & 0x3f),\n\t\t\t\t\t0x80 | (charCode & 0x3f)\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\ti++;\n\t\t\t\t// UTF-16 encodes 0x10000-0x10FFFF by\n\t\t\t\t// subtracting 0x10000 and splitting the\n\t\t\t\t// 20 bits of 0x0-0xFFFFF into two halves\n\t\t\t\tcharCode = 0x10000 + (((charCode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));\n\t\t\t\tutf8.push(\n\t\t\t\t\t0xf0 | (charCode >> 18),\n\t\t\t\t\t0x80 | ((charCode >> 12) & 0x3f),\n\t\t\t\t\t0x80 | ((charCode >> 6) & 0x3f),\n\t\t\t\t\t0x80 | (charCode & 0x3f)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn utf8;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// Copyright 2024 IOTA Stiftung.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0.
|
|
3
|
+
import { GeneralError } from "@twin.org/core";
|
|
4
|
+
import { QRDataMode } from "../models/qrDataMode.js";
|
|
5
|
+
/**
|
|
6
|
+
* Base class for storing QR Data.
|
|
7
|
+
* Based on https://github.com/kazuhikoarase/qrcode-generator/ .
|
|
8
|
+
*/
|
|
9
|
+
export class QRDataBase {
|
|
10
|
+
/**
|
|
11
|
+
* Runtime name for the class.
|
|
12
|
+
*/
|
|
13
|
+
static CLASS_NAME = "QRDataBase";
|
|
14
|
+
/**
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
_mode;
|
|
18
|
+
/**
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
21
|
+
_data;
|
|
22
|
+
/**
|
|
23
|
+
* Create a new instance of QRDataBase.
|
|
24
|
+
* @param mode The mode for the data.
|
|
25
|
+
* @param data The data.
|
|
26
|
+
*/
|
|
27
|
+
constructor(mode, data) {
|
|
28
|
+
this._mode = mode;
|
|
29
|
+
this._data = data;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get the data mode.
|
|
33
|
+
* @returns The data mode.
|
|
34
|
+
*/
|
|
35
|
+
getMode() {
|
|
36
|
+
return this._mode;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get the data for the qr.
|
|
40
|
+
* @returns The data.
|
|
41
|
+
*/
|
|
42
|
+
getData() {
|
|
43
|
+
return this._data;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get the length in bits of the data.
|
|
47
|
+
* @param typeNumber The type number to get the length for.
|
|
48
|
+
* @returns The length in bits.
|
|
49
|
+
* @throws Error if the typeNumber if invalid.
|
|
50
|
+
*/
|
|
51
|
+
getLengthInBits(typeNumber) {
|
|
52
|
+
if (typeNumber >= 1 && typeNumber < 10) {
|
|
53
|
+
switch (this._mode) {
|
|
54
|
+
case QRDataMode.Number:
|
|
55
|
+
return 10;
|
|
56
|
+
case QRDataMode.AlphaNumeric:
|
|
57
|
+
return 9;
|
|
58
|
+
case QRDataMode.Byte8:
|
|
59
|
+
return 8;
|
|
60
|
+
default:
|
|
61
|
+
throw new GeneralError(QRDataBase.CLASS_NAME, "invalidMode", {
|
|
62
|
+
typeNumber,
|
|
63
|
+
mode: this._mode
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else if (typeNumber < 27) {
|
|
68
|
+
switch (this._mode) {
|
|
69
|
+
case QRDataMode.Number:
|
|
70
|
+
return 12;
|
|
71
|
+
case QRDataMode.AlphaNumeric:
|
|
72
|
+
return 11;
|
|
73
|
+
case QRDataMode.Byte8:
|
|
74
|
+
return 16;
|
|
75
|
+
default:
|
|
76
|
+
throw new GeneralError(QRDataBase.CLASS_NAME, "invalidMode", {
|
|
77
|
+
typeNumber,
|
|
78
|
+
mode: this._mode
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else if (typeNumber < 41) {
|
|
83
|
+
switch (this._mode) {
|
|
84
|
+
case QRDataMode.Number:
|
|
85
|
+
return 14;
|
|
86
|
+
case QRDataMode.AlphaNumeric:
|
|
87
|
+
return 13;
|
|
88
|
+
case QRDataMode.Byte8:
|
|
89
|
+
return 16;
|
|
90
|
+
default:
|
|
91
|
+
throw new GeneralError(QRDataBase.CLASS_NAME, "invalidMode", {
|
|
92
|
+
typeNumber,
|
|
93
|
+
mode: this._mode
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
throw new GeneralError(QRDataBase.CLASS_NAME, "invalidTypeNumber", { typeNumber });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=qrDataBase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qrDataBase.js","sourceRoot":"","sources":["../../../src/data/qrDataBase.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD;;;GAGG;AACH,MAAM,OAAgB,UAAU;IAC/B;;OAEG;IACI,MAAM,CAAU,UAAU,gBAAgC;IAEjE;;OAEG;IACc,KAAK,CAAa;IAEnC;;OAEG;IACc,KAAK,CAAS;IAE/B;;;;OAIG;IACH,YAAY,IAAgB,EAAE,IAAY;QACzC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACI,OAAO;QACb,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;IAED;;;OAGG;IACI,OAAO;QACb,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACI,eAAe,CAAC,UAAkB;QACxC,IAAI,UAAU,IAAI,CAAC,IAAI,UAAU,GAAG,EAAE,EAAE,CAAC;YACxC,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;gBACpB,KAAK,UAAU,CAAC,MAAM;oBACrB,OAAO,EAAE,CAAC;gBACX,KAAK,UAAU,CAAC,YAAY;oBAC3B,OAAO,CAAC,CAAC;gBACV,KAAK,UAAU,CAAC,KAAK;oBACpB,OAAO,CAAC,CAAC;gBACV;oBACC,MAAM,IAAI,YAAY,CAAC,UAAU,CAAC,UAAU,EAAE,aAAa,EAAE;wBAC5D,UAAU;wBACV,IAAI,EAAE,IAAI,CAAC,KAAK;qBAChB,CAAC,CAAC;YACL,CAAC;QACF,CAAC;aAAM,IAAI,UAAU,GAAG,EAAE,EAAE,CAAC;YAC5B,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;gBACpB,KAAK,UAAU,CAAC,MAAM;oBACrB,OAAO,EAAE,CAAC;gBACX,KAAK,UAAU,CAAC,YAAY;oBAC3B,OAAO,EAAE,CAAC;gBACX,KAAK,UAAU,CAAC,KAAK;oBACpB,OAAO,EAAE,CAAC;gBACX;oBACC,MAAM,IAAI,YAAY,CAAC,UAAU,CAAC,UAAU,EAAE,aAAa,EAAE;wBAC5D,UAAU;wBACV,IAAI,EAAE,IAAI,CAAC,KAAK;qBAChB,CAAC,CAAC;YACL,CAAC;QACF,CAAC;aAAM,IAAI,UAAU,GAAG,EAAE,EAAE,CAAC;YAC5B,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;gBACpB,KAAK,UAAU,CAAC,MAAM;oBACrB,OAAO,EAAE,CAAC;gBACX,KAAK,UAAU,CAAC,YAAY;oBAC3B,OAAO,EAAE,CAAC;gBACX,KAAK,UAAU,CAAC,KAAK;oBACpB,OAAO,EAAE,CAAC;gBACX;oBACC,MAAM,IAAI,YAAY,CAAC,UAAU,CAAC,UAAU,EAAE,aAAa,EAAE;wBAC5D,UAAU;wBACV,IAAI,EAAE,IAAI,CAAC,KAAK;qBAChB,CAAC,CAAC;YACL,CAAC;QACF,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,YAAY,CAAC,UAAU,CAAC,UAAU,EAAE,mBAAmB,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QACpF,CAAC;IACF,CAAC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { GeneralError } from \"@twin.org/core\";\nimport { nameof } from \"@twin.org/nameof\";\nimport type { BitBuffer } from \"../helpers/bitBuffer.js\";\nimport { QRDataMode } from \"../models/qrDataMode.js\";\n\n/**\n * Base class for storing QR Data.\n * Based on https://github.com/kazuhikoarase/qrcode-generator/ .\n */\nexport abstract class QRDataBase {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<QRDataBase>();\n\n\t/**\n\t * @internal\n\t */\n\tprivate readonly _mode: QRDataMode;\n\n\t/**\n\t * @internal\n\t */\n\tprivate readonly _data: string;\n\n\t/**\n\t * Create a new instance of QRDataBase.\n\t * @param mode The mode for the data.\n\t * @param data The data.\n\t */\n\tconstructor(mode: QRDataMode, data: string) {\n\t\tthis._mode = mode;\n\t\tthis._data = data;\n\t}\n\n\t/**\n\t * Get the data mode.\n\t * @returns The data mode.\n\t */\n\tpublic getMode(): QRDataMode {\n\t\treturn this._mode;\n\t}\n\n\t/**\n\t * Get the data for the qr.\n\t * @returns The data.\n\t */\n\tpublic getData(): string {\n\t\treturn this._data;\n\t}\n\n\t/**\n\t * Get the length in bits of the data.\n\t * @param typeNumber The type number to get the length for.\n\t * @returns The length in bits.\n\t * @throws Error if the typeNumber if invalid.\n\t */\n\tpublic getLengthInBits(typeNumber: number): number {\n\t\tif (typeNumber >= 1 && typeNumber < 10) {\n\t\t\tswitch (this._mode) {\n\t\t\t\tcase QRDataMode.Number:\n\t\t\t\t\treturn 10;\n\t\t\t\tcase QRDataMode.AlphaNumeric:\n\t\t\t\t\treturn 9;\n\t\t\t\tcase QRDataMode.Byte8:\n\t\t\t\t\treturn 8;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new GeneralError(QRDataBase.CLASS_NAME, \"invalidMode\", {\n\t\t\t\t\t\ttypeNumber,\n\t\t\t\t\t\tmode: this._mode\n\t\t\t\t\t});\n\t\t\t}\n\t\t} else if (typeNumber < 27) {\n\t\t\tswitch (this._mode) {\n\t\t\t\tcase QRDataMode.Number:\n\t\t\t\t\treturn 12;\n\t\t\t\tcase QRDataMode.AlphaNumeric:\n\t\t\t\t\treturn 11;\n\t\t\t\tcase QRDataMode.Byte8:\n\t\t\t\t\treturn 16;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new GeneralError(QRDataBase.CLASS_NAME, \"invalidMode\", {\n\t\t\t\t\t\ttypeNumber,\n\t\t\t\t\t\tmode: this._mode\n\t\t\t\t\t});\n\t\t\t}\n\t\t} else if (typeNumber < 41) {\n\t\t\tswitch (this._mode) {\n\t\t\t\tcase QRDataMode.Number:\n\t\t\t\t\treturn 14;\n\t\t\t\tcase QRDataMode.AlphaNumeric:\n\t\t\t\t\treturn 13;\n\t\t\t\tcase QRDataMode.Byte8:\n\t\t\t\t\treturn 16;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new GeneralError(QRDataBase.CLASS_NAME, \"invalidMode\", {\n\t\t\t\t\t\ttypeNumber,\n\t\t\t\t\t\tmode: this._mode\n\t\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new GeneralError(QRDataBase.CLASS_NAME, \"invalidTypeNumber\", { typeNumber });\n\t\t}\n\t}\n\n\t/**\n\t * Get the length of the data.\n\t * @returns The length of the data.\n\t */\n\tpublic abstract getLength(): number;\n\n\t/**\n\t * Write data into the buffer.\n\t * @param buffer The buffer to write into.\n\t */\n\tpublic abstract write(buffer: BitBuffer): void;\n}\n"]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// Copyright 2024 IOTA Stiftung.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0.
|
|
3
|
+
/* eslint-disable no-mixed-operators */
|
|
4
|
+
import { GeneralError } from "@twin.org/core";
|
|
5
|
+
import { QRDataBase } from "./qrDataBase.js";
|
|
6
|
+
import { QRDataMode } from "../models/qrDataMode.js";
|
|
7
|
+
/**
|
|
8
|
+
* QR Data for representing a number.
|
|
9
|
+
* Based on https://github.com/kazuhikoarase/qrcode-generator/ .
|
|
10
|
+
*/
|
|
11
|
+
export class QRNumber extends QRDataBase {
|
|
12
|
+
/**
|
|
13
|
+
* Runtime name for the class.
|
|
14
|
+
*/
|
|
15
|
+
static CLASS_NAME = "QRNumber";
|
|
16
|
+
/**
|
|
17
|
+
* Create a new instance of QRNumber.
|
|
18
|
+
* @param data The data for the qr number.
|
|
19
|
+
*/
|
|
20
|
+
constructor(data) {
|
|
21
|
+
super(QRDataMode.Number, data);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get the length of the data.
|
|
25
|
+
* @returns The length of the data.
|
|
26
|
+
*/
|
|
27
|
+
getLength() {
|
|
28
|
+
return this.getData().length;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Write data into the buffer.
|
|
32
|
+
* @param buffer The buffer to write into.
|
|
33
|
+
*/
|
|
34
|
+
write(buffer) {
|
|
35
|
+
const data = this.getData();
|
|
36
|
+
let i = 0;
|
|
37
|
+
while (i + 2 < data.length) {
|
|
38
|
+
// eslint-disable-next-line unicorn/prefer-string-slice
|
|
39
|
+
buffer.put(this.strToNum(data.substring(i, i + 3)), 10);
|
|
40
|
+
i += 3;
|
|
41
|
+
}
|
|
42
|
+
if (i < data.length) {
|
|
43
|
+
if (data.length - i === 1) {
|
|
44
|
+
// eslint-disable-next-line unicorn/prefer-string-slice
|
|
45
|
+
buffer.put(this.strToNum(data.substring(i, i + 1)), 4);
|
|
46
|
+
}
|
|
47
|
+
else if (data.length - i === 2) {
|
|
48
|
+
// eslint-disable-next-line unicorn/prefer-string-slice
|
|
49
|
+
buffer.put(this.strToNum(data.substring(i, i + 2)), 7);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* @internal
|
|
55
|
+
*/
|
|
56
|
+
strToNum(s) {
|
|
57
|
+
let num = 0;
|
|
58
|
+
for (let i = 0; i < s.length; i++) {
|
|
59
|
+
num = num * 10 + this.charToNum(s.charAt(i));
|
|
60
|
+
}
|
|
61
|
+
return num;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* @internal
|
|
65
|
+
*/
|
|
66
|
+
charToNum(c) {
|
|
67
|
+
if (c >= "0" && c <= "9") {
|
|
68
|
+
return c.charCodeAt(0) - "0".charCodeAt(0);
|
|
69
|
+
}
|
|
70
|
+
throw new GeneralError(QRNumber.CLASS_NAME, "illegalCharacter", { value: c });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=qrNumber.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qrNumber.js","sourceRoot":"","sources":["../../../src/data/qrNumber.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,uCAAuC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD;;;GAGG;AACH,MAAM,OAAO,QAAS,SAAQ,UAAU;IACvC;;OAEG;IACI,MAAM,CAAU,UAAU,cAA8B;IAE/D;;;OAGG;IACH,YAAY,IAAY;QACvB,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAED;;;OAGG;IACI,SAAS;QACf,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,MAAiB;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAE5B,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,uDAAuD;YACvD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxD,CAAC,IAAI,CAAC,CAAC;QACR,CAAC;QAED,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,uDAAuD;gBACvD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxD,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClC,uDAAuD;gBACvD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxD,CAAC;QACF,CAAC;IACF,CAAC;IAED;;OAEG;IACK,QAAQ,CAAC,CAAS;QACzB,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,GAAG,CAAC;IACZ,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,CAAS;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;YAC1B,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,UAAU,EAAE,kBAAkB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n/* eslint-disable no-mixed-operators */\nimport { GeneralError } from \"@twin.org/core\";\nimport { nameof } from \"@twin.org/nameof\";\nimport { QRDataBase } from \"./qrDataBase.js\";\nimport type { BitBuffer } from \"../helpers/bitBuffer.js\";\nimport { QRDataMode } from \"../models/qrDataMode.js\";\n\n/**\n * QR Data for representing a number.\n * Based on https://github.com/kazuhikoarase/qrcode-generator/ .\n */\nexport class QRNumber extends QRDataBase {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<QRNumber>();\n\n\t/**\n\t * Create a new instance of QRNumber.\n\t * @param data The data for the qr number.\n\t */\n\tconstructor(data: string) {\n\t\tsuper(QRDataMode.Number, data);\n\t}\n\n\t/**\n\t * Get the length of the data.\n\t * @returns The length of the data.\n\t */\n\tpublic getLength(): number {\n\t\treturn this.getData().length;\n\t}\n\n\t/**\n\t * Write data into the buffer.\n\t * @param buffer The buffer to write into.\n\t */\n\tpublic write(buffer: BitBuffer): void {\n\t\tconst data = this.getData();\n\n\t\tlet i = 0;\n\n\t\twhile (i + 2 < data.length) {\n\t\t\t// eslint-disable-next-line unicorn/prefer-string-slice\n\t\t\tbuffer.put(this.strToNum(data.substring(i, i + 3)), 10);\n\t\t\ti += 3;\n\t\t}\n\n\t\tif (i < data.length) {\n\t\t\tif (data.length - i === 1) {\n\t\t\t\t// eslint-disable-next-line unicorn/prefer-string-slice\n\t\t\t\tbuffer.put(this.strToNum(data.substring(i, i + 1)), 4);\n\t\t\t} else if (data.length - i === 2) {\n\t\t\t\t// eslint-disable-next-line unicorn/prefer-string-slice\n\t\t\t\tbuffer.put(this.strToNum(data.substring(i, i + 2)), 7);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tprivate strToNum(s: string): number {\n\t\tlet num = 0;\n\t\tfor (let i = 0; i < s.length; i++) {\n\t\t\tnum = num * 10 + this.charToNum(s.charAt(i));\n\t\t}\n\t\treturn num;\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tprivate charToNum(c: string): number {\n\t\tif (c >= \"0\" && c <= \"9\") {\n\t\t\treturn c.charCodeAt(0) - \"0\".charCodeAt(0);\n\t\t}\n\t\tthrow new GeneralError(QRNumber.CLASS_NAME, \"illegalCharacter\", { value: c });\n\t}\n}\n"]}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// Copyright 2024 IOTA Stiftung.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0.
|
|
3
|
+
/* eslint-disable no-bitwise */
|
|
4
|
+
/**
|
|
5
|
+
* Class for maintaining data bits.
|
|
6
|
+
* Based on https://github.com/kazuhikoarase/qrcode-generator/ .
|
|
7
|
+
*/
|
|
8
|
+
export class BitBuffer {
|
|
9
|
+
/**
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
_buffer;
|
|
13
|
+
/**
|
|
14
|
+
* @internal
|
|
15
|
+
*/
|
|
16
|
+
_length;
|
|
17
|
+
/**
|
|
18
|
+
* Create a new instance of BitBuffer.
|
|
19
|
+
*/
|
|
20
|
+
constructor() {
|
|
21
|
+
this._buffer = [];
|
|
22
|
+
this._length = 0;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get the buffer.
|
|
26
|
+
* @returns The buffer.
|
|
27
|
+
*/
|
|
28
|
+
getBuffer() {
|
|
29
|
+
return this._buffer;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get the length in bits.
|
|
33
|
+
* @returns The length.
|
|
34
|
+
*/
|
|
35
|
+
getLengthInBits() {
|
|
36
|
+
return this._length;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Put a value in to the bit buffer.
|
|
40
|
+
* @param num The value.
|
|
41
|
+
* @param length The length.
|
|
42
|
+
*/
|
|
43
|
+
put(num, length) {
|
|
44
|
+
for (let i = 0; i < length; i++) {
|
|
45
|
+
this.putBit(((num >>> (length - i - 1)) & 1) === 1);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Put a bit.
|
|
50
|
+
* @param bit The bit to put.
|
|
51
|
+
*/
|
|
52
|
+
putBit(bit) {
|
|
53
|
+
if (this._length === this._buffer.length * 8) {
|
|
54
|
+
this._buffer.push(0);
|
|
55
|
+
}
|
|
56
|
+
if (bit) {
|
|
57
|
+
this._buffer[~~(this._length / 8)] |= 0x80 >>> this._length % 8;
|
|
58
|
+
}
|
|
59
|
+
this._length++;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Convert to string.
|
|
63
|
+
* @returns The buffer as string.
|
|
64
|
+
*/
|
|
65
|
+
toString() {
|
|
66
|
+
let buffer = "";
|
|
67
|
+
for (let i = 0; i < this.getLengthInBits(); i++) {
|
|
68
|
+
buffer += this.getBit(i) ? "1" : "0";
|
|
69
|
+
}
|
|
70
|
+
return buffer;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* @internal
|
|
74
|
+
*/
|
|
75
|
+
getBit(index) {
|
|
76
|
+
return ((this._buffer[~~(index / 8)] >>> (7 - (index % 8))) & 1) === 1;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=bitBuffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitBuffer.js","sourceRoot":"","sources":["../../../src/helpers/bitBuffer.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,+BAA+B;AAC/B;;;GAGG;AACH,MAAM,OAAO,SAAS;IACrB;;OAEG;IACc,OAAO,CAAW;IAEnC;;OAEG;IACK,OAAO,CAAS;IAExB;;OAEG;IACH;QACC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;IAClB,CAAC;IAED;;;OAGG;IACI,SAAS;QACf,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED;;;OAGG;IACI,eAAe;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACI,GAAG,CAAC,GAAW,EAAE,MAAc;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACrD,CAAC;IACF,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,GAAY;QACzB,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,QAAQ;QACd,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YACjD,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACtC,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,KAAa;QAC3B,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACxE,CAAC;CACD","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n/* eslint-disable no-bitwise */\n/**\n * Class for maintaining data bits.\n * Based on https://github.com/kazuhikoarase/qrcode-generator/ .\n */\nexport class BitBuffer {\n\t/**\n\t * @internal\n\t */\n\tprivate readonly _buffer: number[];\n\n\t/**\n\t * @internal\n\t */\n\tprivate _length: number;\n\n\t/**\n\t * Create a new instance of BitBuffer.\n\t */\n\tconstructor() {\n\t\tthis._buffer = [];\n\t\tthis._length = 0;\n\t}\n\n\t/**\n\t * Get the buffer.\n\t * @returns The buffer.\n\t */\n\tpublic getBuffer(): number[] {\n\t\treturn this._buffer;\n\t}\n\n\t/**\n\t * Get the length in bits.\n\t * @returns The length.\n\t */\n\tpublic getLengthInBits(): number {\n\t\treturn this._length;\n\t}\n\n\t/**\n\t * Put a value in to the bit buffer.\n\t * @param num The value.\n\t * @param length The length.\n\t */\n\tpublic put(num: number, length: number): void {\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tthis.putBit(((num >>> (length - i - 1)) & 1) === 1);\n\t\t}\n\t}\n\n\t/**\n\t * Put a bit.\n\t * @param bit The bit to put.\n\t */\n\tpublic putBit(bit: boolean): void {\n\t\tif (this._length === this._buffer.length * 8) {\n\t\t\tthis._buffer.push(0);\n\t\t}\n\t\tif (bit) {\n\t\t\tthis._buffer[~~(this._length / 8)] |= 0x80 >>> this._length % 8;\n\t\t}\n\t\tthis._length++;\n\t}\n\n\t/**\n\t * Convert to string.\n\t * @returns The buffer as string.\n\t */\n\tpublic toString(): string {\n\t\tlet buffer = \"\";\n\t\tfor (let i = 0; i < this.getLengthInBits(); i++) {\n\t\t\tbuffer += this.getBit(i) ? \"1\" : \"0\";\n\t\t}\n\t\treturn buffer;\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tprivate getBit(index: number): boolean {\n\t\treturn ((this._buffer[~~(index / 8)] >>> (7 - (index % 8))) & 1) === 1;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// Copyright 2024 IOTA Stiftung.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0.
|
|
3
|
+
/* eslint-disable no-bitwise */
|
|
4
|
+
import { GeneralError } from "@twin.org/core";
|
|
5
|
+
/**
|
|
6
|
+
* Class to helper with math.
|
|
7
|
+
* Based on https://github.com/kazuhikoarase/qrcode-generator/ .
|
|
8
|
+
*/
|
|
9
|
+
export class MathHelper {
|
|
10
|
+
/**
|
|
11
|
+
* Runtime name for the class.
|
|
12
|
+
*/
|
|
13
|
+
static CLASS_NAME = "MathHelper";
|
|
14
|
+
/**
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
static _EXP_TABLE;
|
|
18
|
+
/**
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
21
|
+
static _LOG_TABLE;
|
|
22
|
+
/**
|
|
23
|
+
* Initialize the math helper.
|
|
24
|
+
*/
|
|
25
|
+
static initialize() {
|
|
26
|
+
if (!MathHelper._EXP_TABLE) {
|
|
27
|
+
MathHelper._EXP_TABLE = [];
|
|
28
|
+
MathHelper._LOG_TABLE = [];
|
|
29
|
+
for (let i = 0; i < 256; i++) {
|
|
30
|
+
MathHelper._EXP_TABLE.push(i < 8
|
|
31
|
+
? 1 << i
|
|
32
|
+
: MathHelper._EXP_TABLE[i - 4] ^
|
|
33
|
+
MathHelper._EXP_TABLE[i - 5] ^
|
|
34
|
+
MathHelper._EXP_TABLE[i - 6] ^
|
|
35
|
+
MathHelper._EXP_TABLE[i - 8]);
|
|
36
|
+
MathHelper._LOG_TABLE.push(0);
|
|
37
|
+
}
|
|
38
|
+
for (let i = 0; i < 255; i++) {
|
|
39
|
+
MathHelper._LOG_TABLE[MathHelper._EXP_TABLE[i]] = i;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get the log of the value.
|
|
45
|
+
* @param value The value to get the log of.
|
|
46
|
+
* @returns The log of the value.
|
|
47
|
+
* @throws Error if value < 1.
|
|
48
|
+
*/
|
|
49
|
+
static gLog(value) {
|
|
50
|
+
if (value < 1) {
|
|
51
|
+
throw new GeneralError(MathHelper.CLASS_NAME, "lessThanOne", { value });
|
|
52
|
+
}
|
|
53
|
+
return MathHelper._LOG_TABLE[value];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get the exponent of the value.
|
|
57
|
+
* @param value The value to get the exponent of.
|
|
58
|
+
* @returns The exponent of the value.
|
|
59
|
+
*/
|
|
60
|
+
static gExp(value) {
|
|
61
|
+
let localValue = value;
|
|
62
|
+
while (localValue < 0) {
|
|
63
|
+
localValue += 255;
|
|
64
|
+
}
|
|
65
|
+
while (localValue >= 256) {
|
|
66
|
+
localValue -= 255;
|
|
67
|
+
}
|
|
68
|
+
return MathHelper._EXP_TABLE[localValue];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=mathHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mathHelper.js","sourceRoot":"","sources":["../../../src/helpers/mathHelper.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,+BAA+B;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C;;;GAGG;AACH,MAAM,OAAO,UAAU;IACtB;;OAEG;IACI,MAAM,CAAU,UAAU,gBAAgC;IAEjE;;OAEG;IACK,MAAM,CAAC,UAAU,CAAW;IAEpC;;OAEG;IACK,MAAM,CAAC,UAAU,CAAW;IAEpC;;OAEG;IACI,MAAM,CAAC,UAAU;QACvB,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YAC5B,UAAU,CAAC,UAAU,GAAG,EAAE,CAAC;YAC3B,UAAU,CAAC,UAAU,GAAG,EAAE,CAAC;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9B,UAAU,CAAC,UAAU,CAAC,IAAI,CACzB,CAAC,GAAG,CAAC;oBACJ,CAAC,CAAC,CAAC,IAAI,CAAC;oBACR,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;wBAC5B,UAAU,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;wBAC5B,UAAU,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;wBAC5B,UAAU,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAC/B,CAAC;gBACF,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,CAAC;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9B,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACrD,CAAC;QACF,CAAC;IACF,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,IAAI,CAAC,KAAa;QAC/B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACf,MAAM,IAAI,YAAY,CAAC,UAAU,CAAC,UAAU,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,IAAI,CAAC,KAAa;QAC/B,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,OAAO,UAAU,GAAG,CAAC,EAAE,CAAC;YACvB,UAAU,IAAI,GAAG,CAAC;QACnB,CAAC;QACD,OAAO,UAAU,IAAI,GAAG,EAAE,CAAC;YAC1B,UAAU,IAAI,GAAG,CAAC;QACnB,CAAC;QACD,OAAO,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n/* eslint-disable no-bitwise */\n\nimport { GeneralError } from \"@twin.org/core\";\nimport { nameof } from \"@twin.org/nameof\";\n\n/**\n * Class to helper with math.\n * Based on https://github.com/kazuhikoarase/qrcode-generator/ .\n */\nexport class MathHelper {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<MathHelper>();\n\n\t/**\n\t * @internal\n\t */\n\tprivate static _EXP_TABLE: number[];\n\n\t/**\n\t * @internal\n\t */\n\tprivate static _LOG_TABLE: number[];\n\n\t/**\n\t * Initialize the math helper.\n\t */\n\tpublic static initialize(): void {\n\t\tif (!MathHelper._EXP_TABLE) {\n\t\t\tMathHelper._EXP_TABLE = [];\n\t\t\tMathHelper._LOG_TABLE = [];\n\t\t\tfor (let i = 0; i < 256; i++) {\n\t\t\t\tMathHelper._EXP_TABLE.push(\n\t\t\t\t\ti < 8\n\t\t\t\t\t\t? 1 << i\n\t\t\t\t\t\t: MathHelper._EXP_TABLE[i - 4] ^\n\t\t\t\t\t\t\t\tMathHelper._EXP_TABLE[i - 5] ^\n\t\t\t\t\t\t\t\tMathHelper._EXP_TABLE[i - 6] ^\n\t\t\t\t\t\t\t\tMathHelper._EXP_TABLE[i - 8]\n\t\t\t\t);\n\t\t\t\tMathHelper._LOG_TABLE.push(0);\n\t\t\t}\n\t\t\tfor (let i = 0; i < 255; i++) {\n\t\t\t\tMathHelper._LOG_TABLE[MathHelper._EXP_TABLE[i]] = i;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get the log of the value.\n\t * @param value The value to get the log of.\n\t * @returns The log of the value.\n\t * @throws Error if value < 1.\n\t */\n\tpublic static gLog(value: number): number {\n\t\tif (value < 1) {\n\t\t\tthrow new GeneralError(MathHelper.CLASS_NAME, \"lessThanOne\", { value });\n\t\t}\n\t\treturn MathHelper._LOG_TABLE[value];\n\t}\n\n\t/**\n\t * Get the exponent of the value.\n\t * @param value The value to get the exponent of.\n\t * @returns The exponent of the value.\n\t */\n\tpublic static gExp(value: number): number {\n\t\tlet localValue = value;\n\t\twhile (localValue < 0) {\n\t\t\tlocalValue += 255;\n\t\t}\n\t\twhile (localValue >= 256) {\n\t\t\tlocalValue -= 255;\n\t\t}\n\t\treturn MathHelper._EXP_TABLE[localValue];\n\t}\n}\n"]}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// Copyright 2024 IOTA Stiftung.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0.
|
|
3
|
+
/* eslint-disable no-bitwise */
|
|
4
|
+
import { MathHelper } from "./mathHelper.js";
|
|
5
|
+
/**
|
|
6
|
+
* Class to represent a polynomial.
|
|
7
|
+
* Based on https://github.com/kazuhikoarase/qrcode-generator/ .
|
|
8
|
+
*/
|
|
9
|
+
export class Polynomial {
|
|
10
|
+
/**
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
_num;
|
|
14
|
+
/**
|
|
15
|
+
* Create a new instance of Polynomial.
|
|
16
|
+
* @param num The num of the polynomial.
|
|
17
|
+
* @param shift The shift for the polynomial.
|
|
18
|
+
*/
|
|
19
|
+
constructor(num, shift = 0) {
|
|
20
|
+
let offset = 0;
|
|
21
|
+
while (offset < num.length && num[offset] === 0) {
|
|
22
|
+
offset++;
|
|
23
|
+
}
|
|
24
|
+
this._num = [];
|
|
25
|
+
const len = num.length - offset;
|
|
26
|
+
for (let i = 0; i < len; i++) {
|
|
27
|
+
this._num.push(num[offset + i]);
|
|
28
|
+
}
|
|
29
|
+
for (let i = 0; i < shift; i++) {
|
|
30
|
+
this._num.push(0);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The value of the polynomial at given index.
|
|
35
|
+
* @param index The index.
|
|
36
|
+
* @returns The value of the polynomial.
|
|
37
|
+
*/
|
|
38
|
+
getAt(index) {
|
|
39
|
+
return this._num[index];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get the length of the polynomial.
|
|
43
|
+
* @returns The polynomial.
|
|
44
|
+
*/
|
|
45
|
+
getLength() {
|
|
46
|
+
return this._num.length;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Convert the polynomial to a string.
|
|
50
|
+
* @returns The string representation of the polynomial.
|
|
51
|
+
*/
|
|
52
|
+
toString() {
|
|
53
|
+
let buffer = "";
|
|
54
|
+
for (let i = 0; i < this.getLength(); i++) {
|
|
55
|
+
if (i > 0) {
|
|
56
|
+
buffer += ",";
|
|
57
|
+
}
|
|
58
|
+
buffer += this.getAt(i);
|
|
59
|
+
}
|
|
60
|
+
return buffer.toString();
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get the log representation of the polynomial.
|
|
64
|
+
* @returns The log representation of the polynomial.
|
|
65
|
+
*/
|
|
66
|
+
toLogString() {
|
|
67
|
+
let buffer = "";
|
|
68
|
+
for (let i = 0; i < this.getLength(); i++) {
|
|
69
|
+
if (i > 0) {
|
|
70
|
+
buffer += ",";
|
|
71
|
+
}
|
|
72
|
+
buffer += MathHelper.gLog(this.getAt(i));
|
|
73
|
+
}
|
|
74
|
+
return buffer.toString();
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Multiply the polynomial with another one.
|
|
78
|
+
* @param e The polynomial to multiply.
|
|
79
|
+
* @returns The multiplication of the polynomials.
|
|
80
|
+
*/
|
|
81
|
+
multiply(e) {
|
|
82
|
+
const num = [];
|
|
83
|
+
const len = this.getLength() + e.getLength() - 1;
|
|
84
|
+
for (let i = 0; i < len; i++) {
|
|
85
|
+
num.push(0);
|
|
86
|
+
}
|
|
87
|
+
for (let i = 0; i < this.getLength(); i++) {
|
|
88
|
+
for (let j = 0; j < e.getLength(); j++) {
|
|
89
|
+
num[i + j] ^= MathHelper.gExp(MathHelper.gLog(this.getAt(i)) + MathHelper.gLog(e.getAt(j)));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return new Polynomial(num);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Get the modulus of the polynomial from another.
|
|
96
|
+
* @param e The polynomial.
|
|
97
|
+
* @returns The modules of the polynomials.
|
|
98
|
+
*/
|
|
99
|
+
mod(e) {
|
|
100
|
+
if (this.getLength() - e.getLength() < 0) {
|
|
101
|
+
return this;
|
|
102
|
+
}
|
|
103
|
+
const ratio = MathHelper.gLog(this.getAt(0)) - MathHelper.gLog(e.getAt(0));
|
|
104
|
+
// create copy
|
|
105
|
+
const num = [];
|
|
106
|
+
for (let i = 0; i < this.getLength(); i++) {
|
|
107
|
+
num.push(this.getAt(i));
|
|
108
|
+
}
|
|
109
|
+
// subtract and calc rest.
|
|
110
|
+
for (let i = 0; i < e.getLength(); i++) {
|
|
111
|
+
num[i] ^= MathHelper.gExp(MathHelper.gLog(e.getAt(i)) + ratio);
|
|
112
|
+
}
|
|
113
|
+
// call recursively
|
|
114
|
+
return new Polynomial(num).mod(e);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=polynomial.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polynomial.js","sourceRoot":"","sources":["../../../src/helpers/polynomial.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n/* eslint-disable no-bitwise */\nimport { MathHelper } from \"./mathHelper.js\";\n\n/**\n * Class to represent a polynomial.\n * Based on https://github.com/kazuhikoarase/qrcode-generator/ .\n */\nexport class Polynomial {\n\t/**\n\t * @internal\n\t */\n\tprivate readonly _num: number[];\n\n\t/**\n\t * Create a new instance of Polynomial.\n\t * @param num The num of the polynomial.\n\t * @param shift The shift for the polynomial.\n\t */\n\tconstructor(num: number[], shift: number = 0) {\n\t\tlet offset = 0;\n\n\t\twhile (offset < num.length && num[offset] === 0) {\n\t\t\toffset++;\n\t\t}\n\n\t\tthis._num = [];\n\t\tconst len = num.length - offset;\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tthis._num.push(num[offset + i]);\n\t\t}\n\t\tfor (let i = 0; i < shift; i++) {\n\t\t\tthis._num.push(0);\n\t\t}\n\t}\n\n\t/**\n\t * The value of the polynomial at given index.\n\t * @param index The index.\n\t * @returns The value of the polynomial.\n\t */\n\tpublic getAt(index: number): number {\n\t\treturn this._num[index];\n\t}\n\n\t/**\n\t * Get the length of the polynomial.\n\t * @returns The polynomial.\n\t */\n\tpublic getLength(): number {\n\t\treturn this._num.length;\n\t}\n\n\t/**\n\t * Convert the polynomial to a string.\n\t * @returns The string representation of the polynomial.\n\t */\n\tpublic toString(): string {\n\t\tlet buffer = \"\";\n\t\tfor (let i = 0; i < this.getLength(); i++) {\n\t\t\tif (i > 0) {\n\t\t\t\tbuffer += \",\";\n\t\t\t}\n\t\t\tbuffer += this.getAt(i);\n\t\t}\n\t\treturn buffer.toString();\n\t}\n\n\t/**\n\t * Get the log representation of the polynomial.\n\t * @returns The log representation of the polynomial.\n\t */\n\tpublic toLogString(): string {\n\t\tlet buffer = \"\";\n\t\tfor (let i = 0; i < this.getLength(); i++) {\n\t\t\tif (i > 0) {\n\t\t\t\tbuffer += \",\";\n\t\t\t}\n\t\t\tbuffer += MathHelper.gLog(this.getAt(i));\n\t\t}\n\t\treturn buffer.toString();\n\t}\n\n\t/**\n\t * Multiply the polynomial with another one.\n\t * @param e The polynomial to multiply.\n\t * @returns The multiplication of the polynomials.\n\t */\n\tpublic multiply(e: Polynomial): Polynomial {\n\t\tconst num: number[] = [];\n\t\tconst len = this.getLength() + e.getLength() - 1;\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tnum.push(0);\n\t\t}\n\t\tfor (let i = 0; i < this.getLength(); i++) {\n\t\t\tfor (let j = 0; j < e.getLength(); j++) {\n\t\t\t\tnum[i + j] ^= MathHelper.gExp(MathHelper.gLog(this.getAt(i)) + MathHelper.gLog(e.getAt(j)));\n\t\t\t}\n\t\t}\n\t\treturn new Polynomial(num);\n\t}\n\n\t/**\n\t * Get the modulus of the polynomial from another.\n\t * @param e The polynomial.\n\t * @returns The modules of the polynomials.\n\t */\n\tpublic mod(e: Polynomial): Polynomial {\n\t\tif (this.getLength() - e.getLength() < 0) {\n\t\t\treturn this;\n\t\t}\n\n\t\tconst ratio = MathHelper.gLog(this.getAt(0)) - MathHelper.gLog(e.getAt(0));\n\n\t\t// create copy\n\t\tconst num: number[] = [];\n\t\tfor (let i = 0; i < this.getLength(); i++) {\n\t\t\tnum.push(this.getAt(i));\n\t\t}\n\n\t\t// subtract and calc rest.\n\t\tfor (let i = 0; i < e.getLength(); i++) {\n\t\t\tnum[i] ^= MathHelper.gExp(MathHelper.gLog(e.getAt(i)) + ratio);\n\t\t}\n\n\t\t// call recursively\n\t\treturn new Polynomial(num).mod(e);\n\t}\n}\n"]}
|