qreator 9.0.6

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.
Files changed (80) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +92 -0
  3. package/lib/browser/encode.d.ts +2 -0
  4. package/lib/browser/errorcode.d.ts +1 -0
  5. package/lib/browser/matrix.d.ts +9 -0
  6. package/lib/browser/pdf.d.ts +2 -0
  7. package/lib/browser/pdf.umd.js +26816 -0
  8. package/lib/browser/pdf.umd.js.map +1 -0
  9. package/lib/browser/png.d.ts +6 -0
  10. package/lib/browser/png.umd.js +1540 -0
  11. package/lib/browser/png.umd.js.map +1 -0
  12. package/lib/browser/png_browser.d.ts +5 -0
  13. package/lib/browser/qr-base.d.ts +4 -0
  14. package/lib/browser/qr.d.ts +2 -0
  15. package/lib/browser/svg.d.ts +7 -0
  16. package/lib/browser/svg.umd.js +1536 -0
  17. package/lib/browser/svg.umd.js.map +1 -0
  18. package/lib/browser/tests/_common.d.ts +4 -0
  19. package/lib/browser/tests/browser.test.d.ts +1 -0
  20. package/lib/browser/tests/test.d.ts +1 -0
  21. package/lib/browser/typing/types.d.ts +28 -0
  22. package/lib/browser/utils.d.ts +17 -0
  23. package/lib/encode.d.ts +2 -0
  24. package/lib/encode.js +137 -0
  25. package/lib/encode.js.map +1 -0
  26. package/lib/errorcode.d.ts +1 -0
  27. package/lib/errorcode.js +62 -0
  28. package/lib/errorcode.js.map +1 -0
  29. package/lib/matrix.d.ts +9 -0
  30. package/lib/matrix.js +347 -0
  31. package/lib/matrix.js.map +1 -0
  32. package/lib/pdf.d.ts +2 -0
  33. package/lib/pdf.js +64 -0
  34. package/lib/pdf.js.map +1 -0
  35. package/lib/png.d.ts +6 -0
  36. package/lib/png.js +30 -0
  37. package/lib/png.js.map +1 -0
  38. package/lib/png_browser.d.ts +5 -0
  39. package/lib/png_browser.js +53 -0
  40. package/lib/png_browser.js.map +1 -0
  41. package/lib/qr-base.d.ts +4 -0
  42. package/lib/qr-base.js +151 -0
  43. package/lib/qr-base.js.map +1 -0
  44. package/lib/qr.d.ts +2 -0
  45. package/lib/qr.js +2 -0
  46. package/lib/qr.js.map +1 -0
  47. package/lib/svg.d.ts +7 -0
  48. package/lib/svg.js +49 -0
  49. package/lib/svg.js.map +1 -0
  50. package/lib/tests/_common.d.ts +4 -0
  51. package/lib/tests/_common.js +36 -0
  52. package/lib/tests/_common.js.map +1 -0
  53. package/lib/tests/browser.test.d.ts +1 -0
  54. package/lib/tests/browser.test.js +193 -0
  55. package/lib/tests/browser.test.js.map +1 -0
  56. package/lib/tests/test.d.ts +1 -0
  57. package/lib/tests/test.js +238 -0
  58. package/lib/tests/test.js.map +1 -0
  59. package/lib/typing/types.d.ts +28 -0
  60. package/lib/typing/types.js +2 -0
  61. package/lib/typing/types.js.map +1 -0
  62. package/lib/utils.d.ts +17 -0
  63. package/lib/utils.js +68 -0
  64. package/lib/utils.js.map +1 -0
  65. package/package.json +105 -0
  66. package/src/encode.ts +176 -0
  67. package/src/errorcode.ts +75 -0
  68. package/src/matrix.ts +393 -0
  69. package/src/pdf.ts +80 -0
  70. package/src/png.ts +42 -0
  71. package/src/png_browser.ts +73 -0
  72. package/src/qr-base.ts +180 -0
  73. package/src/qr.ts +2 -0
  74. package/src/svg.ts +89 -0
  75. package/src/tests/_common.ts +40 -0
  76. package/src/tests/browser.test.ts +209 -0
  77. package/src/tests/test.ts +250 -0
  78. package/src/typing/index.d.ts +5 -0
  79. package/src/typing/types.ts +99 -0
  80. package/src/utils.ts +86 -0
@@ -0,0 +1,238 @@
1
+ import test from "ava";
2
+ import { readFile, writeFile } from "node:fs/promises";
3
+ import { getPNG } from "../png.js";
4
+ import { getSVG } from "../svg.js";
5
+ import { getPDF } from "../pdf.js";
6
+ import { assertEqual, generatedImageDir, goldenDir } from "./_common.js";
7
+ const text = "I \u2764\uFE0F QR code!";
8
+ const defaultParams = {
9
+ ec_level: "Q",
10
+ margin: 1,
11
+ parse_url: true,
12
+ };
13
+ [
14
+ {
15
+ name: "PNG",
16
+ fn: getPNG,
17
+ filename: "qr.png",
18
+ },
19
+ {
20
+ name: "PNG with empty options",
21
+ fn: getPNG,
22
+ filename: "qr_with_empty_options.png",
23
+ options: {},
24
+ },
25
+ {
26
+ name: "PNG with undefined size",
27
+ fn: getPNG,
28
+ filename: "qr_with_undefined_size.png",
29
+ options: {
30
+ size: undefined,
31
+ },
32
+ },
33
+ {
34
+ name: "PNG with size",
35
+ fn: getPNG,
36
+ filename: "qr_with_size.png",
37
+ params: {
38
+ size: 9,
39
+ }
40
+ },
41
+ {
42
+ name: "PNG with margin",
43
+ fn: getPNG,
44
+ filename: "qr_with_margin.png",
45
+ params: {
46
+ size: 9,
47
+ margin: 3,
48
+ }
49
+ },
50
+ {
51
+ name: "PNG with border radius",
52
+ fn: getPNG,
53
+ filename: "qr_with_border_radius.png",
54
+ params: {
55
+ borderRadius: 1,
56
+ },
57
+ },
58
+ {
59
+ name: "PNG with colors",
60
+ fn: getPNG,
61
+ filename: "qr_with_colors.png",
62
+ params: {
63
+ color: 0x0000a0ff,
64
+ bgColor: 0xffa0ffff,
65
+ },
66
+ },
67
+ {
68
+ name: "PNG with colors (hex)",
69
+ fn: getPNG,
70
+ filename: "qr_with_colors.png",
71
+ params: {
72
+ color: '#0000a0',
73
+ bgColor: '#ffa0ff',
74
+ },
75
+ },
76
+ {
77
+ name: "PNG with colors (rgba)",
78
+ fn: getPNG,
79
+ filename: "qr_with_colors_rgba.png",
80
+ params: {
81
+ color: 'rgba(255, 0, 0, 0.5)',
82
+ bgColor: 'rgba(255, 255, 255, 0.1)',
83
+ },
84
+ },
85
+ {
86
+ name: "PNG with logo",
87
+ fn: getPNG,
88
+ filename: "qr_with_logo.png",
89
+ params: { logo: await readFile(`${goldenDir}/logo.png`) },
90
+ },
91
+ {
92
+ name: "PNG with logo (JPG)",
93
+ fn: getPNG,
94
+ filename: "qr_with_logo_jpg.png",
95
+ params: { logo: await readFile(`${goldenDir}/logo.jpg`) },
96
+ },
97
+ {
98
+ name: "PNG with logo (arraybuffer)",
99
+ fn: getPNG,
100
+ filename: "qr_with_logo.png",
101
+ params: { logo: (await readFile(`${goldenDir}/logo.png`)).buffer },
102
+ },
103
+ {
104
+ name: "SVG",
105
+ fn: getSVG,
106
+ filename: "qr.svg",
107
+ },
108
+ {
109
+ name: "SVG with border radius",
110
+ fn: getSVG,
111
+ filename: "qr_with_border_radius.svg",
112
+ params: {
113
+ borderRadius: 4,
114
+ },
115
+ },
116
+ {
117
+ name: "SVG with EC level",
118
+ fn: getSVG,
119
+ filename: "qr_with_ec_level.svg",
120
+ params: {
121
+ ec_level: "H",
122
+ },
123
+ },
124
+ {
125
+ name: "SVG with size",
126
+ fn: getSVG,
127
+ filename: "qr_with_size.svg",
128
+ params: {
129
+ size: 6,
130
+ },
131
+ },
132
+ {
133
+ name: "SVG with colors (hex)",
134
+ fn: getSVG,
135
+ filename: "qr_with_colors_hex.svg",
136
+ params: {
137
+ color: '#ff0000',
138
+ bgColor: '#00ff00',
139
+ },
140
+ },
141
+ {
142
+ name: "SVG with colors (rgba)",
143
+ fn: getSVG,
144
+ filename: "qr_with_colors_rgba.svg",
145
+ params: {
146
+ color: 'rgba(255, 0, 0, 0.5)',
147
+ bgColor: 'rgba(0, 255, 0, 0.2)',
148
+ },
149
+ },
150
+ {
151
+ name: "SVG with colors",
152
+ fn: getSVG,
153
+ filename: "qr_with_colors.svg",
154
+ params: {
155
+ color: 0xff0000ff,
156
+ bgColor: 0x00ff00ff,
157
+ },
158
+ },
159
+ {
160
+ name: "SVG with logo as buffer",
161
+ fn: getSVG,
162
+ filename: "qr_with_logo.svg",
163
+ params: { logo: await readFile(`${goldenDir}/logo.png`) },
164
+ },
165
+ {
166
+ name: "SVG with logo as arraybuffer (PNG)",
167
+ fn: getSVG,
168
+ filename: "qr_with_logo_as_arraybuffer.svg",
169
+ params: {
170
+ logo: (await readFile(`${goldenDir}/logo.png`)).buffer,
171
+ },
172
+ },
173
+ {
174
+ name: "SVG with logo as arraybuffer (JPG)",
175
+ fn: getSVG,
176
+ filename: "qr_with_logo_as_arraybuffer_jpg.svg",
177
+ params: {
178
+ logo: (await readFile(`${goldenDir}/logo.jpg`)).buffer,
179
+ },
180
+ },
181
+ {
182
+ name: "PDF",
183
+ fn: getPDF,
184
+ filename: "qr.pdf",
185
+ },
186
+ {
187
+ name: "PDF with border radius",
188
+ fn: getPDF,
189
+ filename: "qr_with_border_radius.pdf",
190
+ params: {
191
+ borderRadius: 4,
192
+ }
193
+ },
194
+ {
195
+ name: "PDF with colors",
196
+ fn: getPDF,
197
+ filename: "qr_with_colors.pdf",
198
+ params: { color: 0xff0000ff, bgColor: 0x00ff00ff },
199
+ },
200
+ {
201
+ name: "PDF with colors (hex)",
202
+ fn: getPDF,
203
+ filename: "qr_with_colors.pdf",
204
+ params: { color: '#ff0000', bgColor: '#00ff00' },
205
+ },
206
+ {
207
+ name: "PDF with arraybuffer",
208
+ fn: getPDF,
209
+ filename: "qr_logo_arraybuffer.pdf",
210
+ params: {
211
+ logo: (await readFile(`${goldenDir}/logo.png`)).buffer,
212
+ },
213
+ },
214
+ {
215
+ name: "PDF with arraybuffer (JPG)",
216
+ fn: getPDF,
217
+ filename: "qr_logo_arraybuffer_jpg.pdf",
218
+ params: {
219
+ logo: (await readFile(`${goldenDir}/logo.jpg`)).buffer,
220
+ },
221
+ },
222
+ {
223
+ name: "PDF with logo",
224
+ fn: getPDF,
225
+ filename: "qr_with_logo.pdf",
226
+ params: { logo: await readFile(`${goldenDir}/logo.png`) },
227
+ },
228
+ ].forEach((testData) => {
229
+ test.serial(testData.name, async (t) => {
230
+ const image = await testData.fn(text, {
231
+ ...defaultParams,
232
+ ...testData.params,
233
+ });
234
+ await writeFile(`${generatedImageDir}/${testData.filename}`, image);
235
+ await assertEqual(t, testData.filename);
236
+ });
237
+ });
238
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/tests/test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /// <reference types="node" />
2
+ export type Matrix = number[][];
3
+ export interface Data {
4
+ blocks: number[][];
5
+ ec: number[][];
6
+ ec_len: number;
7
+ ec_level: EcLevel;
8
+ version: number;
9
+ data_len: number;
10
+ }
11
+ export interface NumberData {
12
+ [key: string]: number[];
13
+ }
14
+ export type EcLevel = "L" | "M" | "Q" | "H";
15
+ export type ImageType = "png" | "svg" | "pdf";
16
+ export interface ImageOptions {
17
+ ec_level?: EcLevel;
18
+ type?: ImageType;
19
+ size?: number;
20
+ margin?: number;
21
+ parse_url?: boolean;
22
+ logo?: ArrayBufferLike | Buffer;
23
+ logoWidth?: number;
24
+ logoHeight?: number;
25
+ color?: number | string;
26
+ bgColor?: number | string;
27
+ borderRadius?: number;
28
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/typing/types.ts"],"names":[],"mappings":""}
package/lib/utils.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ /// <reference types="node" />
2
+ import { ImageOptions, ImageType, Matrix } from "./typing/types";
3
+ export declare function getOptions(inOptions: ImageOptions): {
4
+ ec_level?: import("./typing/types").EcLevel;
5
+ type?: ImageType;
6
+ size?: number;
7
+ margin?: number;
8
+ parse_url?: boolean;
9
+ logo?: ArrayBufferLike | Buffer;
10
+ logoWidth?: number;
11
+ logoHeight?: number;
12
+ color?: string | number;
13
+ bgColor?: string | number;
14
+ borderRadius?: number;
15
+ };
16
+ export declare function colorToHex(color: number | string): string;
17
+ export declare function getSVGPath(matrix: Matrix, size: number, margin?: number, borderRadius?: number): string;
package/lib/utils.js ADDED
@@ -0,0 +1,68 @@
1
+ import colorString from "color-string";
2
+ export function getOptions(inOptions) {
3
+ const type = inOptions?.type ?? "png";
4
+ const defaults = type === "png" ? BITMAP_OPTIONS : VECTOR_OPTIONS;
5
+ return { ...defaults, ...inOptions };
6
+ }
7
+ export function colorToHex(color) {
8
+ if (typeof color === "string") {
9
+ return colorString.to.hex(colorString.get.rgb(color));
10
+ }
11
+ return `#${(color >>> 8).toString(16).padStart(6, "0")}`;
12
+ }
13
+ export function getSVGPath(matrix, size, margin = 0, borderRadius = 0) {
14
+ let rectangles = [];
15
+ for (let x = 0; x < matrix.length; x++) {
16
+ const column = matrix[x];
17
+ for (let y = 0; y < column.length; y++) {
18
+ if (column[y]) {
19
+ const leftX = x * size + margin;
20
+ const rightX = (x + 1) * size + margin;
21
+ const topY = y * size + margin;
22
+ const bottomY = (y + 1) * size + margin;
23
+ const rectangle = [];
24
+ rectangle.push(`M ${leftX} ${topY + borderRadius}`);
25
+ rectangle.push(`L ${leftX} ${bottomY - borderRadius}`);
26
+ if (borderRadius > 0) {
27
+ rectangle.push(`A ${borderRadius} ${borderRadius} 0 0 0 ${leftX + borderRadius} ${bottomY} `);
28
+ }
29
+ rectangle.push(`L ${rightX - borderRadius} ${bottomY}`);
30
+ if (borderRadius > 0) {
31
+ rectangle.push(`A ${borderRadius} ${borderRadius} 0 0 0 ${rightX} ${bottomY - borderRadius}`);
32
+ }
33
+ rectangle.push(`L ${rightX} ${topY + borderRadius}`);
34
+ if (borderRadius > 0) {
35
+ rectangle.push(`A ${borderRadius} ${borderRadius} 0 0 0 ${rightX - borderRadius} ${topY}`);
36
+ }
37
+ rectangle.push(`L ${leftX + borderRadius} ${topY}`);
38
+ if (borderRadius > 0) {
39
+ rectangle.push(`A ${borderRadius} ${borderRadius} 0 0 0 ${leftX} ${topY + borderRadius}`);
40
+ }
41
+ rectangle.push(`z`);
42
+ rectangles.push(rectangle.join(" "));
43
+ }
44
+ }
45
+ }
46
+ return rectangles.join(" ");
47
+ }
48
+ const commonOptions = {
49
+ type: "png",
50
+ parse_url: false,
51
+ ec_level: "M",
52
+ logo: undefined,
53
+ logoWidth: 20,
54
+ logoHeight: 20,
55
+ bgColor: 0xffffffff,
56
+ color: 0x000000ff,
57
+ };
58
+ const BITMAP_OPTIONS = {
59
+ ...commonOptions,
60
+ margin: 1,
61
+ size: 5,
62
+ };
63
+ const VECTOR_OPTIONS = {
64
+ ...commonOptions,
65
+ margin: 1,
66
+ size: 0,
67
+ };
68
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,105 @@
1
+ {
2
+ "name": "qreator",
3
+ "version": "9.0.6",
4
+ "description": "QR Code generator for browser and node.js with tree shaking and logo support",
5
+ "homepage": "https://github.com/Short-io/qr-image",
6
+ "keywords": [
7
+ "qrcode",
8
+ "qr code",
9
+ "qr",
10
+ "png",
11
+ "svg",
12
+ "pdf",
13
+ "image"
14
+ ],
15
+ "author": {
16
+ "name": "Andrii Kostenko",
17
+ "url": "http://git.io/gugu"
18
+ },
19
+ "license": "MIT",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "https://github.com/Short-io/qreator.git"
23
+ },
24
+ "bugs": "https://github.com/Short-io/qreator/issues",
25
+ "type": "module",
26
+ "main": "lib/qr.js",
27
+ "exports": {
28
+ "./lib/png": {
29
+ "node": "./lib/png.js",
30
+ "types": "./lib/png.d.ts",
31
+ "default": "./lib/png_browser.js"
32
+ },
33
+ "./lib/svg": {
34
+ "types": "./lib/svg.d.ts",
35
+ "default": "./lib/svg.js"
36
+ },
37
+ "./lib/pdf": {
38
+ "types": "./lib/pdf.d.ts",
39
+ "default": "./lib/pdf.js"
40
+ }
41
+ },
42
+ "scripts": {
43
+ "test": "ava",
44
+ "prepare": "tsc && rollup -c",
45
+ "release": "release-it"
46
+ },
47
+ "size-limit": [
48
+ {
49
+ "path": "lib/qr.js"
50
+ }
51
+ ],
52
+ "files": [
53
+ "lib",
54
+ "src",
55
+ "LICENSE"
56
+ ],
57
+ "devDependencies": {
58
+ "@ava/typescript": "^4.1.0",
59
+ "@rollup/plugin-commonjs": "^25.0.7",
60
+ "@rollup/plugin-json": "^6.1.0",
61
+ "@rollup/plugin-node-resolve": "^15.2.3",
62
+ "@rollup/plugin-typescript": "^11.1.6",
63
+ "@size-limit/preset-small-lib": "^11.0.2",
64
+ "@types/color-string": "^1.5.5",
65
+ "@types/diff": "^5.0.9",
66
+ "@types/jsdom": "^21.1.6",
67
+ "@types/pixelmatch": "^5.2.6",
68
+ "@types/sharp": "^0.31.1",
69
+ "@types/svg-path-parser": "^1.1.6",
70
+ "ava": "^6.1.1",
71
+ "benchmark": "^2.1.4",
72
+ "chalk": "^5.3.0",
73
+ "diff": "^5.2.0",
74
+ "eslint": "^8.56.0",
75
+ "eslint-config-airbnb-base": "^15.0.0",
76
+ "eslint-plugin-import": "^2.29.1",
77
+ "jsdom": "^24.0.0",
78
+ "looks-same": "^9.0.0",
79
+ "microtime": "^3.1.1",
80
+ "path2d-polyfill": "^2.0.1",
81
+ "pixelmatch": "^5.3.0",
82
+ "release-it": "^17.0.3",
83
+ "rollup": "^4.10.0",
84
+ "size-limit": "^11.0.2",
85
+ "svg-path-parser": "^1.1.0",
86
+ "typescript": "^5.3.3",
87
+ "xml-formatter": "^3.6.2",
88
+ "canvas": "npm:@napi-rs/canvas@^0.1.51"
89
+ },
90
+ "dependencies": {
91
+ "color-string": "^1.9.1",
92
+ "js-base64": "^3.7.6",
93
+ "pdf-lib": "^1.17.1",
94
+ "sharp": "^0.33.2"
95
+ },
96
+ "overrides": {
97
+ "jsdom": {
98
+ "canvas": "^0.1.50"
99
+ },
100
+ "sharp": "$sharp"
101
+ },
102
+ "engines": {
103
+ "node": ">=18"
104
+ }
105
+ }
package/src/encode.ts ADDED
@@ -0,0 +1,176 @@
1
+ import { NumberData } from "./typing/types";
2
+ const enc = new TextEncoder();
3
+ const dec = new TextDecoder();
4
+ // {{{1 Choose encode mode and generates struct with data for different version
5
+ export function encode(inData: string | number | ArrayBuffer, parse_url: boolean) {
6
+ let str: string;
7
+ let data: ArrayBufferLike;
8
+ if (typeof inData === "string" || typeof inData === "number") {
9
+ str = `${inData}`;
10
+ data = enc.encode(str);
11
+ } else if (typeof Buffer !== "undefined" && Buffer.isBuffer(data)) {
12
+ str = inData.toString();
13
+ } else if (Array.isArray(inData)) {
14
+ data = new Uint8Array(inData);
15
+ str = dec.decode(inData);
16
+ } else {
17
+ throw new Error("Bad data: " + typeof inData);
18
+ }
19
+
20
+ if (/^[0-9]+$/.test(str)) {
21
+ if (data.byteLength > 7089) {
22
+ throw new Error("Too much data");
23
+ }
24
+ return encode_numeric(str);
25
+ }
26
+
27
+ if (/^[0-9A-Z \$%\*\+\.\/\:\-]+$/.test(str)) {
28
+ if (data.byteLength > 4296) {
29
+ throw new Error("Too much data");
30
+ }
31
+ return encode_alphanum(str);
32
+ }
33
+
34
+ if (parse_url && /^https?:/i.test(str)) {
35
+ return encode_url(str);
36
+ }
37
+ if (data.byteLength > 2953) {
38
+ throw new Error("Too much data");
39
+ }
40
+ return encode_8bit(new Uint8Array(data));
41
+ }
42
+
43
+ /* eslint-disable no-bitwise */
44
+ function pushBits(arr: number[], n: number, value: number) {
45
+ for (let bit = 1 << (n - 1); bit; bit >>>= 1) {
46
+ arr.push(bit & value ? 1 : 0);
47
+ }
48
+ }
49
+
50
+ // {{{1 8bit encode
51
+ function encode_8bit(data: Uint8Array): NumberData {
52
+ const len = data.byteLength;
53
+ const bits: number[] = [];
54
+
55
+ for (let i = 0; i < len; i++) {
56
+ pushBits(bits, 8, data[i]);
57
+ }
58
+
59
+ const res: {
60
+ data1?: number[];
61
+ data10?: number[];
62
+ data27?: number[];
63
+ } = {};
64
+
65
+ let d = [0, 1, 0, 0];
66
+ pushBits(d, 16, len);
67
+ res.data10 = res.data27 = d.concat(bits);
68
+
69
+ if (len < 256) {
70
+ let d = [0, 1, 0, 0];
71
+ pushBits(d, 8, len);
72
+ res.data1 = d.concat(bits);
73
+ }
74
+
75
+ return res;
76
+ }
77
+
78
+ // {{{1 alphanumeric encode
79
+ const ALPHANUM = (function (s: string) {
80
+ const res: { [key: string]: number } = {};
81
+ for (let i = 0; i < s.length; i++) {
82
+ res[s[i]] = i;
83
+ }
84
+ return res;
85
+ })("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:");
86
+
87
+ function encode_alphanum(str: string) {
88
+ const len = str.length;
89
+ const bits: number[] = [];
90
+
91
+ for (let i = 0; i < len; i += 2) {
92
+ let b = 6;
93
+ let n = ALPHANUM[str[i]];
94
+ if (str[i + 1]) {
95
+ b = 11;
96
+ n = n * 45 + ALPHANUM[str[i + 1]];
97
+ }
98
+ pushBits(bits, b, n);
99
+ }
100
+
101
+ const res: NumberData = {};
102
+
103
+ let d = [0, 0, 1, 0];
104
+ pushBits(d, 13, len);
105
+ res.data27 = d.concat(bits);
106
+
107
+ if (len < 2048) {
108
+ let d = [0, 0, 1, 0];
109
+ pushBits(d, 11, len);
110
+ res.data10 = d.concat(bits);
111
+ }
112
+
113
+ if (len < 512) {
114
+ let d = [0, 0, 1, 0];
115
+ pushBits(d, 9, len);
116
+ res.data1 = d.concat(bits);
117
+ }
118
+
119
+ return res;
120
+ }
121
+
122
+ // {{{1 numeric encode
123
+ function encode_numeric(str: string) {
124
+ const len = str.length;
125
+ const bits: number[] = [];
126
+
127
+ for (let i = 0; i < len; i += 3) {
128
+ const s = str.substr(i, 3);
129
+ const b = Math.ceil((s.length * 10) / 3);
130
+ pushBits(bits, b, parseInt(s, 10));
131
+ }
132
+
133
+ const res: NumberData = {};
134
+
135
+ let d = [0, 0, 0, 1];
136
+ pushBits(d, 14, len);
137
+ res.data27 = d.concat(bits);
138
+
139
+ if (len < 4096) {
140
+ let d = [0, 0, 0, 1];
141
+ pushBits(d, 12, len);
142
+ res.data10 = d.concat(bits);
143
+ }
144
+
145
+ if (len < 1024) {
146
+ let d = [0, 0, 0, 1];
147
+ pushBits(d, 10, len);
148
+ res.data1 = d.concat(bits);
149
+ }
150
+
151
+ return res;
152
+ }
153
+
154
+ // {{{1 url encode
155
+ function encode_url(str: string): NumberData {
156
+ const slash = str.indexOf("/", 8) + 1 || str.length;
157
+ const res = encode(str.slice(0, slash).toUpperCase(), false);
158
+
159
+ if (slash >= str.length) {
160
+ return res;
161
+ }
162
+
163
+ const path_res = encode(str.slice(slash), false);
164
+
165
+ res.data27 = res.data27.concat(path_res.data27);
166
+
167
+ if (res.data10 && path_res.data10) {
168
+ res.data10 = res.data10.concat(path_res.data10);
169
+ }
170
+
171
+ if (res.data1 && path_res.data1) {
172
+ res.data1 = res.data1.concat(path_res.data1);
173
+ }
174
+
175
+ return res;
176
+ }