postext 1.36.0 → 1.37.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/dist/__tests__/composed/continuation.test.d.ts +2 -0
- package/dist/__tests__/composed/continuation.test.d.ts.map +1 -0
- package/dist/__tests__/composed/continuation.test.js +352 -0
- package/dist/__tests__/composed/continuation.test.js.map +1 -0
- package/dist/__tests__/composed/contrast.test.d.ts +2 -0
- package/dist/__tests__/composed/contrast.test.d.ts.map +1 -0
- package/dist/__tests__/composed/contrast.test.js +124 -0
- package/dist/__tests__/composed/contrast.test.js.map +1 -0
- package/dist/__tests__/composed/corpus.test.js +7 -1
- package/dist/__tests__/composed/corpus.test.js.map +1 -1
- package/dist/__tests__/composed/fit.test.js +9 -6
- package/dist/__tests__/composed/fit.test.js.map +1 -1
- package/dist/__tests__/composed/groups.test.js +14 -0
- package/dist/__tests__/composed/groups.test.js.map +1 -1
- package/dist/__tests__/composed/headingDesigns.test.d.ts +2 -0
- package/dist/__tests__/composed/headingDesigns.test.d.ts.map +1 -0
- package/dist/__tests__/composed/headingDesigns.test.js +262 -0
- package/dist/__tests__/composed/headingDesigns.test.js.map +1 -0
- package/dist/__tests__/composed/labels.test.d.ts +2 -0
- package/dist/__tests__/composed/labels.test.d.ts.map +1 -0
- package/dist/__tests__/composed/labels.test.js +326 -0
- package/dist/__tests__/composed/labels.test.js.map +1 -0
- package/dist/__tests__/composed/outsidePrint.test.js +5 -2
- package/dist/__tests__/composed/outsidePrint.test.js.map +1 -1
- package/dist/__tests__/composed/sourceMap.test.js +26 -0
- package/dist/__tests__/composed/sourceMap.test.js.map +1 -1
- package/dist/__tests__/composed/spreadLabels.test.d.ts +2 -0
- package/dist/__tests__/composed/spreadLabels.test.d.ts.map +1 -0
- package/dist/__tests__/composed/spreadLabels.test.js +131 -0
- package/dist/__tests__/composed/spreadLabels.test.js.map +1 -0
- package/dist/__tests__/exports.test.js +11 -0
- package/dist/__tests__/exports.test.js.map +1 -1
- package/dist/__tests__/migrate/fixtures/textbookPort.d.ts +14 -0
- package/dist/__tests__/migrate/fixtures/textbookPort.d.ts.map +1 -0
- package/dist/__tests__/migrate/fixtures/textbookPort.js +116 -0
- package/dist/__tests__/migrate/fixtures/textbookPort.js.map +1 -0
- package/dist/__tests__/migrate/textToMarkdown.test.d.ts +2 -0
- package/dist/__tests__/migrate/textToMarkdown.test.d.ts.map +1 -0
- package/dist/__tests__/migrate/textToMarkdown.test.js +268 -0
- package/dist/__tests__/migrate/textToMarkdown.test.js.map +1 -0
- package/dist/__tests__/paragraphStyleLetterSpacing.test.d.ts +2 -0
- package/dist/__tests__/paragraphStyleLetterSpacing.test.d.ts.map +1 -0
- package/dist/__tests__/paragraphStyleLetterSpacing.test.js +89 -0
- package/dist/__tests__/paragraphStyleLetterSpacing.test.js.map +1 -0
- package/dist/__tests__/pictureBelowPrintSize.test.d.ts +2 -0
- package/dist/__tests__/pictureBelowPrintSize.test.d.ts.map +1 -0
- package/dist/__tests__/pictureBelowPrintSize.test.js +82 -0
- package/dist/__tests__/pictureBelowPrintSize.test.js.map +1 -0
- package/dist/__tests__/pipeline/paragraphStyleFaces.test.js +1 -1
- package/dist/__tests__/pipeline/paragraphStyleFaces.test.js.map +1 -1
- package/dist/canvas-backend/composed.d.ts +5 -2
- package/dist/canvas-backend/composed.d.ts.map +1 -1
- package/dist/canvas-backend/composed.js +5 -3
- package/dist/canvas-backend/composed.js.map +1 -1
- package/dist/canvas-backend/index.d.ts.map +1 -1
- package/dist/canvas-backend/index.js +37 -19
- package/dist/canvas-backend/index.js.map +1 -1
- package/dist/canvas-backend/renderResourceBlock.d.ts +5 -1
- package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
- package/dist/canvas-backend/renderResourceBlock.js +60 -1
- package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
- package/dist/composed/continuation.d.ts +102 -0
- package/dist/composed/continuation.d.ts.map +1 -0
- package/dist/composed/continuation.js +87 -0
- package/dist/composed/continuation.js.map +1 -0
- package/dist/composed/labels.d.ts +154 -0
- package/dist/composed/labels.d.ts.map +1 -0
- package/dist/composed/labels.js +524 -0
- package/dist/composed/labels.js.map +1 -0
- package/dist/composed/pageMemo.d.ts +3 -2
- package/dist/composed/pageMemo.d.ts.map +1 -1
- package/dist/composed/pageMemo.js +3 -1
- package/dist/composed/pageMemo.js.map +1 -1
- package/dist/composed/paint.d.ts +8 -2
- package/dist/composed/paint.d.ts.map +1 -1
- package/dist/composed/paint.js +8 -2
- package/dist/composed/paint.js.map +1 -1
- package/dist/composed/reflowLog.d.ts +3 -1
- package/dist/composed/reflowLog.d.ts.map +1 -1
- package/dist/composed/reflowLog.js +20 -6
- package/dist/composed/reflowLog.js.map +1 -1
- package/dist/composed/sourceMap.d.ts +0 -21
- package/dist/composed/sourceMap.d.ts.map +1 -1
- package/dist/composed/sourceMap.js +87 -7
- package/dist/composed/sourceMap.js.map +1 -1
- package/dist/composed/spread.d.ts +3 -0
- package/dist/composed/spread.d.ts.map +1 -1
- package/dist/composed/spread.js +1 -1
- package/dist/composed/spread.js.map +1 -1
- package/dist/configWarnings.d.ts +15 -0
- package/dist/configWarnings.d.ts.map +1 -1
- package/dist/configWarnings.js +29 -17
- package/dist/configWarnings.js.map +1 -1
- package/dist/contrast.d.ts +5 -3
- package/dist/contrast.d.ts.map +1 -1
- package/dist/contrast.js +46 -5
- package/dist/contrast.js.map +1 -1
- package/dist/defaults/paragraphStyles.d.ts +1 -1
- package/dist/defaults/paragraphStyles.d.ts.map +1 -1
- package/dist/defaults/paragraphStyles.js +5 -1
- package/dist/defaults/paragraphStyles.js.map +1 -1
- package/dist/design/slots.d.ts +12 -10
- package/dist/design/slots.d.ts.map +1 -1
- package/dist/design/slots.js +26 -2
- package/dist/design/slots.js.map +1 -1
- package/dist/fonts/faces.d.ts.map +1 -1
- package/dist/fonts/faces.js +6 -0
- package/dist/fonts/faces.js.map +1 -1
- package/dist/highlightMarks.d.ts.map +1 -1
- package/dist/highlightMarks.js +6 -0
- package/dist/highlightMarks.js.map +1 -1
- package/dist/html-backend.d.ts.map +1 -1
- package/dist/html-backend.js +40 -2
- package/dist/html-backend.js.map +1 -1
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/migrate/markdownRuns.d.ts +70 -0
- package/dist/migrate/markdownRuns.d.ts.map +1 -0
- package/dist/migrate/markdownRuns.js +215 -0
- package/dist/migrate/markdownRuns.js.map +1 -0
- package/dist/migrate/pageDesign.d.ts +119 -0
- package/dist/migrate/pageDesign.d.ts.map +1 -0
- package/dist/migrate/pageDesign.js +446 -0
- package/dist/migrate/pageDesign.js.map +1 -0
- package/dist/migrate/textToMarkdown.d.ts +124 -0
- package/dist/migrate/textToMarkdown.d.ts.map +1 -0
- package/dist/migrate/textToMarkdown.js +716 -0
- package/dist/migrate/textToMarkdown.js.map +1 -0
- package/dist/pipeline/build.d.ts.map +1 -1
- package/dist/pipeline/build.js +192 -24
- package/dist/pipeline/build.js.map +1 -1
- package/dist/pipeline/buildMeasurement.d.ts.map +1 -1
- package/dist/pipeline/buildMeasurement.js +12 -1
- package/dist/pipeline/buildMeasurement.js.map +1 -1
- package/dist/pipeline/calloutLayout.d.ts +20 -1
- package/dist/pipeline/calloutLayout.d.ts.map +1 -1
- package/dist/pipeline/calloutLayout.js +30 -2
- package/dist/pipeline/calloutLayout.js.map +1 -1
- package/dist/pipeline/composedLayout.d.ts +16 -2
- package/dist/pipeline/composedLayout.d.ts.map +1 -1
- package/dist/pipeline/composedLayout.js +107 -37
- package/dist/pipeline/composedLayout.js.map +1 -1
- package/dist/pipeline/contentWarnings.d.ts +15 -0
- package/dist/pipeline/contentWarnings.d.ts.map +1 -1
- package/dist/pipeline/contentWarnings.js +85 -0
- package/dist/pipeline/contentWarnings.js.map +1 -1
- package/dist/pipeline/frameLayout.d.ts +4 -1
- package/dist/pipeline/frameLayout.d.ts.map +1 -1
- package/dist/pipeline/frameLayout.js +5 -2
- package/dist/pipeline/frameLayout.js.map +1 -1
- package/dist/pipeline/headerFooter.d.ts +11 -1
- package/dist/pipeline/headerFooter.d.ts.map +1 -1
- package/dist/pipeline/headerFooter.js +169 -66
- package/dist/pipeline/headerFooter.js.map +1 -1
- package/dist/pipeline/mirrorFrame.d.ts.map +1 -1
- package/dist/pipeline/mirrorFrame.js +25 -2
- package/dist/pipeline/mirrorFrame.js.map +1 -1
- package/dist/pipeline/resourceLayout.d.ts +28 -0
- package/dist/pipeline/resourceLayout.d.ts.map +1 -1
- package/dist/pipeline/resourceLayout.js +21 -0
- package/dist/pipeline/resourceLayout.js.map +1 -1
- package/dist/pipeline/styles.d.ts +1 -1
- package/dist/pipeline/styles.d.ts.map +1 -1
- package/dist/pipeline/styles.js +4 -0
- package/dist/pipeline/styles.js.map +1 -1
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/vdt.d.ts +138 -7
- package/dist/vdt.d.ts.map +1 -1
- package/dist/vdt.js.map +1 -1
- package/dist/word/toDocx.d.ts.map +1 -1
- package/dist/word/toDocx.js +14 -0
- package/dist/word/toDocx.js.map +1 -1
- package/dist/word/word.test.js +11 -1
- package/dist/word/word.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,524 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Figure labels drawn on their picture (#860, DESIGN §2.6, §3.3).
|
|
3
|
+
*
|
|
4
|
+
* A `:::figure` lists `::label[TEXT]{at style}` lines; the resource holds
|
|
5
|
+
* the anchors (points in fractions of the whole picture, shared by every
|
|
6
|
+
* locale). Each label is set as a small caption (inline Markdown: bold,
|
|
7
|
+
* italic, chips, marks, references, formulas) in its label style, wrapped
|
|
8
|
+
* within its anchor's `width` and, when a word is still too wide, set
|
|
9
|
+
* smaller down to the style's `minScale`. Its box stands at the anchor's
|
|
10
|
+
* point as `align` / `verticalAlign` say (start and end follow the label's
|
|
11
|
+
* own direction), turned by `rotate` degrees about that point.
|
|
12
|
+
*
|
|
13
|
+
* The label's geometry is kept in its own frame (origin at the anchor
|
|
14
|
+
* point) and the point itself relative to the picture's body, so the
|
|
15
|
+
* label moves with its block wherever placement, frames, spreads or the
|
|
16
|
+
* memo put it, and the painters only add the body's corner:
|
|
17
|
+
* {@link figureLabelMatrix}. Once the pages exist the build stamps each
|
|
18
|
+
* label's `rect` (for `sourceAt`) and reports the anchors a figure names
|
|
19
|
+
* wrongly or leaves without a word ({@link figureLabelWarnings}).
|
|
20
|
+
*/
|
|
21
|
+
import { buildFontString, measureTextWidth } from '../measure';
|
|
22
|
+
import { dimensionToPx } from '../units';
|
|
23
|
+
import { resolveColorValue } from '../defaults/shared';
|
|
24
|
+
import { layoutLabelLines } from '../pipeline/resourceLayout';
|
|
25
|
+
import { uppercasePreservingLength } from '../pipeline/buildBlockKind';
|
|
26
|
+
import { firstStrongDirection } from '../design/bidiText';
|
|
27
|
+
import { BREAK_PLACEHOLDER } from '../parse/inlineFormatting';
|
|
28
|
+
/** The line pitch of a label, in ems, when no paragraph style lends one. */
|
|
29
|
+
const LABEL_LINE_HEIGHT = 1.15;
|
|
30
|
+
/** Measure of a label with no `width`: as good as unbounded. */
|
|
31
|
+
const NO_MEASURE = 1e6;
|
|
32
|
+
const hexOf = (value, resolved, fallback) => resolveColorValue(value, resolved.colorPalette, fallback).hex;
|
|
33
|
+
const px = (dim, dpi, em) => {
|
|
34
|
+
if (!dim || typeof dim.value !== 'number' || !Number.isFinite(dim.value))
|
|
35
|
+
return undefined;
|
|
36
|
+
try {
|
|
37
|
+
return dimensionToPx(dim, dpi, em);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* The look of a label set in style `styleId` (the label's own `style`,
|
|
45
|
+
* else its anchor's): the body text's type, under the paragraph style the
|
|
46
|
+
* label style borrows (`paragraphStyle`), under the label style's own
|
|
47
|
+
* fields. An unknown or absent style is the body text's type.
|
|
48
|
+
*/
|
|
49
|
+
export function resolveLabelLook(styleId, resolved) {
|
|
50
|
+
const dpi = resolved.page.dpi;
|
|
51
|
+
const body = resolved.bodyText;
|
|
52
|
+
const style = styleId !== undefined ? resolved.labelStyles?.find((s) => s.id === styleId) : undefined;
|
|
53
|
+
const para = style?.paragraphStyle
|
|
54
|
+
? resolved.paragraphStyles.find((p) => p.id === style.paragraphStyle)
|
|
55
|
+
: undefined;
|
|
56
|
+
const bodyPx = px(body.fontSize, dpi, 16) ?? 16;
|
|
57
|
+
const paraPx = para ? px(para.fontSize, dpi, bodyPx) ?? bodyPx : bodyPx;
|
|
58
|
+
const fontPx = px(style?.fontSize, dpi, paraPx) ?? paraPx;
|
|
59
|
+
const lineHeight = para
|
|
60
|
+
? Math.max(0.8, (px(para.lineHeight, dpi, paraPx) ?? paraPx * LABEL_LINE_HEIGHT) / paraPx)
|
|
61
|
+
: LABEL_LINE_HEIGHT;
|
|
62
|
+
const haloWidth = style?.halo ? px(style.halo.width, dpi, fontPx) : undefined;
|
|
63
|
+
return {
|
|
64
|
+
...(style ? { styleId: style.id } : {}),
|
|
65
|
+
fontFamily: style?.fontFamily ?? para?.fontFamily ?? body.fontFamily,
|
|
66
|
+
fontPx,
|
|
67
|
+
weight: style?.fontWeight ?? para?.fontWeight ?? body.fontWeight,
|
|
68
|
+
boldWeight: Math.max(para?.boldFontWeight ?? body.boldFontWeight, style?.fontWeight ?? 0),
|
|
69
|
+
// A borrowed paragraph style's slant and capitals hold unless the
|
|
70
|
+
// label style turns them on itself.
|
|
71
|
+
italic: style?.fontStyle === 'italic' || para?.italic === true,
|
|
72
|
+
color: hexOf(style?.color ?? para?.color, resolved, body.color),
|
|
73
|
+
uppercase: style?.textTransform === 'uppercase' || para?.textTransform === 'uppercase',
|
|
74
|
+
letterSpacing: typeof style?.letterSpacing === 'number' && Number.isFinite(style.letterSpacing) ? style.letterSpacing : 0,
|
|
75
|
+
lineHeight,
|
|
76
|
+
...(style?.halo && haloWidth !== undefined && haloWidth > 0
|
|
77
|
+
? { halo: { color: hexOf(style.halo.color, resolved, { hex: '#ffffff', model: 'hex' }), widthPx: haloWidth } }
|
|
78
|
+
: {}),
|
|
79
|
+
...(style?.background ? { background: hexOf(style.background, resolved, { hex: '#ffffff', model: 'hex' }) } : {}),
|
|
80
|
+
paddingPx: Math.max(0, px(style?.padding, dpi, fontPx) ?? 0),
|
|
81
|
+
minScale: style ? Math.min(1, Math.max(0.1, style.minScale)) : 0.85,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/** The place of `label` on `resource`; undefined when it names an anchor
|
|
85
|
+
* the resource lacks. */
|
|
86
|
+
export function labelPlace(label, resource) {
|
|
87
|
+
if ('anchor' in label.at) {
|
|
88
|
+
const id = label.at.anchor;
|
|
89
|
+
const anchor = resource.anchors?.find((a) => a.id === id);
|
|
90
|
+
if (!anchor || !Number.isFinite(anchor.x) || !Number.isFinite(anchor.y))
|
|
91
|
+
return undefined;
|
|
92
|
+
return { x: anchor.x, y: anchor.y, anchor };
|
|
93
|
+
}
|
|
94
|
+
const { x, y } = label.at;
|
|
95
|
+
return Number.isFinite(x) && Number.isFinite(y) ? { x, y } : undefined;
|
|
96
|
+
}
|
|
97
|
+
/** A point of the whole picture (fractions) in px from the top-left of the
|
|
98
|
+
* body as drawn: through its crop (`bodySource`) and its size. */
|
|
99
|
+
export function pictureToBody(rb, fx, fy) {
|
|
100
|
+
const src = rb.bodySource ?? { x: 0, y: 0, width: 1, height: 1 };
|
|
101
|
+
const w = src.width > 0 ? src.width : 1;
|
|
102
|
+
const h = src.height > 0 ? src.height : 1;
|
|
103
|
+
return { x: ((fx - src.x) / w) * rb.bodyRect.width, y: ((fy - src.y) / h) * rb.bodyRect.height };
|
|
104
|
+
}
|
|
105
|
+
/** The width of the whole picture in px, as its body draws it. */
|
|
106
|
+
const pictureWidthPx = (rb) => rb.bodyRect.width / (rb.bodySource && rb.bodySource.width > 0 ? rb.bodySource.width : 1);
|
|
107
|
+
const upperSpans = (spans) => spans.map((s) => (s.text ? { ...s, text: uppercasePreservingLength(s.text) } : s)).map((s) => s.chip ? { ...s, chip: { ...s.chip, spans: s.chip.spans.map((c) => ({ ...c, text: uppercasePreservingLength(c.text) })) } } : s);
|
|
108
|
+
const moveLine = (line, dx, dy) => ({
|
|
109
|
+
...line,
|
|
110
|
+
bbox: { x: line.bbox.x + dx, y: line.bbox.y + dy, width: line.bbox.width, height: line.bbox.height },
|
|
111
|
+
baseline: line.baseline + dy,
|
|
112
|
+
...(line.measure ? { measure: { ...line.measure, x: line.measure.x + dx } } : {}),
|
|
113
|
+
});
|
|
114
|
+
/** A label's spans with each `\\` that ends a word made a forced line
|
|
115
|
+
* break, as in a caption: two characters for two (the break and a space
|
|
116
|
+
* the next line drops), so the source map holds. */
|
|
117
|
+
function withForcedBreaks(spans) {
|
|
118
|
+
return spans.map((s) => (s.text.includes('\\\\') ? { ...s, text: s.text.replace(/\\\\(?=\s|$)/g, `${BREAK_PLACEHOLDER} `) } : s));
|
|
119
|
+
}
|
|
120
|
+
/** The plain text a label's spans read as (a chip's words included). */
|
|
121
|
+
function spanText(spans) {
|
|
122
|
+
return spans.map((s) => (s.chip ? s.chip.spans.map((c) => c.text).join('') : s.text)).join('');
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Lay out one label: its lines in its look, wrapped within `widthPx` (none:
|
|
126
|
+
* one line per forced break), set smaller (down to `minScale`) while a
|
|
127
|
+
* line is wider, then placed about the anchor point by `align` and
|
|
128
|
+
* `verticalAlign`.
|
|
129
|
+
*/
|
|
130
|
+
export function layOutLabel(spans, look, place, ctx) {
|
|
131
|
+
const text = withForcedBreaks(look.uppercase ? upperSpans(spans) : [...spans]);
|
|
132
|
+
const plain = spanText(text);
|
|
133
|
+
if (plain.trim().length === 0)
|
|
134
|
+
return undefined;
|
|
135
|
+
const rtl = firstStrongDirection(plain) === 'rtl';
|
|
136
|
+
const widthPx = place.widthPx !== undefined && place.widthPx > 0 ? place.widthPx : undefined;
|
|
137
|
+
const fontsAt = (sizePx) => {
|
|
138
|
+
const w = look.weight === 400 ? 'normal' : String(look.weight);
|
|
139
|
+
const b = String(look.boldWeight);
|
|
140
|
+
const slant = look.italic ? 'italic' : 'normal';
|
|
141
|
+
const flip = look.italic ? 'normal' : 'italic';
|
|
142
|
+
return [
|
|
143
|
+
buildFontString(look.fontFamily, sizePx, w, slant),
|
|
144
|
+
buildFontString(look.fontFamily, sizePx, b, slant),
|
|
145
|
+
buildFontString(look.fontFamily, sizePx, w, flip),
|
|
146
|
+
buildFontString(look.fontFamily, sizePx, b, flip),
|
|
147
|
+
];
|
|
148
|
+
};
|
|
149
|
+
const measure = (scale) => {
|
|
150
|
+
const sizePx = look.fontPx * scale;
|
|
151
|
+
const fonts = fontsAt(sizePx);
|
|
152
|
+
const lines = layoutLabelLines({
|
|
153
|
+
spans: text,
|
|
154
|
+
fonts,
|
|
155
|
+
fontPx: sizePx,
|
|
156
|
+
lineHeightPx: sizePx * look.lineHeight,
|
|
157
|
+
maxWidthPx: widthPx ?? NO_MEASURE,
|
|
158
|
+
...(look.letterSpacing !== 0 ? { letterSpacingPx: look.letterSpacing * sizePx } : {}),
|
|
159
|
+
direction: rtl ? 'rtl' : 'ltr',
|
|
160
|
+
resolved: ctx.resolved,
|
|
161
|
+
...(ctx.resourceNumbering ? { resourceNumbering: ctx.resourceNumbering } : {}),
|
|
162
|
+
...(ctx.resourceTypes ? { resourceTypes: ctx.resourceTypes } : {}),
|
|
163
|
+
...(ctx.resources ? { resources: ctx.resources } : {}),
|
|
164
|
+
...(ctx.cache ? { cache: ctx.cache } : {}),
|
|
165
|
+
});
|
|
166
|
+
const widest = lines.reduce((m, l) => Math.max(m, l.bbox.width), 0);
|
|
167
|
+
// A word wider than the measure is divided by the measurer: the label
|
|
168
|
+
// does not fit.
|
|
169
|
+
const cut = widthPx !== undefined && (widest > widthPx + 0.01 || lines.some((l) => l.hyphenated && !l.hardHyphen));
|
|
170
|
+
return { lines, fonts, widest, sizePx, cut };
|
|
171
|
+
};
|
|
172
|
+
let scale = 1;
|
|
173
|
+
if (widthPx !== undefined) {
|
|
174
|
+
// The widest word sets the first guess.
|
|
175
|
+
const font = fontsAt(look.fontPx)[0];
|
|
176
|
+
const tracking = look.letterSpacing * look.fontPx;
|
|
177
|
+
const word = plain.split(/\s+/).reduce((m, w) => Math.max(m, measureTextWidth(w, font) + tracking * [...w].length), 0);
|
|
178
|
+
if (word > widthPx)
|
|
179
|
+
scale = Math.max(look.minScale, (widthPx / word) * 0.999);
|
|
180
|
+
}
|
|
181
|
+
let set = measure(scale);
|
|
182
|
+
// Still cut or wider than the measure: a little smaller, down to the
|
|
183
|
+
// style's floor.
|
|
184
|
+
for (let round = 0; round < 6 && set.cut && scale > look.minScale + 1e-6; round++) {
|
|
185
|
+
scale = Math.max(look.minScale, scale * Math.min(0.97, widthPx / Math.max(set.widest, widthPx + 1e-6)));
|
|
186
|
+
set = measure(scale);
|
|
187
|
+
}
|
|
188
|
+
if (set.lines.length === 0)
|
|
189
|
+
return undefined;
|
|
190
|
+
const boxW = set.widest;
|
|
191
|
+
const pitch = set.sizePx * look.lineHeight;
|
|
192
|
+
const boxH = Math.max(pitch * set.lines.length, set.lines.reduce((m, l) => Math.max(m, l.bbox.y + l.bbox.height), 0));
|
|
193
|
+
const align = place.align ?? 'center';
|
|
194
|
+
// `start` is the label's own start: its left edge, its right edge right
|
|
195
|
+
// to left.
|
|
196
|
+
const side = align === 'center' ? 'center' : (align === 'start') !== rtl ? 'left' : 'right';
|
|
197
|
+
const left = side === 'center' ? -boxW / 2 : side === 'left' ? 0 : -boxW;
|
|
198
|
+
const vAlign = place.verticalAlign ?? 'middle';
|
|
199
|
+
const top = vAlign === 'top' ? 0 : vAlign === 'bottom' ? -boxH : -boxH / 2;
|
|
200
|
+
const lines = set.lines.map((line) => {
|
|
201
|
+
const slack = Math.max(0, boxW - line.bbox.width);
|
|
202
|
+
const dx = side === 'center' ? slack / 2 : side === 'left' ? 0 : slack;
|
|
203
|
+
return moveLine(line, left + dx - line.bbox.x, top);
|
|
204
|
+
});
|
|
205
|
+
const box = { x: left, y: top, width: boxW, height: boxH };
|
|
206
|
+
const pad = look.paddingPx;
|
|
207
|
+
const rotate = place.rotate !== undefined && Number.isFinite(place.rotate) && Math.abs(place.rotate % 360) > 1e-9 ? place.rotate % 360 : undefined;
|
|
208
|
+
return {
|
|
209
|
+
x: place.x,
|
|
210
|
+
y: place.y,
|
|
211
|
+
...(rotate !== undefined ? { rotate } : {}),
|
|
212
|
+
lines,
|
|
213
|
+
box,
|
|
214
|
+
fontString: set.fonts[0],
|
|
215
|
+
boldFontString: set.fonts[1],
|
|
216
|
+
italicFontString: set.fonts[2],
|
|
217
|
+
boldItalicFontString: set.fonts[3],
|
|
218
|
+
color: look.color,
|
|
219
|
+
...(look.halo ? { halo: { color: look.halo.color, widthPx: look.halo.widthPx * scale } } : {}),
|
|
220
|
+
...(look.background ? { background: { color: look.background, rect: { x: left - pad, y: top - pad, width: boxW + 2 * pad, height: boxH + 2 * pad } } } : {}),
|
|
221
|
+
...(scale < 1 - 1e-6 ? { scale } : {}),
|
|
222
|
+
...(set.cut ? { overflow: true } : {}),
|
|
223
|
+
...(look.styleId !== undefined ? { styleId: look.styleId } : {}),
|
|
224
|
+
...(rtl ? { direction: 'rtl' } : {}),
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* The labels of a figure laid out on its picture: `labels` (the VDT's,
|
|
229
|
+
* `figureLabels`) with the `layout` of each one that can be drawn, read
|
|
230
|
+
* from `parsed` (the parser's, the same order) for its inline Markdown.
|
|
231
|
+
* A table, a video or a picture with no body draws none; a label whose
|
|
232
|
+
* anchor is unknown is left without a layout.
|
|
233
|
+
*/
|
|
234
|
+
export function layOutFigureLabels(labels, parsed, rb, ctx) {
|
|
235
|
+
if (rb.kind !== 'bitmap' && rb.kind !== 'svg')
|
|
236
|
+
return [...labels];
|
|
237
|
+
if (!(rb.bodyRect.width > 0) || !(rb.bodyRect.height > 0))
|
|
238
|
+
return [...labels];
|
|
239
|
+
const pictureW = pictureWidthPx(rb);
|
|
240
|
+
return labels.map((label, i) => {
|
|
241
|
+
const place = labelPlace(label, rb.resource);
|
|
242
|
+
if (!place)
|
|
243
|
+
return label;
|
|
244
|
+
const anchor = place.anchor;
|
|
245
|
+
const at = pictureToBody(rb, place.x, place.y);
|
|
246
|
+
const look = resolveLabelLook(label.style ?? anchor?.style, ctx.resolved);
|
|
247
|
+
const spans = parsed?.[i]?.spans ?? [{ text: label.text, bold: false, italic: false }];
|
|
248
|
+
const layout = layOutLabel(spans, look, {
|
|
249
|
+
x: at.x,
|
|
250
|
+
y: at.y,
|
|
251
|
+
...(anchor?.width !== undefined && anchor.width > 0 ? { widthPx: anchor.width * pictureW } : {}),
|
|
252
|
+
...(anchor?.align ? { align: anchor.align } : {}),
|
|
253
|
+
...(anchor?.verticalAlign ? { verticalAlign: anchor.verticalAlign } : {}),
|
|
254
|
+
...(anchor?.rotate !== undefined ? { rotate: anchor.rotate } : {}),
|
|
255
|
+
}, ctx);
|
|
256
|
+
return layout ? { ...label, layout } : label;
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
// ---------------------------------------------------------------------------
|
|
260
|
+
// Painting and hit-testing
|
|
261
|
+
// ---------------------------------------------------------------------------
|
|
262
|
+
/** The matrix that puts a label's frame on the block's frame, the body's
|
|
263
|
+
* top-left corner at (`bodyX`, `bodyY`): `translate(body + point) ·
|
|
264
|
+
* rotate(rotate)`. */
|
|
265
|
+
export function figureLabelMatrix(layout, bodyX, bodyY) {
|
|
266
|
+
const t = ((layout.rotate ?? 0) * Math.PI) / 180;
|
|
267
|
+
const cos = Math.cos(t);
|
|
268
|
+
const sin = Math.sin(t);
|
|
269
|
+
// A quarter turn lands exactly (no 1e-17 shear).
|
|
270
|
+
const c = Math.abs(cos) < 1e-12 ? 0 : cos;
|
|
271
|
+
const s = Math.abs(sin) < 1e-12 ? 0 : sin;
|
|
272
|
+
return [c, s, -s, c, bodyX + layout.x, bodyY + layout.y];
|
|
273
|
+
}
|
|
274
|
+
/** What a label paints in its own frame: its background, else its lines'
|
|
275
|
+
* box. */
|
|
276
|
+
export function figureLabelExtent(layout) {
|
|
277
|
+
return layout.background?.rect ?? layout.box;
|
|
278
|
+
}
|
|
279
|
+
const apply = (m, x, y) => [m[0] * x + m[2] * y + m[4], m[1] * x + m[3] * y + m[5]];
|
|
280
|
+
/** The upright box a label covers in the block's frame. */
|
|
281
|
+
export function figureLabelBounds(layout, bodyX, bodyY) {
|
|
282
|
+
const m = figureLabelMatrix(layout, bodyX, bodyY);
|
|
283
|
+
const r = figureLabelExtent(layout);
|
|
284
|
+
const pts = [apply(m, r.x, r.y), apply(m, r.x + r.width, r.y), apply(m, r.x, r.y + r.height), apply(m, r.x + r.width, r.y + r.height)];
|
|
285
|
+
const xs = pts.map((p) => p[0]);
|
|
286
|
+
const ys = pts.map((p) => p[1]);
|
|
287
|
+
const x = Math.min(...xs);
|
|
288
|
+
const y = Math.min(...ys);
|
|
289
|
+
return { x, y, width: Math.max(...xs) - x, height: Math.max(...ys) - y };
|
|
290
|
+
}
|
|
291
|
+
/** The point `(x, y)` of the block's frame in a label's own frame. */
|
|
292
|
+
export function pointInLabel(layout, bodyX, bodyY, x, y) {
|
|
293
|
+
const m = figureLabelMatrix(layout, bodyX, bodyY);
|
|
294
|
+
const dx = x - m[4];
|
|
295
|
+
const dy = y - m[5];
|
|
296
|
+
// The inverse of a rotation is its transpose.
|
|
297
|
+
return { x: m[0] * dx + m[1] * dy, y: m[2] * dx + m[3] * dy };
|
|
298
|
+
}
|
|
299
|
+
/** The top-left corner of a resource block's body in its own frame, and
|
|
300
|
+
* the quarter turn that puts that frame on the block's (a rotated
|
|
301
|
+
* block). */
|
|
302
|
+
function bodyFrame(block) {
|
|
303
|
+
const rb = block.resourceBlock;
|
|
304
|
+
const rot = rb.rotation;
|
|
305
|
+
if (!rot)
|
|
306
|
+
return { bx: block.bbox.x + rb.bodyRect.x, by: block.bbox.y + rb.bodyRect.y };
|
|
307
|
+
const turn = rot.direction === 'ccw' ? [0, -1, 1, 0, rot.originX, rot.originY] : [0, 1, -1, 0, rot.originX, rot.originY];
|
|
308
|
+
return { bx: rb.bodyRect.x, by: rb.bodyRect.y, turn };
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Stamp `rect` on every drawn label of the document (#860): the upright
|
|
312
|
+
* box it covers in its block's frame, through a quarter-turned block's
|
|
313
|
+
* turn. A label not drawn loses any `rect` it had.
|
|
314
|
+
*/
|
|
315
|
+
export function stampFigureLabelRects(doc) {
|
|
316
|
+
const seen = new Set();
|
|
317
|
+
const visit = (block) => {
|
|
318
|
+
if (seen.has(block))
|
|
319
|
+
return;
|
|
320
|
+
seen.add(block);
|
|
321
|
+
const labels = block.resourceBlock?.labels;
|
|
322
|
+
if (!labels || labels.length === 0)
|
|
323
|
+
return;
|
|
324
|
+
const { bx, by, turn } = bodyFrame(block);
|
|
325
|
+
for (const label of labels) {
|
|
326
|
+
if (!label.layout) {
|
|
327
|
+
delete label.rect;
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
330
|
+
let r = figureLabelBounds(label.layout, bx, by);
|
|
331
|
+
if (turn) {
|
|
332
|
+
const pts = [apply(turn, r.x, r.y), apply(turn, r.x + r.width, r.y), apply(turn, r.x, r.y + r.height), apply(turn, r.x + r.width, r.y + r.height)];
|
|
333
|
+
const xs = pts.map((p) => p[0]);
|
|
334
|
+
const ys = pts.map((p) => p[1]);
|
|
335
|
+
const x = Math.min(...xs);
|
|
336
|
+
const y = Math.min(...ys);
|
|
337
|
+
r = { x, y, width: Math.max(...xs) - x, height: Math.max(...ys) - y };
|
|
338
|
+
}
|
|
339
|
+
label.rect = r;
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
for (const block of doc.blocks)
|
|
343
|
+
visit(block);
|
|
344
|
+
for (const page of doc.pages) {
|
|
345
|
+
for (const col of page.columns)
|
|
346
|
+
for (const block of col.blocks)
|
|
347
|
+
visit(block);
|
|
348
|
+
for (const block of page.floats ?? [])
|
|
349
|
+
visit(block);
|
|
350
|
+
// The half of a spread frame painted on the facing page (#861) is a
|
|
351
|
+
// copy of its blocks moved onto that page: its labels get their boxes
|
|
352
|
+
// there, so the facing page answers for the labels it shows.
|
|
353
|
+
for (const frame of page.composed?.frames ?? [])
|
|
354
|
+
for (const block of frame.facingBlocks ?? [])
|
|
355
|
+
visit(block);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* The glyph of a drawn label under the point `(x, y)` of its block's
|
|
360
|
+
* frame: the index into `label.text`'s source map, or undefined off its
|
|
361
|
+
* lines. Lines are read from their plain ranges; a label whose lines lack
|
|
362
|
+
* them spreads its text over its lines in order.
|
|
363
|
+
*/
|
|
364
|
+
export function labelGlyphAt(label, block, x, y) {
|
|
365
|
+
const layout = label.layout;
|
|
366
|
+
if (!layout || layout.lines.length === 0)
|
|
367
|
+
return undefined;
|
|
368
|
+
const { bx, by, turn } = bodyFrame(block);
|
|
369
|
+
let px = x;
|
|
370
|
+
let py = y;
|
|
371
|
+
if (turn) {
|
|
372
|
+
// Into the block's upright frame: the transpose of the quarter turn.
|
|
373
|
+
const dx = x - turn[4];
|
|
374
|
+
const dy = y - turn[5];
|
|
375
|
+
px = turn[0] * dx + turn[1] * dy;
|
|
376
|
+
py = turn[2] * dx + turn[3] * dy;
|
|
377
|
+
}
|
|
378
|
+
const p = pointInLabel(layout, bx, by, px, py);
|
|
379
|
+
let li = 0;
|
|
380
|
+
let best = Infinity;
|
|
381
|
+
layout.lines.forEach((line, i) => {
|
|
382
|
+
const d = p.y < line.bbox.y ? line.bbox.y - p.y : p.y > line.bbox.y + line.bbox.height ? p.y - line.bbox.y - line.bbox.height : 0;
|
|
383
|
+
if (d < best) {
|
|
384
|
+
best = d;
|
|
385
|
+
li = i;
|
|
386
|
+
}
|
|
387
|
+
});
|
|
388
|
+
const line = layout.lines[li];
|
|
389
|
+
const n = label.text.length;
|
|
390
|
+
if (n === 0)
|
|
391
|
+
return undefined;
|
|
392
|
+
const start = line.plainStart ?? Math.floor((li * n) / layout.lines.length);
|
|
393
|
+
const end = line.plainEnd ?? Math.floor(((li + 1) * n) / layout.lines.length);
|
|
394
|
+
const len = Math.max(1, end - start);
|
|
395
|
+
let frac = line.bbox.width > 0 ? (p.x - line.bbox.x) / line.bbox.width : 0;
|
|
396
|
+
frac = Math.max(0, Math.min(0.9999, frac));
|
|
397
|
+
if (layout.direction === 'rtl')
|
|
398
|
+
frac = 0.9999 - frac;
|
|
399
|
+
return Math.max(0, Math.min(n - 1, start + Math.floor(frac * len)));
|
|
400
|
+
}
|
|
401
|
+
// ---------------------------------------------------------------------------
|
|
402
|
+
// Right-to-left pages
|
|
403
|
+
// ---------------------------------------------------------------------------
|
|
404
|
+
/** Layouts already turned for a mirrored page. */
|
|
405
|
+
const mirrored = new WeakSet();
|
|
406
|
+
/**
|
|
407
|
+
* A label layout for the flow of a mirrored page (a right-to-left book):
|
|
408
|
+
* its point, its turn and its lines reflected about the body's vertical
|
|
409
|
+
* axis, so that the page's reflection puts it back where the picture shows
|
|
410
|
+
* it, reading as written. `bodyWidth` is the body's width; `orient` turns
|
|
411
|
+
* a line's run order for the frame as the build does for captions.
|
|
412
|
+
*/
|
|
413
|
+
export function mirrorLabelLayout(layout, bodyWidth, orient) {
|
|
414
|
+
if (mirrored.has(layout))
|
|
415
|
+
return layout;
|
|
416
|
+
const flipBox = (r) => ({ ...r, x: -(r.x + r.width) });
|
|
417
|
+
const out = {
|
|
418
|
+
...layout,
|
|
419
|
+
x: bodyWidth - layout.x,
|
|
420
|
+
...(layout.rotate !== undefined ? { rotate: -layout.rotate } : {}),
|
|
421
|
+
lines: layout.lines.map((line) => {
|
|
422
|
+
const o = orient(line);
|
|
423
|
+
return {
|
|
424
|
+
...o,
|
|
425
|
+
bbox: { ...o.bbox, x: -(o.bbox.x + o.bbox.width) },
|
|
426
|
+
...(o.measure ? { measure: { ...o.measure, x: -(o.measure.x + o.measure.width) } } : {}),
|
|
427
|
+
};
|
|
428
|
+
}),
|
|
429
|
+
box: flipBox(layout.box),
|
|
430
|
+
...(layout.background ? { background: { ...layout.background, rect: flipBox(layout.background.rect) } } : {}),
|
|
431
|
+
};
|
|
432
|
+
mirrored.add(out);
|
|
433
|
+
return out;
|
|
434
|
+
}
|
|
435
|
+
// ---------------------------------------------------------------------------
|
|
436
|
+
// Reading
|
|
437
|
+
// ---------------------------------------------------------------------------
|
|
438
|
+
/** The labels of a figure that are not drawn as text: what its picture's
|
|
439
|
+
* alternative text still names (`altWithLabels`). */
|
|
440
|
+
export function undrawnLabels(labels) {
|
|
441
|
+
if (!labels)
|
|
442
|
+
return undefined;
|
|
443
|
+
const out = labels.filter((l) => !l.layout);
|
|
444
|
+
return out.length > 0 ? out : undefined;
|
|
445
|
+
}
|
|
446
|
+
/** A drawn label's words as read, its lines joined by a space. */
|
|
447
|
+
export function figureLabelReading(label) {
|
|
448
|
+
const lines = label.layout?.lines;
|
|
449
|
+
const text = lines && lines.length > 0 ? lines.map((l) => l.text).join(' ') : label.text;
|
|
450
|
+
return text.replace(/[]/g, '').replace(/\s+/g, ' ').trim();
|
|
451
|
+
}
|
|
452
|
+
// ---------------------------------------------------------------------------
|
|
453
|
+
// Warnings
|
|
454
|
+
// ---------------------------------------------------------------------------
|
|
455
|
+
/**
|
|
456
|
+
* The anchors the figures of `doc` name wrongly (`labelAnchorUnknown`, at
|
|
457
|
+
* the label's text) or leave without a word (`anchorUnlabelled`, a note
|
|
458
|
+
* at the figure: an anchor that names a label style and that no label of
|
|
459
|
+
* the figure stands at), each on the page its figure landed on.
|
|
460
|
+
*/
|
|
461
|
+
export function figureLabelWarnings(doc, figureSource) {
|
|
462
|
+
const out = [];
|
|
463
|
+
const locale = doc.config?.locale;
|
|
464
|
+
const seen = new Set();
|
|
465
|
+
const visit = (block) => {
|
|
466
|
+
const rb = block.resourceBlock;
|
|
467
|
+
const labels = rb?.labels;
|
|
468
|
+
if (!rb || !labels || labels.length === 0 || block.pageIndex < 0)
|
|
469
|
+
return;
|
|
470
|
+
// A figure laid out more than once (the slices of a table, a picture
|
|
471
|
+
// met twice): once.
|
|
472
|
+
const key = `${rb.resource.id}@${labels[0].sourceStart}`;
|
|
473
|
+
if (seen.has(key))
|
|
474
|
+
return;
|
|
475
|
+
seen.add(key);
|
|
476
|
+
const anchors = rb.resource.anchors ?? [];
|
|
477
|
+
const known = anchors.map((a) => a.id);
|
|
478
|
+
const used = new Set();
|
|
479
|
+
for (const label of labels) {
|
|
480
|
+
if (!('anchor' in label.at))
|
|
481
|
+
continue;
|
|
482
|
+
const id = label.at.anchor;
|
|
483
|
+
used.add(id);
|
|
484
|
+
if (known.includes(id))
|
|
485
|
+
continue;
|
|
486
|
+
out.push({
|
|
487
|
+
kind: 'labelAnchorUnknown',
|
|
488
|
+
resourceId: rb.resource.id,
|
|
489
|
+
anchor: id,
|
|
490
|
+
known,
|
|
491
|
+
...(locale ? { locale } : {}),
|
|
492
|
+
...(label.id ? { labelId: label.id } : {}),
|
|
493
|
+
sourceStart: label.sourceStart,
|
|
494
|
+
sourceEnd: label.sourceEnd,
|
|
495
|
+
pageIndex: block.pageIndex,
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
const where = figureSource(block);
|
|
499
|
+
for (const a of anchors) {
|
|
500
|
+
if (!a.style || used.has(a.id))
|
|
501
|
+
continue;
|
|
502
|
+
out.push({
|
|
503
|
+
kind: 'anchorUnlabelled',
|
|
504
|
+
resourceId: rb.resource.id,
|
|
505
|
+
anchor: a.id,
|
|
506
|
+
style: a.style,
|
|
507
|
+
...(locale ? { locale } : {}),
|
|
508
|
+
...(where ? { sourceStart: where.start, sourceEnd: where.end } : {}),
|
|
509
|
+
pageIndex: block.pageIndex,
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
};
|
|
513
|
+
for (const page of doc.pages) {
|
|
514
|
+
for (const col of page.columns)
|
|
515
|
+
for (const block of col.blocks)
|
|
516
|
+
visit(block);
|
|
517
|
+
for (const block of page.floats ?? [])
|
|
518
|
+
visit(block);
|
|
519
|
+
}
|
|
520
|
+
for (const block of doc.blocks)
|
|
521
|
+
visit(block);
|
|
522
|
+
return out;
|
|
523
|
+
}
|
|
524
|
+
//# sourceMappingURL=labels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels.js","sourceRoot":"","sources":["../../src/composed/labels.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,8 +13,9 @@
|
|
|
13
13
|
* indices, container ids and page index are moved to where the page now
|
|
14
14
|
* stands. A page whose layout reads what this key does not hold (a
|
|
15
15
|
* footnote, a cross-reference, a citation, a contents or index listing, a
|
|
16
|
-
* comic strip)
|
|
17
|
-
* joining script's tracking)
|
|
16
|
+
* comic strip), that leaves notes for the pass (a drop cap's warning, a
|
|
17
|
+
* joining script's tracking) or whose content goes on on pages it adds
|
|
18
|
+
* (#859) is always laid out afresh.
|
|
18
19
|
*/
|
|
19
20
|
import type { ContentBlock, InlineSpan } from '../parse/types';
|
|
20
21
|
import type { VDTPage } from '../vdt';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pageMemo.d.ts","sourceRoot":"","sources":["../../src/composed/pageMemo.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"pageMemo.d.ts","sourceRoot":"","sources":["../../src/composed/pageMemo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAsB,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEjH,8DAA8D;AAC9D,MAAM,WAAW,mBAAmB;IAClC,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB;2EACuE;IACvE,SAAS,IAAI,MAAM,CAAC;IACpB;4EACwE;IACxE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACzD,qEAAqE;IACrE,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;CAClD;AAmBD,oEAAoE;AACpE,wBAAgB,qBAAqB,IAAI,IAAI,CAK5C;AAED,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAGrD;AAED,qEAAqE;AACrE,wBAAgB,qBAAqB,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAEvG;AAID;4EAC4E;AAC5E,wBAAgB,MAAM,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAkBvD;AAED;uEACuE;AACvE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,GAAG,OAAO,CAMlF;AAED;qBACqB;AACrB,wBAAgB,eAAe,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO,CAKxD;AAoGD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,mBAAmB,GAAG,kBAAkB,CAyD7G;AAMD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAetE"}
|
|
@@ -242,7 +242,9 @@ export function layoutComposedPageMemo(input, ctx) {
|
|
|
242
242
|
return layout;
|
|
243
243
|
}
|
|
244
244
|
const layout = layoutComposedPage(input);
|
|
245
|
-
|
|
245
|
+
// A page whose content goes on on pages it adds (#859) is laid out
|
|
246
|
+
// afresh with them: the added pages read where it cut its frames.
|
|
247
|
+
if (layout.continuations || ctx.sideEffectsIn(from, to) || !selfContained(layout, new Set(ids), from, to)) {
|
|
246
248
|
stats.skipped++;
|
|
247
249
|
return layout;
|
|
248
250
|
}
|