postext 0.3.5 → 0.3.7

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 (147) hide show
  1. package/dist/__tests__/exports.test.js +1 -0
  2. package/dist/__tests__/exports.test.js.map +1 -1
  3. package/dist/canvas-backend/blockRender.d.ts +3 -0
  4. package/dist/canvas-backend/blockRender.d.ts.map +1 -0
  5. package/dist/canvas-backend/blockRender.js +176 -0
  6. package/dist/canvas-backend/blockRender.js.map +1 -0
  7. package/dist/canvas-backend/decorations.d.ts +6 -0
  8. package/dist/canvas-backend/decorations.d.ts.map +1 -0
  9. package/dist/canvas-backend/decorations.js +106 -0
  10. package/dist/canvas-backend/decorations.js.map +1 -0
  11. package/dist/{canvas-backend.d.ts → canvas-backend/index.d.ts} +2 -2
  12. package/dist/canvas-backend/index.d.ts.map +1 -0
  13. package/dist/canvas-backend/index.js +66 -0
  14. package/dist/canvas-backend/index.js.map +1 -0
  15. package/dist/index.d.ts +2 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +1 -1
  18. package/dist/index.js.map +1 -1
  19. package/dist/knuthPlass/breakpoints.d.ts +6 -0
  20. package/dist/knuthPlass/breakpoints.d.ts.map +1 -0
  21. package/dist/knuthPlass/breakpoints.js +284 -0
  22. package/dist/knuthPlass/breakpoints.js.map +1 -0
  23. package/dist/knuthPlass/constants.d.ts +8 -0
  24. package/dist/knuthPlass/constants.d.ts.map +1 -0
  25. package/dist/knuthPlass/constants.js +8 -0
  26. package/dist/knuthPlass/constants.js.map +1 -0
  27. package/dist/knuthPlass/index.d.ts +12 -0
  28. package/dist/knuthPlass/index.d.ts.map +1 -0
  29. package/dist/knuthPlass/index.js +11 -0
  30. package/dist/knuthPlass/index.js.map +1 -0
  31. package/dist/knuthPlass/pretextAdapter.d.ts +12 -0
  32. package/dist/knuthPlass/pretextAdapter.d.ts.map +1 -0
  33. package/dist/knuthPlass/pretextAdapter.js +178 -0
  34. package/dist/knuthPlass/pretextAdapter.js.map +1 -0
  35. package/dist/knuthPlass/richAdapter.d.ts +26 -0
  36. package/dist/knuthPlass/richAdapter.d.ts.map +1 -0
  37. package/dist/knuthPlass/richAdapter.js +189 -0
  38. package/dist/knuthPlass/richAdapter.js.map +1 -0
  39. package/dist/{knuthPlass.d.ts → knuthPlass/types.d.ts} +1 -31
  40. package/dist/knuthPlass/types.d.ts.map +1 -0
  41. package/dist/knuthPlass/types.js +5 -0
  42. package/dist/knuthPlass/types.js.map +1 -0
  43. package/dist/knuthPlass/utils.d.ts +2 -0
  44. package/dist/knuthPlass/utils.d.ts.map +1 -0
  45. package/dist/knuthPlass/utils.js +4 -0
  46. package/dist/knuthPlass/utils.js.map +1 -0
  47. package/dist/math/rasterCache.d.ts.map +1 -1
  48. package/dist/math/rasterCache.js +29 -6
  49. package/dist/math/rasterCache.js.map +1 -1
  50. package/dist/measure/cache.d.ts +5 -0
  51. package/dist/measure/cache.d.ts.map +1 -0
  52. package/dist/measure/cache.js +38 -0
  53. package/dist/measure/cache.js.map +1 -0
  54. package/dist/measure/canvas.d.ts +8 -0
  55. package/dist/measure/canvas.d.ts.map +1 -0
  56. package/dist/measure/canvas.js +30 -0
  57. package/dist/measure/canvas.js.map +1 -0
  58. package/dist/measure/font.d.ts +19 -0
  59. package/dist/measure/font.d.ts.map +1 -0
  60. package/dist/measure/font.js +34 -0
  61. package/dist/measure/font.js.map +1 -0
  62. package/dist/measure/index.d.ts +7 -0
  63. package/dist/measure/index.d.ts.map +1 -0
  64. package/dist/measure/index.js +6 -0
  65. package/dist/measure/index.js.map +1 -0
  66. package/dist/measure/plain.d.ts +13 -0
  67. package/dist/measure/plain.d.ts.map +1 -0
  68. package/dist/measure/plain.js +167 -0
  69. package/dist/measure/plain.js.map +1 -0
  70. package/dist/measure/rich.d.ts +25 -0
  71. package/dist/measure/rich.d.ts.map +1 -0
  72. package/dist/measure/rich.js +246 -0
  73. package/dist/measure/rich.js.map +1 -0
  74. package/dist/measure/types.d.ts +28 -0
  75. package/dist/measure/types.d.ts.map +1 -0
  76. package/dist/measure/types.js +2 -0
  77. package/dist/measure/types.js.map +1 -0
  78. package/dist/parse/blockParser.d.ts +28 -0
  79. package/dist/parse/blockParser.d.ts.map +1 -0
  80. package/dist/parse/blockParser.js +302 -0
  81. package/dist/parse/blockParser.js.map +1 -0
  82. package/dist/parse/index.d.ts +4 -0
  83. package/dist/parse/index.d.ts.map +1 -0
  84. package/dist/parse/index.js +3 -0
  85. package/dist/parse/index.js.map +1 -0
  86. package/dist/parse/inlineFormatting.d.ts +12 -0
  87. package/dist/parse/inlineFormatting.d.ts.map +1 -0
  88. package/dist/parse/inlineFormatting.js +90 -0
  89. package/dist/parse/inlineFormatting.js.map +1 -0
  90. package/dist/parse/inlineMath.d.ts +29 -0
  91. package/dist/parse/inlineMath.d.ts.map +1 -0
  92. package/dist/parse/inlineMath.js +141 -0
  93. package/dist/parse/inlineMath.js.map +1 -0
  94. package/dist/parse/sourceMapping.d.ts +12 -0
  95. package/dist/parse/sourceMapping.d.ts.map +1 -0
  96. package/dist/parse/sourceMapping.js +130 -0
  97. package/dist/parse/sourceMapping.js.map +1 -0
  98. package/dist/{parse.d.ts → parse/types.d.ts} +2 -25
  99. package/dist/parse/types.d.ts.map +1 -0
  100. package/dist/parse/types.js +2 -0
  101. package/dist/parse/types.js.map +1 -0
  102. package/dist/pipeline/build.d.ts +13 -1
  103. package/dist/pipeline/build.d.ts.map +1 -1
  104. package/dist/pipeline/build.js +43 -277
  105. package/dist/pipeline/build.js.map +1 -1
  106. package/dist/pipeline/buildBlockKind.d.ts +33 -0
  107. package/dist/pipeline/buildBlockKind.d.ts.map +1 -0
  108. package/dist/pipeline/buildBlockKind.js +82 -0
  109. package/dist/pipeline/buildBlockKind.js.map +1 -0
  110. package/dist/pipeline/buildHelpers.d.ts +47 -0
  111. package/dist/pipeline/buildHelpers.d.ts.map +1 -0
  112. package/dist/pipeline/buildHelpers.js +169 -0
  113. package/dist/pipeline/buildHelpers.js.map +1 -0
  114. package/dist/pipeline/buildMeasurement.d.ts +27 -0
  115. package/dist/pipeline/buildMeasurement.d.ts.map +1 -0
  116. package/dist/pipeline/buildMeasurement.js +49 -0
  117. package/dist/pipeline/buildMeasurement.js.map +1 -0
  118. package/dist/pipeline/index.d.ts +2 -1
  119. package/dist/pipeline/index.d.ts.map +1 -1
  120. package/dist/pipeline/index.js +1 -1
  121. package/dist/pipeline/index.js.map +1 -1
  122. package/dist/worker/client.d.ts +21 -0
  123. package/dist/worker/client.d.ts.map +1 -0
  124. package/dist/worker/client.js +98 -0
  125. package/dist/worker/client.js.map +1 -0
  126. package/dist/worker/layout.worker.d.ts +2 -0
  127. package/dist/worker/layout.worker.d.ts.map +1 -0
  128. package/dist/worker/layout.worker.js +121 -0
  129. package/dist/worker/layout.worker.js.map +1 -0
  130. package/dist/worker/protocol.d.ts +43 -0
  131. package/dist/worker/protocol.d.ts.map +1 -0
  132. package/dist/worker/protocol.js +2 -0
  133. package/dist/worker/protocol.js.map +1 -0
  134. package/package.json +9 -1
  135. package/dist/canvas-backend.d.ts.map +0 -1
  136. package/dist/canvas-backend.js +0 -370
  137. package/dist/canvas-backend.js.map +0 -1
  138. package/dist/knuthPlass.d.ts.map +0 -1
  139. package/dist/knuthPlass.js +0 -665
  140. package/dist/knuthPlass.js.map +0 -1
  141. package/dist/measure.d.ts +0 -61
  142. package/dist/measure.d.ts.map +0 -1
  143. package/dist/measure.js +0 -512
  144. package/dist/measure.js.map +0 -1
  145. package/dist/parse.d.ts.map +0 -1
  146. package/dist/parse.js +0 -653
  147. package/dist/parse.js.map +0 -1
@@ -0,0 +1,98 @@
1
+ export function createLayoutWorker(options) {
2
+ const worker = options?.worker
3
+ ?? new Worker(new URL('./layout.worker.js', import.meta.url), { type: 'module' });
4
+ let nextId = 1;
5
+ let disposed = false;
6
+ const pending = new Map();
7
+ worker.addEventListener('message', (event) => {
8
+ const msg = event.data;
9
+ const entry = pending.get(msg.id);
10
+ if (!entry)
11
+ return;
12
+ switch (msg.kind) {
13
+ case 'built':
14
+ pending.delete(msg.id);
15
+ entry.resolve(msg.doc);
16
+ return;
17
+ case 'fontsRegistered':
18
+ pending.delete(msg.id);
19
+ entry.resolve(undefined);
20
+ return;
21
+ case 'cancelled':
22
+ pending.delete(msg.id);
23
+ entry.reject(new DOMException('Build cancelled', 'AbortError'));
24
+ return;
25
+ case 'error':
26
+ pending.delete(msg.id);
27
+ entry.reject(Object.assign(new Error(msg.message), { stack: msg.stack }));
28
+ return;
29
+ }
30
+ });
31
+ worker.addEventListener('error', (event) => {
32
+ for (const entry of pending.values()) {
33
+ entry.reject(new Error(event.message || 'Worker error'));
34
+ }
35
+ pending.clear();
36
+ });
37
+ function send(msg, transfer) {
38
+ if (disposed)
39
+ throw new Error('Layout worker has been disposed');
40
+ if (transfer && transfer.length > 0)
41
+ worker.postMessage(msg, transfer);
42
+ else
43
+ worker.postMessage(msg);
44
+ }
45
+ return {
46
+ registerFonts(faces) {
47
+ const id = nextId++;
48
+ return new Promise((resolve, reject) => {
49
+ pending.set(id, {
50
+ resolve: () => resolve(),
51
+ reject,
52
+ });
53
+ send({ kind: 'registerFonts', id, faces }, faces.map((f) => f.buffer));
54
+ });
55
+ },
56
+ build(content, config, opts) {
57
+ const id = nextId++;
58
+ return new Promise((resolve, reject) => {
59
+ if (opts?.signal?.aborted) {
60
+ reject(new DOMException('Aborted', 'AbortError'));
61
+ return;
62
+ }
63
+ const onAbort = () => {
64
+ if (!pending.has(id))
65
+ return;
66
+ send({ kind: 'cancel', id });
67
+ };
68
+ if (opts?.signal) {
69
+ opts.signal.addEventListener('abort', onAbort, { once: true });
70
+ }
71
+ pending.set(id, {
72
+ resolve: (v) => resolve(v),
73
+ reject: (err) => {
74
+ opts?.signal?.removeEventListener('abort', onAbort);
75
+ reject(err);
76
+ },
77
+ onAbort,
78
+ });
79
+ send({ kind: 'build', id, content, config });
80
+ });
81
+ },
82
+ dispose() {
83
+ if (disposed)
84
+ return;
85
+ disposed = true;
86
+ try {
87
+ worker.postMessage({ kind: 'dispose' });
88
+ }
89
+ catch { /* ignore */ }
90
+ worker.terminate();
91
+ for (const entry of pending.values()) {
92
+ entry.reject(new DOMException('Worker disposed', 'AbortError'));
93
+ }
94
+ pending.clear();
95
+ },
96
+ };
97
+ }
98
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/worker/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=layout.worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.worker.d.ts","sourceRoot":"","sources":["../../src/worker/layout.worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,121 @@
1
+ /// <reference lib="webworker" />
2
+ import { buildDocument, BuildCancelledError } from '../pipeline';
3
+ import { initMathEngine, isMathReady } from '../math';
4
+ import { createMeasurementCache, clearMeasurementCache } from '../measure';
5
+ const ctx = self;
6
+ const registeredFaces = new Set();
7
+ let measurementCache = createMeasurementCache();
8
+ let currentBuildId = null;
9
+ let cancelRequestedFor = null;
10
+ function faceKey(p) {
11
+ return `${p.family}|${p.weight}|${p.style}|${p.unicodeRange ?? ''}`;
12
+ }
13
+ async function registerFonts(faces) {
14
+ const fontSet = ctx.fonts;
15
+ if (!fontSet)
16
+ return;
17
+ let addedAny = false;
18
+ await Promise.all(faces.map(async (face) => {
19
+ const key = faceKey(face);
20
+ if (registeredFaces.has(key))
21
+ return;
22
+ try {
23
+ const ff = new FontFace(face.family, face.buffer, {
24
+ weight: face.weight,
25
+ style: face.style,
26
+ unicodeRange: face.unicodeRange,
27
+ });
28
+ await ff.load();
29
+ fontSet.add(ff);
30
+ registeredFaces.add(key);
31
+ addedAny = true;
32
+ }
33
+ catch (err) {
34
+ console.warn('[postext/worker] failed to register font', face.family, err);
35
+ }
36
+ }));
37
+ // Any build that measured text before these faces landed used fallback
38
+ // metrics. Drop the block-level cache and pretext's glyph cache so the
39
+ // next build re-measures with the real glyphs.
40
+ if (addedAny) {
41
+ measurementCache = createMeasurementCache();
42
+ clearMeasurementCache();
43
+ }
44
+ }
45
+ function post(msg) {
46
+ ctx.postMessage(msg);
47
+ }
48
+ function serializeError(err) {
49
+ if (err instanceof Error)
50
+ return { message: err.message, stack: err.stack };
51
+ return { message: String(err) };
52
+ }
53
+ ctx.addEventListener('message', async (event) => {
54
+ const msg = event.data;
55
+ switch (msg.kind) {
56
+ case 'registerFonts': {
57
+ try {
58
+ await registerFonts(msg.faces);
59
+ post({ kind: 'fontsRegistered', id: msg.id });
60
+ }
61
+ catch (err) {
62
+ post({ kind: 'error', id: msg.id, ...serializeError(err) });
63
+ }
64
+ return;
65
+ }
66
+ case 'build': {
67
+ currentBuildId = msg.id;
68
+ // Yield once so a cancel posted right after the build can be observed
69
+ // before we start the CPU-bound work.
70
+ await Promise.resolve();
71
+ try {
72
+ // Bring MathJax up before the (sync) build path calls renderMath —
73
+ // otherwise the VDT receives placeholder MathRenders and inline
74
+ // formulas paint as grey boxes instead of glyphs. Skipped for docs
75
+ // that contain no `$…$`.
76
+ if (!isMathReady() && /\$/.test(msg.content.markdown)) {
77
+ await initMathEngine();
78
+ if (cancelRequestedFor === msg.id) {
79
+ post({ kind: 'cancelled', id: msg.id });
80
+ return;
81
+ }
82
+ }
83
+ const doc = buildDocument(msg.content, msg.config, measurementCache, {
84
+ shouldCancel: () => cancelRequestedFor === msg.id,
85
+ });
86
+ if (cancelRequestedFor === msg.id) {
87
+ cancelRequestedFor = null;
88
+ post({ kind: 'cancelled', id: msg.id });
89
+ }
90
+ else {
91
+ post({ kind: 'built', id: msg.id, doc });
92
+ }
93
+ }
94
+ catch (err) {
95
+ if (err instanceof BuildCancelledError) {
96
+ post({ kind: 'cancelled', id: msg.id });
97
+ }
98
+ else {
99
+ post({ kind: 'error', id: msg.id, ...serializeError(err) });
100
+ }
101
+ }
102
+ finally {
103
+ if (currentBuildId === msg.id)
104
+ currentBuildId = null;
105
+ if (cancelRequestedFor === msg.id)
106
+ cancelRequestedFor = null;
107
+ }
108
+ return;
109
+ }
110
+ case 'cancel': {
111
+ if (currentBuildId === msg.id)
112
+ cancelRequestedFor = msg.id;
113
+ return;
114
+ }
115
+ case 'dispose': {
116
+ ctx.close();
117
+ return;
118
+ }
119
+ }
120
+ });
121
+ //# sourceMappingURL=layout.worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.worker.js","sourceRoot":"","sources":["../../src/worker/layout.worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { PostextContent, PostextConfig } from '../types';
2
+ import type { VDTDocument } from '../vdt';
3
+ export interface FontPayload {
4
+ family: string;
5
+ weight: string;
6
+ style: string;
7
+ unicodeRange?: string;
8
+ /** Transferred to the worker. Becomes detached on the sender side. */
9
+ buffer: ArrayBuffer;
10
+ }
11
+ export type RequestMessage = {
12
+ kind: 'registerFonts';
13
+ id: number;
14
+ faces: FontPayload[];
15
+ } | {
16
+ kind: 'build';
17
+ id: number;
18
+ content: PostextContent;
19
+ config?: PostextConfig;
20
+ } | {
21
+ kind: 'cancel';
22
+ /** Id of the in-flight build to cancel. */
23
+ id: number;
24
+ } | {
25
+ kind: 'dispose';
26
+ };
27
+ export type ResponseMessage = {
28
+ kind: 'built';
29
+ id: number;
30
+ doc: VDTDocument;
31
+ } | {
32
+ kind: 'fontsRegistered';
33
+ id: number;
34
+ } | {
35
+ kind: 'cancelled';
36
+ id: number;
37
+ } | {
38
+ kind: 'error';
39
+ id: number;
40
+ message: string;
41
+ stack?: string;
42
+ };
43
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/worker/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE1C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,MAAM,cAAc,GACtB;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB,GACD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,2CAA2C;IAC3C,EAAE,EAAE,MAAM,CAAC;CACZ,GACD;IACE,IAAI,EAAE,SAAS,CAAC;CACjB,CAAC;AAEN,MAAM,MAAM,eAAe,GACvB;IACE,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,WAAW,CAAC;CAClB,GACD;IACE,IAAI,EAAE,iBAAiB,CAAC;IACxB,EAAE,EAAE,MAAM,CAAC;CACZ,GACD;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACZ,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/worker/protocol.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "postext",
3
- "version": "0.3.5",
3
+ "version": "0.3.7",
4
4
  "description": "A programmable typesetter for the web. Layout engine that applies professional editorial rules — columns, orphan/widow prevention, resource placement, footnotes — to semantic content. Built on @chenglou/pretext for DOM-free text measurement.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -18,6 +18,14 @@
18
18
  "types": "./dist/index.d.ts",
19
19
  "default": "./dist/index.js"
20
20
  },
21
+ "./worker": {
22
+ "types": "./dist/worker/client.d.ts",
23
+ "default": "./dist/worker/client.js"
24
+ },
25
+ "./worker/entry": {
26
+ "types": "./dist/worker/layout.worker.d.ts",
27
+ "default": "./dist/worker/layout.worker.js"
28
+ },
21
29
  "./package.json": "./package.json"
22
30
  },
23
31
  "peerDependencies": {
@@ -1 +0,0 @@
1
- {"version":3,"file":"canvas-backend.d.ts","sourceRoot":"","sources":["../src/canvas-backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAwE,MAAM,OAAO,CAAC;AAyYxH,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,iBAAiB,EACzB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,IAAI,CA2FN;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,WAAW,GACf,iBAAiB,CAInB;AAMD,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,iBAAiB,EAAE,CAEpE"}