@flux-lang/typesetter 0.1.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/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +223 -0
- package/dist/index.js.map +1 -0
- package/index.d.ts +14 -0
- package/package.json +32 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface TypesetterPdfOptions {
|
|
2
|
+
baseUrl?: string;
|
|
3
|
+
timeoutMs?: number;
|
|
4
|
+
preferCssPageSize?: boolean;
|
|
5
|
+
allowFile?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface TypesetterBackend {
|
|
8
|
+
name: string;
|
|
9
|
+
pdf(html: string, css: string, options?: TypesetterPdfOptions): Promise<Uint8Array>;
|
|
10
|
+
paginate?: (html: string, css: string, options?: TypesetterPdfOptions) => Promise<string>;
|
|
11
|
+
}
|
|
12
|
+
export declare function createTypesetterBackend(): TypesetterBackend;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACpF,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3F;AAED,wBAAgB,uBAAuB,IAAI,iBAAiB,CAI3D"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { promises as fs, statSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import { spawn } from "node:child_process";
|
|
5
|
+
import { chromium } from "playwright";
|
|
6
|
+
export function createTypesetterBackend() {
|
|
7
|
+
const pro = detectProBackend();
|
|
8
|
+
if (pro)
|
|
9
|
+
return pro;
|
|
10
|
+
return new PlaywrightBackend();
|
|
11
|
+
}
|
|
12
|
+
class PlaywrightBackend {
|
|
13
|
+
name = "playwright";
|
|
14
|
+
async pdf(html, css, options = {}) {
|
|
15
|
+
const doc = buildHtmlDocument(html, css, options.baseUrl);
|
|
16
|
+
let browser = null;
|
|
17
|
+
try {
|
|
18
|
+
browser = await chromium.launch({
|
|
19
|
+
headless: true,
|
|
20
|
+
args: [
|
|
21
|
+
"--font-render-hinting=none",
|
|
22
|
+
"--disable-font-subpixel-positioning",
|
|
23
|
+
"--disable-breakpad",
|
|
24
|
+
"--disable-dev-shm-usage",
|
|
25
|
+
"--disable-extensions",
|
|
26
|
+
],
|
|
27
|
+
});
|
|
28
|
+
const page = await browser.newPage();
|
|
29
|
+
await page.route("**/*", (route) => {
|
|
30
|
+
const url = route.request().url();
|
|
31
|
+
if (options.baseUrl && url.startsWith(options.baseUrl)) {
|
|
32
|
+
void route.continue();
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (options.allowFile && url.startsWith("file://")) {
|
|
36
|
+
void route.continue();
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (url.startsWith("data:")) {
|
|
40
|
+
void route.continue();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
void route.abort();
|
|
44
|
+
});
|
|
45
|
+
await page.setContent(doc, { waitUntil: "load", timeout: options.timeoutMs ?? 30000 });
|
|
46
|
+
await page.emulateMedia({ media: "print" });
|
|
47
|
+
await page.addStyleTag({
|
|
48
|
+
content: `*{animation:none !important;transition:none !important;}`,
|
|
49
|
+
});
|
|
50
|
+
await applySlotFits(page);
|
|
51
|
+
const pdf = await page.pdf({
|
|
52
|
+
printBackground: true,
|
|
53
|
+
preferCSSPageSize: options.preferCssPageSize ?? true,
|
|
54
|
+
});
|
|
55
|
+
return pdf;
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
await browser?.close();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
class ProBackend {
|
|
63
|
+
name;
|
|
64
|
+
executable;
|
|
65
|
+
constructor(name, executable) {
|
|
66
|
+
this.name = name;
|
|
67
|
+
this.executable = executable;
|
|
68
|
+
}
|
|
69
|
+
async pdf(html, css, options = {}) {
|
|
70
|
+
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "flux-typesetter-"));
|
|
71
|
+
const htmlPath = path.join(tmpDir, "index.html");
|
|
72
|
+
const pdfPath = path.join(tmpDir, "output.pdf");
|
|
73
|
+
const doc = buildHtmlDocument(html, css, options.baseUrl);
|
|
74
|
+
await fs.writeFile(htmlPath, doc, "utf8");
|
|
75
|
+
if (this.name === "prince") {
|
|
76
|
+
await runCommand(this.executable, ["--media", "print", "-o", pdfPath, htmlPath]);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
await runCommand(this.executable, ["-d", pdfPath, htmlPath]);
|
|
80
|
+
}
|
|
81
|
+
const buffer = await fs.readFile(pdfPath);
|
|
82
|
+
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
83
|
+
return buffer;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function detectProBackend() {
|
|
87
|
+
const prince = which("prince");
|
|
88
|
+
if (prince) {
|
|
89
|
+
return new ProBackend("prince", prince);
|
|
90
|
+
}
|
|
91
|
+
const ah = which("ah");
|
|
92
|
+
if (ah) {
|
|
93
|
+
return new ProBackend("antenna-house", ah);
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
function buildHtmlDocument(html, css, baseUrl) {
|
|
98
|
+
const safeBase = baseUrl ? `<base href="${escapeHtml(baseUrl)}">` : "";
|
|
99
|
+
return [
|
|
100
|
+
"<!doctype html>",
|
|
101
|
+
"<html>",
|
|
102
|
+
"<head>",
|
|
103
|
+
'<meta charset="utf-8">',
|
|
104
|
+
safeBase,
|
|
105
|
+
"<style>",
|
|
106
|
+
css,
|
|
107
|
+
"</style>",
|
|
108
|
+
"</head>",
|
|
109
|
+
"<body>",
|
|
110
|
+
html,
|
|
111
|
+
"</body>",
|
|
112
|
+
"</html>",
|
|
113
|
+
].join("");
|
|
114
|
+
}
|
|
115
|
+
async function applySlotFits(page) {
|
|
116
|
+
await page.evaluate(() => {
|
|
117
|
+
const fitsWithin = (container, inner) => {
|
|
118
|
+
return inner.scrollWidth <= container.clientWidth && inner.scrollHeight <= container.clientHeight;
|
|
119
|
+
};
|
|
120
|
+
const applyFit = (slot) => {
|
|
121
|
+
const fit = slot.getAttribute("data-flux-fit");
|
|
122
|
+
const inner = slot.querySelector("[data-flux-slot-inner]") || slot.querySelector(".flux-slot-inner");
|
|
123
|
+
if (!inner || !(inner instanceof HTMLElement) || !(slot instanceof HTMLElement))
|
|
124
|
+
return;
|
|
125
|
+
const isInline = slot.getAttribute("data-flux-inline") === "true";
|
|
126
|
+
inner.style.transform = "";
|
|
127
|
+
inner.style.fontSize = "";
|
|
128
|
+
inner.style.whiteSpace = "";
|
|
129
|
+
inner.style.textOverflow = "";
|
|
130
|
+
inner.style.webkitLineClamp = "";
|
|
131
|
+
inner.style.webkitBoxOrient = "";
|
|
132
|
+
inner.style.display = "";
|
|
133
|
+
if (fit === "shrink") {
|
|
134
|
+
const style = window.getComputedStyle(inner);
|
|
135
|
+
const base = parseFloat(style.fontSize) || 14;
|
|
136
|
+
let lo = 6;
|
|
137
|
+
let hi = base;
|
|
138
|
+
let best = base;
|
|
139
|
+
for (let i = 0; i < 10; i += 1) {
|
|
140
|
+
const mid = (lo + hi) / 2;
|
|
141
|
+
inner.style.fontSize = `${mid}px`;
|
|
142
|
+
if (fitsWithin(slot, inner)) {
|
|
143
|
+
best = mid;
|
|
144
|
+
lo = mid + 0.1;
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
hi = mid - 0.1;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
inner.style.fontSize = `${best}px`;
|
|
151
|
+
}
|
|
152
|
+
else if (fit === "scaleDown") {
|
|
153
|
+
inner.style.transformOrigin = "top left";
|
|
154
|
+
const scaleX = slot.clientWidth / inner.scrollWidth;
|
|
155
|
+
const scaleY = slot.clientHeight / inner.scrollHeight;
|
|
156
|
+
const scale = Math.min(1, scaleX, scaleY);
|
|
157
|
+
inner.style.transform = `scale(${scale})`;
|
|
158
|
+
}
|
|
159
|
+
else if (fit === "ellipsis") {
|
|
160
|
+
if (isInline) {
|
|
161
|
+
inner.style.display = "inline-block";
|
|
162
|
+
inner.style.whiteSpace = "nowrap";
|
|
163
|
+
inner.style.textOverflow = "ellipsis";
|
|
164
|
+
inner.style.overflow = "hidden";
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
const lineHeight = parseFloat(window.getComputedStyle(inner).lineHeight) || 16;
|
|
168
|
+
const maxLines = Math.max(1, Math.floor(slot.clientHeight / lineHeight));
|
|
169
|
+
inner.style.display = "-webkit-box";
|
|
170
|
+
inner.style.webkitBoxOrient = "vertical";
|
|
171
|
+
inner.style.webkitLineClamp = String(maxLines);
|
|
172
|
+
inner.style.overflow = "hidden";
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
document.querySelectorAll("[data-flux-fit]").forEach((slot) => applyFit(slot));
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
function which(cmd) {
|
|
180
|
+
const pathEntries = process.env.PATH?.split(path.delimiter) ?? [];
|
|
181
|
+
const extensions = process.platform === "win32" ? [".exe", ".cmd", ".bat", ""] : [""];
|
|
182
|
+
for (const entry of pathEntries) {
|
|
183
|
+
for (const ext of extensions) {
|
|
184
|
+
const full = path.join(entry, `${cmd}${ext}`);
|
|
185
|
+
try {
|
|
186
|
+
if (fsSyncExists(full))
|
|
187
|
+
return full;
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
function fsSyncExists(filePath) {
|
|
197
|
+
try {
|
|
198
|
+
return statSync(filePath).isFile();
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
function runCommand(cmd, args) {
|
|
205
|
+
return new Promise((resolve, reject) => {
|
|
206
|
+
const child = spawn(cmd, args, { stdio: "inherit" });
|
|
207
|
+
child.on("error", reject);
|
|
208
|
+
child.on("exit", (code) => {
|
|
209
|
+
if (code === 0)
|
|
210
|
+
resolve();
|
|
211
|
+
else
|
|
212
|
+
reject(new Error(`${cmd} exited with code ${code}`));
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
function escapeHtml(value) {
|
|
217
|
+
return value
|
|
218
|
+
.replace(/&/g, "&")
|
|
219
|
+
.replace(/</g, "<")
|
|
220
|
+
.replace(/>/g, ">")
|
|
221
|
+
.replace(/"/g, """);
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAA2B,MAAM,YAAY,CAAC;AAe/D,MAAM,UAAU,uBAAuB;IACrC,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;IAC/B,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IACpB,OAAO,IAAI,iBAAiB,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,iBAAiB;IACrB,IAAI,GAAG,YAAY,CAAC;IAEpB,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,GAAW,EAAE,UAAgC,EAAE;QACrE,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,OAAO,GAAmB,IAAI,CAAC;QACnC,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;gBAC9B,QAAQ,EAAE,IAAI;gBACd,IAAI,EAAE;oBACJ,4BAA4B;oBAC5B,qCAAqC;oBACrC,oBAAoB;oBACpB,yBAAyB;oBACzB,sBAAsB;iBACvB;aACF,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACrC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBACjC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC;gBAClC,IAAI,OAAO,CAAC,OAAO,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;oBACvD,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;oBACtB,OAAO;gBACT,CAAC;gBACD,IAAI,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBACnD,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;oBACtB,OAAO;gBACT,CAAC;gBACD,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC5B,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;oBACtB,OAAO;gBACT,CAAC;gBACD,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK,EAAE,CAAC,CAAC;YACvF,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAC5C,MAAM,IAAI,CAAC,WAAW,CAAC;gBACrB,OAAO,EAAE,0DAA0D;aACpE,CAAC,CAAC;YACH,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC;gBACzB,eAAe,EAAE,IAAI;gBACrB,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,IAAI;aACrD,CAAC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU;IACd,IAAI,CAAS;IACL,UAAU,CAAS;IAE3B,YAAY,IAAY,EAAE,UAAkB;QAC1C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,GAAW,EAAE,UAAgC,EAAE;QACrE,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1D,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAE1C,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,MAAM,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QACnF,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,SAAS,gBAAgB;IACvB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/B,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,IAAI,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,EAAE,EAAE,CAAC;QACP,OAAO,IAAI,UAAU,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,GAAW,EAAE,OAAgB;IACpE,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,eAAe,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,OAAO;QACL,iBAAiB;QACjB,QAAQ;QACR,QAAQ;QACR,wBAAwB;QACxB,QAAQ;QACR,SAAS;QACT,GAAG;QACH,UAAU;QACV,SAAS;QACT,QAAQ;QACR,IAAI;QACJ,SAAS;QACT,SAAS;KACV,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACb,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAU;IACrC,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;QACvB,MAAM,UAAU,GAAG,CAAC,SAAsB,EAAE,KAAkB,EAAE,EAAE;YAChE,OAAO,KAAK,CAAC,WAAW,IAAI,SAAS,CAAC,WAAW,IAAI,KAAK,CAAC,YAAY,IAAI,SAAS,CAAC,YAAY,CAAC;QACpG,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,CAAC,IAAa,EAAE,EAAE;YACjC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;YAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;YACrG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,YAAY,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,YAAY,WAAW,CAAC;gBAAE,OAAO;YACxF,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,KAAK,MAAM,CAAC;YAClE,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;YAC3B,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;YAC1B,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC;YAC5B,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC;YAC9B,KAAK,CAAC,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC;YACjC,KAAK,CAAC,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC;YACjC,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;YAEzB,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACrB,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAC7C,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC9C,IAAI,EAAE,GAAG,CAAC,CAAC;gBACX,IAAI,EAAE,GAAG,IAAI,CAAC;gBACd,IAAI,IAAI,GAAG,IAAI,CAAC;gBAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC/B,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;oBAC1B,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,GAAG,IAAI,CAAC;oBAClC,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;wBAC5B,IAAI,GAAG,GAAG,CAAC;wBACX,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;oBACjB,CAAC;yBAAM,CAAC;wBACN,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;oBACjB,CAAC;gBACH,CAAC;gBACD,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,IAAI,IAAI,CAAC;YACrC,CAAC;iBAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;gBAC/B,KAAK,CAAC,KAAK,CAAC,eAAe,GAAG,UAAU,CAAC;gBACzC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;gBACpD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;gBACtD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC1C,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,SAAS,KAAK,GAAG,CAAC;YAC5C,CAAC;iBAAM,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;gBAC9B,IAAI,QAAQ,EAAE,CAAC;oBACb,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,cAAc,CAAC;oBACrC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;oBAClC,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,UAAU,CAAC;oBACtC,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAClC,CAAC;qBAAM,CAAC;oBACN,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;oBAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC;oBACzE,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,aAAa,CAAC;oBACpC,KAAK,CAAC,KAAK,CAAC,eAAe,GAAG,UAAU,CAAC;oBACzC,KAAK,CAAC,KAAK,CAAC,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;oBAC/C,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAClC,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,KAAK,CAAC,GAAW;IACxB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAClE,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACtF,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC;YAC9C,IAAI,CAAC;gBACH,IAAI,YAAY,CAAC,IAAI,CAAC;oBAAE,OAAO,IAAI,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAAW,EAAE,IAAc;IAC7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACrD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;;gBACrB,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,qBAAqB,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface TypesetterPdfOptions {
|
|
2
|
+
baseUrl?: string;
|
|
3
|
+
timeoutMs?: number;
|
|
4
|
+
preferCssPageSize?: boolean;
|
|
5
|
+
allowFile?: boolean;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface TypesetterBackend {
|
|
9
|
+
name: string;
|
|
10
|
+
pdf(html: string, css: string, options?: TypesetterPdfOptions): Promise<Uint8Array>;
|
|
11
|
+
paginate?: (html: string, css: string, options?: TypesetterPdfOptions) => Promise<string>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function createTypesetterBackend(): TypesetterBackend;
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@flux-lang/typesetter",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Typesetting backends for Flux HTML rendering.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Sebastian Suarez-Solis",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "dist/index.js",
|
|
9
|
+
"module": "dist/index.js",
|
|
10
|
+
"types": "index.d.ts",
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md",
|
|
14
|
+
"index.d.ts"
|
|
15
|
+
],
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"import": "./dist/index.js",
|
|
19
|
+
"types": "./index.d.ts"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc -p tsconfig.json",
|
|
24
|
+
"test": "echo \"No tests yet\""
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"playwright": "^1.50.1"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"typescript": "^5.6.0"
|
|
31
|
+
}
|
|
32
|
+
}
|