@reportwright/viewer 0.12.1 → 0.13.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 +93 -0
- package/README.md +18 -1
- package/THIRD-PARTY-NOTICES.md +52 -0
- package/dist/{chunk-DXHLIJEY.js → chunk-47ZAKRVN.js} +6 -6
- package/dist/{chunk-NR2G4TMG.js → chunk-B5ZCT3UK.js} +47 -26
- package/dist/chunk-B5ZCT3UK.js.map +6 -0
- package/dist/chunk-BR5K6SBL.js +324 -0
- package/dist/chunk-BR5K6SBL.js.map +6 -0
- package/dist/chunk-CCH7CFU5.js +5026 -0
- package/dist/chunk-CCH7CFU5.js.map +6 -0
- package/dist/{peer/chunk-BQFI3DHK.js → chunk-ES2LYZ6S.js} +292 -25
- package/dist/chunk-ES2LYZ6S.js.map +6 -0
- package/dist/{chunk-S2IUUI6N.js → chunk-GOCWG6FG.js} +67 -49
- package/dist/chunk-GOCWG6FG.js.map +6 -0
- package/dist/{chunk-3D2KFKG2.js → chunk-GRYITZPG.js} +11 -9
- package/dist/chunk-GRYITZPG.js.map +6 -0
- package/dist/{chunk-2BPBQMH2.js → chunk-H422SRD3.js} +8 -8
- package/dist/chunk-JD6EJ3LI.js +18 -0
- package/dist/{chunk-Z7MKH66Z.js → chunk-MS2LQC2O.js} +236 -12
- package/dist/chunk-MS2LQC2O.js.map +6 -0
- package/dist/{chunk-Q6MMPKQA.js → chunk-PF4RFKX2.js} +13 -12
- package/dist/chunk-PF4RFKX2.js.map +6 -0
- package/dist/{chunk-PGP3QA6L.js → chunk-PKXTMC4J.js} +1351 -75
- package/dist/chunk-PKXTMC4J.js.map +6 -0
- package/dist/{chunk-M6AYND5G.js → chunk-U2ZY2NPQ.js} +16 -7
- package/dist/chunk-U2ZY2NPQ.js.map +6 -0
- package/dist/{chunk-DPVJEFKP.js → chunk-WOBRKNIA.js} +13 -13
- package/dist/{chunk-DPVJEFKP.js.map → chunk-WOBRKNIA.js.map} +1 -1
- package/dist/chunk-XXTAPZO4.js +34 -0
- package/dist/{chunk-VNOWPSE6.js → chunk-ZGRJJ6OW.js} +1226 -887
- package/dist/chunk-ZGRJJ6OW.js.map +6 -0
- package/dist/designer.d.ts +11 -3
- package/dist/designer.js +598 -390
- package/dist/designer.js.map +3 -3
- package/dist/engine.worker.bwip.js +51422 -0
- package/dist/engine.worker.bwip.js.map +6 -0
- package/dist/engine.worker.js +59582 -26
- package/dist/engine.worker.js.map +3 -3
- package/dist/peer/{chunk-WSNRD2AQ.js → chunk-3EYYRJR4.js} +13 -12
- package/dist/{chunk-Q6MMPKQA.js.map → peer/chunk-3EYYRJR4.js.map} +1 -1
- package/dist/peer/{chunk-TSC4RAH3.js → chunk-3XZY54LM.js} +1351 -75
- package/dist/peer/chunk-3XZY54LM.js.map +6 -0
- package/dist/peer/chunk-5RUNOIS7.js +33 -0
- package/dist/peer/chunk-5RUNOIS7.js.map +6 -0
- package/dist/peer/{chunk-6I2EAAVN.js → chunk-7IP67PA6.js} +47 -26
- package/dist/peer/chunk-7IP67PA6.js.map +6 -0
- package/dist/peer/{chunk-R4VX5UC7.js → chunk-A6UXBSTP.js} +8 -8
- package/dist/peer/{chunk-V42KN7HD.js → chunk-CFTFTV2O.js} +6 -6
- package/dist/peer/chunk-JQTRDHQP.js +866 -0
- package/dist/peer/chunk-JQTRDHQP.js.map +6 -0
- package/dist/peer/chunk-KD6CDYGE.js +5024 -0
- package/dist/peer/chunk-KD6CDYGE.js.map +6 -0
- package/dist/peer/chunk-MXR6JBMP.js +546 -0
- package/dist/peer/chunk-MXR6JBMP.js.map +6 -0
- package/dist/peer/chunk-N42DCZZA.js +378 -0
- package/dist/peer/chunk-N42DCZZA.js.map +6 -0
- package/dist/{chunk-6TPZ7G74.js → peer/chunk-RKFP7SDY.js} +292 -25
- package/dist/peer/chunk-RKFP7SDY.js.map +6 -0
- package/dist/peer/{chunk-BMAXIBP2.js → chunk-WABYQWMT.js} +13 -13
- package/dist/peer/{chunk-BMAXIBP2.js.map → chunk-WABYQWMT.js.map} +1 -1
- package/dist/peer/chunk-WVQQCD4M.js +14211 -0
- package/dist/peer/chunk-WVQQCD4M.js.map +6 -0
- package/dist/peer/chunk-XHCRHVRK.js +17 -0
- package/dist/peer/chunk-XHCRHVRK.js.map +6 -0
- package/dist/peer/{chunk-WQGENQZO.js → chunk-ZS3J4WBH.js} +11 -9
- package/dist/peer/chunk-ZS3J4WBH.js.map +6 -0
- package/dist/peer/designer.js +455 -247
- package/dist/peer/designer.js.map +3 -3
- package/dist/peer/engine.worker.bwip.js +51422 -0
- package/dist/peer/engine.worker.bwip.js.map +6 -0
- package/dist/peer/engine.worker.js +59582 -25
- package/dist/peer/engine.worker.js.map +3 -3
- package/dist/peer/viewer.js +16 -12
- package/dist/peer/viewer.js.map +1 -1
- package/dist/viewer.d.ts +2 -1
- package/dist/viewer.js +16 -12
- package/dist/viewer.js.map +1 -1
- package/package.json +3 -2
- package/dist/chunk-3D2KFKG2.js.map +0 -6
- package/dist/chunk-6TPZ7G74.js.map +0 -6
- package/dist/chunk-BRB34AJ2.js +0 -16
- package/dist/chunk-M6AYND5G.js.map +0 -6
- package/dist/chunk-NR2G4TMG.js.map +0 -6
- package/dist/chunk-PGP3QA6L.js.map +0 -6
- package/dist/chunk-S2IUUI6N.js.map +0 -6
- package/dist/chunk-ULKEEARQ.js +0 -553
- package/dist/chunk-ULKEEARQ.js.map +0 -6
- package/dist/chunk-VNOWPSE6.js.map +0 -6
- package/dist/chunk-Z7MKH66Z.js.map +0 -6
- package/dist/peer/chunk-2FZTYEDE.js +0 -15
- package/dist/peer/chunk-6I2EAAVN.js.map +0 -6
- package/dist/peer/chunk-BQFI3DHK.js.map +0 -6
- package/dist/peer/chunk-TSC4RAH3.js.map +0 -6
- package/dist/peer/chunk-WQGENQZO.js.map +0 -6
- package/dist/peer/chunk-WSNRD2AQ.js.map +0 -6
- /package/dist/{chunk-DXHLIJEY.js.map → chunk-47ZAKRVN.js.map} +0 -0
- /package/dist/{chunk-2BPBQMH2.js.map → chunk-H422SRD3.js.map} +0 -0
- /package/dist/{chunk-BRB34AJ2.js.map → chunk-JD6EJ3LI.js.map} +0 -0
- /package/dist/{peer/chunk-2FZTYEDE.js.map → chunk-XXTAPZO4.js.map} +0 -0
- /package/dist/peer/{chunk-R4VX5UC7.js.map → chunk-A6UXBSTP.js.map} +0 -0
- /package/dist/peer/{chunk-V42KN7HD.js.map → chunk-CFTFTV2O.js.map} +0 -0
package/dist/chunk-ULKEEARQ.js
DELETED
|
@@ -1,553 +0,0 @@
|
|
|
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
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/engine/text/measure.js"],
|
|
4
|
-
"mappings": "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",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|