postext 0.3.5 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/exports.test.js +1 -0
- package/dist/__tests__/exports.test.js.map +1 -1
- package/dist/canvas-backend/blockRender.d.ts +3 -0
- package/dist/canvas-backend/blockRender.d.ts.map +1 -0
- package/dist/canvas-backend/blockRender.js +176 -0
- package/dist/canvas-backend/blockRender.js.map +1 -0
- package/dist/canvas-backend/decorations.d.ts +6 -0
- package/dist/canvas-backend/decorations.d.ts.map +1 -0
- package/dist/canvas-backend/decorations.js +106 -0
- package/dist/canvas-backend/decorations.js.map +1 -0
- package/dist/{canvas-backend.d.ts → canvas-backend/index.d.ts} +2 -2
- package/dist/canvas-backend/index.d.ts.map +1 -0
- package/dist/canvas-backend/index.js +66 -0
- package/dist/canvas-backend/index.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/knuthPlass/breakpoints.d.ts +6 -0
- package/dist/knuthPlass/breakpoints.d.ts.map +1 -0
- package/dist/knuthPlass/breakpoints.js +284 -0
- package/dist/knuthPlass/breakpoints.js.map +1 -0
- package/dist/knuthPlass/constants.d.ts +8 -0
- package/dist/knuthPlass/constants.d.ts.map +1 -0
- package/dist/knuthPlass/constants.js +8 -0
- package/dist/knuthPlass/constants.js.map +1 -0
- package/dist/knuthPlass/index.d.ts +12 -0
- package/dist/knuthPlass/index.d.ts.map +1 -0
- package/dist/knuthPlass/index.js +11 -0
- package/dist/knuthPlass/index.js.map +1 -0
- package/dist/knuthPlass/pretextAdapter.d.ts +12 -0
- package/dist/knuthPlass/pretextAdapter.d.ts.map +1 -0
- package/dist/knuthPlass/pretextAdapter.js +178 -0
- package/dist/knuthPlass/pretextAdapter.js.map +1 -0
- package/dist/knuthPlass/richAdapter.d.ts +26 -0
- package/dist/knuthPlass/richAdapter.d.ts.map +1 -0
- package/dist/knuthPlass/richAdapter.js +189 -0
- package/dist/knuthPlass/richAdapter.js.map +1 -0
- package/dist/{knuthPlass.d.ts → knuthPlass/types.d.ts} +1 -31
- package/dist/knuthPlass/types.d.ts.map +1 -0
- package/dist/knuthPlass/types.js +5 -0
- package/dist/knuthPlass/types.js.map +1 -0
- package/dist/knuthPlass/utils.d.ts +2 -0
- package/dist/knuthPlass/utils.d.ts.map +1 -0
- package/dist/knuthPlass/utils.js +4 -0
- package/dist/knuthPlass/utils.js.map +1 -0
- package/dist/math/rasterCache.d.ts.map +1 -1
- package/dist/math/rasterCache.js +29 -6
- package/dist/math/rasterCache.js.map +1 -1
- package/dist/measure/cache.d.ts +5 -0
- package/dist/measure/cache.d.ts.map +1 -0
- package/dist/measure/cache.js +38 -0
- package/dist/measure/cache.js.map +1 -0
- package/dist/measure/canvas.d.ts +8 -0
- package/dist/measure/canvas.d.ts.map +1 -0
- package/dist/measure/canvas.js +30 -0
- package/dist/measure/canvas.js.map +1 -0
- package/dist/measure/font.d.ts +19 -0
- package/dist/measure/font.d.ts.map +1 -0
- package/dist/measure/font.js +34 -0
- package/dist/measure/font.js.map +1 -0
- package/dist/measure/index.d.ts +7 -0
- package/dist/measure/index.d.ts.map +1 -0
- package/dist/measure/index.js +6 -0
- package/dist/measure/index.js.map +1 -0
- package/dist/measure/plain.d.ts +13 -0
- package/dist/measure/plain.d.ts.map +1 -0
- package/dist/measure/plain.js +167 -0
- package/dist/measure/plain.js.map +1 -0
- package/dist/measure/rich.d.ts +25 -0
- package/dist/measure/rich.d.ts.map +1 -0
- package/dist/measure/rich.js +246 -0
- package/dist/measure/rich.js.map +1 -0
- package/dist/measure/types.d.ts +28 -0
- package/dist/measure/types.d.ts.map +1 -0
- package/dist/measure/types.js +2 -0
- package/dist/measure/types.js.map +1 -0
- package/dist/parse/blockParser.d.ts +28 -0
- package/dist/parse/blockParser.d.ts.map +1 -0
- package/dist/parse/blockParser.js +302 -0
- package/dist/parse/blockParser.js.map +1 -0
- package/dist/parse/index.d.ts +4 -0
- package/dist/parse/index.d.ts.map +1 -0
- package/dist/parse/index.js +3 -0
- package/dist/parse/index.js.map +1 -0
- package/dist/parse/inlineFormatting.d.ts +12 -0
- package/dist/parse/inlineFormatting.d.ts.map +1 -0
- package/dist/parse/inlineFormatting.js +90 -0
- package/dist/parse/inlineFormatting.js.map +1 -0
- package/dist/parse/inlineMath.d.ts +29 -0
- package/dist/parse/inlineMath.d.ts.map +1 -0
- package/dist/parse/inlineMath.js +141 -0
- package/dist/parse/inlineMath.js.map +1 -0
- package/dist/parse/sourceMapping.d.ts +12 -0
- package/dist/parse/sourceMapping.d.ts.map +1 -0
- package/dist/parse/sourceMapping.js +130 -0
- package/dist/parse/sourceMapping.js.map +1 -0
- package/dist/{parse.d.ts → parse/types.d.ts} +2 -25
- package/dist/parse/types.d.ts.map +1 -0
- package/dist/parse/types.js +2 -0
- package/dist/parse/types.js.map +1 -0
- package/dist/pipeline/build.d.ts +13 -1
- package/dist/pipeline/build.d.ts.map +1 -1
- package/dist/pipeline/build.js +43 -277
- package/dist/pipeline/build.js.map +1 -1
- package/dist/pipeline/buildBlockKind.d.ts +33 -0
- package/dist/pipeline/buildBlockKind.d.ts.map +1 -0
- package/dist/pipeline/buildBlockKind.js +82 -0
- package/dist/pipeline/buildBlockKind.js.map +1 -0
- package/dist/pipeline/buildHelpers.d.ts +47 -0
- package/dist/pipeline/buildHelpers.d.ts.map +1 -0
- package/dist/pipeline/buildHelpers.js +169 -0
- package/dist/pipeline/buildHelpers.js.map +1 -0
- package/dist/pipeline/buildMeasurement.d.ts +27 -0
- package/dist/pipeline/buildMeasurement.d.ts.map +1 -0
- package/dist/pipeline/buildMeasurement.js +49 -0
- package/dist/pipeline/buildMeasurement.js.map +1 -0
- package/dist/pipeline/index.d.ts +2 -1
- package/dist/pipeline/index.d.ts.map +1 -1
- package/dist/pipeline/index.js +1 -1
- package/dist/pipeline/index.js.map +1 -1
- package/dist/worker/client.d.ts +21 -0
- package/dist/worker/client.d.ts.map +1 -0
- package/dist/worker/client.js +98 -0
- package/dist/worker/client.js.map +1 -0
- package/dist/worker/layout.worker.d.ts +2 -0
- package/dist/worker/layout.worker.d.ts.map +1 -0
- package/dist/worker/layout.worker.js +121 -0
- package/dist/worker/layout.worker.js.map +1 -0
- package/dist/worker/protocol.d.ts +43 -0
- package/dist/worker/protocol.d.ts.map +1 -0
- package/dist/worker/protocol.js +2 -0
- package/dist/worker/protocol.js.map +1 -0
- package/package.json +9 -1
- package/dist/canvas-backend.d.ts.map +0 -1
- package/dist/canvas-backend.js +0 -370
- package/dist/canvas-backend.js.map +0 -1
- package/dist/knuthPlass.d.ts.map +0 -1
- package/dist/knuthPlass.js +0 -665
- package/dist/knuthPlass.js.map +0 -1
- package/dist/measure.d.ts +0 -61
- package/dist/measure.d.ts.map +0 -1
- package/dist/measure.js +0 -512
- package/dist/measure.js.map +0 -1
- package/dist/parse.d.ts.map +0 -1
- package/dist/parse.js +0 -653
- package/dist/parse.js.map +0 -1
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Block-level markdown tokenizer. Splits the source into `ContentBlock`s
|
|
3
|
+
* (headings, paragraphs, blockquotes, list items, math display blocks) and
|
|
4
|
+
* attaches per-character `sourceMap` arrays so higher layers can map cursor
|
|
5
|
+
* positions back into the original markdown.
|
|
6
|
+
*/
|
|
7
|
+
import { extractInlineMath, fixMathSourceMap, injectMathSpans } from './inlineMath';
|
|
8
|
+
import { parseInlineFormatting, stripInlineFormatting } from './inlineFormatting';
|
|
9
|
+
import { buildBlockMapping } from './sourceMapping';
|
|
10
|
+
const HEADING_RE = /^(#{1,6})\s+(.+)$/;
|
|
11
|
+
const TASK_ITEM_RE = /^(\s*)([-*+])\s+\[([ xX])\]\s+(.*)$/;
|
|
12
|
+
const ORDERED_LIST_ITEM_RE = /^(\s*)(\d+)([.)])\s+(.*)$/;
|
|
13
|
+
const LIST_ITEM_RE = /^(\s*)([-*+])\s+(.*)$/;
|
|
14
|
+
/** One-line `$$ ... $$` display math (the whole line is the formula). */
|
|
15
|
+
const BLOCK_MATH_SINGLE_RE = /^\s*\$\$([\s\S]+?)\$\$\s*$/;
|
|
16
|
+
/** Standalone `$$` marker (opening or closing a multi-line display block). */
|
|
17
|
+
const BLOCK_MATH_FENCE_RE = /^\s*\$\$\s*$/;
|
|
18
|
+
// Single-slot memo used by parseMarkdownMemo. The returned array and its
|
|
19
|
+
// ContentBlocks are treated as read-only by the rest of the pipeline.
|
|
20
|
+
let _parseMemoInput = null;
|
|
21
|
+
let _parseMemoResult = null;
|
|
22
|
+
/**
|
|
23
|
+
* Memoized wrapper around parseMarkdown: returns the cached result when the
|
|
24
|
+
* input string is byte-for-byte identical to the previous call. This avoids
|
|
25
|
+
* reparsing the whole document on each keystroke when upstream recomputes
|
|
26
|
+
* only because a sibling state changed.
|
|
27
|
+
*/
|
|
28
|
+
export function parseMarkdownMemo(markdown) {
|
|
29
|
+
if (_parseMemoResult !== null && _parseMemoInput === markdown) {
|
|
30
|
+
return _parseMemoResult.blocks;
|
|
31
|
+
}
|
|
32
|
+
const result = parseMarkdownWithIssues(markdown);
|
|
33
|
+
_parseMemoInput = markdown;
|
|
34
|
+
_parseMemoResult = result;
|
|
35
|
+
return result.blocks;
|
|
36
|
+
}
|
|
37
|
+
export function parseMarkdownWithIssuesMemo(markdown) {
|
|
38
|
+
if (_parseMemoResult !== null && _parseMemoInput === markdown) {
|
|
39
|
+
return _parseMemoResult;
|
|
40
|
+
}
|
|
41
|
+
const result = parseMarkdownWithIssues(markdown);
|
|
42
|
+
_parseMemoInput = markdown;
|
|
43
|
+
_parseMemoResult = result;
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
export function parseMarkdown(markdown) {
|
|
47
|
+
return parseMarkdownWithIssues(markdown).blocks;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Merge consecutive blockquote lines into a single block, and consecutive
|
|
51
|
+
* non-blank, non-special lines into paragraphs.
|
|
52
|
+
*/
|
|
53
|
+
export function parseMarkdownWithIssues(markdown) {
|
|
54
|
+
const blocks = [];
|
|
55
|
+
const issues = [];
|
|
56
|
+
const rawLines = markdown.split('\n');
|
|
57
|
+
// Precompute starting offset of each raw line in the original markdown.
|
|
58
|
+
// lineOffsets[i] = offset of first char of rawLines[i]. Line terminator '\n'
|
|
59
|
+
// contributes exactly 1 character between consecutive lines.
|
|
60
|
+
const lineOffsets = new Array(rawLines.length);
|
|
61
|
+
{
|
|
62
|
+
let cur = 0;
|
|
63
|
+
for (let k = 0; k < rawLines.length; k++) {
|
|
64
|
+
lineOffsets[k] = cur;
|
|
65
|
+
cur += rawLines[k].length + 1; // +1 for the '\n' that was split away
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const lineEndOffset = (k) => lineOffsets[k] + rawLines[k].length;
|
|
69
|
+
let i = 0;
|
|
70
|
+
while (i < rawLines.length) {
|
|
71
|
+
const line = rawLines[i];
|
|
72
|
+
const trimmed = line.trim();
|
|
73
|
+
// Skip blank lines
|
|
74
|
+
if (trimmed === '') {
|
|
75
|
+
i++;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
// Display math — single-line `$$ ... $$`
|
|
79
|
+
const singleMath = line.match(BLOCK_MATH_SINGLE_RE);
|
|
80
|
+
if (singleMath) {
|
|
81
|
+
const srcStart = lineOffsets[i];
|
|
82
|
+
const srcEnd = lineEndOffset(i);
|
|
83
|
+
blocks.push({
|
|
84
|
+
type: 'mathDisplay',
|
|
85
|
+
text: '',
|
|
86
|
+
spans: [],
|
|
87
|
+
tex: singleMath[1],
|
|
88
|
+
sourceStart: srcStart,
|
|
89
|
+
sourceEnd: srcEnd,
|
|
90
|
+
sourceMap: [],
|
|
91
|
+
});
|
|
92
|
+
i++;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
// Display math — multi-line `$$` ... `$$` (opening fence on its own line).
|
|
96
|
+
if (BLOCK_MATH_FENCE_RE.test(line)) {
|
|
97
|
+
const startIdx = i;
|
|
98
|
+
i++;
|
|
99
|
+
const texLines = [];
|
|
100
|
+
let closed = false;
|
|
101
|
+
while (i < rawLines.length) {
|
|
102
|
+
if (BLOCK_MATH_FENCE_RE.test(rawLines[i])) {
|
|
103
|
+
closed = true;
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
texLines.push(rawLines[i]);
|
|
107
|
+
i++;
|
|
108
|
+
}
|
|
109
|
+
const srcStart = lineOffsets[startIdx];
|
|
110
|
+
const srcEnd = closed ? lineEndOffset(i) : lineEndOffset(i - 1);
|
|
111
|
+
if (!closed) {
|
|
112
|
+
issues.push({
|
|
113
|
+
kind: 'unclosedMathBlock',
|
|
114
|
+
delimiter: '$$',
|
|
115
|
+
sourceStart: srcStart,
|
|
116
|
+
sourceEnd: srcEnd,
|
|
117
|
+
tex: texLines.join('\n'),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
blocks.push({
|
|
121
|
+
type: 'mathDisplay',
|
|
122
|
+
text: '',
|
|
123
|
+
spans: [],
|
|
124
|
+
tex: texLines.join('\n'),
|
|
125
|
+
sourceStart: srcStart,
|
|
126
|
+
sourceEnd: srcEnd,
|
|
127
|
+
sourceMap: [],
|
|
128
|
+
});
|
|
129
|
+
if (closed)
|
|
130
|
+
i++; // consume the closing fence
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
// Heading
|
|
134
|
+
const headingMatch = trimmed.match(HEADING_RE);
|
|
135
|
+
if (headingMatch) {
|
|
136
|
+
const headingRawContent = headingMatch[2];
|
|
137
|
+
const srcStart = lineOffsets[i];
|
|
138
|
+
const srcEnd = lineEndOffset(i);
|
|
139
|
+
// Absolute offset of the first content char (after the `# `).
|
|
140
|
+
const prefixLen = line.indexOf(headingRawContent);
|
|
141
|
+
const contentAbsStart = srcStart + (prefixLen >= 0 ? prefixLen : 0);
|
|
142
|
+
const { cleaned, maths, issues: mathIssues } = extractInlineMath(headingRawContent, null, contentAbsStart, srcEnd);
|
|
143
|
+
issues.push(...mathIssues);
|
|
144
|
+
const rawText = stripInlineFormatting(cleaned);
|
|
145
|
+
const rawSpans = injectMathSpans([{ text: rawText, bold: false, italic: false }], maths);
|
|
146
|
+
const mapping = buildBlockMapping(markdown, srcStart, srcEnd, rawSpans);
|
|
147
|
+
fixMathSourceMap(mapping.text, mapping.spans, mapping.sourceMap);
|
|
148
|
+
blocks.push({
|
|
149
|
+
type: 'heading',
|
|
150
|
+
text: mapping.text,
|
|
151
|
+
spans: mapping.spans.length > 0 ? mapping.spans : [{ text: '', bold: false, italic: false }],
|
|
152
|
+
level: headingMatch[1].length,
|
|
153
|
+
sourceStart: srcStart,
|
|
154
|
+
sourceEnd: srcEnd,
|
|
155
|
+
sourceMap: mapping.sourceMap,
|
|
156
|
+
});
|
|
157
|
+
i++;
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
// List items — unordered (`-`, `*`, `+`), ordered (`1.`, `1)`) and
|
|
161
|
+
// GFM task (`- [ ]`, `- [x]`). Consume consecutive list lines of any kind
|
|
162
|
+
// (nesting and mixed kinds are allowed); the pipeline segments ordered
|
|
163
|
+
// runs by kind and depth for numbering.
|
|
164
|
+
const isListStart = TASK_ITEM_RE.test(line) || ORDERED_LIST_ITEM_RE.test(line) || LIST_ITEM_RE.test(line);
|
|
165
|
+
if (isListStart) {
|
|
166
|
+
while (i < rawLines.length) {
|
|
167
|
+
const curRaw = rawLines[i];
|
|
168
|
+
const taskMatch = curRaw.match(TASK_ITEM_RE);
|
|
169
|
+
const orderedMatch = !taskMatch ? curRaw.match(ORDERED_LIST_ITEM_RE) : null;
|
|
170
|
+
const unorderedMatch = !taskMatch && !orderedMatch ? curRaw.match(LIST_ITEM_RE) : null;
|
|
171
|
+
const anyMatch = taskMatch ?? orderedMatch ?? unorderedMatch;
|
|
172
|
+
if (anyMatch) {
|
|
173
|
+
const leading = anyMatch[1].length;
|
|
174
|
+
const depth = Math.max(1, Math.min(5, Math.floor(leading / 2) + 1));
|
|
175
|
+
const srcStart = lineOffsets[i];
|
|
176
|
+
const srcEnd = lineEndOffset(i);
|
|
177
|
+
let listKind;
|
|
178
|
+
let itemText;
|
|
179
|
+
let markerLength;
|
|
180
|
+
let startNumber;
|
|
181
|
+
let checked;
|
|
182
|
+
if (taskMatch) {
|
|
183
|
+
listKind = 'task';
|
|
184
|
+
checked = taskMatch[3] !== ' ';
|
|
185
|
+
itemText = taskMatch[4];
|
|
186
|
+
// leading spaces + bullet (1) + space (1) + `[x]` (3) + space (1)
|
|
187
|
+
markerLength = taskMatch[2].length + 1 + 3 + 1;
|
|
188
|
+
}
|
|
189
|
+
else if (orderedMatch) {
|
|
190
|
+
listKind = 'ordered';
|
|
191
|
+
startNumber = parseInt(orderedMatch[2], 10);
|
|
192
|
+
itemText = orderedMatch[4];
|
|
193
|
+
// number digits + separator (1) + space (1)
|
|
194
|
+
markerLength = orderedMatch[2].length + 1 + 1;
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
listKind = 'unordered';
|
|
198
|
+
itemText = unorderedMatch[3];
|
|
199
|
+
markerLength = unorderedMatch[2].length + 1;
|
|
200
|
+
}
|
|
201
|
+
const contentOffset = leading + markerLength;
|
|
202
|
+
const itemSrcStart = srcStart + contentOffset;
|
|
203
|
+
const mathExtract = extractInlineMath(itemText, null, itemSrcStart, srcEnd);
|
|
204
|
+
issues.push(...mathExtract.issues);
|
|
205
|
+
const rawSpans = injectMathSpans(parseInlineFormatting(mathExtract.cleaned), mathExtract.maths);
|
|
206
|
+
const mapping = buildBlockMapping(markdown, itemSrcStart, srcEnd, rawSpans);
|
|
207
|
+
fixMathSourceMap(mapping.text, mapping.spans, mapping.sourceMap);
|
|
208
|
+
const block = {
|
|
209
|
+
type: 'listItem',
|
|
210
|
+
text: mapping.text,
|
|
211
|
+
spans: mapping.spans.length > 0 ? mapping.spans : [{ text: '', bold: false, italic: false }],
|
|
212
|
+
depth,
|
|
213
|
+
listKind,
|
|
214
|
+
sourceStart: srcStart,
|
|
215
|
+
sourceEnd: srcEnd,
|
|
216
|
+
sourceMap: mapping.sourceMap,
|
|
217
|
+
};
|
|
218
|
+
if (startNumber !== undefined)
|
|
219
|
+
block.startNumber = startNumber;
|
|
220
|
+
if (checked !== undefined)
|
|
221
|
+
block.checked = checked;
|
|
222
|
+
blocks.push(block);
|
|
223
|
+
i++;
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
// Blank line: allow a single blank followed by another list item.
|
|
227
|
+
if (curRaw.trim() === '' &&
|
|
228
|
+
i + 1 < rawLines.length &&
|
|
229
|
+
(TASK_ITEM_RE.test(rawLines[i + 1]) ||
|
|
230
|
+
ORDERED_LIST_ITEM_RE.test(rawLines[i + 1]) ||
|
|
231
|
+
LIST_ITEM_RE.test(rawLines[i + 1]))) {
|
|
232
|
+
i++;
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
// Blockquote — collect consecutive > lines
|
|
240
|
+
if (trimmed.startsWith('>')) {
|
|
241
|
+
const quoteLines = [];
|
|
242
|
+
const startIdx = i;
|
|
243
|
+
let lastIdx = i;
|
|
244
|
+
while (i < rawLines.length) {
|
|
245
|
+
const ql = rawLines[i].trim();
|
|
246
|
+
if (!ql.startsWith('>'))
|
|
247
|
+
break;
|
|
248
|
+
quoteLines.push(ql.replace(/^>\s?/, ''));
|
|
249
|
+
lastIdx = i;
|
|
250
|
+
i++;
|
|
251
|
+
}
|
|
252
|
+
const srcStart = lineOffsets[startIdx];
|
|
253
|
+
const srcEnd = lineEndOffset(lastIdx);
|
|
254
|
+
const mathExtract = extractInlineMath(quoteLines.join(' '), null, srcStart, srcEnd);
|
|
255
|
+
issues.push(...mathExtract.issues);
|
|
256
|
+
const rawSpans = injectMathSpans(parseInlineFormatting(mathExtract.cleaned), mathExtract.maths);
|
|
257
|
+
const mapping = buildBlockMapping(markdown, srcStart, srcEnd, rawSpans);
|
|
258
|
+
fixMathSourceMap(mapping.text, mapping.spans, mapping.sourceMap);
|
|
259
|
+
blocks.push({
|
|
260
|
+
type: 'blockquote',
|
|
261
|
+
text: mapping.text,
|
|
262
|
+
spans: mapping.spans,
|
|
263
|
+
sourceStart: srcStart,
|
|
264
|
+
sourceEnd: srcEnd,
|
|
265
|
+
sourceMap: mapping.sourceMap,
|
|
266
|
+
});
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
// Paragraph — collect consecutive non-blank, non-special lines
|
|
270
|
+
const paraLines = [];
|
|
271
|
+
const startIdx = i;
|
|
272
|
+
let lastIdx = i;
|
|
273
|
+
while (i < rawLines.length) {
|
|
274
|
+
const rawLine = rawLines[i];
|
|
275
|
+
const pl = rawLine.trim();
|
|
276
|
+
if (pl === '' || pl.match(HEADING_RE) || pl.startsWith('>') || rawLine.match(LIST_ITEM_RE))
|
|
277
|
+
break;
|
|
278
|
+
paraLines.push(pl);
|
|
279
|
+
lastIdx = i;
|
|
280
|
+
i++;
|
|
281
|
+
}
|
|
282
|
+
if (paraLines.length > 0) {
|
|
283
|
+
const srcStart = lineOffsets[startIdx];
|
|
284
|
+
const srcEnd = lineEndOffset(lastIdx);
|
|
285
|
+
const mathExtract = extractInlineMath(paraLines.join(' '), null, srcStart, srcEnd);
|
|
286
|
+
issues.push(...mathExtract.issues);
|
|
287
|
+
const rawSpans = injectMathSpans(parseInlineFormatting(mathExtract.cleaned), mathExtract.maths);
|
|
288
|
+
const mapping = buildBlockMapping(markdown, srcStart, srcEnd, rawSpans);
|
|
289
|
+
fixMathSourceMap(mapping.text, mapping.spans, mapping.sourceMap);
|
|
290
|
+
blocks.push({
|
|
291
|
+
type: 'paragraph',
|
|
292
|
+
text: mapping.text,
|
|
293
|
+
spans: mapping.spans,
|
|
294
|
+
sourceStart: srcStart,
|
|
295
|
+
sourceEnd: srcEnd,
|
|
296
|
+
sourceMap: mapping.sourceMap,
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return { blocks, issues };
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=blockParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blockParser.js","sourceRoot":"","sources":["../../src/parse/blockParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type { ContentBlockType, MathMeta, InlineSpan, TextSpan, MathSpan, ListKind, ParseIssueKind, ParseIssue, ContentBlock, } from './types';
|
|
2
|
+
export { MATH_PLACEHOLDER } from './inlineMath';
|
|
3
|
+
export { parseMarkdownMemo, parseMarkdownWithIssuesMemo, parseMarkdown, parseMarkdownWithIssues, } from './blockParser';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parse/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,gBAAgB,EAChB,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,UAAU,EACV,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC3B,aAAa,EACb,uBAAuB,GACxB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parse/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC3B,aAAa,EACb,uBAAuB,GACxB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { InlineSpan } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Strip inline markdown formatting for plain-text extraction.
|
|
4
|
+
* Handles bold, italic, code, links, and images.
|
|
5
|
+
*/
|
|
6
|
+
export declare function stripInlineFormatting(text: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Parse inline formatting to produce spans with bold and italic flags.
|
|
9
|
+
* Recognizes ***bold italic***, **bold**, *italic* (and underscore equivalents).
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseInlineFormatting(text: string): InlineSpan[];
|
|
12
|
+
//# sourceMappingURL=inlineFormatting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inlineFormatting.d.ts","sourceRoot":"","sources":["../../src/parse/inlineFormatting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAU1D;AAsCD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAmChE"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strip inline markdown formatting for plain-text extraction.
|
|
3
|
+
* Handles bold, italic, code, links, and images.
|
|
4
|
+
*/
|
|
5
|
+
export function stripInlineFormatting(text) {
|
|
6
|
+
return text
|
|
7
|
+
.replace(/!\[.*?\]\(.*?\)/g, '') // images
|
|
8
|
+
.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1') // links
|
|
9
|
+
.replace(/\*\*(.+?)\*\*/g, '$1') // bold
|
|
10
|
+
.replace(/__(.+?)__/g, '$1') // bold alt
|
|
11
|
+
.replace(/\*(.+?)\*/g, '$1') // italic
|
|
12
|
+
.replace(/_(.+?)_/g, '$1') // italic alt
|
|
13
|
+
.replace(/`(.+?)`/g, '$1') // inline code
|
|
14
|
+
.trim();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Strip non-emphasis inline formatting (images, links, code) but keep bold/italic markers.
|
|
18
|
+
*/
|
|
19
|
+
function stripNonEmphasisFormatting(text) {
|
|
20
|
+
return text
|
|
21
|
+
.replace(/!\[.*?\]\(.*?\)/g, '') // images
|
|
22
|
+
.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1') // links
|
|
23
|
+
.replace(/`(.+?)`/g, '$1'); // inline code
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Split a text region into italic/non-italic spans, carrying an ambient bold flag.
|
|
27
|
+
*/
|
|
28
|
+
function splitItalicSpans(text, bold, forcedItalic, out) {
|
|
29
|
+
if (forcedItalic) {
|
|
30
|
+
if (text.length > 0)
|
|
31
|
+
out.push({ text, bold, italic: true });
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const italicRe = /\*(.+?)\*|_(.+?)_/g;
|
|
35
|
+
let last = 0;
|
|
36
|
+
let m;
|
|
37
|
+
while ((m = italicRe.exec(text)) !== null) {
|
|
38
|
+
if (m.index > last) {
|
|
39
|
+
const before = text.slice(last, m.index);
|
|
40
|
+
if (before.length > 0)
|
|
41
|
+
out.push({ text: before, bold, italic: false });
|
|
42
|
+
}
|
|
43
|
+
const inner = m[1] ?? m[2];
|
|
44
|
+
if (inner.length > 0)
|
|
45
|
+
out.push({ text: inner, bold, italic: true });
|
|
46
|
+
last = m.index + m[0].length;
|
|
47
|
+
}
|
|
48
|
+
if (last < text.length) {
|
|
49
|
+
const rest = text.slice(last);
|
|
50
|
+
if (rest.length > 0)
|
|
51
|
+
out.push({ text: rest, bold, italic: false });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Parse inline formatting to produce spans with bold and italic flags.
|
|
56
|
+
* Recognizes ***bold italic***, **bold**, *italic* (and underscore equivalents).
|
|
57
|
+
*/
|
|
58
|
+
export function parseInlineFormatting(text) {
|
|
59
|
+
const cleaned = stripNonEmphasisFormatting(text);
|
|
60
|
+
const spans = [];
|
|
61
|
+
// Triple markers (bold+italic) first, then double (bold) — longest first.
|
|
62
|
+
const boldRe = /\*\*\*(.+?)\*\*\*|___(.+?)___|\*\*(.+?)\*\*|__(.+?)__/g;
|
|
63
|
+
let lastIndex = 0;
|
|
64
|
+
let match;
|
|
65
|
+
while ((match = boldRe.exec(cleaned)) !== null) {
|
|
66
|
+
if (match.index > lastIndex) {
|
|
67
|
+
splitItalicSpans(cleaned.slice(lastIndex, match.index), false, false, spans);
|
|
68
|
+
}
|
|
69
|
+
const triple = match[1] ?? match[2];
|
|
70
|
+
if (triple !== undefined) {
|
|
71
|
+
splitItalicSpans(triple, true, true, spans);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
const inner = match[3] ?? match[4];
|
|
75
|
+
splitItalicSpans(inner, true, false, spans);
|
|
76
|
+
}
|
|
77
|
+
lastIndex = match.index + match[0].length;
|
|
78
|
+
}
|
|
79
|
+
if (lastIndex < cleaned.length) {
|
|
80
|
+
splitItalicSpans(cleaned.slice(lastIndex), false, false, spans);
|
|
81
|
+
}
|
|
82
|
+
if (spans.length === 0) {
|
|
83
|
+
const trimmed = cleaned.trim();
|
|
84
|
+
if (trimmed.length > 0) {
|
|
85
|
+
splitItalicSpans(trimmed, false, false, spans);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return spans;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=inlineFormatting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inlineFormatting.js","sourceRoot":"","sources":["../../src/parse/inlineFormatting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { InlineSpan, MathMeta, ParseIssue } from './types';
|
|
2
|
+
/** Object Replacement Character — atomic plain-text placeholder for a math
|
|
3
|
+
* span. One code unit per formula so `sourceMap` stays 1-to-1. */
|
|
4
|
+
export declare const MATH_PLACEHOLDER = "\uFFFC";
|
|
5
|
+
/** Extract inline `$...$` math spans from a line's text.
|
|
6
|
+
* - Returns a cleaned text where each match is replaced by `MATH_PLACEHOLDER`.
|
|
7
|
+
* - Returns the list of math metadata aligned with the order of placeholders.
|
|
8
|
+
* - Detects unclosed `$` (odd number of unescaped `$` in the text).
|
|
9
|
+
*
|
|
10
|
+
* `absOffsets[i]` is the absolute source offset of `text[i]` in the original
|
|
11
|
+
* markdown; used to emit accurate `sourceStart`/`sourceEnd` on each math
|
|
12
|
+
* span. When the caller cannot provide an exact map (e.g. text has been
|
|
13
|
+
* reassembled from multiple source lines) it can pass `null` and math
|
|
14
|
+
* offsets will default to the block's source range.
|
|
15
|
+
*/
|
|
16
|
+
export declare function extractInlineMath(text: string, absOffsets: number[] | null, fallbackStart: number, fallbackEnd: number): {
|
|
17
|
+
cleaned: string;
|
|
18
|
+
maths: MathMeta[];
|
|
19
|
+
issues: ParseIssue[];
|
|
20
|
+
};
|
|
21
|
+
/** Walk an InlineSpan list and attach MathMeta to each `\uFFFC` occurrence
|
|
22
|
+
* in order. Splits plain-text spans around the placeholder so the math
|
|
23
|
+
* span is its own entry (carrying the ambient bold/italic). */
|
|
24
|
+
export declare function injectMathSpans(spans: InlineSpan[], maths: MathMeta[]): InlineSpan[];
|
|
25
|
+
/** Overwrite `sourceMap[i]` entries corresponding to math placeholders with
|
|
26
|
+
* the math span's absolute sourceStart. Keeps click-to-focus accurate for
|
|
27
|
+
* formulas even though the placeholder char has no direct source match. */
|
|
28
|
+
export declare function fixMathSourceMap(text: string, spans: InlineSpan[], sourceMap: number[]): void;
|
|
29
|
+
//# sourceMappingURL=inlineMath.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inlineMath.d.ts","sourceRoot":"","sources":["../../src/parse/inlineMath.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEhE;mEACmE;AACnE,eAAO,MAAM,gBAAgB,WAAW,CAAC;AAEzC;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,EAC3B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAC,MAAM,EAAE,UAAU,EAAE,CAAA;CAAE,CA+D9D;AAED;;gEAEgE;AAChE,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,UAAU,EAAE,CAkCpF;AAED;;4EAE4E;AAC5E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAa7F"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/** Object Replacement Character — atomic plain-text placeholder for a math
|
|
2
|
+
* span. One code unit per formula so `sourceMap` stays 1-to-1. */
|
|
3
|
+
export const MATH_PLACEHOLDER = '\uFFFC';
|
|
4
|
+
/** Extract inline `$...$` math spans from a line's text.
|
|
5
|
+
* - Returns a cleaned text where each match is replaced by `MATH_PLACEHOLDER`.
|
|
6
|
+
* - Returns the list of math metadata aligned with the order of placeholders.
|
|
7
|
+
* - Detects unclosed `$` (odd number of unescaped `$` in the text).
|
|
8
|
+
*
|
|
9
|
+
* `absOffsets[i]` is the absolute source offset of `text[i]` in the original
|
|
10
|
+
* markdown; used to emit accurate `sourceStart`/`sourceEnd` on each math
|
|
11
|
+
* span. When the caller cannot provide an exact map (e.g. text has been
|
|
12
|
+
* reassembled from multiple source lines) it can pass `null` and math
|
|
13
|
+
* offsets will default to the block's source range.
|
|
14
|
+
*/
|
|
15
|
+
export function extractInlineMath(text, absOffsets, fallbackStart, fallbackEnd) {
|
|
16
|
+
const maths = [];
|
|
17
|
+
const issues = [];
|
|
18
|
+
let out = '';
|
|
19
|
+
let i = 0;
|
|
20
|
+
const absAt = (idx) => {
|
|
21
|
+
if (absOffsets && idx < absOffsets.length)
|
|
22
|
+
return absOffsets[idx];
|
|
23
|
+
if (absOffsets && absOffsets.length > 0)
|
|
24
|
+
return absOffsets[absOffsets.length - 1] + (idx - (absOffsets.length - 1));
|
|
25
|
+
return fallbackStart + idx;
|
|
26
|
+
};
|
|
27
|
+
while (i < text.length) {
|
|
28
|
+
const ch = text[i];
|
|
29
|
+
if (ch === '\\' && text[i + 1] === '$') {
|
|
30
|
+
// Escaped dollar sign — keep as literal `$` in output.
|
|
31
|
+
out += '$';
|
|
32
|
+
i += 2;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (ch !== '$') {
|
|
36
|
+
out += ch;
|
|
37
|
+
i++;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
// Found a '$'. Skip display-math `$$` sequences — those are handled at
|
|
41
|
+
// block level, so inside a paragraph we treat `$$` as literal.
|
|
42
|
+
if (text[i + 1] === '$') {
|
|
43
|
+
out += '$$';
|
|
44
|
+
i += 2;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
// Scan for the matching closing `$`, honouring `\$` escapes.
|
|
48
|
+
let j = i + 1;
|
|
49
|
+
let foundClose = -1;
|
|
50
|
+
while (j < text.length) {
|
|
51
|
+
if (text[j] === '\\' && text[j + 1] === '$') {
|
|
52
|
+
j += 2;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (text[j] === '$') {
|
|
56
|
+
foundClose = j;
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
// Bail on newline — inline math must be on a single line.
|
|
60
|
+
if (text[j] === '\n')
|
|
61
|
+
break;
|
|
62
|
+
j++;
|
|
63
|
+
}
|
|
64
|
+
if (foundClose < 0) {
|
|
65
|
+
issues.push({
|
|
66
|
+
kind: 'unclosedMath',
|
|
67
|
+
delimiter: '$',
|
|
68
|
+
sourceStart: absAt(i),
|
|
69
|
+
sourceEnd: fallbackEnd,
|
|
70
|
+
tex: text.slice(i + 1),
|
|
71
|
+
});
|
|
72
|
+
out += text.slice(i);
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
const tex = text.slice(i + 1, foundClose).replace(/\\\$/g, '$');
|
|
76
|
+
maths.push({ tex, sourceStart: absAt(i), sourceEnd: absAt(foundClose) + 1 });
|
|
77
|
+
out += MATH_PLACEHOLDER;
|
|
78
|
+
i = foundClose + 1;
|
|
79
|
+
}
|
|
80
|
+
return { cleaned: out, maths, issues };
|
|
81
|
+
}
|
|
82
|
+
/** Walk an InlineSpan list and attach MathMeta to each `\uFFFC` occurrence
|
|
83
|
+
* in order. Splits plain-text spans around the placeholder so the math
|
|
84
|
+
* span is its own entry (carrying the ambient bold/italic). */
|
|
85
|
+
export function injectMathSpans(spans, maths) {
|
|
86
|
+
if (maths.length === 0)
|
|
87
|
+
return spans;
|
|
88
|
+
const out = [];
|
|
89
|
+
let idx = 0;
|
|
90
|
+
for (const span of spans) {
|
|
91
|
+
if (span.text.indexOf(MATH_PLACEHOLDER) < 0) {
|
|
92
|
+
out.push(span);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
let buf = '';
|
|
96
|
+
for (const ch of span.text) {
|
|
97
|
+
if (ch === MATH_PLACEHOLDER) {
|
|
98
|
+
if (buf.length > 0) {
|
|
99
|
+
out.push({ text: buf, bold: span.bold, italic: span.italic });
|
|
100
|
+
buf = '';
|
|
101
|
+
}
|
|
102
|
+
const meta = maths[idx++];
|
|
103
|
+
if (meta) {
|
|
104
|
+
out.push({
|
|
105
|
+
text: MATH_PLACEHOLDER,
|
|
106
|
+
bold: span.bold,
|
|
107
|
+
italic: span.italic,
|
|
108
|
+
math: meta,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
buf += ch;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (buf.length > 0) {
|
|
117
|
+
out.push({ text: buf, bold: span.bold, italic: span.italic });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return out;
|
|
121
|
+
}
|
|
122
|
+
/** Overwrite `sourceMap[i]` entries corresponding to math placeholders with
|
|
123
|
+
* the math span's absolute sourceStart. Keeps click-to-focus accurate for
|
|
124
|
+
* formulas even though the placeholder char has no direct source match. */
|
|
125
|
+
export function fixMathSourceMap(text, spans, sourceMap) {
|
|
126
|
+
if (sourceMap.length === 0)
|
|
127
|
+
return;
|
|
128
|
+
// Walk spans in order, tracking plain-text position. Each math span
|
|
129
|
+
// contributes exactly one placeholder char whose sourceMap entry we
|
|
130
|
+
// overwrite with its span's sourceStart.
|
|
131
|
+
let p = 0;
|
|
132
|
+
for (const span of spans) {
|
|
133
|
+
if (span.math && p < sourceMap.length) {
|
|
134
|
+
sourceMap[p] = span.math.sourceStart;
|
|
135
|
+
}
|
|
136
|
+
p += span.text.length;
|
|
137
|
+
if (p > text.length)
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=inlineMath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inlineMath.js","sourceRoot":"","sources":["../../src/parse/inlineMath.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { InlineSpan } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Build normalized text, spans, and sourceMap for a block. The plain text is
|
|
4
|
+
* whitespace-normalized to match pretext's internal normalization so that the
|
|
5
|
+
* per-character `sourceMap` aligns with rendered line segments.
|
|
6
|
+
*/
|
|
7
|
+
export declare function buildBlockMapping(markdown: string, blockSrcStart: number, blockSrcEnd: number, rawSpans: InlineSpan[]): {
|
|
8
|
+
text: string;
|
|
9
|
+
spans: InlineSpan[];
|
|
10
|
+
sourceMap: number[];
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=sourceMapping.d.ts.map
|