postext 1.25.5 → 1.26.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/__tests__/cjk/headingNumberMark.test.d.ts +2 -0
- package/dist/__tests__/cjk/headingNumberMark.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/headingNumberMark.test.js +108 -0
- package/dist/__tests__/cjk/headingNumberMark.test.js.map +1 -0
- package/dist/__tests__/cjk/japaneseDash.test.d.ts +2 -0
- package/dist/__tests__/cjk/japaneseDash.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/japaneseDash.test.js +250 -0
- package/dist/__tests__/cjk/japaneseDash.test.js.map +1 -0
- package/dist/__tests__/cjk/japaneseSpacing.test.js +1 -1
- package/dist/__tests__/cjk/punctuation.test.js +5 -3
- package/dist/__tests__/cjk/punctuation.test.js.map +1 -1
- package/dist/__tests__/columnRuleBands.test.js +47 -0
- package/dist/__tests__/columnRuleBands.test.js.map +1 -1
- package/dist/__tests__/comics/canvas.test.js +38 -1
- package/dist/__tests__/comics/canvas.test.js.map +1 -1
- package/dist/__tests__/comics/html.test.js +16 -3
- package/dist/__tests__/comics/html.test.js.map +1 -1
- package/dist/__tests__/design/cjkDesignDash.test.js +7 -4
- package/dist/__tests__/design/cjkDesignDash.test.js.map +1 -1
- package/dist/__tests__/englishApostropheHyphenation.test.d.ts +2 -0
- package/dist/__tests__/englishApostropheHyphenation.test.d.ts.map +1 -0
- package/dist/__tests__/englishApostropheHyphenation.test.js +47 -0
- package/dist/__tests__/englishApostropheHyphenation.test.js.map +1 -0
- package/dist/__tests__/exports.test.js +1 -0
- package/dist/__tests__/exports.test.js.map +1 -1
- package/dist/__tests__/leaderMinRepeats.test.d.ts +2 -0
- package/dist/__tests__/leaderMinRepeats.test.d.ts.map +1 -0
- package/dist/__tests__/leaderMinRepeats.test.js +109 -0
- package/dist/__tests__/leaderMinRepeats.test.js.map +1 -0
- package/dist/__tests__/pipeline/footnoteRuntTracking.test.d.ts +2 -0
- package/dist/__tests__/pipeline/footnoteRuntTracking.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/footnoteRuntTracking.test.js +90 -0
- package/dist/__tests__/pipeline/footnoteRuntTracking.test.js.map +1 -0
- package/dist/__tests__/pipeline/orderedNumberAlign.test.d.ts +2 -0
- package/dist/__tests__/pipeline/orderedNumberAlign.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/orderedNumberAlign.test.js +108 -0
- package/dist/__tests__/pipeline/orderedNumberAlign.test.js.map +1 -0
- package/dist/__tests__/pipeline/trailingCapColumnNote.test.d.ts +2 -0
- package/dist/__tests__/pipeline/trailingCapColumnNote.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/trailingCapColumnNote.test.js +63 -0
- package/dist/__tests__/pipeline/trailingCapColumnNote.test.js.map +1 -0
- package/dist/__tests__/pipeline/trailingCapFloatHead.test.d.ts +2 -0
- package/dist/__tests__/pipeline/trailingCapFloatHead.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/trailingCapFloatHead.test.js +91 -0
- package/dist/__tests__/pipeline/trailingCapFloatHead.test.js.map +1 -0
- package/dist/__tests__/rtl/arabicLeadingNumbers.test.d.ts +2 -0
- package/dist/__tests__/rtl/arabicLeadingNumbers.test.d.ts.map +1 -0
- package/dist/__tests__/rtl/arabicLeadingNumbers.test.js +186 -0
- package/dist/__tests__/rtl/arabicLeadingNumbers.test.js.map +1 -0
- package/dist/__tests__/rtl/listMarkerDirection.test.d.ts +2 -0
- package/dist/__tests__/rtl/listMarkerDirection.test.d.ts.map +1 -0
- package/dist/__tests__/rtl/listMarkerDirection.test.js +197 -0
- package/dist/__tests__/rtl/listMarkerDirection.test.js.map +1 -0
- package/dist/__tests__/trackedLigatures.test.d.ts +2 -0
- package/dist/__tests__/trackedLigatures.test.d.ts.map +1 -0
- package/dist/__tests__/trackedLigatures.test.js +587 -0
- package/dist/__tests__/trackedLigatures.test.js.map +1 -0
- package/dist/__tests__/vectorRasterScale.test.d.ts +2 -0
- package/dist/__tests__/vectorRasterScale.test.d.ts.map +1 -0
- package/dist/__tests__/vectorRasterScale.test.js +304 -0
- package/dist/__tests__/vectorRasterScale.test.js.map +1 -0
- package/dist/bidi.d.ts +43 -3
- package/dist/bidi.d.ts.map +1 -1
- package/dist/bidi.js +29 -7
- package/dist/bidi.js.map +1 -1
- package/dist/canvas-backend/blockRender.d.ts.map +1 -1
- package/dist/canvas-backend/blockRender.js +43 -5
- package/dist/canvas-backend/blockRender.js.map +1 -1
- package/dist/canvas-backend/comic.d.ts +8 -4
- package/dist/canvas-backend/comic.d.ts.map +1 -1
- package/dist/canvas-backend/comic.js +13 -6
- package/dist/canvas-backend/comic.js.map +1 -1
- package/dist/canvas-backend/deviceScale.d.ts +31 -0
- package/dist/canvas-backend/deviceScale.d.ts.map +1 -0
- package/dist/canvas-backend/deviceScale.js +45 -0
- package/dist/canvas-backend/deviceScale.js.map +1 -0
- package/dist/canvas-backend/index.d.ts +5 -1
- package/dist/canvas-backend/index.d.ts.map +1 -1
- package/dist/canvas-backend/index.js.map +1 -1
- package/dist/canvas-backend/mirrorFrame.d.ts +14 -1
- package/dist/canvas-backend/mirrorFrame.d.ts.map +1 -1
- package/dist/canvas-backend/mirrorFrame.js +51 -7
- package/dist/canvas-backend/mirrorFrame.js.map +1 -1
- package/dist/canvas-backend/renderResourceBlock.d.ts +5 -3
- package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
- package/dist/canvas-backend/renderResourceBlock.js +39 -6
- package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
- package/dist/canvas-backend/trackedText.d.ts +72 -0
- package/dist/canvas-backend/trackedText.d.ts.map +1 -0
- package/dist/canvas-backend/trackedText.js +166 -0
- package/dist/canvas-backend/trackedText.js.map +1 -0
- package/dist/canvas-backend/wordRuns.d.ts +6 -0
- package/dist/canvas-backend/wordRuns.d.ts.map +1 -1
- package/dist/canvas-backend/wordRuns.js +11 -1
- package/dist/canvas-backend/wordRuns.js.map +1 -1
- package/dist/columnRule.d.ts +2 -1
- package/dist/columnRule.d.ts.map +1 -1
- package/dist/columnRule.js +11 -3
- package/dist/columnRule.js.map +1 -1
- package/dist/comics/layoutPage.d.ts.map +1 -1
- package/dist/comics/layoutPage.js +54 -2
- package/dist/comics/layoutPage.js.map +1 -1
- package/dist/comics/lettering/__tests__/ellipsisFace.test.d.ts +2 -0
- package/dist/comics/lettering/__tests__/ellipsisFace.test.d.ts.map +1 -0
- package/dist/comics/lettering/__tests__/ellipsisFace.test.js +54 -0
- package/dist/comics/lettering/__tests__/ellipsisFace.test.js.map +1 -0
- package/dist/comics/lettering/__tests__/polish.test.js +8 -0
- package/dist/comics/lettering/__tests__/polish.test.js.map +1 -1
- package/dist/comics/lettering/__tests__/round4.test.d.ts +2 -0
- package/dist/comics/lettering/__tests__/round4.test.d.ts.map +1 -0
- package/dist/comics/lettering/__tests__/round4.test.js +212 -0
- package/dist/comics/lettering/__tests__/round4.test.js.map +1 -0
- package/dist/comics/lettering/letter.js +2 -2
- package/dist/comics/lettering/letter.js.map +1 -1
- package/dist/comics/lettering/placement.d.ts +10 -3
- package/dist/comics/lettering/placement.d.ts.map +1 -1
- package/dist/comics/lettering/placement.js +162 -22
- package/dist/comics/lettering/placement.js.map +1 -1
- package/dist/comics/lettering/text.d.ts.map +1 -1
- package/dist/comics/lettering/text.js +25 -3
- package/dist/comics/lettering/text.js.map +1 -1
- package/dist/comics/lettering/types.d.ts +29 -2
- package/dist/comics/lettering/types.d.ts.map +1 -1
- package/dist/defaults/orderedLists.d.ts +1 -0
- package/dist/defaults/orderedLists.d.ts.map +1 -1
- package/dist/defaults/orderedLists.js +7 -0
- package/dist/defaults/orderedLists.js.map +1 -1
- package/dist/design/bidiText.d.ts +5 -2
- package/dist/design/bidiText.d.ts.map +1 -1
- package/dist/design/bidiText.js +7 -4
- package/dist/design/bidiText.js.map +1 -1
- package/dist/design/layout.d.ts +5 -0
- package/dist/design/layout.d.ts.map +1 -1
- package/dist/design/layout.js +1 -1
- package/dist/design/layout.js.map +1 -1
- package/dist/html-backend.d.ts.map +1 -1
- package/dist/html-backend.js +32 -6
- package/dist/html-backend.js.map +1 -1
- package/dist/htmlComic.d.ts +2 -1
- package/dist/htmlComic.d.ts.map +1 -1
- package/dist/htmlComic.js +14 -1
- package/dist/htmlComic.js.map +1 -1
- package/dist/hyphenate.d.ts.map +1 -1
- package/dist/hyphenate.js +52 -0
- package/dist/hyphenate.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/math/rasterCache.d.ts +7 -1
- package/dist/math/rasterCache.d.ts.map +1 -1
- package/dist/math/rasterCache.js +23 -11
- package/dist/math/rasterCache.js.map +1 -1
- package/dist/measure/bidiLines.d.ts +8 -0
- package/dist/measure/bidiLines.d.ts.map +1 -1
- package/dist/measure/bidiLines.js +13 -0
- package/dist/measure/bidiLines.js.map +1 -1
- package/dist/measure/cache.d.ts.map +1 -1
- package/dist/measure/cache.js +5 -3
- package/dist/measure/cache.js.map +1 -1
- package/dist/measure/cjkCompose.d.ts +10 -0
- package/dist/measure/cjkCompose.d.ts.map +1 -1
- package/dist/measure/cjkCompose.js +95 -19
- package/dist/measure/cjkCompose.js.map +1 -1
- package/dist/measure/cjkPunctuation.d.ts +10 -0
- package/dist/measure/cjkPunctuation.d.ts.map +1 -1
- package/dist/measure/cjkPunctuation.js +18 -1
- package/dist/measure/cjkPunctuation.js.map +1 -1
- package/dist/measure/hardBreaks.d.ts.map +1 -1
- package/dist/measure/hardBreaks.js +4 -1
- package/dist/measure/hardBreaks.js.map +1 -1
- package/dist/measure/leader.d.ts +6 -1
- package/dist/measure/leader.d.ts.map +1 -1
- package/dist/measure/leader.js +8 -3
- package/dist/measure/leader.js.map +1 -1
- package/dist/measure/plain.d.ts.map +1 -1
- package/dist/measure/plain.js +4 -2
- package/dist/measure/plain.js.map +1 -1
- package/dist/measure/rich.d.ts.map +1 -1
- package/dist/measure/rich.js +7 -4
- package/dist/measure/rich.js.map +1 -1
- package/dist/measure/types.d.ts +7 -0
- package/dist/measure/types.d.ts.map +1 -1
- package/dist/measure/types.js.map +1 -1
- package/dist/pipeline/build.d.ts.map +1 -1
- package/dist/pipeline/build.js +38 -5
- package/dist/pipeline/build.js.map +1 -1
- package/dist/pipeline/buildBlockKind.d.ts +5 -0
- package/dist/pipeline/buildBlockKind.d.ts.map +1 -1
- package/dist/pipeline/buildBlockKind.js +1 -0
- package/dist/pipeline/buildBlockKind.js.map +1 -1
- package/dist/pipeline/calloutLayout.d.ts.map +1 -1
- package/dist/pipeline/calloutLayout.js +8 -4
- package/dist/pipeline/calloutLayout.js.map +1 -1
- package/dist/pipeline/citations.d.ts.map +1 -1
- package/dist/pipeline/citations.js +52 -6
- package/dist/pipeline/citations.js.map +1 -1
- package/dist/pipeline/config.d.ts +6 -0
- package/dist/pipeline/config.d.ts.map +1 -1
- package/dist/pipeline/config.js +12 -1
- package/dist/pipeline/config.js.map +1 -1
- package/dist/pipeline/headerFooter.d.ts +2 -0
- package/dist/pipeline/headerFooter.d.ts.map +1 -1
- package/dist/pipeline/headerFooter.js +3 -1
- package/dist/pipeline/headerFooter.js.map +1 -1
- package/dist/pipeline/lists.d.ts +8 -0
- package/dist/pipeline/lists.d.ts.map +1 -1
- package/dist/pipeline/lists.js +18 -1
- package/dist/pipeline/lists.js.map +1 -1
- package/dist/pipeline/measureContentBlock.d.ts.map +1 -1
- package/dist/pipeline/measureContentBlock.js +3 -0
- package/dist/pipeline/measureContentBlock.js.map +1 -1
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/vdt.d.ts +9 -0
- package/dist/vdt.d.ts.map +1 -1
- package/dist/vdt.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { needsBidi } from '../bidi';
|
|
2
|
+
import { graphemesOf } from '../measure/graphemes';
|
|
3
|
+
import { joiningScriptIn } from '../measure/joining';
|
|
4
|
+
import { paintAsOneRun } from './mirrorFrame';
|
|
5
|
+
/** Letter-spacing the words are probed with, px. */
|
|
6
|
+
const PROBE = 1;
|
|
7
|
+
/** Least difference, px, between a word's natural width and its width
|
|
8
|
+
* under letter-spacing (the spacing taken off) that counts as another
|
|
9
|
+
* shaping: above the noise of `measureText`, below any ligature. */
|
|
10
|
+
const TOLERANCE = 0.05;
|
|
11
|
+
/** Words remembered per font before the memory starts over. */
|
|
12
|
+
const MAX_WORDS = 8192;
|
|
13
|
+
/** Font string → what is known of each text set in it. */
|
|
14
|
+
const knownByFont = new Map();
|
|
15
|
+
function known(font) {
|
|
16
|
+
let k = knownByFont.get(font);
|
|
17
|
+
if (!k)
|
|
18
|
+
knownByFont.set(font, k = { otherwise: new Map(), words: new Map() });
|
|
19
|
+
return k;
|
|
20
|
+
}
|
|
21
|
+
/** Whether `text` may be painted in pieces at all: no right-to-left letter
|
|
22
|
+
* in it and no letter of a joining script (see the module comment). */
|
|
23
|
+
function divisible(text) {
|
|
24
|
+
return !needsBidi(text) && !joiningScriptIn(text);
|
|
25
|
+
}
|
|
26
|
+
function widthAt(ctx, text, spacing) {
|
|
27
|
+
ctx.letterSpacing = `${spacing}px`;
|
|
28
|
+
return ctx.measureText(text).width;
|
|
29
|
+
}
|
|
30
|
+
/** {@link shapedOtherwise}, measured: the context's `letterSpacing` is
|
|
31
|
+
* left at any value. */
|
|
32
|
+
function probe(ctx, text) {
|
|
33
|
+
const natural = widthAt(ctx, text, 0);
|
|
34
|
+
const one = widthAt(ctx, text, PROBE);
|
|
35
|
+
const two = widthAt(ctx, text, 2 * PROBE);
|
|
36
|
+
// What one more unit of spacing adds: the spacing after each letter.
|
|
37
|
+
const step = two - one;
|
|
38
|
+
// A measurer that takes no letter-spacing (a test stub, an old browser).
|
|
39
|
+
if (!(step > PROBE / 2))
|
|
40
|
+
return false;
|
|
41
|
+
return Math.abs(one - step - natural) > TOLERANCE;
|
|
42
|
+
}
|
|
43
|
+
function otherwise(ctx, font, text) {
|
|
44
|
+
const { otherwise: words } = known(font);
|
|
45
|
+
let changed = words.get(text);
|
|
46
|
+
if (changed === undefined) {
|
|
47
|
+
changed = probe(ctx, text);
|
|
48
|
+
if (words.size >= MAX_WORDS)
|
|
49
|
+
words.clear();
|
|
50
|
+
words.set(text, changed);
|
|
51
|
+
}
|
|
52
|
+
return changed;
|
|
53
|
+
}
|
|
54
|
+
function wordOf(ctx, font, text) {
|
|
55
|
+
if (!divisible(text))
|
|
56
|
+
return null;
|
|
57
|
+
const letters = graphemesOf(text);
|
|
58
|
+
if (letters.length < 2 || !otherwise(ctx, font, text))
|
|
59
|
+
return null;
|
|
60
|
+
// Two neighbours that shape otherwise under letter-spacing are a
|
|
61
|
+
// ligature; a third joins them the same way (f + f + i).
|
|
62
|
+
const groups = [];
|
|
63
|
+
let ligatures = 0;
|
|
64
|
+
for (let k = 0; k < letters.length;) {
|
|
65
|
+
let end = k + 1;
|
|
66
|
+
while (end < letters.length && otherwise(ctx, font, letters[end - 1] + letters[end]))
|
|
67
|
+
end++;
|
|
68
|
+
const ligature = end - k > 1;
|
|
69
|
+
const last = groups[groups.length - 1];
|
|
70
|
+
if (!ligature && last && !last.ligature)
|
|
71
|
+
last.end = end;
|
|
72
|
+
else
|
|
73
|
+
groups.push({ start: k, end, ligature });
|
|
74
|
+
if (ligature)
|
|
75
|
+
ligatures++;
|
|
76
|
+
k = end;
|
|
77
|
+
}
|
|
78
|
+
// Shaped otherwise as a whole but by no pair of neighbours: left as it was.
|
|
79
|
+
if (ligatures === 0)
|
|
80
|
+
return null;
|
|
81
|
+
ctx.letterSpacing = '0px';
|
|
82
|
+
const natural = (from, to) => ctx.measureText(letters.slice(from, to).join('')).width;
|
|
83
|
+
let glyphs = 0;
|
|
84
|
+
const pieces = groups.map((g) => {
|
|
85
|
+
// Up to the piece's first letter in the natural shaping, the kerning
|
|
86
|
+
// before it counted: the pieces meet as the whole word's letters do.
|
|
87
|
+
const offset = g.start === 0 ? 0 : natural(0, g.start + 1) - natural(g.start, g.start + 1);
|
|
88
|
+
const piece = { text: letters.slice(g.start, g.end).join(''), offset, glyphsBefore: glyphs, ligature: g.ligature };
|
|
89
|
+
glyphs += g.ligature ? 1 : g.end - g.start;
|
|
90
|
+
return piece;
|
|
91
|
+
});
|
|
92
|
+
return { pieces, natural: natural(0, letters.length), letters: letters.length };
|
|
93
|
+
}
|
|
94
|
+
/** {@link trackedPieces} with the word's measures. */
|
|
95
|
+
function trackedWord(ctx, text) {
|
|
96
|
+
if (text.length < 2 || !measures(ctx))
|
|
97
|
+
return null;
|
|
98
|
+
const font = ctx.font;
|
|
99
|
+
const { words } = known(font);
|
|
100
|
+
let word = words.get(text);
|
|
101
|
+
if (word === undefined) {
|
|
102
|
+
const spacing = ctx.letterSpacing;
|
|
103
|
+
word = wordOf(ctx, font, text);
|
|
104
|
+
ctx.letterSpacing = spacing;
|
|
105
|
+
if (words.size >= MAX_WORDS)
|
|
106
|
+
words.clear();
|
|
107
|
+
words.set(text, word);
|
|
108
|
+
}
|
|
109
|
+
return word;
|
|
110
|
+
}
|
|
111
|
+
/** Whether the context can be asked: it has a `letterSpacing` and measures. */
|
|
112
|
+
function measures(ctx) {
|
|
113
|
+
return 'letterSpacing' in ctx && typeof ctx.measureText === 'function';
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Whether the browser shapes `text`, in the context's font, otherwise once
|
|
117
|
+
* a letter-spacing is set: its width at a letter-spacing, that spacing
|
|
118
|
+
* taken off, is not its natural width (it holds a ligature the
|
|
119
|
+
* letter-spacing turns off). False where the context measures no
|
|
120
|
+
* letter-spacing. The context's `letterSpacing` is put back as it was
|
|
121
|
+
* found.
|
|
122
|
+
*/
|
|
123
|
+
export function shapedOtherwise(ctx, text) {
|
|
124
|
+
if (text.length < 2 || !measures(ctx))
|
|
125
|
+
return false;
|
|
126
|
+
const spacing = ctx.letterSpacing;
|
|
127
|
+
const changed = otherwise(ctx, ctx.font, text);
|
|
128
|
+
ctx.letterSpacing = spacing;
|
|
129
|
+
return changed;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* The pieces a tracked word is painted in, in the context's font, or null
|
|
133
|
+
* when it is painted whole (the browser shapes it the same under
|
|
134
|
+
* letter-spacing, the context measures none, or the word holds a
|
|
135
|
+
* right-to-left or joining letter). The context's `letterSpacing` is put
|
|
136
|
+
* back as it was found.
|
|
137
|
+
*/
|
|
138
|
+
export function trackedPieces(ctx, text) {
|
|
139
|
+
return trackedWord(ctx, text)?.pieces ?? null;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Paint a word of a tracked line with `paint` (the caller's `fillText`) at
|
|
143
|
+
* `x`, `y`: its left end on a left-to-right page, the start of its box in
|
|
144
|
+
* a mirrored frame. `tracking` is the context's `letterSpacing` on entry,
|
|
145
|
+
* px, and on return. A word that would lose its ligatures to it is painted
|
|
146
|
+
* in its {@link trackedPieces}, as one run (`paintAsOneRun`): its box is
|
|
147
|
+
* the one the frame turns a word painted whole about, its natural width
|
|
148
|
+
* and the tracking after each letter. Any other word with one `paint`.
|
|
149
|
+
*/
|
|
150
|
+
export function fillTrackedWord(ctx, text, x, y, tracking, paint) {
|
|
151
|
+
const word = tracking !== 0 ? trackedWord(ctx, text) : null;
|
|
152
|
+
if (!word) {
|
|
153
|
+
paint(text, x, y);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
paintAsOneRun(ctx, x, word.natural + tracking * word.letters, () => {
|
|
157
|
+
for (const piece of word.pieces) {
|
|
158
|
+
if (piece.ligature)
|
|
159
|
+
ctx.letterSpacing = '0px';
|
|
160
|
+
paint(piece.text, x + piece.offset + tracking * piece.glyphsBefore, y);
|
|
161
|
+
if (piece.ligature)
|
|
162
|
+
ctx.letterSpacing = `${tracking}px`;
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=trackedText.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trackedText.js","sourceRoot":"","sources":["../../src/canvas-backend/trackedText.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,12 @@ export type WordRun = NonNullable<VDTLineSegment['runs']>[number];
|
|
|
16
16
|
* - a word set in several styles (`runs`, `كتا**ب**`) is painted whole in
|
|
17
17
|
* the segment's style, then once more in each other run's style, clipped
|
|
18
18
|
* to that run's stretch of the word ({@link paintWordRuns}).
|
|
19
|
+
*
|
|
20
|
+
* A left-to-right word of a tracked line that the browser would shape
|
|
21
|
+
* without its ligatures under letter-spacing is painted with them, as it
|
|
22
|
+
* was measured (`fillTrackedWord`, #663): in pieces, which a mirrored page
|
|
23
|
+
* turns back as one run (#685). A right-to-left word and a word of a
|
|
24
|
+
* joining script are never painted in pieces.
|
|
19
25
|
*/
|
|
20
26
|
export declare function fillSegmentWord(ctx: CanvasRenderingContext2D, seg: VDTLineSegment, x: number, y: number, tracking: number, paint: (text: string, x: number, y: number) => void, runStyle: (run: WordRun) => {
|
|
21
27
|
font: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wordRuns.d.ts","sourceRoot":"","sources":["../../src/canvas-backend/wordRuns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"wordRuns.d.ts","sourceRoot":"","sources":["../../src/canvas-backend/wordRuns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAK7C,8EAA8E;AAC9E,MAAM,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAQlE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,wBAAwB,EAC7B,GAAG,EAAE,cAAc,EACnB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,EACnD,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzD,IAAI,CAkBN;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,wBAAwB,EAC7B,GAAG,EAAE,cAAc,EACnB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,EACnD,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzD,IAAI,CAsCN"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { joiningScriptIn } from '../measure/joining';
|
|
2
2
|
import { mirroredPaintActive } from './mirrorFrame';
|
|
3
|
+
import { fillTrackedWord } from './trackedText';
|
|
3
4
|
/** How far above and below the baseline a run's clip reaches: past any
|
|
4
5
|
* ascender, stacked vowel sign or descender. */
|
|
5
6
|
const CLIP_REACH = 4096;
|
|
@@ -19,6 +20,12 @@ const MARK_RE = /\p{M}/u;
|
|
|
19
20
|
* - a word set in several styles (`runs`, `كتا**ب**`) is painted whole in
|
|
20
21
|
* the segment's style, then once more in each other run's style, clipped
|
|
21
22
|
* to that run's stretch of the word ({@link paintWordRuns}).
|
|
23
|
+
*
|
|
24
|
+
* A left-to-right word of a tracked line that the browser would shape
|
|
25
|
+
* without its ligatures under letter-spacing is painted with them, as it
|
|
26
|
+
* was measured (`fillTrackedWord`, #663): in pieces, which a mirrored page
|
|
27
|
+
* turns back as one run (#685). A right-to-left word and a word of a
|
|
28
|
+
* joining script are never painted in pieces.
|
|
22
29
|
*/
|
|
23
30
|
export function fillSegmentWord(ctx, seg, x, y, tracking, paint, runStyle) {
|
|
24
31
|
const untracked = tracking !== 0 && joiningScriptIn(seg.text);
|
|
@@ -31,7 +38,10 @@ export function fillSegmentWord(ctx, seg, x, y, tracking, paint, runStyle) {
|
|
|
31
38
|
ctx.direction = 'rtl';
|
|
32
39
|
ctx.textAlign = 'left';
|
|
33
40
|
}
|
|
34
|
-
|
|
41
|
+
if (tracking !== 0 && !untracked && !rtl && !seg.runs)
|
|
42
|
+
fillTrackedWord(ctx, seg.text, x, y, tracking, paint);
|
|
43
|
+
else
|
|
44
|
+
paint(seg.text, x, y);
|
|
35
45
|
if (seg.runs)
|
|
36
46
|
paintWordRuns(ctx, seg, x, y, paint, runStyle);
|
|
37
47
|
if (rtl) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wordRuns.js","sourceRoot":"","sources":["../../src/canvas-backend/wordRuns.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"wordRuns.js","sourceRoot":"","sources":["../../src/canvas-backend/wordRuns.ts"],"names":[],"mappings":"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"}
|
package/dist/columnRule.d.ts
CHANGED
|
@@ -18,7 +18,8 @@ export interface ColumnRuleSegment {
|
|
|
18
18
|
* — the ruling a compositor would draw. Under a page-span heading's opener
|
|
19
19
|
* band it starts where the text does. A gutter between two columns that
|
|
20
20
|
* hold nothing (a band closed before any text landed, the empty columns
|
|
21
|
-
* left beside a closing page's text
|
|
21
|
+
* left beside a closing page's text, the grid line a page-span opener
|
|
22
|
+
* leaves under its band before a page-span box) is not ruled; a zero-height column
|
|
22
23
|
* (one a float filled) still bounds its gutters, which then run the length
|
|
23
24
|
* of its neighbour — beside the float, never through it (#505). Bands are
|
|
24
25
|
* visited in column order, which is band order because bands are always
|
package/dist/columnRule.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"columnRule.d.ts","sourceRoot":"","sources":["../src/columnRule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAG7F;;sCAEsC;AACtC,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG,aAAa,CAIjH;AAED,6EAA6E;AAC7E,MAAM,WAAW,iBAAiB;IAChC,uCAAuC;IACvC,CAAC,EAAE,MAAM,CAAC;IACV,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAmBD
|
|
1
|
+
{"version":3,"file":"columnRule.d.ts","sourceRoot":"","sources":["../src/columnRule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAG7F;;sCAEsC;AACtC,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG,aAAa,CAIjH;AAED,6EAA6E;AAC7E,MAAM,WAAW,iBAAiB;IAChC,uCAAuC;IACvC,CAAC,EAAE,MAAM,CAAC;IACV,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAmBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,SAAS,SAAS,EAAE;AAC7B;+DAC+D;AAC/D,aAAa,CAAC,EAAE,SAAS,eAAe,EAAE,GACzC,iBAAiB,EAAE,CAgDrB;AAED;+CAC+C;AAC/C,MAAM,WAAW,mBAAmB;IAClC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,6EAA6E;AAC7E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,GAAG,mBAAmB,EAAE,CAIhG"}
|
package/dist/columnRule.js
CHANGED
|
@@ -33,7 +33,8 @@ function ruleTop(col) {
|
|
|
33
33
|
* — the ruling a compositor would draw. Under a page-span heading's opener
|
|
34
34
|
* band it starts where the text does. A gutter between two columns that
|
|
35
35
|
* hold nothing (a band closed before any text landed, the empty columns
|
|
36
|
-
* left beside a closing page's text
|
|
36
|
+
* left beside a closing page's text, the grid line a page-span opener
|
|
37
|
+
* leaves under its band before a page-span box) is not ruled; a zero-height column
|
|
37
38
|
* (one a float filled) still bounds its gutters, which then run the length
|
|
38
39
|
* of its neighbour — beside the float, never through it (#505). Bands are
|
|
39
40
|
* visited in column order, which is band order because bands are always
|
|
@@ -63,9 +64,16 @@ footnoteAreas) {
|
|
|
63
64
|
byBand.set(band, [col]);
|
|
64
65
|
}
|
|
65
66
|
const tall = (col) => col.bbox.height > 0.5;
|
|
67
|
+
// A column that holds only the hidden heading of a page-span opener
|
|
68
|
+
// holds nothing the rule could stand beside: the opener band paints the
|
|
69
|
+
// heading, and the band closed under it before any text landed (a
|
|
70
|
+
// page-span box follows the opener, and the band ends on the grid line
|
|
71
|
+
// under the opener's foot). Ruled, that sliver printed a tick of rule
|
|
72
|
+
// between the opener and the box (#675).
|
|
73
|
+
const holdsNothing = (col) => col.blocks.every((b) => b.type === 'heading' && b.hidden === true);
|
|
66
74
|
// A page with no text at all (a blank page) keeps its rules, as it did.
|
|
67
|
-
const anyText = columns.some((c) => c.kind !== 'span' && c
|
|
68
|
-
const empty = (col) => col.kind !== 'side' && col
|
|
75
|
+
const anyText = columns.some((c) => c.kind !== 'span' && !holdsNothing(c));
|
|
76
|
+
const empty = (col) => col.kind !== 'side' && holdsNothing(col);
|
|
69
77
|
const segments = [];
|
|
70
78
|
for (const cols of byBand.values()) {
|
|
71
79
|
// Reading order is not always geometric order (a side column at the
|
package/dist/columnRule.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"columnRule.js","sourceRoot":"","sources":["../src/columnRule.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC;;sCAEsC;AACtC,MAAM,UAAU,cAAc,CAAC,IAAiC,EAAE,GAAgC;IAChG,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC,UAAU,CAAC;IAC5C,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;IAC1C,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,EAAE,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC3H,CAAC;AAUD;;;;;;;2CAO2C;AAC3C,SAAS,OAAO,CAAC,GAAc;IAC7B,IAAI,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACrB,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,MAAM;QACrD,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAClF,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"columnRule.js","sourceRoot":"","sources":["../src/columnRule.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layoutPage.d.ts","sourceRoot":"","sources":["../../src/comics/layoutPage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,0BAA0B,EAAE,oBAAoB,EAA4B,MAAM,UAAU,CAAC;AACpK,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAe,eAAe,EAAE,YAAY,EAAE,aAAa,EAAoB,OAAO,EAAY,MAAM,QAAQ,CAAC;AAU1K,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"layoutPage.d.ts","sourceRoot":"","sources":["../../src/comics/layoutPage.ts"],"names":[],"mappings":"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"}
|
|
@@ -419,6 +419,27 @@ function buttedCaption(style, panel, at) {
|
|
|
419
419
|
return style;
|
|
420
420
|
return { ...style, strokeWidth: panel.border.width };
|
|
421
421
|
}
|
|
422
|
+
/** Whether a balloon's outline is an oval or grows from one (a cloud, a
|
|
423
|
+
* burst): its box's corners are no part of it. */
|
|
424
|
+
function roundBalloon(comics, b) {
|
|
425
|
+
if (b.kind !== 'balloon' || !b.shape)
|
|
426
|
+
return false;
|
|
427
|
+
const shape = pickBalloonStyle(comics, b.style)?.shape;
|
|
428
|
+
return shape !== 'rectangle' && shape !== 'rounded' && shape !== 'none';
|
|
429
|
+
}
|
|
430
|
+
/** A balloon's tail as drawn, from its body to its tip (the body taken as
|
|
431
|
+
* the oval its box holds); undefined for a balloon with none. */
|
|
432
|
+
function drawnTail(b) {
|
|
433
|
+
if (!b.tailTip)
|
|
434
|
+
return undefined;
|
|
435
|
+
const c = { x: b.bbox.x + b.bbox.width / 2, y: b.bbox.y + b.bbox.height / 2 };
|
|
436
|
+
const dx = b.tailTip.x - c.x;
|
|
437
|
+
const dy = b.tailTip.y - c.y;
|
|
438
|
+
const k = Math.hypot(dx / (b.bbox.width / 2 || 1), dy / (b.bbox.height / 2 || 1));
|
|
439
|
+
if (!(k > 1))
|
|
440
|
+
return undefined;
|
|
441
|
+
return [{ x: c.x + dx / k, y: c.y + dy / k }, { x: b.tailTip.x, y: b.tailTip.y }];
|
|
442
|
+
}
|
|
422
443
|
/** A box grown (negative `d`) or shrunk by `d` on every side. */
|
|
423
444
|
function insetBox2(b, d) {
|
|
424
445
|
return { x: b.x + d, y: b.y + d, width: b.width - 2 * d, height: b.height - 2 * d };
|
|
@@ -452,11 +473,39 @@ export function letterPanels(input) {
|
|
|
452
473
|
const castById = new Map(comics.cast.map((c) => [c.id, c]));
|
|
453
474
|
const balloons = [];
|
|
454
475
|
const warnings = [];
|
|
476
|
+
const em = dimensionToPx(L.fontSize, dpi);
|
|
477
|
+
// What each panel's picture protects, on the page (#671): a balloon that
|
|
478
|
+
// leaves its panel keeps off the faces and avoid zones of the others.
|
|
479
|
+
const insets = panels.map((_, i) => panelSources[i]?.attrs.inset !== undefined);
|
|
480
|
+
const protectedArt = panels.map((panel, pi) => {
|
|
481
|
+
const resource = panel.art ? resources.get(panel.art.resourceId) : undefined;
|
|
482
|
+
if (!panel.art || !resource)
|
|
483
|
+
return [];
|
|
484
|
+
const under = panels.filter((q, qi) => qi > pi && insets[qi] && overlaps(q.bbox, panel.bbox)).map((q) => q.polygon);
|
|
485
|
+
const shown = (rect) => overlaps(rect, panel.bbox);
|
|
486
|
+
const entry = (rect, kind, guard = false) => ({ rect, kind, ...(guard ? { guard } : {}), within: panel.polygon, ...(under.length > 0 ? { under } : {}) });
|
|
487
|
+
return [
|
|
488
|
+
...(resource.anchors ?? []).filter((a) => a.id !== 'sfx' && a.face).map((a) => entry(comicArtRectToPage(panel.art, a.face), 'face')),
|
|
489
|
+
...(resource.avoid ?? []).map((r) => entry(comicArtRectToPage(panel.art, r), 'avoid')),
|
|
490
|
+
...headGuards(panel, resource, em).map((g) => entry(g, 'avoid', true)),
|
|
491
|
+
].filter((e) => shown(e.rect));
|
|
492
|
+
});
|
|
455
493
|
panels.forEach((panel, pi) => {
|
|
456
494
|
const src = panelSources[pi];
|
|
457
495
|
if (!src || src.items.length === 0)
|
|
458
496
|
return;
|
|
459
497
|
const resource = panel.art ? resources.get(panel.art.resourceId) : undefined;
|
|
498
|
+
// A line that may leave the panel (`break`, a pin, drawn sound) can land
|
|
499
|
+
// on anything about it: it is told what the panels before it lettered
|
|
500
|
+
// and what the pictures around it protect, as far as it can reach (its
|
|
501
|
+
// middle stays in its panel). A panel with no such line is lettered
|
|
502
|
+
// from what pokes into it alone, whatever the rest of the page does.
|
|
503
|
+
const laidOver = panels.filter((q, qi) => qi > pi && insets[qi] && overlaps(q.bbox, panel.bbox)).map((q) => q.polygon);
|
|
504
|
+
const leaves = src.items.some((it) => it.break || it.at !== undefined || it.role === 'sfx');
|
|
505
|
+
const reach = leaves ? insetBox2(panel.bbox, -Math.max(panel.bbox.width, panel.bbox.height)) : panel.bbox;
|
|
506
|
+
const set = balloons.filter((b) => overlaps(b.bbox, reach));
|
|
507
|
+
const tails = set.map(drawnTail).filter((t) => t !== undefined);
|
|
508
|
+
const around = leaves ? protectedArt.flatMap((list, qi) => (qi === pi ? [] : list.filter((e) => overlaps(e.rect, reach)))) : [];
|
|
460
509
|
const lp = {
|
|
461
510
|
index: panel.index,
|
|
462
511
|
polygon: panel.polygon,
|
|
@@ -468,17 +517,20 @@ export function letterPanels(input) {
|
|
|
468
517
|
anchors: panelAnchors(panel, resource),
|
|
469
518
|
avoid: [
|
|
470
519
|
...(panel.art ? (resource?.avoid ?? []).map((r) => comicArtRectToPage(panel.art, r)) : []),
|
|
471
|
-
...headGuards(panel, resource,
|
|
520
|
+
...headGuards(panel, resource, em).map((g) => ({ ...g, guard: true })),
|
|
472
521
|
],
|
|
473
522
|
keepOut: (input.avoid ?? []).filter((r) => overlaps(r, insetBox2(panel.bbox, -2 * insetPx))),
|
|
474
523
|
softAvoid: [...softSafeArea(panel, resource), ...headZones(panel, resource), ...bodyZones(panel, resource)],
|
|
475
524
|
...(panel.border.style !== 'none' && panel.border.width > 0 ? { borderPx: panel.border.width } : {}),
|
|
476
525
|
neighbours: panels.filter((q) => q !== panel).map((q) => q.bbox),
|
|
526
|
+
...(laidOver.length > 0 ? { over: laidOver } : {}),
|
|
477
527
|
...(input.frame ? { limit: input.frame } : {}),
|
|
478
528
|
...(trim ? { trim, sheet: input.bleedBox ? intersect(input.bleedBox, union(trim, panel.bbox)) : trim } : {}),
|
|
479
529
|
// What the panels before this one lettered: a balloon breaking out
|
|
480
530
|
// of either panel never covers the other's.
|
|
481
|
-
foreign:
|
|
531
|
+
foreign: set.map((b) => (roundBalloon(comics, b) ? { ...b.bbox, round: true } : b.bbox)),
|
|
532
|
+
...(tails.length > 0 ? { foreignTails: tails } : {}),
|
|
533
|
+
...(around.length > 0 ? { foreignArt: around } : {}),
|
|
482
534
|
dpi,
|
|
483
535
|
};
|
|
484
536
|
const items = src.items.map((it, k) => {
|