rapier-markdown-kit 1.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 (55) hide show
  1. package/LICENSE +40 -0
  2. package/README.md +102 -0
  3. package/dist/agent/vendor/pretext/LICENSE +21 -0
  4. package/dist/agent/vendor/pretext/NOTICE +15 -0
  5. package/dist/agent/vendor/pretext/SOURCE.json +85 -0
  6. package/dist/agent/vendor/pretext/analysis.js +1234 -0
  7. package/dist/agent/vendor/pretext/bidi.js +151 -0
  8. package/dist/agent/vendor/pretext/generated/bidi-data.js +3831 -0
  9. package/dist/agent/vendor/pretext/layout.js +308 -0
  10. package/dist/agent/vendor/pretext/line-break.js +636 -0
  11. package/dist/agent/vendor/pretext/line-text.js +44 -0
  12. package/dist/agent/vendor/pretext/measurement.js +189 -0
  13. package/dist/agent/vendor/pretext/package.json +3 -0
  14. package/dist/agent/vendor/pretext/rich-inline.js +291 -0
  15. package/dist/agent/will.mjs +167 -0
  16. package/dist/kit/assets.mjs +3 -0
  17. package/dist/kit/conformance/01-inline.expected.json +82 -0
  18. package/dist/kit/conformance/01-inline.md +10 -0
  19. package/dist/kit/conformance/02-width-x-align.expected.json +83 -0
  20. package/dist/kit/conformance/02-width-x-align.md +12 -0
  21. package/dist/kit/conformance/03-wrap-around-silhouette.expected.json +177 -0
  22. package/dist/kit/conformance/03-wrap-around-silhouette.md +12 -0
  23. package/dist/kit/conformance/04-wrap-box.expected.json +173 -0
  24. package/dist/kit/conformance/04-wrap-box.md +12 -0
  25. package/dist/kit/conformance/05-behind.expected.json +122 -0
  26. package/dist/kit/conformance/05-behind.md +12 -0
  27. package/dist/kit/conformance/06-front.expected.json +122 -0
  28. package/dist/kit/conformance/06-front.md +12 -0
  29. package/dist/kit/conformance/07-rotate-raster.expected.json +179 -0
  30. package/dist/kit/conformance/07-rotate-raster.md +12 -0
  31. package/dist/kit/conformance/08-drawing-rotation.expected.json +188 -0
  32. package/dist/kit/conformance/08-drawing-rotation.md +12 -0
  33. package/dist/kit/conformance/09-drawing-ring-interior.expected.json +229 -0
  34. package/dist/kit/conformance/09-drawing-ring-interior.md +12 -0
  35. package/dist/kit/conformance/10-both-sides.expected.json +221 -0
  36. package/dist/kit/conformance/10-both-sides.md +10 -0
  37. package/dist/kit/conformance/11-neighbour-skips-image.expected.json +160 -0
  38. package/dist/kit/conformance/11-neighbour-skips-image.md +13 -0
  39. package/dist/kit/conformance/12-heading-barrier.expected.json +164 -0
  40. package/dist/kit/conformance/12-heading-barrier.md +12 -0
  41. package/dist/kit/conformance/13-rtl-text.expected.json +179 -0
  42. package/dist/kit/conformance/13-rtl-text.md +8 -0
  43. package/dist/kit/conformance/README.md +99 -0
  44. package/dist/kit/conformance/measurer.mjs +0 -0
  45. package/dist/kit/conformance/run.mjs +123 -0
  46. package/dist/kit/index.mjs +6 -0
  47. package/dist/kit/layout.mjs +2 -0
  48. package/dist/kit/marks.mjs +2 -0
  49. package/dist/kit/model.mjs +3 -0
  50. package/dist/kit/will.mjs +2 -0
  51. package/dist/layout/model.mjs +364 -0
  52. package/dist/spec/md-assets.mjs +323 -0
  53. package/dist/spec/md-layout.mjs +117 -0
  54. package/dist/spec/md-marks.mjs +78 -0
  55. package/package.json +33 -0
@@ -0,0 +1,308 @@
1
+ /*! Pretext 0.0.9 | MIT | Copyright (c) 2026 Pretext contributors */
2
+ import { computeSegmentLevels } from './bidi.js';
3
+ import { analyzeText, clearAnalysisCaches, getBreakablePreferredBreaks, getCjkTextUnits, getSharedGraphemeSegmenter, isCJK, isNumericRunSegment, isIndependentSymbolRun, setAnalysisLocale } from './analysis.js';
4
+ import { clearMeasurementCaches, getCorrectedSegmentWidth, getSegmentBreakableFitAdvances, getEngineProfile, getFontMeasurementState, getSegmentMetrics, textMayContainEmoji } from './measurement.js';
5
+ import { countPreparedLines, measurePreparedLineGeometry, normalizePreparedLineStart, stepPreparedLineGeometryFromChunk, walkPreparedLinesRaw } from './line-break.js';
6
+ import { buildLineTextFromRange, clearLineTextCaches, getLineTextCache } from './line-text.js';
7
+ function createEmptyPrepared(includeSegments) {
8
+ if (includeSegments) {
9
+ return {
10
+ widths: [],
11
+ lineEndFitAdvances: [],
12
+ lineEndPaintAdvances: [],
13
+ kinds: [],
14
+ simpleLineWalkFastPath: true,
15
+ segLevels: null,
16
+ breakableFitAdvances: [],
17
+ breakablePreferredBreaks: [],
18
+ letterSpacing: 0,
19
+ spacingGraphemeCounts: [],
20
+ discretionaryHyphenWidth: 0,
21
+ tabStopAdvance: 0,
22
+ chunks: [],
23
+ segments: []
24
+ };
25
+ }
26
+ return {
27
+ widths: [],
28
+ lineEndFitAdvances: [],
29
+ lineEndPaintAdvances: [],
30
+ kinds: [],
31
+ simpleLineWalkFastPath: true,
32
+ segLevels: null,
33
+ breakableFitAdvances: [],
34
+ breakablePreferredBreaks: [],
35
+ letterSpacing: 0,
36
+ spacingGraphemeCounts: [],
37
+ discretionaryHyphenWidth: 0,
38
+ tabStopAdvance: 0,
39
+ chunks: []
40
+ };
41
+ }
42
+ function countRenderedSpacingGraphemes(text, kind) {
43
+ if (kind === 'zero-width-break' || kind === 'soft-hyphen' || kind === 'hard-break') {
44
+ return 0;
45
+ }
46
+ if (kind === 'tab') return 1;
47
+ let count = 0;
48
+ const graphemeSegmenter = getSharedGraphemeSegmenter();
49
+ for (const _ of graphemeSegmenter.segment(text))count++;
50
+ return count;
51
+ }
52
+ function addInternalLetterSpacing(width, graphemeCount, letterSpacing) {
53
+ return graphemeCount > 1 ? width + (graphemeCount - 1) * letterSpacing : width;
54
+ }
55
+ function measureAnalysis(analysis, font, includeSegments, wordBreak, letterSpacing) {
56
+ const engineProfile = getEngineProfile();
57
+ const { cache, emojiCorrection } = getFontMeasurementState(font, textMayContainEmoji(analysis.normalized));
58
+ const discretionaryHyphenWidth = getCorrectedSegmentWidth('-', getSegmentMetrics('-', cache), emojiCorrection) + (letterSpacing === 0 ? 0 : letterSpacing * 2);
59
+ const spaceWidth = getCorrectedSegmentWidth(' ', getSegmentMetrics(' ', cache), emojiCorrection);
60
+ const tabStopAdvance = spaceWidth * 8;
61
+ const hasLetterSpacing = letterSpacing !== 0;
62
+ if (analysis.len === 0) return createEmptyPrepared(includeSegments);
63
+ const widths = [];
64
+ const lineEndFitAdvances = [];
65
+ const lineEndPaintAdvances = [];
66
+ const kinds = [];
67
+ let simpleLineWalkFastPath = !hasLetterSpacing;
68
+ const segStarts = includeSegments ? [] : null;
69
+ const breakableFitAdvances = [];
70
+ const breakablePreferredBreaks = [];
71
+ const spacingGraphemeCounts = [];
72
+ const segments = includeSegments ? [] : null;
73
+ const chunks = [];
74
+ let chunkStartSegmentIndex = 0;
75
+ function pushMeasuredSegment(text, width, lineEndFitAdvance, lineEndPaintAdvance, kind, start, breakableFitAdvance, breakablePreferredBreak, spacingGraphemeCount) {
76
+ if (kind !== 'text' && kind !== 'space' && kind !== 'zero-width-break') {
77
+ simpleLineWalkFastPath = false;
78
+ }
79
+ widths.push(width);
80
+ lineEndFitAdvances.push(lineEndFitAdvance);
81
+ lineEndPaintAdvances.push(lineEndPaintAdvance);
82
+ kinds.push(kind);
83
+ segStarts?.push(start);
84
+ breakableFitAdvances.push(breakableFitAdvance);
85
+ breakablePreferredBreaks.push(breakablePreferredBreak);
86
+ if (hasLetterSpacing) spacingGraphemeCounts.push(spacingGraphemeCount);
87
+ if (segments !== null) segments.push(text);
88
+ }
89
+ function pushMeasuredTextSegment(text, textMetrics, kind, start, allowOverflowBreaks) {
90
+ const spacingGraphemeCount = hasLetterSpacing ? countRenderedSpacingGraphemes(text, kind) : 0;
91
+ const width = addInternalLetterSpacing(getCorrectedSegmentWidth(text, textMetrics, emojiCorrection), spacingGraphemeCount, letterSpacing);
92
+ const baseLineEndFitAdvance = kind === 'space' || kind === 'preserved-space' || kind === 'zero-width-break' ? 0 : width;
93
+ const lineEndFitAdvance = baseLineEndFitAdvance === 0 ? 0 : baseLineEndFitAdvance + (spacingGraphemeCount > 0 ? letterSpacing : 0);
94
+ const lineEndPaintAdvance = kind === 'space' || kind === 'zero-width-break' ? 0 : width;
95
+ if (allowOverflowBreaks && text.length > 1) {
96
+ let fitMode = 'sum-graphemes';
97
+ if (letterSpacing !== 0) {
98
+ fitMode = 'segment-prefixes';
99
+ } else if (isNumericRunSegment(text)) {
100
+ fitMode = 'pair-context';
101
+ } else if (engineProfile.preferPrefixWidthsForBreakableRuns) {
102
+ fitMode = 'segment-prefixes';
103
+ }
104
+ const fitAdvances = getSegmentBreakableFitAdvances(text, textMetrics, cache, emojiCorrection, fitMode);
105
+ const preferredBreaks = fitAdvances === null || wordBreak === 'keep-all' ? null : getBreakablePreferredBreaks(text);
106
+ pushMeasuredSegment(text, width, lineEndFitAdvance, lineEndPaintAdvance, kind, start, fitAdvances, preferredBreaks, spacingGraphemeCount);
107
+ return;
108
+ }
109
+ pushMeasuredSegment(text, width, lineEndFitAdvance, lineEndPaintAdvance, kind, start, null, null, spacingGraphemeCount);
110
+ }
111
+ for(let mi = 0; mi < analysis.len; mi++){
112
+ const segText = analysis.texts[mi];
113
+ const segKind = analysis.kinds[mi];
114
+ const segStart = analysis.starts[mi];
115
+ if (segKind === 'soft-hyphen') {
116
+ pushMeasuredSegment(segText, 0, discretionaryHyphenWidth, discretionaryHyphenWidth, segKind, segStart, null, null, 0);
117
+ continue;
118
+ }
119
+ if (segKind === 'hard-break') {
120
+ const endSegmentIndex = widths.length;
121
+ pushMeasuredSegment(segText, 0, 0, 0, segKind, segStart, null, null, 0);
122
+ chunks.push({
123
+ startSegmentIndex: chunkStartSegmentIndex,
124
+ endSegmentIndex,
125
+ consumedEndSegmentIndex: widths.length
126
+ });
127
+ chunkStartSegmentIndex = widths.length;
128
+ continue;
129
+ }
130
+ if (segKind === 'tab') {
131
+ pushMeasuredSegment(segText, 0, 0, 0, segKind, segStart, null, null, hasLetterSpacing ? countRenderedSpacingGraphemes(segText, segKind) : 0);
132
+ continue;
133
+ }
134
+ if (segKind === 'text' && isCJK(segText)) {
135
+ const measuredUnits = getCjkTextUnits(segText, engineProfile, wordBreak);
136
+ for(let i = 0; i < measuredUnits.length; i++){
137
+ const unit = measuredUnits[i];
138
+ const unitMetrics = getSegmentMetrics(unit.text, cache);
139
+ pushMeasuredTextSegment(unit.text, unitMetrics, 'text', segStart + unit.start, unit.overflow === 'grapheme' || analysis.isWordLike[mi] && (wordBreak === 'keep-all' || unit.overflow === 'word-like'));
140
+ }
141
+ continue;
142
+ }
143
+ pushMeasuredTextSegment(segText, getSegmentMetrics(segText, cache), segKind, segStart, segKind === 'text' && (analysis.isWordLike[mi] || isIndependentSymbolRun(segText)));
144
+ }
145
+ if (chunkStartSegmentIndex < widths.length) {
146
+ chunks.push({
147
+ startSegmentIndex: chunkStartSegmentIndex,
148
+ endSegmentIndex: widths.length,
149
+ consumedEndSegmentIndex: widths.length
150
+ });
151
+ }
152
+ const segLevels = segStarts === null ? null : computeSegmentLevels(analysis.normalized, segStarts);
153
+ if (segments !== null) {
154
+ return {
155
+ widths,
156
+ lineEndFitAdvances,
157
+ lineEndPaintAdvances,
158
+ kinds,
159
+ simpleLineWalkFastPath,
160
+ segLevels,
161
+ breakableFitAdvances,
162
+ breakablePreferredBreaks,
163
+ letterSpacing,
164
+ spacingGraphemeCounts,
165
+ discretionaryHyphenWidth,
166
+ tabStopAdvance,
167
+ chunks,
168
+ segments
169
+ };
170
+ }
171
+ return {
172
+ widths,
173
+ lineEndFitAdvances,
174
+ lineEndPaintAdvances,
175
+ kinds,
176
+ simpleLineWalkFastPath,
177
+ segLevels,
178
+ breakableFitAdvances,
179
+ breakablePreferredBreaks,
180
+ letterSpacing,
181
+ spacingGraphemeCounts,
182
+ discretionaryHyphenWidth,
183
+ tabStopAdvance,
184
+ chunks
185
+ };
186
+ }
187
+ function prepareInternal(text, font, includeSegments, options) {
188
+ const wordBreak = options?.wordBreak ?? 'normal';
189
+ const letterSpacing = options?.letterSpacing ?? 0;
190
+ const analysis = analyzeText(text, getEngineProfile(), options?.whiteSpace, wordBreak);
191
+ return measureAnalysis(analysis, font, includeSegments, wordBreak, letterSpacing);
192
+ }
193
+ export function prepare(text, font, options) {
194
+ return prepareInternal(text, font, false, options);
195
+ }
196
+ export function prepareWithSegments(text, font, options) {
197
+ return prepareInternal(text, font, true, options);
198
+ }
199
+ function getInternalPrepared(prepared) {
200
+ return prepared;
201
+ }
202
+ export function layout(prepared, maxWidth, lineHeight) {
203
+ const lineCount = countPreparedLines(getInternalPrepared(prepared), maxWidth);
204
+ return {
205
+ lineCount,
206
+ height: lineCount * lineHeight
207
+ };
208
+ }
209
+ function createLayoutLine(prepared, cache, width, startSegmentIndex, startGraphemeIndex, endSegmentIndex, endGraphemeIndex) {
210
+ return {
211
+ text: buildLineTextFromRange(prepared, cache, startSegmentIndex, startGraphemeIndex, endSegmentIndex, endGraphemeIndex),
212
+ width,
213
+ start: {
214
+ segmentIndex: startSegmentIndex,
215
+ graphemeIndex: startGraphemeIndex
216
+ },
217
+ end: {
218
+ segmentIndex: endSegmentIndex,
219
+ graphemeIndex: endGraphemeIndex
220
+ }
221
+ };
222
+ }
223
+ function createLayoutLineRange(width, startSegmentIndex, startGraphemeIndex, endSegmentIndex, endGraphemeIndex) {
224
+ return {
225
+ width,
226
+ start: {
227
+ segmentIndex: startSegmentIndex,
228
+ graphemeIndex: startGraphemeIndex
229
+ },
230
+ end: {
231
+ segmentIndex: endSegmentIndex,
232
+ graphemeIndex: endGraphemeIndex
233
+ }
234
+ };
235
+ }
236
+ export function materializeLineRange(prepared, line) {
237
+ return createLayoutLine(prepared, getLineTextCache(prepared), line.width, line.start.segmentIndex, line.start.graphemeIndex, line.end.segmentIndex, line.end.graphemeIndex);
238
+ }
239
+ export function walkLineRanges(prepared, maxWidth, onLine) {
240
+ if (prepared.widths.length === 0) return 0;
241
+ return walkPreparedLinesRaw(getInternalPrepared(prepared), maxWidth, (width, startSegmentIndex, startGraphemeIndex, endSegmentIndex, endGraphemeIndex)=>{
242
+ onLine(createLayoutLineRange(width, startSegmentIndex, startGraphemeIndex, endSegmentIndex, endGraphemeIndex));
243
+ });
244
+ }
245
+ export function measureLineStats(prepared, maxWidth) {
246
+ return measurePreparedLineGeometry(getInternalPrepared(prepared), maxWidth);
247
+ }
248
+ export function measureNaturalWidth(prepared) {
249
+ let maxWidth = 0;
250
+ walkPreparedLinesRaw(getInternalPrepared(prepared), Number.POSITIVE_INFINITY, (width)=>{
251
+ if (width > maxWidth) maxWidth = width;
252
+ });
253
+ return maxWidth;
254
+ }
255
+ export function layoutNextLine(prepared, start, maxWidth) {
256
+ const internal = getInternalPrepared(prepared);
257
+ const end = {
258
+ segmentIndex: start.segmentIndex,
259
+ graphemeIndex: start.graphemeIndex
260
+ };
261
+ const chunkIndex = normalizePreparedLineStart(internal, end);
262
+ if (chunkIndex < 0) return null;
263
+ const lineStartSegmentIndex = end.segmentIndex;
264
+ const lineStartGraphemeIndex = end.graphemeIndex;
265
+ const width = stepPreparedLineGeometryFromChunk(internal, end, chunkIndex, maxWidth);
266
+ if (width === null) return null;
267
+ return createLayoutLine(prepared, getLineTextCache(prepared), width, lineStartSegmentIndex, lineStartGraphemeIndex, end.segmentIndex, end.graphemeIndex);
268
+ }
269
+ export function layoutNextLineRange(prepared, start, maxWidth) {
270
+ const internal = getInternalPrepared(prepared);
271
+ const end = {
272
+ segmentIndex: start.segmentIndex,
273
+ graphemeIndex: start.graphemeIndex
274
+ };
275
+ const chunkIndex = normalizePreparedLineStart(internal, end);
276
+ if (chunkIndex < 0) return null;
277
+ const lineStartSegmentIndex = end.segmentIndex;
278
+ const lineStartGraphemeIndex = end.graphemeIndex;
279
+ const width = stepPreparedLineGeometryFromChunk(internal, end, chunkIndex, maxWidth);
280
+ if (width === null) return null;
281
+ return createLayoutLineRange(width, lineStartSegmentIndex, lineStartGraphemeIndex, end.segmentIndex, end.graphemeIndex);
282
+ }
283
+ export function layoutWithLines(prepared, maxWidth, lineHeight) {
284
+ const lines = [];
285
+ if (prepared.widths.length === 0) return {
286
+ lineCount: 0,
287
+ height: 0,
288
+ lines
289
+ };
290
+ const graphemeCache = getLineTextCache(prepared);
291
+ const lineCount = walkPreparedLinesRaw(getInternalPrepared(prepared), maxWidth, (width, startSegmentIndex, startGraphemeIndex, endSegmentIndex, endGraphemeIndex)=>{
292
+ lines.push(createLayoutLine(prepared, graphemeCache, width, startSegmentIndex, startGraphemeIndex, endSegmentIndex, endGraphemeIndex));
293
+ });
294
+ return {
295
+ lineCount,
296
+ height: lineCount * lineHeight,
297
+ lines
298
+ };
299
+ }
300
+ export function clearCache() {
301
+ clearAnalysisCaches();
302
+ clearLineTextCaches();
303
+ clearMeasurementCaches();
304
+ }
305
+ export function setLocale(locale) {
306
+ setAnalysisLocale(locale);
307
+ clearCache();
308
+ }