pretext-pdf 1.0.9 → 1.1.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/CHANGELOG.md +945 -913
- package/UPSTREAM.md +112 -0
- package/dist/cli.js +19 -19
- package/dist/measure-text.d.ts +1 -1
- package/dist/measure-text.d.ts.map +1 -1
- package/dist/measure-text.js +1 -1
- package/dist/measure-text.js.map +1 -1
- package/dist/rich-text.js +1 -1
- package/dist/rich-text.js.map +1 -1
- package/dist/vendor/pretext/analysis.d.ts +35 -0
- package/dist/vendor/pretext/analysis.d.ts.map +1 -0
- package/dist/vendor/pretext/analysis.js +1162 -0
- package/dist/vendor/pretext/analysis.js.map +1 -0
- package/dist/vendor/pretext/bidi.d.ts +2 -0
- package/dist/vendor/pretext/bidi.d.ts.map +1 -0
- package/dist/vendor/pretext/bidi.js +176 -0
- package/dist/vendor/pretext/bidi.js.map +1 -0
- package/dist/vendor/pretext/generated/bidi-data.d.ts +5 -0
- package/dist/vendor/pretext/generated/bidi-data.d.ts.map +1 -0
- package/dist/vendor/pretext/generated/bidi-data.js +980 -0
- package/dist/vendor/pretext/generated/bidi-data.js.map +1 -0
- package/dist/vendor/pretext/layout.d.ts +75 -0
- package/dist/vendor/pretext/layout.d.ts.map +1 -0
- package/dist/vendor/pretext/layout.js +448 -0
- package/dist/vendor/pretext/layout.js.map +1 -0
- package/dist/vendor/pretext/line-break.d.ts +43 -0
- package/dist/vendor/pretext/line-break.d.ts.map +1 -0
- package/dist/vendor/pretext/line-break.js +908 -0
- package/dist/vendor/pretext/line-break.js.map +1 -0
- package/dist/vendor/pretext/line-text.d.ts +5 -0
- package/dist/vendor/pretext/line-text.d.ts.map +1 -0
- package/dist/vendor/pretext/line-text.js +69 -0
- package/dist/vendor/pretext/line-text.js.map +1 -0
- package/dist/vendor/pretext/measurement.d.ts +31 -0
- package/dist/vendor/pretext/measurement.d.ts.map +1 -0
- package/dist/vendor/pretext/measurement.js +251 -0
- package/dist/vendor/pretext/measurement.js.map +1 -0
- package/dist/vendor/pretext/rich-inline.d.ts +53 -0
- package/dist/vendor/pretext/rich-inline.d.ts.map +1 -0
- package/dist/vendor/pretext/rich-inline.js +327 -0
- package/dist/vendor/pretext/rich-inline.js.map +1 -0
- package/package.json +212 -212
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
import { measureNaturalWidth, prepareWithSegments, } from './layout.js';
|
|
2
|
+
import { buildLineTextFromRange, getLineTextCache, } from './line-text.js';
|
|
3
|
+
import { stepPreparedLineGeometry, } from './line-break.js';
|
|
4
|
+
const COLLAPSIBLE_BOUNDARY_RE = /[ \t\n\f\r]+/;
|
|
5
|
+
const LEADING_COLLAPSIBLE_BOUNDARY_RE = /^[ \t\n\f\r]+/;
|
|
6
|
+
const TRAILING_COLLAPSIBLE_BOUNDARY_RE = /[ \t\n\f\r]+$/;
|
|
7
|
+
const EMPTY_LAYOUT_CURSOR = { segmentIndex: 0, graphemeIndex: 0 };
|
|
8
|
+
const RICH_INLINE_START_CURSOR = {
|
|
9
|
+
itemIndex: 0,
|
|
10
|
+
segmentIndex: 0,
|
|
11
|
+
graphemeIndex: 0,
|
|
12
|
+
};
|
|
13
|
+
function getInternalPreparedRichInline(prepared) {
|
|
14
|
+
return prepared;
|
|
15
|
+
}
|
|
16
|
+
function cloneCursor(cursor) {
|
|
17
|
+
return {
|
|
18
|
+
segmentIndex: cursor.segmentIndex,
|
|
19
|
+
graphemeIndex: cursor.graphemeIndex,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function isLineStartCursor(cursor) {
|
|
23
|
+
return cursor.segmentIndex === 0 && cursor.graphemeIndex === 0;
|
|
24
|
+
}
|
|
25
|
+
function getCollapsedSpaceWidth(font, letterSpacing, cache) {
|
|
26
|
+
const cacheKey = `${font}\u0000${letterSpacing}`;
|
|
27
|
+
const cached = cache.get(cacheKey);
|
|
28
|
+
if (cached !== undefined)
|
|
29
|
+
return cached;
|
|
30
|
+
const options = letterSpacing === 0 ? undefined : { letterSpacing };
|
|
31
|
+
const joinedWidth = measureNaturalWidth(prepareWithSegments('A A', font, options));
|
|
32
|
+
const compactWidth = measureNaturalWidth(prepareWithSegments('AA', font, options));
|
|
33
|
+
const collapsedWidth = Math.max(0, joinedWidth - compactWidth);
|
|
34
|
+
cache.set(cacheKey, collapsedWidth);
|
|
35
|
+
return collapsedWidth;
|
|
36
|
+
}
|
|
37
|
+
function prepareWholeItemLine(prepared) {
|
|
38
|
+
const end = { segmentIndex: 0, graphemeIndex: 0 };
|
|
39
|
+
const width = stepPreparedLineGeometry(prepared, end, Number.POSITIVE_INFINITY);
|
|
40
|
+
if (width === null)
|
|
41
|
+
return null;
|
|
42
|
+
return {
|
|
43
|
+
endGraphemeIndex: end.graphemeIndex,
|
|
44
|
+
endSegmentIndex: end.segmentIndex,
|
|
45
|
+
width,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function endsInsideFirstSegment(segmentIndex, graphemeIndex) {
|
|
49
|
+
return segmentIndex === 0 && graphemeIndex > 0;
|
|
50
|
+
}
|
|
51
|
+
export function prepareRichInline(items) {
|
|
52
|
+
const preparedItems = [];
|
|
53
|
+
const itemsBySourceItemIndex = Array.from({ length: items.length });
|
|
54
|
+
const collapsedSpaceWidthCache = new Map();
|
|
55
|
+
let pendingGapWidth = 0;
|
|
56
|
+
for (let index = 0; index < items.length; index++) {
|
|
57
|
+
const item = items[index];
|
|
58
|
+
const letterSpacing = item.letterSpacing ?? 0;
|
|
59
|
+
const hasLeadingWhitespace = LEADING_COLLAPSIBLE_BOUNDARY_RE.test(item.text);
|
|
60
|
+
const hasTrailingWhitespace = TRAILING_COLLAPSIBLE_BOUNDARY_RE.test(item.text);
|
|
61
|
+
const trimmedText = item.text
|
|
62
|
+
.replace(LEADING_COLLAPSIBLE_BOUNDARY_RE, '')
|
|
63
|
+
.replace(TRAILING_COLLAPSIBLE_BOUNDARY_RE, '');
|
|
64
|
+
if (trimmedText.length === 0) {
|
|
65
|
+
if (COLLAPSIBLE_BOUNDARY_RE.test(item.text) && pendingGapWidth === 0) {
|
|
66
|
+
pendingGapWidth = getCollapsedSpaceWidth(item.font, letterSpacing, collapsedSpaceWidthCache);
|
|
67
|
+
}
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const gapBefore = pendingGapWidth > 0
|
|
71
|
+
? pendingGapWidth
|
|
72
|
+
: hasLeadingWhitespace
|
|
73
|
+
? getCollapsedSpaceWidth(item.font, letterSpacing, collapsedSpaceWidthCache)
|
|
74
|
+
: 0;
|
|
75
|
+
const prepared = prepareWithSegments(trimmedText, item.font, letterSpacing === 0 ? undefined : { letterSpacing });
|
|
76
|
+
const wholeLine = prepareWholeItemLine(prepared);
|
|
77
|
+
if (wholeLine === null) {
|
|
78
|
+
pendingGapWidth = hasTrailingWhitespace
|
|
79
|
+
? getCollapsedSpaceWidth(item.font, letterSpacing, collapsedSpaceWidthCache)
|
|
80
|
+
: 0;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const preparedItem = {
|
|
84
|
+
break: item.break ?? 'normal',
|
|
85
|
+
endGraphemeIndex: wholeLine.endGraphemeIndex,
|
|
86
|
+
endSegmentIndex: wholeLine.endSegmentIndex,
|
|
87
|
+
extraWidth: item.extraWidth ?? 0,
|
|
88
|
+
gapBefore,
|
|
89
|
+
naturalWidth: wholeLine.width,
|
|
90
|
+
prepared,
|
|
91
|
+
sourceItemIndex: index,
|
|
92
|
+
};
|
|
93
|
+
preparedItems.push(preparedItem);
|
|
94
|
+
itemsBySourceItemIndex[index] = preparedItem;
|
|
95
|
+
pendingGapWidth = hasTrailingWhitespace
|
|
96
|
+
? getCollapsedSpaceWidth(item.font, letterSpacing, collapsedSpaceWidthCache)
|
|
97
|
+
: 0;
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
items: preparedItems,
|
|
101
|
+
itemsBySourceItemIndex,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function stepRichInlineLine(flow, maxWidth, cursor, collectFragment) {
|
|
105
|
+
if (flow.items.length === 0 || cursor.itemIndex >= flow.items.length)
|
|
106
|
+
return null;
|
|
107
|
+
const safeWidth = Math.max(1, maxWidth);
|
|
108
|
+
let lineWidth = 0;
|
|
109
|
+
let remainingWidth = safeWidth;
|
|
110
|
+
let itemIndex = cursor.itemIndex;
|
|
111
|
+
const textCursor = {
|
|
112
|
+
segmentIndex: cursor.segmentIndex,
|
|
113
|
+
graphemeIndex: cursor.graphemeIndex,
|
|
114
|
+
};
|
|
115
|
+
lineLoop: while (itemIndex < flow.items.length) {
|
|
116
|
+
const item = flow.items[itemIndex];
|
|
117
|
+
if (!isLineStartCursor(textCursor) &&
|
|
118
|
+
textCursor.segmentIndex === item.endSegmentIndex &&
|
|
119
|
+
textCursor.graphemeIndex === item.endGraphemeIndex) {
|
|
120
|
+
itemIndex++;
|
|
121
|
+
textCursor.segmentIndex = 0;
|
|
122
|
+
textCursor.graphemeIndex = 0;
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
const gapBefore = lineWidth === 0 ? 0 : item.gapBefore;
|
|
126
|
+
const atItemStart = isLineStartCursor(textCursor);
|
|
127
|
+
if (item.break === 'never') {
|
|
128
|
+
if (!atItemStart) {
|
|
129
|
+
itemIndex++;
|
|
130
|
+
textCursor.segmentIndex = 0;
|
|
131
|
+
textCursor.graphemeIndex = 0;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const occupiedWidth = item.naturalWidth + item.extraWidth;
|
|
135
|
+
const totalWidth = gapBefore + occupiedWidth;
|
|
136
|
+
if (lineWidth > 0 && totalWidth > remainingWidth)
|
|
137
|
+
break lineLoop;
|
|
138
|
+
collectFragment?.(item, gapBefore, occupiedWidth, cloneCursor(EMPTY_LAYOUT_CURSOR), {
|
|
139
|
+
segmentIndex: item.endSegmentIndex,
|
|
140
|
+
graphemeIndex: item.endGraphemeIndex,
|
|
141
|
+
});
|
|
142
|
+
lineWidth += totalWidth;
|
|
143
|
+
remainingWidth = Math.max(0, safeWidth - lineWidth);
|
|
144
|
+
itemIndex++;
|
|
145
|
+
textCursor.segmentIndex = 0;
|
|
146
|
+
textCursor.graphemeIndex = 0;
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const reservedWidth = gapBefore + item.extraWidth;
|
|
150
|
+
if (lineWidth > 0 && reservedWidth >= remainingWidth)
|
|
151
|
+
break lineLoop;
|
|
152
|
+
if (atItemStart) {
|
|
153
|
+
const totalWidth = reservedWidth + item.naturalWidth;
|
|
154
|
+
if (totalWidth <= remainingWidth) {
|
|
155
|
+
collectFragment?.(item, gapBefore, item.naturalWidth + item.extraWidth, cloneCursor(EMPTY_LAYOUT_CURSOR), {
|
|
156
|
+
segmentIndex: item.endSegmentIndex,
|
|
157
|
+
graphemeIndex: item.endGraphemeIndex,
|
|
158
|
+
});
|
|
159
|
+
lineWidth += totalWidth;
|
|
160
|
+
remainingWidth = Math.max(0, safeWidth - lineWidth);
|
|
161
|
+
itemIndex++;
|
|
162
|
+
textCursor.segmentIndex = 0;
|
|
163
|
+
textCursor.graphemeIndex = 0;
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const availableWidth = Math.max(1, remainingWidth - reservedWidth);
|
|
168
|
+
const lineEnd = {
|
|
169
|
+
segmentIndex: textCursor.segmentIndex,
|
|
170
|
+
graphemeIndex: textCursor.graphemeIndex,
|
|
171
|
+
};
|
|
172
|
+
const lineWidthForItem = stepPreparedLineGeometry(item.prepared, lineEnd, availableWidth);
|
|
173
|
+
if (lineWidthForItem === null) {
|
|
174
|
+
itemIndex++;
|
|
175
|
+
textCursor.segmentIndex = 0;
|
|
176
|
+
textCursor.graphemeIndex = 0;
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
if (textCursor.segmentIndex === lineEnd.segmentIndex &&
|
|
180
|
+
textCursor.graphemeIndex === lineEnd.graphemeIndex) {
|
|
181
|
+
itemIndex++;
|
|
182
|
+
textCursor.segmentIndex = 0;
|
|
183
|
+
textCursor.graphemeIndex = 0;
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
// Guard against overflow: stepPreparedLineGeometry always places at
|
|
187
|
+
// least one content unit even when it exceeds maxWidth (to prevent
|
|
188
|
+
// infinite loops in standalone layout). When we already have content on
|
|
189
|
+
// the current line and the returned fragment would push us past
|
|
190
|
+
// safeWidth, break the line before this item so the fragment can start
|
|
191
|
+
// fresh on the next line where it will have the full width available.
|
|
192
|
+
if (lineWidth > 0 &&
|
|
193
|
+
atItemStart &&
|
|
194
|
+
gapBefore + lineWidthForItem + item.extraWidth > remainingWidth) {
|
|
195
|
+
break lineLoop;
|
|
196
|
+
}
|
|
197
|
+
// If the only thing we can fit after paying the boundary gap is a partial
|
|
198
|
+
// slice of the item's first segment, prefer wrapping before the item so we
|
|
199
|
+
// keep whole-word-style boundaries when they exist. But once the current
|
|
200
|
+
// line can consume a real breakable unit from the item, stay greedy and
|
|
201
|
+
// keep filling the line.
|
|
202
|
+
if (lineWidth > 0 &&
|
|
203
|
+
atItemStart &&
|
|
204
|
+
gapBefore > 0 &&
|
|
205
|
+
endsInsideFirstSegment(lineEnd.segmentIndex, lineEnd.graphemeIndex)) {
|
|
206
|
+
const freshLineEnd = { segmentIndex: 0, graphemeIndex: 0 };
|
|
207
|
+
const freshLineWidth = stepPreparedLineGeometry(item.prepared, freshLineEnd, Math.max(1, safeWidth - item.extraWidth));
|
|
208
|
+
if (freshLineWidth !== null &&
|
|
209
|
+
(freshLineEnd.segmentIndex > lineEnd.segmentIndex ||
|
|
210
|
+
(freshLineEnd.segmentIndex === lineEnd.segmentIndex &&
|
|
211
|
+
freshLineEnd.graphemeIndex > lineEnd.graphemeIndex))) {
|
|
212
|
+
break lineLoop;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
collectFragment?.(item, gapBefore, lineWidthForItem + item.extraWidth, cloneCursor(textCursor), {
|
|
216
|
+
segmentIndex: lineEnd.segmentIndex,
|
|
217
|
+
graphemeIndex: lineEnd.graphemeIndex,
|
|
218
|
+
});
|
|
219
|
+
lineWidth += gapBefore + lineWidthForItem + item.extraWidth;
|
|
220
|
+
remainingWidth = Math.max(0, safeWidth - lineWidth);
|
|
221
|
+
if (lineEnd.segmentIndex === item.endSegmentIndex &&
|
|
222
|
+
lineEnd.graphemeIndex === item.endGraphemeIndex) {
|
|
223
|
+
itemIndex++;
|
|
224
|
+
textCursor.segmentIndex = 0;
|
|
225
|
+
textCursor.graphemeIndex = 0;
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
textCursor.segmentIndex = lineEnd.segmentIndex;
|
|
229
|
+
textCursor.graphemeIndex = lineEnd.graphemeIndex;
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
if (lineWidth === 0)
|
|
233
|
+
return null;
|
|
234
|
+
cursor.itemIndex = itemIndex;
|
|
235
|
+
cursor.segmentIndex = textCursor.segmentIndex;
|
|
236
|
+
cursor.graphemeIndex = textCursor.graphemeIndex;
|
|
237
|
+
return lineWidth;
|
|
238
|
+
}
|
|
239
|
+
export function layoutNextRichInlineLineRange(prepared, maxWidth, start = RICH_INLINE_START_CURSOR) {
|
|
240
|
+
const flow = getInternalPreparedRichInline(prepared);
|
|
241
|
+
const end = {
|
|
242
|
+
itemIndex: start.itemIndex,
|
|
243
|
+
segmentIndex: start.segmentIndex,
|
|
244
|
+
graphemeIndex: start.graphemeIndex,
|
|
245
|
+
};
|
|
246
|
+
const fragments = [];
|
|
247
|
+
const width = stepRichInlineLine(flow, maxWidth, end, (item, gapBefore, occupiedWidth, fragmentStart, fragmentEnd) => {
|
|
248
|
+
fragments.push({
|
|
249
|
+
itemIndex: item.sourceItemIndex,
|
|
250
|
+
gapBefore,
|
|
251
|
+
occupiedWidth,
|
|
252
|
+
start: fragmentStart,
|
|
253
|
+
end: fragmentEnd,
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
if (width === null)
|
|
257
|
+
return null;
|
|
258
|
+
return {
|
|
259
|
+
fragments,
|
|
260
|
+
width,
|
|
261
|
+
end,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
function materializeFragmentText(item, fragment) {
|
|
265
|
+
return buildLineTextFromRange(item.prepared, getLineTextCache(item.prepared), fragment.start.segmentIndex, fragment.start.graphemeIndex, fragment.end.segmentIndex, fragment.end.graphemeIndex);
|
|
266
|
+
}
|
|
267
|
+
// Bridge from cheap range walking to full fragment text. Lets callers do
|
|
268
|
+
// shrinkwrap/virtualization/probing work first, then only pay for text on the
|
|
269
|
+
// lines they actually render.
|
|
270
|
+
export function materializeRichInlineLineRange(prepared, line) {
|
|
271
|
+
const flow = getInternalPreparedRichInline(prepared);
|
|
272
|
+
const fragments = [];
|
|
273
|
+
for (let i = 0; i < line.fragments.length; i++) {
|
|
274
|
+
const fragment = line.fragments[i];
|
|
275
|
+
const item = flow.itemsBySourceItemIndex[fragment.itemIndex];
|
|
276
|
+
if (item === undefined)
|
|
277
|
+
throw new Error('Missing rich-text inline item for fragment');
|
|
278
|
+
fragments.push({
|
|
279
|
+
itemIndex: fragment.itemIndex,
|
|
280
|
+
text: materializeFragmentText(item, fragment),
|
|
281
|
+
gapBefore: fragment.gapBefore,
|
|
282
|
+
occupiedWidth: fragment.occupiedWidth,
|
|
283
|
+
start: fragment.start,
|
|
284
|
+
end: fragment.end,
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
return {
|
|
288
|
+
fragments,
|
|
289
|
+
width: line.width,
|
|
290
|
+
end: line.end,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
export function walkRichInlineLineRanges(prepared, maxWidth, onLine) {
|
|
294
|
+
let lineCount = 0;
|
|
295
|
+
let cursor = RICH_INLINE_START_CURSOR;
|
|
296
|
+
while (true) {
|
|
297
|
+
const line = layoutNextRichInlineLineRange(prepared, maxWidth, cursor);
|
|
298
|
+
if (line === null)
|
|
299
|
+
return lineCount;
|
|
300
|
+
onLine(line);
|
|
301
|
+
lineCount++;
|
|
302
|
+
cursor = line.end;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
export function measureRichInlineStats(prepared, maxWidth) {
|
|
306
|
+
const flow = getInternalPreparedRichInline(prepared);
|
|
307
|
+
let lineCount = 0;
|
|
308
|
+
let maxLineWidth = 0;
|
|
309
|
+
const cursor = {
|
|
310
|
+
itemIndex: 0,
|
|
311
|
+
segmentIndex: 0,
|
|
312
|
+
graphemeIndex: 0,
|
|
313
|
+
};
|
|
314
|
+
while (true) {
|
|
315
|
+
const lineWidth = stepRichInlineLine(flow, maxWidth, cursor);
|
|
316
|
+
if (lineWidth === null) {
|
|
317
|
+
return {
|
|
318
|
+
lineCount,
|
|
319
|
+
maxLineWidth,
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
lineCount++;
|
|
323
|
+
if (lineWidth > maxLineWidth)
|
|
324
|
+
maxLineWidth = lineWidth;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=rich-inline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rich-inline.js","sourceRoot":"","sources":["../../../src/vendor/pretext/rich-inline.ts"],"names":[],"mappings":"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"}
|