@flighthq/textlayout 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/index.d.ts +13 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +13 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/richTextContent.d.ts +6 -0
  6. package/dist/richTextContent.d.ts.map +1 -0
  7. package/dist/richTextContent.js +435 -0
  8. package/dist/richTextContent.js.map +1 -0
  9. package/dist/richTextMetrics.d.ts +9 -0
  10. package/dist/richTextMetrics.d.ts.map +1 -0
  11. package/dist/richTextMetrics.js +44 -0
  12. package/dist/richTextMetrics.js.map +1 -0
  13. package/dist/richTextQuery.d.ts +14 -0
  14. package/dist/richTextQuery.d.ts.map +1 -0
  15. package/dist/richTextQuery.js +205 -0
  16. package/dist/richTextQuery.js.map +1 -0
  17. package/dist/textBounds.d.ts +13 -0
  18. package/dist/textBounds.d.ts.map +1 -0
  19. package/dist/textBounds.js +42 -0
  20. package/dist/textBounds.js.map +1 -0
  21. package/dist/textFormat.d.ts +7 -0
  22. package/dist/textFormat.d.ts.map +1 -0
  23. package/dist/textFormat.js +24 -0
  24. package/dist/textFormat.js.map +1 -0
  25. package/dist/textFormatRange.d.ts +3 -0
  26. package/dist/textFormatRange.d.ts.map +1 -0
  27. package/dist/textFormatRange.js +4 -0
  28. package/dist/textFormatRange.js.map +1 -0
  29. package/dist/textLayout.d.ts +8 -0
  30. package/dist/textLayout.d.ts.map +1 -0
  31. package/dist/textLayout.js +632 -0
  32. package/dist/textLayout.js.map +1 -0
  33. package/dist/textLayoutGroup.d.ts +3 -0
  34. package/dist/textLayoutGroup.d.ts.map +1 -0
  35. package/dist/textLayoutGroup.js +17 -0
  36. package/dist/textLayoutGroup.js.map +1 -0
  37. package/dist/textLayoutMeasure.d.ts +4 -0
  38. package/dist/textLayoutMeasure.d.ts.map +1 -0
  39. package/dist/textLayoutMeasure.js +23 -0
  40. package/dist/textLayoutMeasure.js.map +1 -0
  41. package/dist/textLayoutRuntime.d.ts +4 -0
  42. package/dist/textLayoutRuntime.d.ts.map +1 -0
  43. package/dist/textLayoutRuntime.js +11 -0
  44. package/dist/textLayoutRuntime.js.map +1 -0
  45. package/dist/textLineBreaks.d.ts +8 -0
  46. package/dist/textLineBreaks.d.ts.map +1 -0
  47. package/dist/textLineBreaks.js +36 -0
  48. package/dist/textLineBreaks.js.map +1 -0
  49. package/dist/textMetrics.d.ts +4 -0
  50. package/dist/textMetrics.d.ts.map +1 -0
  51. package/dist/textMetrics.js +12 -0
  52. package/dist/textMetrics.js.map +1 -0
  53. package/package.json +38 -0
  54. package/src/richTextContent.test.ts +201 -0
  55. package/src/richTextMetrics.test.ts +124 -0
  56. package/src/richTextQuery.test.ts +196 -0
  57. package/src/textBounds.test.ts +110 -0
  58. package/src/textFormat.test.ts +66 -0
  59. package/src/textFormatRange.test.ts +9 -0
  60. package/src/textLayout.test.ts +661 -0
  61. package/src/textLayoutGroup.test.ts +30 -0
  62. package/src/textLayoutMeasure.test.ts +36 -0
  63. package/src/textLayoutRuntime.test.ts +30 -0
  64. package/src/textLineBreaks.test.ts +73 -0
  65. package/src/textMetrics.test.ts +19 -0
@@ -0,0 +1,13 @@
1
+ export { clearRichTextContent, computeRichTextContent, createRichTextContent, getRichTextContent, } from './richTextContent';
2
+ export { computeRichTextBottomScrollV, computeRichTextLineCount, computeRichTextMaxScrollH, computeRichTextMaxScrollV, computeRichTextTextHeight, computeRichTextTextWidth, getRichTextScrollYOffset, } from './richTextMetrics';
3
+ export { computeRichTextCharIndexAtPoint, computeRichTextLineMetrics, getRichTextCharBoundaries, getRichTextFirstCharInParagraph, getRichTextLineIndexAtPoint, getRichTextLineIndexOfChar, getRichTextLineLength, getRichTextLineOffset, getRichTextLineText, getRichTextLinkAtPoint, getRichTextParagraphLength, getRichTextSelectionRectangles, } from './richTextQuery';
4
+ export { computeTextBoundsHeight, computeTextBoundsOffsetX, computeTextBoundsRectangle, computeTextBoundsWidth, TEXT_BOUNDS_GUTTER, } from './textBounds';
5
+ export { getTextFormatAscent, getTextFormatDescent, getTextFormatHeight, getTextFormatLeading, mergeTextFormat, } from './textFormat';
6
+ export { createTextFormatRange } from './textFormatRange';
7
+ export { computeTextLayout, createTextLayoutResult, getTextLayoutIsTruncated, TEXT_LAYOUT_GUTTER } from './textLayout';
8
+ export { createTextLayoutGroup } from './textLayoutGroup';
9
+ export { getTextLayoutMeasureProvider, setTextLayoutMeasureProvider } from './textLayoutMeasure';
10
+ export { clearTextLayoutResult, getTextLayoutResult } from './textLayoutRuntime';
11
+ export { getTextLineBreakIndex, getTextLineBreaks } from './textLineBreaks';
12
+ export { createTextMetrics, getTextMetrics } from './textMetrics';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,+BAA+B,EAC/B,0BAA0B,EAC1B,yBAAyB,EACzB,+BAA+B,EAC/B,2BAA2B,EAC3B,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,EAC1B,8BAA8B,GAC/B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,EAC1B,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvH,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,4BAA4B,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACjG,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ export { clearRichTextContent, computeRichTextContent, createRichTextContent, getRichTextContent, } from './richTextContent';
2
+ export { computeRichTextBottomScrollV, computeRichTextLineCount, computeRichTextMaxScrollH, computeRichTextMaxScrollV, computeRichTextTextHeight, computeRichTextTextWidth, getRichTextScrollYOffset, } from './richTextMetrics';
3
+ export { computeRichTextCharIndexAtPoint, computeRichTextLineMetrics, getRichTextCharBoundaries, getRichTextFirstCharInParagraph, getRichTextLineIndexAtPoint, getRichTextLineIndexOfChar, getRichTextLineLength, getRichTextLineOffset, getRichTextLineText, getRichTextLinkAtPoint, getRichTextParagraphLength, getRichTextSelectionRectangles, } from './richTextQuery';
4
+ export { computeTextBoundsHeight, computeTextBoundsOffsetX, computeTextBoundsRectangle, computeTextBoundsWidth, TEXT_BOUNDS_GUTTER, } from './textBounds';
5
+ export { getTextFormatAscent, getTextFormatDescent, getTextFormatHeight, getTextFormatLeading, mergeTextFormat, } from './textFormat';
6
+ export { createTextFormatRange } from './textFormatRange';
7
+ export { computeTextLayout, createTextLayoutResult, getTextLayoutIsTruncated, TEXT_LAYOUT_GUTTER } from './textLayout';
8
+ export { createTextLayoutGroup } from './textLayoutGroup';
9
+ export { getTextLayoutMeasureProvider, setTextLayoutMeasureProvider } from './textLayoutMeasure';
10
+ export { clearTextLayoutResult, getTextLayoutResult } from './textLayoutRuntime';
11
+ export { getTextLineBreakIndex, getTextLineBreaks } from './textLineBreaks';
12
+ export { createTextMetrics, getTextMetrics } from './textMetrics';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,+BAA+B,EAC/B,0BAA0B,EAC1B,yBAAyB,EACzB,+BAA+B,EAC/B,2BAA2B,EAC3B,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,EAC1B,8BAA8B,GAC/B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,EAC1B,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvH,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,4BAA4B,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACjG,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { RichTextContent, RichTextData, RichTextRuntime } from '@flighthq/types';
2
+ export declare function clearRichTextContent(runtime: RichTextRuntime): void;
3
+ export declare function computeRichTextContent(out: RichTextContent, data: Readonly<RichTextData>, passwordCharacter?: string | null): void;
4
+ export declare function createRichTextContent(): RichTextContent;
5
+ export declare function getRichTextContent(runtime: RichTextRuntime): RichTextContent;
6
+ //# sourceMappingURL=richTextContent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"richTextContent.d.ts","sourceRoot":"","sources":["../src/richTextContent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAA+B,MAAM,iBAAiB,CAAC;AAInH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAEnE;AAMD,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,iBAAiB,GAAE,MAAM,GAAG,IAAW,GACtC,IAAI,CAgBN;AAED,wBAAgB,qBAAqB,IAAI,eAAe,CAEvD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,eAAe,CAK5E"}
@@ -0,0 +1,435 @@
1
+ import { mergeTextFormat } from './textFormat';
2
+ export function clearRichTextContent(runtime) {
3
+ runtime.richTextContent = null;
4
+ }
5
+ // `passwordCharacter` drives masking: null leaves the text visible; a string masks every character
6
+ // with it (an empty string falls back to the bullet default). The caller — buildRichTextLayoutParams —
7
+ // reads it from the RichText's editable-input slot, so password state lives on the input capability,
8
+ // not on RichTextData.
9
+ export function computeRichTextContent(out, data, passwordCharacter = null) {
10
+ out.text = '';
11
+ out.formatRanges.length = 0;
12
+ const baseFormat = createBaseFormat(data);
13
+ const source = getRenderableSource(data, passwordCharacter);
14
+ if (source.length === 0)
15
+ return;
16
+ if (data.htmlText.length === 0 || passwordCharacter !== null) {
17
+ appendText(out, source, baseFormat, data.condenseWhite, data.maxChars);
18
+ }
19
+ else {
20
+ parseHtmlText(out, source, data, baseFormat);
21
+ }
22
+ clampRanges(out.formatRanges, out.text.length);
23
+ applyTextFormatRanges(out, data.textFormatRanges);
24
+ }
25
+ export function createRichTextContent() {
26
+ return { formatRanges: [], text: '' };
27
+ }
28
+ export function getRichTextContent(runtime) {
29
+ if (runtime.richTextContent === null) {
30
+ runtime.richTextContent = createRichTextContent();
31
+ }
32
+ return runtime.richTextContent;
33
+ }
34
+ function appendLineBreak(out, maxChars) {
35
+ if (maxChars >= 0 && out.text.length >= maxChars)
36
+ return;
37
+ out.text += '\n';
38
+ }
39
+ function appendText(out, text, format, condenseWhite, maxChars) {
40
+ let value = decodeHtmlEntities(text);
41
+ if (condenseWhite) {
42
+ value = value.replace(/[ \f\n\r\t\v]+/g, ' ');
43
+ if (out.text.length === 0)
44
+ value = value.trimStart();
45
+ if (out.text.endsWith(' '))
46
+ value = value.trimStart();
47
+ }
48
+ if (value.length === 0)
49
+ return;
50
+ const remaining = maxChars < 0 ? value.length : Math.max(0, maxChars - out.text.length);
51
+ if (remaining === 0)
52
+ return;
53
+ if (value.length > remaining)
54
+ value = value.slice(0, remaining);
55
+ const start = out.text.length;
56
+ out.text += value;
57
+ writeFormatRange(out.formatRanges, format, start, out.text.length);
58
+ }
59
+ function applyAttributeFormat(format, name, value) {
60
+ switch (name) {
61
+ case 'align':
62
+ if (isTextAlign(value))
63
+ format.align = value;
64
+ break;
65
+ case 'blockindent':
66
+ format.blockIndent = parseNumber(value);
67
+ break;
68
+ case 'color':
69
+ format.color = parseColor(value);
70
+ break;
71
+ case 'face':
72
+ case 'font':
73
+ case 'fontfamily':
74
+ format.font = value;
75
+ break;
76
+ case 'indent':
77
+ format.indent = parseNumber(value);
78
+ break;
79
+ case 'leading':
80
+ format.leading = parseNumber(value);
81
+ break;
82
+ case 'leftmargin':
83
+ format.leftMargin = parseNumber(value);
84
+ break;
85
+ case 'letterspacing':
86
+ format.letterSpacing = parseNumber(value);
87
+ break;
88
+ case 'rightmargin':
89
+ format.rightMargin = parseNumber(value);
90
+ break;
91
+ case 'size':
92
+ format.size = parseNumber(value);
93
+ break;
94
+ case 'tabstops':
95
+ format.tabStops = parseTabStops(value);
96
+ break;
97
+ }
98
+ }
99
+ function applyCssFormat(format, property, value) {
100
+ switch (property) {
101
+ case 'color':
102
+ format.color = parseColor(value);
103
+ break;
104
+ case 'font-family':
105
+ format.font = stripQuotes(value);
106
+ break;
107
+ case 'font-size':
108
+ format.size = parseNumber(value);
109
+ break;
110
+ case 'font-style':
111
+ if (value === 'italic' || value === 'oblique')
112
+ format.italic = true;
113
+ break;
114
+ case 'font-weight':
115
+ if (value === 'bold' || parseNumber(value) >= 600)
116
+ format.bold = true;
117
+ break;
118
+ case 'letter-spacing':
119
+ format.letterSpacing = parseNumber(value);
120
+ break;
121
+ case 'line-height':
122
+ format.leading = parseNumber(value);
123
+ break;
124
+ case 'margin-left':
125
+ format.leftMargin = parseNumber(value);
126
+ break;
127
+ case 'margin-right':
128
+ format.rightMargin = parseNumber(value);
129
+ break;
130
+ case 'text-align':
131
+ if (isTextAlign(value))
132
+ format.align = value;
133
+ break;
134
+ case 'text-decoration':
135
+ if (value.includes('underline'))
136
+ format.underline = true;
137
+ if (value.includes('line-through'))
138
+ format.strikethrough = true;
139
+ break;
140
+ case 'text-indent':
141
+ format.indent = parseNumber(value);
142
+ break;
143
+ }
144
+ }
145
+ function applyInlineStyle(format, style) {
146
+ for (const declaration of style.split(';')) {
147
+ const separator = declaration.indexOf(':');
148
+ if (separator === -1)
149
+ continue;
150
+ const property = declaration.slice(0, separator).trim().toLowerCase();
151
+ const value = declaration
152
+ .slice(separator + 1)
153
+ .trim()
154
+ .toLowerCase();
155
+ if (property.length > 0 && value.length > 0)
156
+ applyCssFormat(format, property, value);
157
+ }
158
+ }
159
+ function applyStyleSheetFormat(format, data, tag, attrs) {
160
+ const styleSheet = data.styleSheet;
161
+ if (styleSheet === null)
162
+ return;
163
+ mergeFormatInto(format, styleSheet[tag]);
164
+ const className = attrs.class;
165
+ if (className !== undefined) {
166
+ for (const name of className.split(/\s+/)) {
167
+ if (name.length > 0) {
168
+ mergeFormatInto(format, styleSheet[`.${name}`]);
169
+ mergeFormatInto(format, styleSheet[name]);
170
+ }
171
+ }
172
+ }
173
+ const id = attrs.id;
174
+ if (id !== undefined)
175
+ mergeFormatInto(format, styleSheet[`#${id}`]);
176
+ }
177
+ function applyTagFormat(format, tag, attrs) {
178
+ switch (tag) {
179
+ case 'b':
180
+ case 'strong':
181
+ format.bold = true;
182
+ break;
183
+ case 'em':
184
+ case 'i':
185
+ format.italic = true;
186
+ break;
187
+ case 'font':
188
+ for (const name of Object.keys(attrs))
189
+ applyAttributeFormat(format, name, attrs[name]);
190
+ break;
191
+ case 'li':
192
+ format.bullet = true;
193
+ break;
194
+ case 'p':
195
+ if (attrs.align !== undefined && isTextAlign(attrs.align))
196
+ format.align = attrs.align;
197
+ break;
198
+ case 'a':
199
+ if (attrs.href !== undefined)
200
+ format.url = attrs.href;
201
+ if (attrs.target !== undefined)
202
+ format.target = attrs.target;
203
+ break;
204
+ case 'textformat':
205
+ for (const name of Object.keys(attrs))
206
+ applyAttributeFormat(format, name, attrs[name]);
207
+ break;
208
+ case 's':
209
+ case 'strike':
210
+ format.strikethrough = true;
211
+ break;
212
+ case 'u':
213
+ format.underline = true;
214
+ break;
215
+ }
216
+ if (attrs.style !== undefined)
217
+ applyInlineStyle(format, attrs.style);
218
+ }
219
+ function applyTextFormatRanges(out, overrides) {
220
+ if (overrides.length === 0 || out.text.length === 0)
221
+ return;
222
+ let ranges = out.formatRanges;
223
+ for (const override of overrides) {
224
+ const start = Math.max(0, Math.min(out.text.length, override.start));
225
+ const end = Math.max(start, Math.min(out.text.length, override.end));
226
+ if (start === end)
227
+ continue;
228
+ const next = [];
229
+ for (const range of ranges) {
230
+ if (range.end <= start || range.start >= end) {
231
+ writeFormatRange(next, range.format, range.start, range.end);
232
+ continue;
233
+ }
234
+ if (range.start < start)
235
+ writeFormatRange(next, range.format, range.start, start);
236
+ writeFormatRange(next, mergeTextFormat(range.format, override.format), Math.max(range.start, start), Math.min(range.end, end));
237
+ if (range.end > end)
238
+ writeFormatRange(next, range.format, end, range.end);
239
+ }
240
+ ranges = next;
241
+ }
242
+ out.formatRanges.length = 0;
243
+ for (const range of ranges)
244
+ writeFormatRange(out.formatRanges, range.format, range.start, range.end);
245
+ }
246
+ function clampRanges(ranges, length) {
247
+ for (let i = ranges.length - 1; i >= 0; i--) {
248
+ const range = ranges[i];
249
+ if (range.start >= length) {
250
+ ranges.splice(i, 1);
251
+ }
252
+ else if (range.end > length) {
253
+ range.end = length;
254
+ }
255
+ }
256
+ }
257
+ function createBaseFormat(data) {
258
+ const format = mergeTextFormat(data.defaultTextFormat, data.textFormat);
259
+ if (format.color === undefined)
260
+ format.color = data.textColor;
261
+ return format;
262
+ }
263
+ function decodeHtmlEntities(value) {
264
+ return value.replace(/&(#x[0-9a-f]+|#[0-9]+|[a-z]+);/gi, (_match, entity) => {
265
+ const lower = entity.toLowerCase();
266
+ if (lower.startsWith('#x'))
267
+ return String.fromCodePoint(Number.parseInt(lower.slice(2), 16));
268
+ if (lower.startsWith('#'))
269
+ return String.fromCodePoint(Number.parseInt(lower.slice(1), 10));
270
+ return namedEntities[lower] ?? `&${entity};`;
271
+ });
272
+ }
273
+ function handleHtmlTag(out, token, data, stack) {
274
+ const content = token.slice(1, -1).trim();
275
+ if (content.length === 0 || content.startsWith('!'))
276
+ return;
277
+ const closing = content.startsWith('/');
278
+ const selfClosing = content.endsWith('/');
279
+ const body = (closing ? content.slice(1) : content).replace(/\/$/, '').trim();
280
+ const separator = body.search(/\s/);
281
+ const tag = (separator === -1 ? body : body.slice(0, separator)).toLowerCase();
282
+ const attrs = parseAttributes(separator === -1 ? '' : body.slice(separator + 1));
283
+ if (closing) {
284
+ if (stack.length > 1)
285
+ stack.pop();
286
+ if (tag === 'p' && out.text.length > 0 && !out.text.endsWith('\n'))
287
+ appendLineBreak(out, data.maxChars);
288
+ return;
289
+ }
290
+ if (tag === 'br') {
291
+ appendLineBreak(out, data.maxChars);
292
+ return;
293
+ }
294
+ if ((tag === 'p' || tag === 'li') && out.text.length > 0 && !out.text.endsWith('\n')) {
295
+ appendLineBreak(out, data.maxChars);
296
+ }
297
+ const format = { ...stack[stack.length - 1] };
298
+ applyStyleSheetFormat(format, data, tag, attrs);
299
+ applyTagFormat(format, tag, attrs);
300
+ if (!selfClosing)
301
+ stack.push(format);
302
+ }
303
+ function getRenderableSource(data, passwordCharacter) {
304
+ if (passwordCharacter === null)
305
+ return data.htmlText.length > 0 ? data.htmlText : data.text;
306
+ const mask = passwordCharacter.length > 0 ? passwordCharacter.charAt(0) : '\u2022';
307
+ return mask.repeat(data.text.length);
308
+ }
309
+ function isTextAlign(value) {
310
+ return (value === 'center' ||
311
+ value === 'end' ||
312
+ value === 'justify' ||
313
+ value === 'left' ||
314
+ value === 'right' ||
315
+ value === 'start');
316
+ }
317
+ function mergeFormatInto(format, style) {
318
+ if (style === undefined)
319
+ return;
320
+ const merged = mergeTextFormat(format, style);
321
+ for (const key of Object.keys(merged)) {
322
+ format[key] = merged[key];
323
+ }
324
+ }
325
+ function parseAttributes(source) {
326
+ const attrs = {};
327
+ const pattern = /([^\s=]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'>]+)))?/g;
328
+ let match;
329
+ while ((match = pattern.exec(source)) !== null) {
330
+ const name = match[1].toLowerCase();
331
+ attrs[name] = match[2] ?? match[3] ?? match[4] ?? '';
332
+ }
333
+ return attrs;
334
+ }
335
+ function parseColor(value) {
336
+ const color = value.trim().toLowerCase();
337
+ if (color.startsWith('#')) {
338
+ if (color.length === 4) {
339
+ const r = color.charAt(1);
340
+ const g = color.charAt(2);
341
+ const b = color.charAt(3);
342
+ return Number.parseInt(`${r}${r}${g}${g}${b}${b}`, 16);
343
+ }
344
+ return Number.parseInt(color.slice(1), 16);
345
+ }
346
+ if (color.startsWith('0x'))
347
+ return Number.parseInt(color.slice(2), 16);
348
+ return namedColors[color] ?? 0;
349
+ }
350
+ function parseHtmlText(out, source, data, baseFormat) {
351
+ const stack = [baseFormat];
352
+ const pattern = /<[^>]*>/g;
353
+ let index = 0;
354
+ let match;
355
+ while ((match = pattern.exec(source)) !== null) {
356
+ appendText(out, source.slice(index, match.index), stack[stack.length - 1], data.condenseWhite, data.maxChars);
357
+ handleHtmlTag(out, match[0], data, stack);
358
+ index = match.index + match[0].length;
359
+ }
360
+ appendText(out, source.slice(index), stack[stack.length - 1], data.condenseWhite, data.maxChars);
361
+ }
362
+ function parseNumber(value) {
363
+ const parsed = Number.parseFloat(value);
364
+ return Number.isFinite(parsed) ? parsed : 0;
365
+ }
366
+ function parseTabStops(value) {
367
+ return value
368
+ .split(',')
369
+ .map((part) => parseNumber(part.trim()))
370
+ .filter((part) => Number.isFinite(part));
371
+ }
372
+ function stripQuotes(value) {
373
+ return value.replace(/^['"]|['"]$/g, '');
374
+ }
375
+ function writeFormatRange(ranges, format, start, end) {
376
+ if (start === end)
377
+ return;
378
+ const previous = ranges[ranges.length - 1];
379
+ if (previous !== undefined && previous.end === start && textFormatEquals(previous.format, format)) {
380
+ previous.end = end;
381
+ }
382
+ else {
383
+ ranges.push({ end, format: { ...format }, start });
384
+ }
385
+ }
386
+ function textFormatEquals(a, b) {
387
+ const aKeys = Object.keys(a);
388
+ const bKeys = Object.keys(b);
389
+ if (aKeys.length !== bKeys.length)
390
+ return false;
391
+ for (const key of aKeys) {
392
+ const aValue = a[key];
393
+ const bValue = b[key];
394
+ if (Array.isArray(aValue) && Array.isArray(bValue)) {
395
+ if (aValue.length !== bValue.length)
396
+ return false;
397
+ for (let i = 0; i < aValue.length; i++) {
398
+ if (aValue[i] !== bValue[i])
399
+ return false;
400
+ }
401
+ }
402
+ else if (aValue !== bValue) {
403
+ return false;
404
+ }
405
+ }
406
+ return true;
407
+ }
408
+ const namedColors = {
409
+ black: 0x000000,
410
+ blue: 0x0000ff,
411
+ cyan: 0x00ffff,
412
+ fuchsia: 0xff00ff,
413
+ gray: 0x808080,
414
+ green: 0x008000,
415
+ lime: 0x00ff00,
416
+ magenta: 0xff00ff,
417
+ maroon: 0x800000,
418
+ navy: 0x000080,
419
+ olive: 0x808000,
420
+ purple: 0x800080,
421
+ red: 0xff0000,
422
+ silver: 0xc0c0c0,
423
+ teal: 0x008080,
424
+ white: 0xffffff,
425
+ yellow: 0xffff00,
426
+ };
427
+ const namedEntities = {
428
+ amp: '&',
429
+ apos: "'",
430
+ gt: '>',
431
+ lt: '<',
432
+ nbsp: ' ',
433
+ quot: '"',
434
+ };
435
+ //# sourceMappingURL=richTextContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"richTextContent.js","sourceRoot":"","sources":["../src/richTextContent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { RichTextData, TextLayoutResult } from '@flighthq/types';
2
+ export declare function computeRichTextBottomScrollV(data: Readonly<RichTextData>, layout: Readonly<TextLayoutResult>): number;
3
+ export declare function computeRichTextLineCount(layout: Readonly<TextLayoutResult>): number;
4
+ export declare function computeRichTextMaxScrollH(data: Readonly<RichTextData>, layout: Readonly<TextLayoutResult>): number;
5
+ export declare function computeRichTextMaxScrollV(data: Readonly<RichTextData>, layout: Readonly<TextLayoutResult>): number;
6
+ export declare function computeRichTextTextHeight(layout: Readonly<TextLayoutResult>): number;
7
+ export declare function computeRichTextTextWidth(layout: Readonly<TextLayoutResult>): number;
8
+ export declare function getRichTextScrollYOffset(lineHeights: readonly number[], firstVisibleLine: number): number;
9
+ //# sourceMappingURL=richTextMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"richTextMetrics.d.ts","sourceRoot":"","sources":["../src/richTextMetrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAItE,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAErH;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAEnF;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAGlH;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAGlH;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAEpF;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAEnF;AAED,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAKzG"}
@@ -0,0 +1,44 @@
1
+ import { computeTextBoundsHeight, computeTextBoundsWidth, TEXT_BOUNDS_GUTTER } from './textBounds';
2
+ export function computeRichTextBottomScrollV(data, layout) {
3
+ return Math.min(layout.numLines, data.scrollV + getVisibleLineCount(data, layout) - 1);
4
+ }
5
+ export function computeRichTextLineCount(layout) {
6
+ return layout.numLines;
7
+ }
8
+ export function computeRichTextMaxScrollH(data, layout) {
9
+ const visibleWidth = Math.max(0, computeTextBoundsWidth(data, layout) - TEXT_BOUNDS_GUTTER * 2);
10
+ return Math.max(0, Math.ceil(layout.textWidth - visibleWidth));
11
+ }
12
+ export function computeRichTextMaxScrollV(data, layout) {
13
+ if (layout.numLines <= 1)
14
+ return 1;
15
+ return Math.max(1, layout.numLines - getVisibleLineCount(data, layout) + 1);
16
+ }
17
+ export function computeRichTextTextHeight(layout) {
18
+ return Math.ceil(layout.textHeight);
19
+ }
20
+ export function computeRichTextTextWidth(layout) {
21
+ return Math.ceil(layout.textWidth);
22
+ }
23
+ export function getRichTextScrollYOffset(lineHeights, firstVisibleLine) {
24
+ let offset = 0;
25
+ const limit = Math.min(firstVisibleLine, lineHeights.length);
26
+ for (let i = 0; i < limit; i++)
27
+ offset += lineHeights[i];
28
+ return offset;
29
+ }
30
+ function getVisibleLineCount(data, layout) {
31
+ const visibleHeight = Math.max(0, computeTextBoundsHeight(data, layout) - TEXT_BOUNDS_GUTTER * 2);
32
+ if (visibleHeight === 0)
33
+ return 1;
34
+ let total = 0;
35
+ let count = 0;
36
+ for (const height of layout.lineHeights) {
37
+ if (count > 0 && total + height > visibleHeight)
38
+ break;
39
+ total += height;
40
+ count++;
41
+ }
42
+ return Math.max(1, count);
43
+ }
44
+ //# sourceMappingURL=richTextMetrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"richTextMetrics.js","sourceRoot":"","sources":["../src/richTextMetrics.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEnG,MAAM,UAAU,4BAA4B,CAAC,IAA4B,EAAE,MAAkC;IAC3G,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,GAAG,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAkC;IACzE,OAAO,MAAM,CAAC,QAAQ,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAA4B,EAAE,MAAkC;IACxG,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,kBAAkB,GAAG,CAAC,CAAC,CAAC;IAChG,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAA4B,EAAE,MAAkC;IACxG,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACnC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,GAAG,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,MAAkC;IAC1E,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAkC;IACzE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,WAA8B,EAAE,gBAAwB;IAC/F,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;QAAE,MAAM,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;IACzD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAAC,IAA4B,EAAE,MAAkC;IAC3F,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,uBAAuB,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,kBAAkB,GAAG,CAAC,CAAC,CAAC;IAClG,IAAI,aAAa,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAElC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACxC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,MAAM,GAAG,aAAa;YAAE,MAAM;QACvD,KAAK,IAAI,MAAM,CAAC;QAChB,KAAK,EAAE,CAAC;IACV,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { Rectangle, TextLayoutResult, TextLineMetrics, TextSelectionRectangle } from '@flighthq/types';
2
+ export declare function computeRichTextCharIndexAtPoint(layout: Readonly<TextLayoutResult>, x: number, y: number): number;
3
+ export declare function computeRichTextLineMetrics(layout: Readonly<TextLayoutResult>, lineIndex: number): TextLineMetrics | null;
4
+ export declare function getRichTextCharBoundaries(out: Rectangle, layout: Readonly<TextLayoutResult>, charIndex: number): boolean;
5
+ export declare function getRichTextFirstCharInParagraph(text: string, charIndex: number): number;
6
+ export declare function getRichTextLineIndexAtPoint(layout: Readonly<TextLayoutResult>, y: number): number;
7
+ export declare function getRichTextLineIndexOfChar(layout: Readonly<TextLayoutResult>, charIndex: number): number;
8
+ export declare function getRichTextLineLength(layout: Readonly<TextLayoutResult>, lineIndex: number): number;
9
+ export declare function getRichTextLineOffset(layout: Readonly<TextLayoutResult>, lineIndex: number): number;
10
+ export declare function getRichTextLineText(text: string, layout: Readonly<TextLayoutResult>, lineIndex: number): string;
11
+ export declare function getRichTextLinkAtPoint(layout: Readonly<TextLayoutResult>, x: number, y: number): string | null;
12
+ export declare function getRichTextParagraphLength(text: string, charIndex: number): number;
13
+ export declare function getRichTextSelectionRectangles(out: TextSelectionRectangle[], beginIndex: number, endIndex: number, layout: Readonly<TextLayoutResult>): void;
14
+ //# sourceMappingURL=richTextQuery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"richTextQuery.d.ts","sourceRoot":"","sources":["../src/richTextQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAET,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAIzB,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CA4ChH;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,SAAS,EAAE,MAAM,GAChB,eAAe,GAAG,IAAI,CA2BxB;AAED,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,SAAS,EAAE,MAAM,GAChB,OAAO,CAcT;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAMvF;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAajG;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGxG;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CASnG;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAKnG;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAS/G;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa9G;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAKlF;AAED,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,sBAAsB,EAAE,EAC7B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GACjC,IAAI,CAeN"}