@reportwright/viewer 0.12.0 → 0.12.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/CHANGELOG.md +55 -1
- package/README.md +27 -5
- package/dist/{chunk-KJTRZJHN.js → chunk-2BPBQMH2.js} +4 -3
- package/dist/chunk-2BPBQMH2.js.map +6 -0
- package/dist/{chunk-ODREGGKA.js → chunk-3D2KFKG2.js} +5 -4
- package/dist/chunk-3D2KFKG2.js.map +6 -0
- package/dist/chunk-6TPZ7G74.js +494 -0
- package/dist/chunk-6TPZ7G74.js.map +6 -0
- package/dist/chunk-BRB34AJ2.js +16 -0
- package/dist/{chunk-APRPSQOD.js → chunk-DPVJEFKP.js} +28 -9
- package/dist/chunk-DPVJEFKP.js.map +6 -0
- package/dist/{chunk-RYHJUQSV.js → chunk-DXHLIJEY.js} +2 -2
- package/dist/{chunk-SR2TQ2ZK.js → chunk-F6RMRXIN.js} +2 -2
- package/dist/chunk-F6RMRXIN.js.map +6 -0
- package/dist/{chunk-3D43XGIN.js → chunk-M6AYND5G.js} +8 -638
- package/dist/chunk-M6AYND5G.js.map +6 -0
- package/dist/{chunk-EOVGKHAS.js → chunk-NR2G4TMG.js} +59 -51
- package/dist/chunk-NR2G4TMG.js.map +6 -0
- package/dist/{chunk-5N6OFCHJ.js → chunk-PGP3QA6L.js} +22 -10
- package/dist/chunk-PGP3QA6L.js.map +6 -0
- package/dist/{chunk-FARG6X2U.js → chunk-Q6MMPKQA.js} +14 -9
- package/dist/chunk-Q6MMPKQA.js.map +6 -0
- package/dist/{chunk-SBD55ZES.js → chunk-S2IUUI6N.js} +76 -32
- package/dist/chunk-S2IUUI6N.js.map +6 -0
- package/dist/chunk-ULKEEARQ.js +553 -0
- package/dist/chunk-ULKEEARQ.js.map +6 -0
- package/dist/{chunk-M6GENFAH.js → chunk-VNOWPSE6.js} +527 -1461
- package/dist/chunk-VNOWPSE6.js.map +6 -0
- package/dist/chunk-Z7MKH66Z.js +642 -0
- package/dist/chunk-Z7MKH66Z.js.map +6 -0
- package/dist/designer.d.ts +10 -3
- package/dist/designer.js +41 -31
- package/dist/designer.js.map +2 -2
- package/dist/engine.worker.js +71 -0
- package/dist/engine.worker.js.map +6 -0
- package/dist/peer/chunk-2FZTYEDE.js +15 -0
- package/dist/peer/{chunk-NPYKZINU.js → chunk-6I2EAAVN.js} +39 -31
- package/dist/peer/chunk-6I2EAAVN.js.map +6 -0
- package/dist/peer/{chunk-IPU2YRL2.js → chunk-BMAXIBP2.js} +28 -9
- package/dist/peer/chunk-BMAXIBP2.js.map +6 -0
- package/dist/peer/chunk-BQFI3DHK.js +494 -0
- package/dist/peer/chunk-BQFI3DHK.js.map +6 -0
- package/dist/peer/{chunk-76ZABVTI.js → chunk-R4VX5UC7.js} +4 -3
- package/dist/peer/{chunk-KBT6ZGGO.js → chunk-TSC4RAH3.js} +22 -10
- package/dist/peer/chunk-TSC4RAH3.js.map +6 -0
- package/dist/peer/{chunk-M4AGFUWE.js → chunk-V42KN7HD.js} +2 -2
- package/dist/peer/{chunk-Y5CAHLXS.js → chunk-WQGENQZO.js} +5 -4
- package/dist/peer/{chunk-MCJPN2KL.js → chunk-WSNRD2AQ.js} +14 -9
- package/dist/peer/chunk-WSNRD2AQ.js.map +6 -0
- package/dist/peer/designer.js +41 -31
- package/dist/peer/designer.js.map +2 -2
- package/dist/peer/engine.worker.js +70 -0
- package/dist/peer/engine.worker.js.map +6 -0
- package/dist/peer/viewer.js +12 -5
- package/dist/peer/viewer.js.map +1 -1
- package/dist/viewer.d.ts +9 -1
- package/dist/viewer.js +12 -5
- package/dist/viewer.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-3D43XGIN.js.map +0 -6
- package/dist/chunk-5N6OFCHJ.js.map +0 -6
- package/dist/chunk-AH47FS6Y.js +0 -13
- package/dist/chunk-APRPSQOD.js.map +0 -6
- package/dist/chunk-EOVGKHAS.js.map +0 -6
- package/dist/chunk-FARG6X2U.js.map +0 -6
- package/dist/chunk-M6GENFAH.js.map +0 -6
- package/dist/chunk-SBD55ZES.js.map +0 -6
- package/dist/chunk-SR2TQ2ZK.js.map +0 -6
- package/dist/peer/chunk-76ZABVTI.js.map +0 -6
- package/dist/peer/chunk-GBITRNHE.js +0 -14806
- package/dist/peer/chunk-GBITRNHE.js.map +0 -6
- package/dist/peer/chunk-IMQRHDR4.js +0 -12
- package/dist/peer/chunk-IPU2YRL2.js.map +0 -6
- package/dist/peer/chunk-KBT6ZGGO.js.map +0 -6
- package/dist/peer/chunk-MCJPN2KL.js.map +0 -6
- package/dist/peer/chunk-NPYKZINU.js.map +0 -6
- package/dist/peer/chunk-Y5CAHLXS.js.map +0 -6
- /package/dist/{chunk-AH47FS6Y.js.map → chunk-BRB34AJ2.js.map} +0 -0
- /package/dist/{chunk-RYHJUQSV.js.map → chunk-DXHLIJEY.js.map} +0 -0
- /package/dist/peer/{chunk-IMQRHDR4.js.map → chunk-2FZTYEDE.js.map} +0 -0
- /package/dist/{chunk-KJTRZJHN.js.map → peer/chunk-R4VX5UC7.js.map} +0 -0
- /package/dist/peer/{chunk-M4AGFUWE.js.map → chunk-V42KN7HD.js.map} +0 -0
- /package/dist/{chunk-ODREGGKA.js.map → peer/chunk-WQGENQZO.js.map} +0 -0
|
@@ -0,0 +1,553 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CORE_FONT_KEY,
|
|
3
|
+
DEFAULT_FAMILY,
|
|
4
|
+
SHAPER,
|
|
5
|
+
fallbackKey,
|
|
6
|
+
fontCss,
|
|
7
|
+
resolveFontKey
|
|
8
|
+
} from "./chunk-Z7MKH66Z.js";
|
|
9
|
+
|
|
10
|
+
// src/engine/text/measure.js
|
|
11
|
+
import bidiFactory from "bidi-js";
|
|
12
|
+
var bidi = bidiFactory();
|
|
13
|
+
function special(cp) {
|
|
14
|
+
if (cp < 1424) return false;
|
|
15
|
+
if (cp <= 7423) return true;
|
|
16
|
+
if (cp >= 8192 && cp <= 8303) return cp >= 8203 && cp <= 8207 || cp >= 8234 && cp <= 8238 || cp >= 8288;
|
|
17
|
+
return cp >= 11904 && cp <= 42191 || cp >= 43056 && cp <= 44031 || cp >= 44032 && cp <= 55215 || cp >= 63744 && cp <= 64255 || cp >= 64285 && cp <= 65023 || cp >= 65024 && cp <= 65039 || cp >= 65072 && cp <= 65103 || cp >= 65136 && cp <= 65278 || cp >= 65280 && cp <= 65519 || cp >= 65536;
|
|
18
|
+
}
|
|
19
|
+
var FORMAT_CHAR = /^\p{Cf}$/u;
|
|
20
|
+
var cjk = (cp) => cp >= 11904 && cp <= 40959 || cp >= 44032 && cp <= 55215 || cp >= 63744 && cp <= 64255 || cp >= 65280 && cp <= 65519 || cp >= 131072 && cp <= 262143;
|
|
21
|
+
var NO_START = new Set("、。,.・:;?!ー)」』】〕〉》〗〙〟’”}⦆ぁぃぅぇぉっゃゅょゎゕゖァィゥェォッャュョヮヵヶ々〻‐゠–〜~…‥,.!?:;)]}%ゝゞヽヾ゛゜ㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ。」、・ー%]⦆");
|
|
22
|
+
var NO_END = new Set("(「『【〔〈《〖〘〝‘“{⦅([{[「$¥£");
|
|
23
|
+
var MAYBE = /[^\u0000-\u058f]/;
|
|
24
|
+
var RTL_OR_CONTROLS = /[-ࣿיִ-﷿ﹰ---]|[\uD802\uD803\uD83A]/;
|
|
25
|
+
var SCRIPTS = [
|
|
26
|
+
"Latin",
|
|
27
|
+
"Greek",
|
|
28
|
+
"Cyrillic",
|
|
29
|
+
"Armenian",
|
|
30
|
+
"Hebrew",
|
|
31
|
+
"Arabic",
|
|
32
|
+
"Syriac",
|
|
33
|
+
"Thaana",
|
|
34
|
+
"Devanagari",
|
|
35
|
+
"Bengali",
|
|
36
|
+
"Gurmukhi",
|
|
37
|
+
"Gujarati",
|
|
38
|
+
"Oriya",
|
|
39
|
+
"Tamil",
|
|
40
|
+
"Telugu",
|
|
41
|
+
"Kannada",
|
|
42
|
+
"Malayalam",
|
|
43
|
+
"Sinhala",
|
|
44
|
+
"Thai",
|
|
45
|
+
"Lao",
|
|
46
|
+
"Tibetan",
|
|
47
|
+
"Myanmar",
|
|
48
|
+
"Georgian",
|
|
49
|
+
"Hangul",
|
|
50
|
+
"Ethiopic",
|
|
51
|
+
"Khmer",
|
|
52
|
+
"Mongolian",
|
|
53
|
+
"Han",
|
|
54
|
+
"Hiragana",
|
|
55
|
+
"Katakana",
|
|
56
|
+
"Bopomofo"
|
|
57
|
+
].map((s) => (
|
|
58
|
+
/** @type {[string, RegExp]} */
|
|
59
|
+
[s, new RegExp(`\\p{Script=${s}}`, "u")]
|
|
60
|
+
));
|
|
61
|
+
var SIMPLE = /* @__PURE__ */ new Set(["Latin", "Greek", "Cyrillic", "Armenian", "Georgian", "Hangul", "Han", "Hiragana", "Katakana", "Bopomofo", "Common"]);
|
|
62
|
+
var STICKY = /[\p{M}\p{Cf}]/u;
|
|
63
|
+
var SPACE = /\s/u;
|
|
64
|
+
var scriptCache = /* @__PURE__ */ new Map();
|
|
65
|
+
function scriptOf(cp) {
|
|
66
|
+
let s = scriptCache.get(cp);
|
|
67
|
+
if (s === void 0) {
|
|
68
|
+
const ch = String.fromCodePoint(cp);
|
|
69
|
+
s = "Common";
|
|
70
|
+
for (const [name, re] of SCRIPTS) if (re.test(ch)) {
|
|
71
|
+
s = name;
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
if (scriptCache.size >= 2e4) scriptCache.clear();
|
|
75
|
+
scriptCache.set(cp, s);
|
|
76
|
+
}
|
|
77
|
+
return s;
|
|
78
|
+
}
|
|
79
|
+
var INTL = typeof Intl !== "undefined" && typeof Intl.Segmenter === "function";
|
|
80
|
+
var GRAPHEMES = INTL ? new Intl.Segmenter(void 0, { granularity: "grapheme" }) : null;
|
|
81
|
+
var JOINS = /[\p{M}\u200c\u200d\ufe00-\ufe0f]/u;
|
|
82
|
+
function clusters(s, intl = true) {
|
|
83
|
+
if (intl && GRAPHEMES) return [...GRAPHEMES.segment(s)].map((x) => x.segment);
|
|
84
|
+
const out = [];
|
|
85
|
+
for (const ch of s) {
|
|
86
|
+
if (out.length && (JOINS.test(ch) || out[out.length - 1].endsWith(""))) out[out.length - 1] += ch;
|
|
87
|
+
else out.push(ch);
|
|
88
|
+
}
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
var graphemes = (s) => clusters(s);
|
|
92
|
+
var SA = /[\u0e00-\u0eff\u1000-\u109f\u1780-\u17ff\u19e0-\u19ff\u1a20-\u1aaf\ua9e0-\ua9ff\uaa60-\uaadf]/;
|
|
93
|
+
var WORDS = INTL ? new Intl.Segmenter(void 0, { granularity: "word" }) : null;
|
|
94
|
+
function saBreaks(text, segmenter = WORDS) {
|
|
95
|
+
const out = /* @__PURE__ */ new Set();
|
|
96
|
+
if (!segmenter) return out;
|
|
97
|
+
for (const { index } of segmenter.segment(text)) {
|
|
98
|
+
if (index > 0 && (SA.test(text[index]) || SA.test(text[index - 1]))) out.add(index);
|
|
99
|
+
}
|
|
100
|
+
return out;
|
|
101
|
+
}
|
|
102
|
+
var TextMeasurer = class {
|
|
103
|
+
/** @param {import('./fonts.js').FontStore} store */
|
|
104
|
+
constructor(store) {
|
|
105
|
+
this.store = store;
|
|
106
|
+
this.faces = /* @__PURE__ */ new Map();
|
|
107
|
+
this.boxes = /* @__PURE__ */ new WeakMap();
|
|
108
|
+
this.boxCount = 0;
|
|
109
|
+
this.looks = /* @__PURE__ */ new WeakMap();
|
|
110
|
+
this.cover = /* @__PURE__ */ new Map();
|
|
111
|
+
this.cache = /* @__PURE__ */ new Map();
|
|
112
|
+
this.missing = /* @__PURE__ */ new Set();
|
|
113
|
+
this.noGlyph = /* @__PURE__ */ new Set();
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* The key to measure with: `key` when loaded; else (not loaded yet, or failed) the bundled face of the same weight
|
|
117
|
+
* and style when that is loaded, else the core regular face. A key not yet loaded is asked for in the next pass.
|
|
118
|
+
*/
|
|
119
|
+
usable(key) {
|
|
120
|
+
if (this.store.has(key)) return key;
|
|
121
|
+
if (!this.store.failed.has(key)) this.missing.add(key);
|
|
122
|
+
const c = fontCss(key);
|
|
123
|
+
const same = resolveFontKey(DEFAULT_FAMILY, c.weight, c.style);
|
|
124
|
+
return this.store.has(same) ? same : CORE_FONT_KEY;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* A loaded face's numbers, read once: fontkit's getters (unitsPerEm, ascent…) decode tables on every read.
|
|
128
|
+
* adv: advances per code point (-1 = not on the fast path); words: fast-path units per string (a table repeats them).
|
|
129
|
+
* @param {string} key a loaded key
|
|
130
|
+
*/
|
|
131
|
+
face(key) {
|
|
132
|
+
let f = this.faces.get(key);
|
|
133
|
+
if (!f) {
|
|
134
|
+
const font = this.store.get(key);
|
|
135
|
+
f = { font, upm: font.unitsPerEm, ascent: font.ascent, descent: font.descent, adv: /* @__PURE__ */ new Map(), words: /* @__PURE__ */ new Map(), met: /* @__PURE__ */ new Map() };
|
|
136
|
+
this.faces.set(key, f);
|
|
137
|
+
}
|
|
138
|
+
return f;
|
|
139
|
+
}
|
|
140
|
+
/** Font units of `text` on the fast path, or -1 when it needs the complex path. */
|
|
141
|
+
fast(text, key) {
|
|
142
|
+
const f = this.face(key);
|
|
143
|
+
const hit = f.words.get(text);
|
|
144
|
+
if (hit !== void 0) return hit;
|
|
145
|
+
const m = f.adv, font = f.font;
|
|
146
|
+
let units = 0;
|
|
147
|
+
for (let i = 0; i < text.length; i++) {
|
|
148
|
+
let cp = text.charCodeAt(i);
|
|
149
|
+
if (cp >= 55296 && cp <= 56319) {
|
|
150
|
+
const lo = text.charCodeAt(i + 1);
|
|
151
|
+
if (lo >= 56320 && lo <= 57343) {
|
|
152
|
+
cp = (cp - 55296) * 1024 + lo - 56320 + 65536;
|
|
153
|
+
i++;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
let a = m.get(cp);
|
|
157
|
+
if (a === void 0) {
|
|
158
|
+
a = special(cp) || cp >= 32 && !font.hasGlyphForCodePoint(cp) ? -1 : font.glyphForCodePoint(cp).advanceWidth || 0;
|
|
159
|
+
m.set(cp, a);
|
|
160
|
+
}
|
|
161
|
+
if (a < 0) {
|
|
162
|
+
units = -1;
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
units += a;
|
|
166
|
+
}
|
|
167
|
+
if (text.length <= 256) {
|
|
168
|
+
if (f.words.size >= 5e4) f.words.clear();
|
|
169
|
+
f.words.set(text, units);
|
|
170
|
+
}
|
|
171
|
+
return units;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Advance width in points. @param {string} text @param {string} key @param {number} size
|
|
175
|
+
* @param {'ltr'|'rtl'} [dir] paragraph direction (default: from the first strong character)
|
|
176
|
+
*/
|
|
177
|
+
width(text, key, size, dir) {
|
|
178
|
+
const k = this.store.has(key) ? key : this.usable(key);
|
|
179
|
+
const u = this.fast(text, k);
|
|
180
|
+
if (u >= 0) return u * size / this.face(k).upm;
|
|
181
|
+
return this.layout(text, k, dir).w * size;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Where underline and strike-through go, from the font's own tables (post and OS/2), in points:
|
|
185
|
+
* y offsets of the stroke centre from the baseline (positive = down, as on the page) and thicknesses.
|
|
186
|
+
* A font without the tables falls back to proportions of its descent and x-height.
|
|
187
|
+
* @param {string} key @param {number} size
|
|
188
|
+
*/
|
|
189
|
+
decoration(key, size) {
|
|
190
|
+
const f = this.store.get(this.usable(key));
|
|
191
|
+
const u = f.unitsPerEm, os2 = f["OS/2"] || {};
|
|
192
|
+
const ut = f.underlineThickness > 0 ? f.underlineThickness : u / 14;
|
|
193
|
+
const up = f.underlinePosition < 0 ? f.underlinePosition : f.descent / 2;
|
|
194
|
+
const st = os2.yStrikeoutSize > 0 ? os2.yStrikeoutSize : ut;
|
|
195
|
+
const sp = os2.yStrikeoutPosition > 0 ? os2.yStrikeoutPosition : (f.xHeight > 0 ? f.xHeight : f.ascent * 0.5) / 2 + st / 2;
|
|
196
|
+
const k = size / u;
|
|
197
|
+
return { underlineY: -(up - ut / 2) * k, underlineWidth: ut * k, strikeY: -(sp - st / 2) * k, strikeWidth: st * k };
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Superscript and subscript from the font's OS/2 table, in em: the size of the small text and how far its
|
|
201
|
+
* baseline moves (rise up for superscript, drop down for subscript). Fonts without the values get the
|
|
202
|
+
* proportions most fonts use.
|
|
203
|
+
* @param {string} key
|
|
204
|
+
*/
|
|
205
|
+
script(key) {
|
|
206
|
+
const f = this.store.get(this.usable(key));
|
|
207
|
+
const u = f.unitsPerEm, o = f["OS/2"] || {};
|
|
208
|
+
const frac = (v, d) => v > 0 && v < u * 2 ? v / u : d;
|
|
209
|
+
return { supScale: frac(o.ySuperscriptYSize, 0.65), supRise: frac(o.ySuperscriptYOffset, 0.35), subScale: frac(o.ySubscriptYSize, 0.65), subDrop: frac(o.ySubscriptYOffset, 0.15) };
|
|
210
|
+
}
|
|
211
|
+
/** @param {string} key @param {number} size */
|
|
212
|
+
metrics(key, size) {
|
|
213
|
+
const f = this.face(this.usable(key));
|
|
214
|
+
let r = f.met.get(size);
|
|
215
|
+
if (!r) {
|
|
216
|
+
r = Object.freeze({ ascent: f.ascent * size / f.upm, descent: -f.descent * size / f.upm });
|
|
217
|
+
f.met.set(size, r);
|
|
218
|
+
}
|
|
219
|
+
return r;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* The visually ordered runs of one line, or null when the line is simple (draw `text` as it is).
|
|
223
|
+
* @param {string} text @param {string} key @param {number} size @param {'ltr'|'rtl'} [dir]
|
|
224
|
+
* @returns {Run[]|null}
|
|
225
|
+
*/
|
|
226
|
+
runs(text, key, size, dir) {
|
|
227
|
+
if (!dir && !MAYBE.test(text)) return null;
|
|
228
|
+
const k = this.usable(key);
|
|
229
|
+
if (this.fast(text, k) >= 0) return null;
|
|
230
|
+
return this.layout(text, k, dir).runs.map((r) => ({
|
|
231
|
+
...r,
|
|
232
|
+
x: r.x * size,
|
|
233
|
+
w: r.w * size,
|
|
234
|
+
glyphs: r.glyphs.map((v, i) => i % 4 === 1 || i % 4 === 2 ? v * size : v)
|
|
235
|
+
}));
|
|
236
|
+
}
|
|
237
|
+
/** Paragraph direction of text that needs shaping, bidi or CJK breaks, else undefined. */
|
|
238
|
+
direction(text, key) {
|
|
239
|
+
if (!MAYBE.test(text)) return void 0;
|
|
240
|
+
const k = this.usable(key);
|
|
241
|
+
if (this.fast(text, k) >= 0) return void 0;
|
|
242
|
+
return this.layout(text, k, void 0).rtl ? "rtl" : "ltr";
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Greedy line breaking. Simple paragraphs break at spaces (a word longer than the line breaks by
|
|
246
|
+
* character), exactly as before. Others also break between CJK characters (kinsoku applied), never
|
|
247
|
+
* inside a grapheme cluster (a conjunct, a letter and its marks), and remember their direction.
|
|
248
|
+
* @param {string} text @param {string} key @param {number} size @param {number} maxWidth
|
|
249
|
+
* @returns {{text: string, width: number, dir?: 'ltr'|'rtl'}[]}
|
|
250
|
+
*/
|
|
251
|
+
wrap(text, key, size, maxWidth) {
|
|
252
|
+
const out = [];
|
|
253
|
+
const k = this.usable(key);
|
|
254
|
+
const sp = this.width(" ", k, size);
|
|
255
|
+
const str = String(text);
|
|
256
|
+
for (const para of str.includes("\n") ? str.split(/\r?\n/) : [str]) {
|
|
257
|
+
const dir = this.direction(para, k);
|
|
258
|
+
if (dir) {
|
|
259
|
+
this.wrapComplex(para, k, size, maxWidth, dir, sp, out);
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
if (!para.includes(" ")) {
|
|
263
|
+
const ww = this.width(para, k, size);
|
|
264
|
+
if (ww <= maxWidth || maxWidth <= 0) {
|
|
265
|
+
out.push({ text: para, width: ww, end: true });
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
const words = para.split(/ +/);
|
|
270
|
+
let line = "", lw = 0;
|
|
271
|
+
const push = () => {
|
|
272
|
+
out.push({ text: line, width: lw });
|
|
273
|
+
line = "";
|
|
274
|
+
lw = 0;
|
|
275
|
+
};
|
|
276
|
+
for (let wi = 0; wi < words.length; wi++) {
|
|
277
|
+
const w = words[wi];
|
|
278
|
+
if (w === "" && wi > 0) continue;
|
|
279
|
+
const ww = this.width(w, k, size);
|
|
280
|
+
if (line === "") {
|
|
281
|
+
if (ww <= maxWidth || maxWidth <= 0) {
|
|
282
|
+
line = w;
|
|
283
|
+
lw = ww;
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
} else if (lw + sp + ww <= maxWidth) {
|
|
287
|
+
line += " " + w;
|
|
288
|
+
lw += sp + ww;
|
|
289
|
+
continue;
|
|
290
|
+
} else {
|
|
291
|
+
push();
|
|
292
|
+
if (ww <= maxWidth) {
|
|
293
|
+
line = w;
|
|
294
|
+
lw = ww;
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
let after = -1;
|
|
299
|
+
for (const ch of w) {
|
|
300
|
+
const cw = this.width(ch, k, size);
|
|
301
|
+
if (lw + cw > maxWidth && line !== "") {
|
|
302
|
+
if (after > 0 && after < line.length) {
|
|
303
|
+
const rest = line.slice(after);
|
|
304
|
+
line = line.slice(0, after);
|
|
305
|
+
lw = this.width(line, k, size);
|
|
306
|
+
push();
|
|
307
|
+
line = rest;
|
|
308
|
+
lw = this.width(rest, k, size);
|
|
309
|
+
} else push();
|
|
310
|
+
after = -1;
|
|
311
|
+
}
|
|
312
|
+
line += ch;
|
|
313
|
+
lw += cw;
|
|
314
|
+
if ((ch === "/" || ch === "-") && line.length > 1) after = line.length;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
push();
|
|
318
|
+
out[out.length - 1].end = true;
|
|
319
|
+
}
|
|
320
|
+
return out;
|
|
321
|
+
}
|
|
322
|
+
/** @param {string} para @param {string} key @param {number} size @param {number} maxWidth @param {'ltr'|'rtl'} dir @param {number} sp @param {any[]} out */
|
|
323
|
+
wrapComplex(para, key, size, maxWidth, dir, sp, out) {
|
|
324
|
+
const tokens = [];
|
|
325
|
+
const sa = SA.test(para) ? saBreaks(para) : null;
|
|
326
|
+
let cur = "", space = false, prev = "", at = 0;
|
|
327
|
+
for (const ch of para) {
|
|
328
|
+
const i = at;
|
|
329
|
+
at += ch.length;
|
|
330
|
+
if (ch === " ") {
|
|
331
|
+
if (cur) {
|
|
332
|
+
tokens.push({ text: cur, space });
|
|
333
|
+
cur = "";
|
|
334
|
+
}
|
|
335
|
+
space = tokens.length > 0;
|
|
336
|
+
prev = "";
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
const cp = (
|
|
340
|
+
/** @type {number} */
|
|
341
|
+
ch.codePointAt(0)
|
|
342
|
+
);
|
|
343
|
+
const pcp = prev ? (
|
|
344
|
+
/** @type {number} */
|
|
345
|
+
prev.codePointAt(0)
|
|
346
|
+
) : 0;
|
|
347
|
+
if (cur && (sa?.has(i) || (cjk(cp) || cjk(pcp)) && !NO_START.has(ch) && !NO_END.has(prev) && !STICKY.test(ch))) {
|
|
348
|
+
tokens.push({ text: cur, space });
|
|
349
|
+
cur = "";
|
|
350
|
+
space = false;
|
|
351
|
+
}
|
|
352
|
+
cur += ch;
|
|
353
|
+
prev = ch;
|
|
354
|
+
}
|
|
355
|
+
if (cur) tokens.push({ text: cur, space });
|
|
356
|
+
let line = "", lw = 0;
|
|
357
|
+
const push = () => {
|
|
358
|
+
out.push({ text: line, width: this.width(line, key, size, dir), dir });
|
|
359
|
+
line = "";
|
|
360
|
+
lw = 0;
|
|
361
|
+
};
|
|
362
|
+
for (const t of tokens) {
|
|
363
|
+
const tw = this.width(t.text, key, size, dir);
|
|
364
|
+
const gap = line && t.space ? sp : 0;
|
|
365
|
+
if (line === "" ? tw <= maxWidth || maxWidth <= 0 : lw + gap + tw <= maxWidth) {
|
|
366
|
+
line += (line && t.space ? " " : "") + t.text;
|
|
367
|
+
lw += gap + tw;
|
|
368
|
+
continue;
|
|
369
|
+
}
|
|
370
|
+
if (line) push();
|
|
371
|
+
if (tw <= maxWidth) {
|
|
372
|
+
line = t.text;
|
|
373
|
+
lw = tw;
|
|
374
|
+
continue;
|
|
375
|
+
}
|
|
376
|
+
for (const g of graphemes(t.text)) {
|
|
377
|
+
const gw = this.width(g, key, size, dir);
|
|
378
|
+
if (lw + gw > maxWidth && line !== "") push();
|
|
379
|
+
line += g;
|
|
380
|
+
lw += gw;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
push();
|
|
384
|
+
}
|
|
385
|
+
/** Cut a line so it fits, then add "…". */
|
|
386
|
+
ellipsize(text, key, size, maxWidth, dir) {
|
|
387
|
+
const ell = "…";
|
|
388
|
+
if (this.width(text, key, size, dir) <= maxWidth) return text;
|
|
389
|
+
const ew = this.width(ell, key, size);
|
|
390
|
+
if (this.direction(text, key)) {
|
|
391
|
+
const gs = graphemes(text);
|
|
392
|
+
while (gs.length && this.width(gs.join(""), key, size, dir) + ew > maxWidth) gs.pop();
|
|
393
|
+
return gs.join("").trimEnd() + ell;
|
|
394
|
+
}
|
|
395
|
+
let s = text;
|
|
396
|
+
while (s.length && this.width(s, key, size) + ew > maxWidth) s = s.slice(0, -1);
|
|
397
|
+
return s.trimEnd() + ell;
|
|
398
|
+
}
|
|
399
|
+
/** Does this font have a glyph for the character? */
|
|
400
|
+
has(key, cp) {
|
|
401
|
+
let m = this.cover.get(key);
|
|
402
|
+
if (!m) {
|
|
403
|
+
m = /* @__PURE__ */ new Map();
|
|
404
|
+
this.cover.set(key, m);
|
|
405
|
+
}
|
|
406
|
+
let h = m.get(cp);
|
|
407
|
+
if (h === void 0) {
|
|
408
|
+
h = !!this.store.get(key).hasGlyphForCodePoint(cp);
|
|
409
|
+
m.set(cp, h);
|
|
410
|
+
}
|
|
411
|
+
return h;
|
|
412
|
+
}
|
|
413
|
+
/** The font for one character: the chosen one, else the bundled fallback for its script, else the one before. */
|
|
414
|
+
pick(cp, key, prev) {
|
|
415
|
+
if (cp < 32 || this.has(key, cp) || FORMAT_CHAR.test(String.fromCodePoint(cp))) return key;
|
|
416
|
+
const fb = fallbackKey(cp, key);
|
|
417
|
+
if (fb && !this.store.failed.has(fb)) {
|
|
418
|
+
if (!this.store.has(fb)) {
|
|
419
|
+
this.missing.add(fb);
|
|
420
|
+
return key;
|
|
421
|
+
}
|
|
422
|
+
if (this.has(fb, cp)) return fb;
|
|
423
|
+
}
|
|
424
|
+
if (prev && prev !== key && this.has(prev, cp)) return prev;
|
|
425
|
+
if (!this.missing.size) this.noGlyph.add(String.fromCodePoint(cp));
|
|
426
|
+
return key;
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Bidi levels, a font per character, runs (one font, level, script, and space or not), shaping,
|
|
430
|
+
* then visual order. Cached at size 1.
|
|
431
|
+
* @param {string} text @param {string} key a loaded key @param {'ltr'|'rtl'|undefined} dir
|
|
432
|
+
* @returns {{ w: number, rtl: boolean, runs: Run[] }}
|
|
433
|
+
*/
|
|
434
|
+
layout(text, key, dir) {
|
|
435
|
+
const ck = `${key}${dir || ""}${text}`;
|
|
436
|
+
const hit = this.cache.get(ck);
|
|
437
|
+
if (hit) return hit;
|
|
438
|
+
let levels = null, rtl = dir === "rtl";
|
|
439
|
+
if (dir === "rtl" || RTL_OR_CONTROLS.test(text)) {
|
|
440
|
+
const e = bidi.getEmbeddingLevels(text, dir);
|
|
441
|
+
levels = e.levels;
|
|
442
|
+
rtl = ((e.paragraphs[0]?.level ?? 0) & 1) === 1;
|
|
443
|
+
}
|
|
444
|
+
const segs = [];
|
|
445
|
+
let cur = null, prevFont = "";
|
|
446
|
+
for (let i = 0; i < text.length; ) {
|
|
447
|
+
const cp = (
|
|
448
|
+
/** @type {number} */
|
|
449
|
+
text.codePointAt(i)
|
|
450
|
+
);
|
|
451
|
+
const n = cp > 65535 ? 2 : 1;
|
|
452
|
+
const ch = text.slice(i, i + n);
|
|
453
|
+
const font = STICKY.test(ch) && prevFont ? prevFont : this.pick(cp, key, prevFont);
|
|
454
|
+
const level = levels ? levels[i] : 0;
|
|
455
|
+
const ws = SPACE.test(ch);
|
|
456
|
+
const script = scriptOf(cp);
|
|
457
|
+
if (!cur || font !== cur.font || level !== cur.level || ws !== cur.ws || script !== "Common" && cur.script !== "Common" && script !== cur.script) {
|
|
458
|
+
cur = { start: i, end: i + n, font, level, script, ws };
|
|
459
|
+
segs.push(cur);
|
|
460
|
+
} else {
|
|
461
|
+
cur.end = i + n;
|
|
462
|
+
if (cur.script === "Common") cur.script = script;
|
|
463
|
+
}
|
|
464
|
+
prevFont = font;
|
|
465
|
+
i += n;
|
|
466
|
+
}
|
|
467
|
+
const runs = segs.map((s) => this.shapeRun(text.slice(s.start, s.end), s.font, (s.level & 1) === 1, s.script));
|
|
468
|
+
const order = runs.map((r, i) => ({ r, level: segs[i].level }));
|
|
469
|
+
let max = 0, minOdd = Infinity;
|
|
470
|
+
for (const o of order) {
|
|
471
|
+
max = Math.max(max, o.level);
|
|
472
|
+
if (o.level & 1) minOdd = Math.min(minOdd, o.level);
|
|
473
|
+
}
|
|
474
|
+
for (let l = max; l >= minOdd; l--) {
|
|
475
|
+
for (let i = 0; i < order.length; ) {
|
|
476
|
+
if (order[i].level < l) {
|
|
477
|
+
i++;
|
|
478
|
+
continue;
|
|
479
|
+
}
|
|
480
|
+
let j = i;
|
|
481
|
+
while (j < order.length && order[j].level >= l) j++;
|
|
482
|
+
const rev = order.slice(i, j).reverse();
|
|
483
|
+
order.splice(i, j - i, ...rev);
|
|
484
|
+
i = j;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
let x = 0;
|
|
488
|
+
for (const o of order) {
|
|
489
|
+
o.r.x = x;
|
|
490
|
+
x += o.r.w;
|
|
491
|
+
}
|
|
492
|
+
const out = { w: x, rtl, runs: order.map((o) => o.r) };
|
|
493
|
+
if (this.cache.size > 2e4) this.cache.clear();
|
|
494
|
+
this.cache.set(ck, out);
|
|
495
|
+
return out;
|
|
496
|
+
}
|
|
497
|
+
/** One run at size 1: HarfBuzz for complex scripts and right-to-left text, else character-map glyphs. @returns {Run} */
|
|
498
|
+
shapeRun(text, key, rtl, script) {
|
|
499
|
+
const complex = !SIMPLE.has(script);
|
|
500
|
+
const store = this.store;
|
|
501
|
+
const glyphs = [];
|
|
502
|
+
let pen = 0;
|
|
503
|
+
if ((complex || rtl) && store.shaper) {
|
|
504
|
+
const hf = store.hbFont(key);
|
|
505
|
+
const g = store.shaper.shape(hf, text, rtl, !complex);
|
|
506
|
+
for (let i = 0; i < g.length; i += 5) {
|
|
507
|
+
glyphs.push(g[i], (pen + g[i + 2]) / hf.upem, g[i + 3] / hf.upem, g[i + 4]);
|
|
508
|
+
pen += g[i + 1];
|
|
509
|
+
}
|
|
510
|
+
return { font: key, x: 0, w: pen / hf.upem, text, ...rtl ? { rtl } : {}, ...complex ? { shaped: true } : {}, glyphs };
|
|
511
|
+
}
|
|
512
|
+
if ((complex || rtl) && !store.failed.has(SHAPER)) this.missing.add(SHAPER);
|
|
513
|
+
else if (complex || rtl) this.unshaped = true;
|
|
514
|
+
const f = store.get(key);
|
|
515
|
+
const list = [];
|
|
516
|
+
for (let i = 0; i < text.length; ) {
|
|
517
|
+
const cp = (
|
|
518
|
+
/** @type {number} */
|
|
519
|
+
text.codePointAt(i)
|
|
520
|
+
);
|
|
521
|
+
const g = f.glyphForCodePoint(cp);
|
|
522
|
+
list.push([g.id, g.advanceWidth || 0, i]);
|
|
523
|
+
i += cp > 65535 ? 2 : 1;
|
|
524
|
+
}
|
|
525
|
+
if (rtl) list.reverse();
|
|
526
|
+
for (const [id, a, c] of list) {
|
|
527
|
+
glyphs.push(id, pen / f.unitsPerEm, 0, c);
|
|
528
|
+
pen += a;
|
|
529
|
+
}
|
|
530
|
+
return { font: key, x: 0, w: pen / f.unitsPerEm, text, ...rtl ? { rtl } : {}, glyphs };
|
|
531
|
+
}
|
|
532
|
+
};
|
|
533
|
+
function finishText(items, m) {
|
|
534
|
+
for (const it of items) {
|
|
535
|
+
if (it.t === "field") {
|
|
536
|
+
finishText(it.draw, m);
|
|
537
|
+
continue;
|
|
538
|
+
}
|
|
539
|
+
if (it.t !== "text") continue;
|
|
540
|
+
it.font = m.usable(it.font);
|
|
541
|
+
for (const l of it.lines) {
|
|
542
|
+
const r = m.runs(l.text, it.font, it.size, l.dir);
|
|
543
|
+
if (r) l.runs = r;
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
export {
|
|
549
|
+
FORMAT_CHAR,
|
|
550
|
+
TextMeasurer,
|
|
551
|
+
finishText
|
|
552
|
+
};
|
|
553
|
+
//# sourceMappingURL=chunk-ULKEEARQ.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/engine/text/measure.js"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|