@juit/qrcode 0.0.0
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/LICENSE.md +211 -0
- package/NOTICE.md +13 -0
- package/README.md +175 -0
- package/dist/encode.cjs +147 -0
- package/dist/encode.cjs.map +6 -0
- package/dist/encode.d.ts +11 -0
- package/dist/encode.mjs +122 -0
- package/dist/encode.mjs.map +6 -0
- package/dist/images/path.cjs +145 -0
- package/dist/images/path.cjs.map +6 -0
- package/dist/images/path.d.ts +6 -0
- package/dist/images/path.mjs +120 -0
- package/dist/images/path.mjs.map +6 -0
- package/dist/images/pdf.cjs +96 -0
- package/dist/images/pdf.cjs.map +6 -0
- package/dist/images/pdf.d.ts +3 -0
- package/dist/images/pdf.mjs +71 -0
- package/dist/images/pdf.mjs.map +6 -0
- package/dist/images/png.cjs +86 -0
- package/dist/images/png.cjs.map +6 -0
- package/dist/images/png.d.ts +3 -0
- package/dist/images/png.mjs +61 -0
- package/dist/images/png.mjs.map +6 -0
- package/dist/images/svg.cjs +64 -0
- package/dist/images/svg.cjs.map +6 -0
- package/dist/images/svg.d.ts +54 -0
- package/dist/images/svg.mjs +38 -0
- package/dist/images/svg.mjs.map +6 -0
- package/dist/index.cjs +110 -0
- package/dist/index.cjs.map +6 -0
- package/dist/index.d.ts +74 -0
- package/dist/index.mjs +74 -0
- package/dist/index.mjs.map +6 -0
- package/dist/matrix.cjs +360 -0
- package/dist/matrix.cjs.map +6 -0
- package/dist/matrix.d.ts +3 -0
- package/dist/matrix.mjs +335 -0
- package/dist/matrix.mjs.map +6 -0
- package/dist/qrcode.cjs +183 -0
- package/dist/qrcode.cjs.map +6 -0
- package/dist/qrcode.d.ts +20 -0
- package/dist/qrcode.mjs +158 -0
- package/dist/qrcode.mjs.map +6 -0
- package/dist/utils/crc32.cjs +53 -0
- package/dist/utils/crc32.cjs.map +6 -0
- package/dist/utils/crc32.d.ts +9 -0
- package/dist/utils/crc32.mjs +28 -0
- package/dist/utils/crc32.mjs.map +6 -0
- package/dist/utils/dataurl.cjs +35 -0
- package/dist/utils/dataurl.cjs.map +6 -0
- package/dist/utils/dataurl.d.ts +1 -0
- package/dist/utils/dataurl.mjs +10 -0
- package/dist/utils/dataurl.mjs.map +6 -0
- package/dist/utils/deflate.cjs +39 -0
- package/dist/utils/deflate.cjs.map +6 -0
- package/dist/utils/deflate.d.ts +2 -0
- package/dist/utils/deflate.mjs +14 -0
- package/dist/utils/deflate.mjs.map +6 -0
- package/dist/utils/ecc.cjs +93 -0
- package/dist/utils/ecc.cjs.map +6 -0
- package/dist/utils/ecc.d.ts +2 -0
- package/dist/utils/ecc.mjs +68 -0
- package/dist/utils/ecc.mjs.map +6 -0
- package/dist/utils/merge.cjs +41 -0
- package/dist/utils/merge.cjs.map +6 -0
- package/dist/utils/merge.d.ts +2 -0
- package/dist/utils/merge.mjs +16 -0
- package/dist/utils/merge.mjs.map +6 -0
- package/package.json +61 -0
- package/src/encode.ts +180 -0
- package/src/images/path.ts +131 -0
- package/src/images/pdf.ts +76 -0
- package/src/images/png.ts +105 -0
- package/src/images/svg.ts +102 -0
- package/src/index.ts +147 -0
- package/src/matrix.ts +392 -0
- package/src/qrcode.ts +217 -0
- package/src/utils/crc32.ts +50 -0
- package/src/utils/dataurl.ts +7 -0
- package/src/utils/deflate.ts +17 -0
- package/src/utils/ecc.ts +95 -0
- package/src/utils/merge.ts +13 -0
package/dist/encode.mjs
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// encode.ts
|
|
2
|
+
var ALPHANUM = function(s) {
|
|
3
|
+
const res = {};
|
|
4
|
+
for (let i = 0; i < s.length; i++) {
|
|
5
|
+
res[s[i]] = i;
|
|
6
|
+
}
|
|
7
|
+
return res;
|
|
8
|
+
}("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:");
|
|
9
|
+
function pushBits(arr, n, value) {
|
|
10
|
+
for (let bit = 1 << n - 1; bit; bit = bit >>> 1) {
|
|
11
|
+
arr.push(!!(bit & value));
|
|
12
|
+
}
|
|
13
|
+
return arr;
|
|
14
|
+
}
|
|
15
|
+
function binaryEncode(data) {
|
|
16
|
+
const len = data.length;
|
|
17
|
+
const bits = [];
|
|
18
|
+
for (let i = 0; i < len; i++) {
|
|
19
|
+
pushBits(bits, 8, data[i]);
|
|
20
|
+
}
|
|
21
|
+
const d = pushBits([false, true, false, false], 16, len);
|
|
22
|
+
const res = {
|
|
23
|
+
data27: d.concat(bits)
|
|
24
|
+
};
|
|
25
|
+
res.data10 = res.data27;
|
|
26
|
+
if (len < 256) {
|
|
27
|
+
const d2 = pushBits([false, true, false, false], 8, len);
|
|
28
|
+
res.data1 = d2.concat(bits);
|
|
29
|
+
}
|
|
30
|
+
return res;
|
|
31
|
+
}
|
|
32
|
+
function alphanumEncode(str) {
|
|
33
|
+
const len = str.length;
|
|
34
|
+
const bits = [];
|
|
35
|
+
for (let i = 0; i < len; i += 2) {
|
|
36
|
+
let b = 6;
|
|
37
|
+
let n = ALPHANUM[str[i]];
|
|
38
|
+
if (str[i + 1]) {
|
|
39
|
+
b = 11;
|
|
40
|
+
n = n * 45 + ALPHANUM[str[i + 1]];
|
|
41
|
+
}
|
|
42
|
+
pushBits(bits, b, n);
|
|
43
|
+
}
|
|
44
|
+
const d = pushBits([false, false, true, false], 13, len);
|
|
45
|
+
const res = {
|
|
46
|
+
data27: d.concat(bits)
|
|
47
|
+
};
|
|
48
|
+
if (len < 2048) {
|
|
49
|
+
const d2 = pushBits([false, false, true, false], 11, len);
|
|
50
|
+
res.data10 = d2.concat(bits);
|
|
51
|
+
}
|
|
52
|
+
if (len < 512) {
|
|
53
|
+
const d2 = pushBits([false, false, true, false], 9, len);
|
|
54
|
+
res.data1 = d2.concat(bits);
|
|
55
|
+
}
|
|
56
|
+
return res;
|
|
57
|
+
}
|
|
58
|
+
function numericEncode(str) {
|
|
59
|
+
const len = str.length;
|
|
60
|
+
const bits = [];
|
|
61
|
+
for (let i = 0; i < len; i += 3) {
|
|
62
|
+
const s = str.substring(i, i + 3);
|
|
63
|
+
const b = Math.ceil(s.length * 10 / 3);
|
|
64
|
+
pushBits(bits, b, parseInt(s, 10));
|
|
65
|
+
}
|
|
66
|
+
const d = pushBits([false, false, false, true], 14, len);
|
|
67
|
+
const res = {
|
|
68
|
+
data27: d.concat(bits)
|
|
69
|
+
};
|
|
70
|
+
if (len < 4096) {
|
|
71
|
+
const d2 = pushBits([false, false, false, true], 12, len);
|
|
72
|
+
res.data10 = d2.concat(bits);
|
|
73
|
+
}
|
|
74
|
+
if (len < 1024) {
|
|
75
|
+
const d2 = pushBits([false, false, false, true], 10, len);
|
|
76
|
+
res.data1 = d2.concat(bits);
|
|
77
|
+
}
|
|
78
|
+
return res;
|
|
79
|
+
}
|
|
80
|
+
function urlEncode(str) {
|
|
81
|
+
const slash = str.indexOf("/", 8) + 1 || str.length;
|
|
82
|
+
const res = encodeQrCodeMessage(str.slice(0, slash).toUpperCase(), false);
|
|
83
|
+
if (slash >= str.length)
|
|
84
|
+
return res;
|
|
85
|
+
const path = encodeQrCodeMessage(str.slice(slash), false);
|
|
86
|
+
res.data27 = res.data27.concat(path.data27);
|
|
87
|
+
if (res.data10 && path.data10) {
|
|
88
|
+
res.data10 = res.data10.concat(path.data10);
|
|
89
|
+
}
|
|
90
|
+
if (res.data1 && path.data1) {
|
|
91
|
+
res.data1 = res.data1.concat(path.data1);
|
|
92
|
+
}
|
|
93
|
+
return res;
|
|
94
|
+
}
|
|
95
|
+
function encodeQrCodeMessage(message, url) {
|
|
96
|
+
let data;
|
|
97
|
+
if (typeof message === "string") {
|
|
98
|
+
data = new TextEncoder().encode(message);
|
|
99
|
+
if (/^[0-9]+$/.test(message)) {
|
|
100
|
+
if (data.length > 7089)
|
|
101
|
+
throw new Error(`Too much numeric data (len=${data.length})`);
|
|
102
|
+
return numericEncode(message);
|
|
103
|
+
}
|
|
104
|
+
if (/^[0-9A-Z $%*+./:-]+$/.test(message)) {
|
|
105
|
+
if (data.length > 4296)
|
|
106
|
+
throw new Error(`Too much alphanumeric data (len=${data.length})`);
|
|
107
|
+
return alphanumEncode(message);
|
|
108
|
+
}
|
|
109
|
+
if (url && /^https?:/i.test(message)) {
|
|
110
|
+
return urlEncode(message);
|
|
111
|
+
}
|
|
112
|
+
} else {
|
|
113
|
+
data = message;
|
|
114
|
+
}
|
|
115
|
+
if (data.length > 2953)
|
|
116
|
+
throw new Error(`Too much binary data (len=${data.length})`);
|
|
117
|
+
return binaryEncode(data);
|
|
118
|
+
}
|
|
119
|
+
export {
|
|
120
|
+
encodeQrCodeMessage
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=encode.mjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/encode.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["d"]
|
|
6
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// images/path.ts
|
|
21
|
+
var path_exports = {};
|
|
22
|
+
__export(path_exports, {
|
|
23
|
+
generatePaths: () => generatePaths
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(path_exports);
|
|
26
|
+
function generatePaths(code) {
|
|
27
|
+
const { matrix, size } = code;
|
|
28
|
+
const filled = [];
|
|
29
|
+
for (let row = -1; row <= size; row++) {
|
|
30
|
+
filled[row] = [];
|
|
31
|
+
}
|
|
32
|
+
const path = [];
|
|
33
|
+
for (let row = 0; row < size; row++) {
|
|
34
|
+
for (let col = 0; col < size; col++) {
|
|
35
|
+
if (filled[row][col])
|
|
36
|
+
continue;
|
|
37
|
+
filled[row][col] = true;
|
|
38
|
+
if (isDark(row, col)) {
|
|
39
|
+
if (!isDark(row - 1, col)) {
|
|
40
|
+
path.push(plot(row, col, "right"));
|
|
41
|
+
}
|
|
42
|
+
} else {
|
|
43
|
+
if (isDark(row, col - 1)) {
|
|
44
|
+
path.push(plot(row, col, "down"));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return path;
|
|
50
|
+
function isDark(row, col) {
|
|
51
|
+
if (row < 0 || col < 0 || row >= size || col >= size)
|
|
52
|
+
return false;
|
|
53
|
+
return !!matrix[row][col];
|
|
54
|
+
}
|
|
55
|
+
function plot(row0, col0, dir) {
|
|
56
|
+
filled[row0][col0] = true;
|
|
57
|
+
const res = [];
|
|
58
|
+
res.push(["M", col0, row0]);
|
|
59
|
+
let row = row0;
|
|
60
|
+
let col = col0;
|
|
61
|
+
let len = 0;
|
|
62
|
+
do {
|
|
63
|
+
switch (dir) {
|
|
64
|
+
case "right":
|
|
65
|
+
filled[row][col] = true;
|
|
66
|
+
if (isDark(row, col)) {
|
|
67
|
+
filled[row - 1][col] = true;
|
|
68
|
+
if (isDark(row - 1, col)) {
|
|
69
|
+
res.push(["h", len]);
|
|
70
|
+
len = 0;
|
|
71
|
+
dir = "up";
|
|
72
|
+
} else {
|
|
73
|
+
len++;
|
|
74
|
+
col++;
|
|
75
|
+
}
|
|
76
|
+
} else {
|
|
77
|
+
res.push(["h", len]);
|
|
78
|
+
len = 0;
|
|
79
|
+
dir = "down";
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
case "left":
|
|
83
|
+
filled[row - 1][col - 1] = true;
|
|
84
|
+
if (isDark(row - 1, col - 1)) {
|
|
85
|
+
filled[row][col - 1] = true;
|
|
86
|
+
if (isDark(row, col - 1)) {
|
|
87
|
+
res.push(["h", -len]);
|
|
88
|
+
len = 0;
|
|
89
|
+
dir = "down";
|
|
90
|
+
} else {
|
|
91
|
+
len++;
|
|
92
|
+
col--;
|
|
93
|
+
}
|
|
94
|
+
} else {
|
|
95
|
+
res.push(["h", -len]);
|
|
96
|
+
len = 0;
|
|
97
|
+
dir = "up";
|
|
98
|
+
}
|
|
99
|
+
break;
|
|
100
|
+
case "down":
|
|
101
|
+
filled[row][col - 1] = true;
|
|
102
|
+
if (isDark(row, col - 1)) {
|
|
103
|
+
filled[row][col] = true;
|
|
104
|
+
if (isDark(row, col)) {
|
|
105
|
+
res.push(["v", len]);
|
|
106
|
+
len = 0;
|
|
107
|
+
dir = "right";
|
|
108
|
+
} else {
|
|
109
|
+
len++;
|
|
110
|
+
row++;
|
|
111
|
+
}
|
|
112
|
+
} else {
|
|
113
|
+
res.push(["v", len]);
|
|
114
|
+
len = 0;
|
|
115
|
+
dir = "left";
|
|
116
|
+
}
|
|
117
|
+
break;
|
|
118
|
+
case "up":
|
|
119
|
+
filled[row - 1][col] = true;
|
|
120
|
+
if (isDark(row - 1, col)) {
|
|
121
|
+
filled[row - 1][col - 1] = true;
|
|
122
|
+
if (isDark(row - 1, col - 1)) {
|
|
123
|
+
res.push(["v", -len]);
|
|
124
|
+
len = 0;
|
|
125
|
+
dir = "left";
|
|
126
|
+
} else {
|
|
127
|
+
len++;
|
|
128
|
+
row--;
|
|
129
|
+
}
|
|
130
|
+
} else {
|
|
131
|
+
res.push(["v", -len]);
|
|
132
|
+
len = 0;
|
|
133
|
+
dir = "right";
|
|
134
|
+
}
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
} while (row != row0 || col != col0);
|
|
138
|
+
return res;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
142
|
+
0 && (module.exports = {
|
|
143
|
+
generatePaths
|
|
144
|
+
});
|
|
145
|
+
//# sourceMappingURL=path.cjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/images/path.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { QrCode } from '../index';
|
|
2
|
+
export type PathItem = ['M', number, number] | ['h', number] | ['v', number];
|
|
3
|
+
export type Path = PathItem[];
|
|
4
|
+
export type Paths = Path[];
|
|
5
|
+
/** Generate a set of vector paths for a QR code */
|
|
6
|
+
export declare function generatePaths(code: QrCode): Paths;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// images/path.ts
|
|
2
|
+
function generatePaths(code) {
|
|
3
|
+
const { matrix, size } = code;
|
|
4
|
+
const filled = [];
|
|
5
|
+
for (let row = -1; row <= size; row++) {
|
|
6
|
+
filled[row] = [];
|
|
7
|
+
}
|
|
8
|
+
const path = [];
|
|
9
|
+
for (let row = 0; row < size; row++) {
|
|
10
|
+
for (let col = 0; col < size; col++) {
|
|
11
|
+
if (filled[row][col])
|
|
12
|
+
continue;
|
|
13
|
+
filled[row][col] = true;
|
|
14
|
+
if (isDark(row, col)) {
|
|
15
|
+
if (!isDark(row - 1, col)) {
|
|
16
|
+
path.push(plot(row, col, "right"));
|
|
17
|
+
}
|
|
18
|
+
} else {
|
|
19
|
+
if (isDark(row, col - 1)) {
|
|
20
|
+
path.push(plot(row, col, "down"));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return path;
|
|
26
|
+
function isDark(row, col) {
|
|
27
|
+
if (row < 0 || col < 0 || row >= size || col >= size)
|
|
28
|
+
return false;
|
|
29
|
+
return !!matrix[row][col];
|
|
30
|
+
}
|
|
31
|
+
function plot(row0, col0, dir) {
|
|
32
|
+
filled[row0][col0] = true;
|
|
33
|
+
const res = [];
|
|
34
|
+
res.push(["M", col0, row0]);
|
|
35
|
+
let row = row0;
|
|
36
|
+
let col = col0;
|
|
37
|
+
let len = 0;
|
|
38
|
+
do {
|
|
39
|
+
switch (dir) {
|
|
40
|
+
case "right":
|
|
41
|
+
filled[row][col] = true;
|
|
42
|
+
if (isDark(row, col)) {
|
|
43
|
+
filled[row - 1][col] = true;
|
|
44
|
+
if (isDark(row - 1, col)) {
|
|
45
|
+
res.push(["h", len]);
|
|
46
|
+
len = 0;
|
|
47
|
+
dir = "up";
|
|
48
|
+
} else {
|
|
49
|
+
len++;
|
|
50
|
+
col++;
|
|
51
|
+
}
|
|
52
|
+
} else {
|
|
53
|
+
res.push(["h", len]);
|
|
54
|
+
len = 0;
|
|
55
|
+
dir = "down";
|
|
56
|
+
}
|
|
57
|
+
break;
|
|
58
|
+
case "left":
|
|
59
|
+
filled[row - 1][col - 1] = true;
|
|
60
|
+
if (isDark(row - 1, col - 1)) {
|
|
61
|
+
filled[row][col - 1] = true;
|
|
62
|
+
if (isDark(row, col - 1)) {
|
|
63
|
+
res.push(["h", -len]);
|
|
64
|
+
len = 0;
|
|
65
|
+
dir = "down";
|
|
66
|
+
} else {
|
|
67
|
+
len++;
|
|
68
|
+
col--;
|
|
69
|
+
}
|
|
70
|
+
} else {
|
|
71
|
+
res.push(["h", -len]);
|
|
72
|
+
len = 0;
|
|
73
|
+
dir = "up";
|
|
74
|
+
}
|
|
75
|
+
break;
|
|
76
|
+
case "down":
|
|
77
|
+
filled[row][col - 1] = true;
|
|
78
|
+
if (isDark(row, col - 1)) {
|
|
79
|
+
filled[row][col] = true;
|
|
80
|
+
if (isDark(row, col)) {
|
|
81
|
+
res.push(["v", len]);
|
|
82
|
+
len = 0;
|
|
83
|
+
dir = "right";
|
|
84
|
+
} else {
|
|
85
|
+
len++;
|
|
86
|
+
row++;
|
|
87
|
+
}
|
|
88
|
+
} else {
|
|
89
|
+
res.push(["v", len]);
|
|
90
|
+
len = 0;
|
|
91
|
+
dir = "left";
|
|
92
|
+
}
|
|
93
|
+
break;
|
|
94
|
+
case "up":
|
|
95
|
+
filled[row - 1][col] = true;
|
|
96
|
+
if (isDark(row - 1, col)) {
|
|
97
|
+
filled[row - 1][col - 1] = true;
|
|
98
|
+
if (isDark(row - 1, col - 1)) {
|
|
99
|
+
res.push(["v", -len]);
|
|
100
|
+
len = 0;
|
|
101
|
+
dir = "left";
|
|
102
|
+
} else {
|
|
103
|
+
len++;
|
|
104
|
+
row--;
|
|
105
|
+
}
|
|
106
|
+
} else {
|
|
107
|
+
res.push(["v", -len]);
|
|
108
|
+
len = 0;
|
|
109
|
+
dir = "right";
|
|
110
|
+
}
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
} while (row != row0 || col != col0);
|
|
114
|
+
return res;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export {
|
|
118
|
+
generatePaths
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=path.mjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/images/path.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// images/pdf.ts
|
|
21
|
+
var pdf_exports = {};
|
|
22
|
+
__export(pdf_exports, {
|
|
23
|
+
generatePdf: () => generatePdf
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(pdf_exports);
|
|
26
|
+
var import_deflate = require("../utils/deflate.cjs");
|
|
27
|
+
var import_merge = require("../utils/merge.cjs");
|
|
28
|
+
var import_path = require("./path.cjs");
|
|
29
|
+
async function generatePdf(code, options) {
|
|
30
|
+
const { margin = 4, scale = 9 } = { ...options };
|
|
31
|
+
const size = (code.size + 2 * margin) * scale;
|
|
32
|
+
const encoder = new TextEncoder();
|
|
33
|
+
const chunks = [
|
|
34
|
+
encoder.encode("%PDF-1.0\n\n"),
|
|
35
|
+
// PDF header
|
|
36
|
+
encoder.encode("1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj\n"),
|
|
37
|
+
encoder.encode("2 0 obj << /Type /Pages /Count 1 /Kids [ 3 0 R ] >> endobj\n"),
|
|
38
|
+
encoder.encode(`3 0 obj << /Type /Page /Parent 2 0 R /Resources <<>> /Contents 4 0 R /MediaBox [ 0 0 ${size} ${size} ] >> endobj
|
|
39
|
+
`)
|
|
40
|
+
];
|
|
41
|
+
let path = `${scale} 0 0 ${scale} 0 0 cm
|
|
42
|
+
`;
|
|
43
|
+
path += (0, import_path.generatePaths)(code).map(function(subpath) {
|
|
44
|
+
let x = NaN;
|
|
45
|
+
let y = NaN;
|
|
46
|
+
let res = "";
|
|
47
|
+
for (let k = 0; k < subpath.length; k++) {
|
|
48
|
+
const item = subpath[k];
|
|
49
|
+
switch (item[0]) {
|
|
50
|
+
case "M":
|
|
51
|
+
x = item[1] + margin;
|
|
52
|
+
y = code.size - item[2] + margin;
|
|
53
|
+
res += x + " " + y + " m ";
|
|
54
|
+
break;
|
|
55
|
+
case "h":
|
|
56
|
+
x += item[1];
|
|
57
|
+
res += x + " " + y + " l ";
|
|
58
|
+
break;
|
|
59
|
+
case "v":
|
|
60
|
+
y -= item[1];
|
|
61
|
+
res += x + " " + y + " l ";
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
res += "h";
|
|
66
|
+
return res;
|
|
67
|
+
}).join("\n");
|
|
68
|
+
path += "\nf\n";
|
|
69
|
+
const deflated = await (0, import_deflate.deflate)(encoder.encode(path));
|
|
70
|
+
chunks.push((0, import_merge.mergeArrays)(
|
|
71
|
+
encoder.encode(`4 0 obj << /Length ${deflated.length} /Filter /FlateDecode >> stream
|
|
72
|
+
`),
|
|
73
|
+
// start the stream
|
|
74
|
+
deflated,
|
|
75
|
+
// the path is deflated
|
|
76
|
+
encoder.encode("\nendstream\nendobj\n")
|
|
77
|
+
// end the stream
|
|
78
|
+
));
|
|
79
|
+
let xref = "xref\n0 5\n0000000000 65535 f \n";
|
|
80
|
+
let offset = chunks[0].length;
|
|
81
|
+
for (let i = 1; i < 5; i++) {
|
|
82
|
+
xref += `0000000000${offset}`.slice(-10) + " 00000 n \n";
|
|
83
|
+
offset += chunks[i].length;
|
|
84
|
+
}
|
|
85
|
+
chunks.push(
|
|
86
|
+
encoder.encode(xref),
|
|
87
|
+
encoder.encode("trailer << /Root 1 0 R /Size 5 >>\n"),
|
|
88
|
+
encoder.encode("startxref\n" + offset + "\n%%EOF\n")
|
|
89
|
+
);
|
|
90
|
+
return (0, import_merge.mergeArrays)(...chunks);
|
|
91
|
+
}
|
|
92
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
93
|
+
0 && (module.exports = {
|
|
94
|
+
generatePdf
|
|
95
|
+
});
|
|
96
|
+
//# sourceMappingURL=pdf.cjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/images/pdf.ts"],
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAwB;AACxB,mBAA4B;AAC5B,kBAA8B;AAK9B,eAAsB,YAAY,MAAc,SAAmD;AACjG,QAAM,EAAE,SAAS,GAAG,QAAQ,EAAE,IAAI,EAAE,GAAG,QAAQ;AAC/C,QAAM,QAAQ,KAAK,OAAO,IAAI,UAAU;AAGxC,QAAM,UAAU,IAAI,YAAY;AAGhC,QAAM,SAAuB;AAAA,IAC3B,QAAQ,OAAO,cAAc;AAAA;AAAA,IAC7B,QAAQ,OAAO,oDAAoD;AAAA,IACnE,QAAQ,OAAO,8DAA8D;AAAA,IAC7E,QAAQ,OAAO,wFAAwF,IAAI,IAAI,IAAI;AAAA,CAAgB;AAAA,EACrI;AAGA,MAAI,OAAO,GAAG,KAAK,QAAQ,KAAK;AAAA;AAChC,cAAQ,2BAAc,IAAI,EAAE,IAAI,SAAS,SAAS;AAChD,QAAI,IAAY;AAChB,QAAI,IAAY;AAChB,QAAI,MAAc;AAElB,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAM,OAAO,QAAQ,CAAC;AACtB,cAAQ,KAAK,CAAC,GAAG;AAAA,QACf,KAAK;AACH,cAAI,KAAK,CAAC,IAAI;AACd,cAAI,KAAK,OAAO,KAAK,CAAC,IAAI;AAC1B,iBAAO,IAAI,MAAM,IAAI;AACrB;AAAA,QACF,KAAK;AACH,eAAK,KAAK,CAAC;AACX,iBAAO,IAAI,MAAM,IAAI;AACrB;AAAA,QACF,KAAK;AACH,eAAK,KAAK,CAAC;AACX,iBAAO,IAAI,MAAM,IAAI;AACrB;AAAA,MACJ;AAAA,IACF;AACA,WAAO;AACP,WAAO;AAAA,EACT,CAAC,EAAE,KAAK,IAAI;AACZ,UAAQ;AAGR,QAAM,WAAW,UAAM,wBAAQ,QAAQ,OAAO,IAAI,CAAC;AACnD,SAAO,SAAK;AAAA,IACR,QAAQ,OAAO,sBAAsB,SAAS,MAAM;AAAA,CAAmC;AAAA;AAAA,IACvF;AAAA;AAAA,IACA,QAAQ,OAAO,uBAAuB;AAAA;AAAA,EAC1C,CAAC;AAGD,MAAI,OAAO;AACX,MAAI,SAAS,OAAO,CAAC,EAAG;AACxB,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAQ,aAAa,MAAM,GAAG,MAAM,GAAG,IAAI;AAC3C,cAAU,OAAO,CAAC,EAAG;AAAA,EACvB;AAEA,SAAO;AAAA,IACH,QAAQ,OAAO,IAAI;AAAA,IACnB,QAAQ,OAAO,qCAAqC;AAAA,IACpD,QAAQ,OAAO,gBAAgB,SAAS,WAAW;AAAA,EACvD;AAEA,aAAO,0BAAY,GAAG,MAAM;AAC9B;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// images/pdf.ts
|
|
2
|
+
import { deflate } from "../utils/deflate.mjs";
|
|
3
|
+
import { mergeArrays } from "../utils/merge.mjs";
|
|
4
|
+
import { generatePaths } from "./path.mjs";
|
|
5
|
+
async function generatePdf(code, options) {
|
|
6
|
+
const { margin = 4, scale = 9 } = { ...options };
|
|
7
|
+
const size = (code.size + 2 * margin) * scale;
|
|
8
|
+
const encoder = new TextEncoder();
|
|
9
|
+
const chunks = [
|
|
10
|
+
encoder.encode("%PDF-1.0\n\n"),
|
|
11
|
+
// PDF header
|
|
12
|
+
encoder.encode("1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj\n"),
|
|
13
|
+
encoder.encode("2 0 obj << /Type /Pages /Count 1 /Kids [ 3 0 R ] >> endobj\n"),
|
|
14
|
+
encoder.encode(`3 0 obj << /Type /Page /Parent 2 0 R /Resources <<>> /Contents 4 0 R /MediaBox [ 0 0 ${size} ${size} ] >> endobj
|
|
15
|
+
`)
|
|
16
|
+
];
|
|
17
|
+
let path = `${scale} 0 0 ${scale} 0 0 cm
|
|
18
|
+
`;
|
|
19
|
+
path += generatePaths(code).map(function(subpath) {
|
|
20
|
+
let x = NaN;
|
|
21
|
+
let y = NaN;
|
|
22
|
+
let res = "";
|
|
23
|
+
for (let k = 0; k < subpath.length; k++) {
|
|
24
|
+
const item = subpath[k];
|
|
25
|
+
switch (item[0]) {
|
|
26
|
+
case "M":
|
|
27
|
+
x = item[1] + margin;
|
|
28
|
+
y = code.size - item[2] + margin;
|
|
29
|
+
res += x + " " + y + " m ";
|
|
30
|
+
break;
|
|
31
|
+
case "h":
|
|
32
|
+
x += item[1];
|
|
33
|
+
res += x + " " + y + " l ";
|
|
34
|
+
break;
|
|
35
|
+
case "v":
|
|
36
|
+
y -= item[1];
|
|
37
|
+
res += x + " " + y + " l ";
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
res += "h";
|
|
42
|
+
return res;
|
|
43
|
+
}).join("\n");
|
|
44
|
+
path += "\nf\n";
|
|
45
|
+
const deflated = await deflate(encoder.encode(path));
|
|
46
|
+
chunks.push(mergeArrays(
|
|
47
|
+
encoder.encode(`4 0 obj << /Length ${deflated.length} /Filter /FlateDecode >> stream
|
|
48
|
+
`),
|
|
49
|
+
// start the stream
|
|
50
|
+
deflated,
|
|
51
|
+
// the path is deflated
|
|
52
|
+
encoder.encode("\nendstream\nendobj\n")
|
|
53
|
+
// end the stream
|
|
54
|
+
));
|
|
55
|
+
let xref = "xref\n0 5\n0000000000 65535 f \n";
|
|
56
|
+
let offset = chunks[0].length;
|
|
57
|
+
for (let i = 1; i < 5; i++) {
|
|
58
|
+
xref += `0000000000${offset}`.slice(-10) + " 00000 n \n";
|
|
59
|
+
offset += chunks[i].length;
|
|
60
|
+
}
|
|
61
|
+
chunks.push(
|
|
62
|
+
encoder.encode(xref),
|
|
63
|
+
encoder.encode("trailer << /Root 1 0 R /Size 5 >>\n"),
|
|
64
|
+
encoder.encode("startxref\n" + offset + "\n%%EOF\n")
|
|
65
|
+
);
|
|
66
|
+
return mergeArrays(...chunks);
|
|
67
|
+
}
|
|
68
|
+
export {
|
|
69
|
+
generatePdf
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=pdf.mjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/images/pdf.ts"],
|
|
4
|
+
"mappings": ";AAAA,SAAS,eAAe;AACxB,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAK9B,eAAsB,YAAY,MAAc,SAAmD;AACjG,QAAM,EAAE,SAAS,GAAG,QAAQ,EAAE,IAAI,EAAE,GAAG,QAAQ;AAC/C,QAAM,QAAQ,KAAK,OAAO,IAAI,UAAU;AAGxC,QAAM,UAAU,IAAI,YAAY;AAGhC,QAAM,SAAuB;AAAA,IAC3B,QAAQ,OAAO,cAAc;AAAA;AAAA,IAC7B,QAAQ,OAAO,oDAAoD;AAAA,IACnE,QAAQ,OAAO,8DAA8D;AAAA,IAC7E,QAAQ,OAAO,wFAAwF,IAAI,IAAI,IAAI;AAAA,CAAgB;AAAA,EACrI;AAGA,MAAI,OAAO,GAAG,KAAK,QAAQ,KAAK;AAAA;AAChC,UAAQ,cAAc,IAAI,EAAE,IAAI,SAAS,SAAS;AAChD,QAAI,IAAY;AAChB,QAAI,IAAY;AAChB,QAAI,MAAc;AAElB,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAM,OAAO,QAAQ,CAAC;AACtB,cAAQ,KAAK,CAAC,GAAG;AAAA,QACf,KAAK;AACH,cAAI,KAAK,CAAC,IAAI;AACd,cAAI,KAAK,OAAO,KAAK,CAAC,IAAI;AAC1B,iBAAO,IAAI,MAAM,IAAI;AACrB;AAAA,QACF,KAAK;AACH,eAAK,KAAK,CAAC;AACX,iBAAO,IAAI,MAAM,IAAI;AACrB;AAAA,QACF,KAAK;AACH,eAAK,KAAK,CAAC;AACX,iBAAO,IAAI,MAAM,IAAI;AACrB;AAAA,MACJ;AAAA,IACF;AACA,WAAO;AACP,WAAO;AAAA,EACT,CAAC,EAAE,KAAK,IAAI;AACZ,UAAQ;AAGR,QAAM,WAAW,MAAM,QAAQ,QAAQ,OAAO,IAAI,CAAC;AACnD,SAAO,KAAK;AAAA,IACR,QAAQ,OAAO,sBAAsB,SAAS,MAAM;AAAA,CAAmC;AAAA;AAAA,IACvF;AAAA;AAAA,IACA,QAAQ,OAAO,uBAAuB;AAAA;AAAA,EAC1C,CAAC;AAGD,MAAI,OAAO;AACX,MAAI,SAAS,OAAO,CAAC,EAAG;AACxB,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAQ,aAAa,MAAM,GAAG,MAAM,GAAG,IAAI;AAC3C,cAAU,OAAO,CAAC,EAAG;AAAA,EACvB;AAEA,SAAO;AAAA,IACH,QAAQ,OAAO,IAAI;AAAA,IACnB,QAAQ,OAAO,qCAAqC;AAAA,IACpD,QAAQ,OAAO,gBAAgB,SAAS,WAAW;AAAA,EACvD;AAEA,SAAO,YAAY,GAAG,MAAM;AAC9B;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|