postext 0.1.2 → 0.1.4

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 (45) hide show
  1. package/dist/__tests__/exports.test.js +34 -2
  2. package/dist/__tests__/exports.test.js.map +1 -1
  3. package/dist/canvas-backend.d.ts +5 -0
  4. package/dist/canvas-backend.d.ts.map +1 -0
  5. package/dist/canvas-backend.js +156 -0
  6. package/dist/canvas-backend.js.map +1 -0
  7. package/dist/createLayout.d.ts +2 -2
  8. package/dist/createLayout.d.ts.map +1 -1
  9. package/dist/createLayout.js +25 -2
  10. package/dist/createLayout.js.map +1 -1
  11. package/dist/defaults.d.ts +23 -0
  12. package/dist/defaults.d.ts.map +1 -0
  13. package/dist/defaults.js +387 -0
  14. package/dist/defaults.js.map +1 -0
  15. package/dist/hyphenate.d.ts +11 -0
  16. package/dist/hyphenate.d.ts.map +1 -0
  17. package/dist/hyphenate.js +140 -0
  18. package/dist/hyphenate.js.map +1 -0
  19. package/dist/index.d.ts +11 -1
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +7 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/measure.d.ts +40 -0
  24. package/dist/measure.d.ts.map +1 -0
  25. package/dist/measure.js +267 -0
  26. package/dist/measure.js.map +1 -0
  27. package/dist/parse.d.ts +17 -0
  28. package/dist/parse.d.ts.map +1 -0
  29. package/dist/parse.js +152 -0
  30. package/dist/parse.js.map +1 -0
  31. package/dist/pipeline.d.ts +4 -0
  32. package/dist/pipeline.d.ts.map +1 -0
  33. package/dist/pipeline.js +324 -0
  34. package/dist/pipeline.js.map +1 -0
  35. package/dist/types.d.ts +131 -0
  36. package/dist/types.d.ts.map +1 -1
  37. package/dist/units.d.ts +9 -0
  38. package/dist/units.d.ts.map +1 -0
  39. package/dist/units.js +27 -0
  40. package/dist/units.js.map +1 -0
  41. package/dist/vdt.d.ts +83 -0
  42. package/dist/vdt.d.ts.map +1 -0
  43. package/dist/vdt.js +50 -0
  44. package/dist/vdt.js.map +1 -0
  45. package/package.json +4 -1
@@ -0,0 +1,40 @@
1
+ import type { VDTLine } from './vdt';
2
+ import type { TextAlign, HyphenationLocale } from './types';
3
+ import type { InlineSpan } from './parse';
4
+ /**
5
+ * Build a CSS font shorthand string for canvas / pretext.
6
+ * Example: "75px EB Garamond"
7
+ */
8
+ export declare function buildFontString(fontFamily: string, fontSizePx: number, weight?: string, style?: string): string;
9
+ /**
10
+ * Initializes the hyphenator for a given locale.
11
+ * Must be called before measureBlock is used with hyphenation.
12
+ */
13
+ export declare function initHyphenator(locale: HyphenationLocale): void;
14
+ /**
15
+ * Clear pretext's internal measurement caches.
16
+ * Call this after fonts finish loading to ensure accurate measurements.
17
+ */
18
+ export declare function clearMeasurementCache(): void;
19
+ export interface MeasuredBlock {
20
+ lines: VDTLine[];
21
+ totalHeight: number;
22
+ }
23
+ export interface MeasureBlockOptions {
24
+ textAlign?: TextAlign;
25
+ hyphenate?: boolean;
26
+ }
27
+ /**
28
+ * Measure a text block: break it into lines within maxWidthPx
29
+ * and return VDTLine data with bounding boxes.
30
+ *
31
+ * The returned lines have bbox positions relative to the block origin (0,0).
32
+ * The pipeline will offset them to absolute page coordinates later.
33
+ */
34
+ export declare function measureBlock(text: string, font: string, maxWidthPx: number, lineHeightPx: number, options?: MeasureBlockOptions): MeasuredBlock;
35
+ /**
36
+ * Measure a rich text block with mixed font weights.
37
+ * Uses canvas measureText for per-token measurement and greedy line-breaking.
38
+ */
39
+ export declare function measureRichBlock(spans: InlineSpan[], normalFont: string, boldFont: string, maxWidthPx: number, lineHeightPx: number, options?: MeasureBlockOptions): MeasuredBlock;
40
+ //# sourceMappingURL=measure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure.d.ts","sourceRoot":"","sources":["../src/measure.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAkB,MAAM,OAAO,CAAC;AAErD,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAS1C;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,MAAiB,EACzB,KAAK,GAAE,MAAiB,GACvB,MAAM,CAOR;AAkDD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAE9D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAMD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,aAAa,CA2Df;AAyFD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,UAAU,EAAE,EACnB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,aAAa,CAgFf"}
@@ -0,0 +1,267 @@
1
+ import { prepareWithSegments, layoutNextLine, clearCache, } from '@chenglou/pretext';
2
+ import { createBoundingBox } from './vdt';
3
+ import { hyphenateText, setHyphenationLocale } from './hyphenate';
4
+ const SOFT_HYPHEN = '\u00AD';
5
+ // ---------------------------------------------------------------------------
6
+ // Font string builder
7
+ // ---------------------------------------------------------------------------
8
+ /**
9
+ * Build a CSS font shorthand string for canvas / pretext.
10
+ * Example: "75px EB Garamond"
11
+ */
12
+ export function buildFontString(fontFamily, fontSizePx, weight = 'normal', style = 'normal') {
13
+ const parts = [];
14
+ if (style !== 'normal')
15
+ parts.push(style);
16
+ if (weight !== 'normal')
17
+ parts.push(weight);
18
+ parts.push(`${fontSizePx}px`);
19
+ parts.push(fontFamily);
20
+ return parts.join(' ');
21
+ }
22
+ // ---------------------------------------------------------------------------
23
+ // Line segment extraction
24
+ // ---------------------------------------------------------------------------
25
+ function extractSegments(prepared, start, end) {
26
+ const result = [];
27
+ let hyphenated = false;
28
+ for (let i = start.segmentIndex; i < end.segmentIndex; i++) {
29
+ const seg = prepared.segments[i];
30
+ const w = prepared.widths[i];
31
+ if (seg === SOFT_HYPHEN) {
32
+ // If this is the last segment before the break, mark as hyphenated
33
+ if (i === end.segmentIndex - 1)
34
+ hyphenated = true;
35
+ continue;
36
+ }
37
+ if (seg.trim().length === 0) {
38
+ result.push({ kind: 'space', text: seg, width: w });
39
+ }
40
+ else {
41
+ result.push({ kind: 'text', text: seg, width: w });
42
+ }
43
+ }
44
+ // Check if the break point is at a soft hyphen
45
+ if (!hyphenated && end.segmentIndex < prepared.segments.length) {
46
+ if (prepared.segments[end.segmentIndex] === SOFT_HYPHEN) {
47
+ hyphenated = true;
48
+ }
49
+ }
50
+ // Trim trailing spaces
51
+ while (result.length > 0 && result[result.length - 1].kind === 'space') {
52
+ result.pop();
53
+ }
54
+ return { segments: result, hyphenated };
55
+ }
56
+ // ---------------------------------------------------------------------------
57
+ // Hyphenation initialization
58
+ // ---------------------------------------------------------------------------
59
+ /**
60
+ * Initializes the hyphenator for a given locale.
61
+ * Must be called before measureBlock is used with hyphenation.
62
+ */
63
+ export function initHyphenator(locale) {
64
+ setHyphenationLocale(locale);
65
+ }
66
+ /**
67
+ * Clear pretext's internal measurement caches.
68
+ * Call this after fonts finish loading to ensure accurate measurements.
69
+ */
70
+ export function clearMeasurementCache() {
71
+ clearCache();
72
+ }
73
+ /**
74
+ * Measure a text block: break it into lines within maxWidthPx
75
+ * and return VDTLine data with bounding boxes.
76
+ *
77
+ * The returned lines have bbox positions relative to the block origin (0,0).
78
+ * The pipeline will offset them to absolute page coordinates later.
79
+ */
80
+ export function measureBlock(text, font, maxWidthPx, lineHeightPx, options) {
81
+ if (text.trim() === '') {
82
+ return { lines: [], totalHeight: 0 };
83
+ }
84
+ const shouldHyphenate = options?.hyphenate ?? false;
85
+ const textAlign = options?.textAlign ?? 'left';
86
+ const processedText = shouldHyphenate ? hyphenateText(text) : text;
87
+ const prepared = prepareWithSegments(processedText, font);
88
+ const lines = [];
89
+ let cursor = { segmentIndex: 0, graphemeIndex: 0 };
90
+ let y = 0;
91
+ while (true) {
92
+ const line = layoutNextLine(prepared, cursor, maxWidthPx);
93
+ if (line === null)
94
+ break;
95
+ const nextCursor = line.end;
96
+ const isLastLine = layoutNextLine(prepared, nextCursor, maxWidthPx) === null;
97
+ if (textAlign === 'justify') {
98
+ const { segments, hyphenated } = extractSegments(prepared, cursor, nextCursor);
99
+ // If hyphenated, add the visible hyphen to the last text segment
100
+ if (hyphenated) {
101
+ const lastTextIdx = findLastTextSegmentIndex(segments);
102
+ if (lastTextIdx >= 0) {
103
+ const lastSeg = segments[lastTextIdx];
104
+ segments[lastTextIdx] = {
105
+ kind: 'text',
106
+ text: lastSeg.text + '-',
107
+ width: lastSeg.width + getHyphenWidth(prepared),
108
+ };
109
+ }
110
+ }
111
+ lines.push({
112
+ text: hyphenated ? cleanSoftHyphens(line.text) + '-' : cleanSoftHyphens(line.text),
113
+ bbox: createBoundingBox(0, y, line.width, lineHeightPx),
114
+ baseline: y + lineHeightPx * 0.8,
115
+ hyphenated,
116
+ segments,
117
+ isLastLine,
118
+ });
119
+ }
120
+ else {
121
+ lines.push({
122
+ text: cleanSoftHyphens(line.text),
123
+ bbox: createBoundingBox(0, y, line.width, lineHeightPx),
124
+ baseline: y + lineHeightPx * 0.8,
125
+ hyphenated: false,
126
+ });
127
+ }
128
+ cursor = nextCursor;
129
+ y += lineHeightPx;
130
+ }
131
+ return { lines, totalHeight: y };
132
+ }
133
+ // ---------------------------------------------------------------------------
134
+ // Helpers
135
+ // ---------------------------------------------------------------------------
136
+ function findLastTextSegmentIndex(segments) {
137
+ for (let i = segments.length - 1; i >= 0; i--) {
138
+ if (segments[i].kind === 'text')
139
+ return i;
140
+ }
141
+ return -1;
142
+ }
143
+ function getHyphenWidth(prepared) {
144
+ // Use discretionaryHyphenWidth from pretext internals
145
+ const core = prepared;
146
+ if (core.discretionaryHyphenWidth && core.discretionaryHyphenWidth > 0) {
147
+ return core.discretionaryHyphenWidth;
148
+ }
149
+ return 5; // fallback
150
+ }
151
+ function cleanSoftHyphens(text) {
152
+ return text.replace(/\u00AD/g, '');
153
+ }
154
+ let _measureCtx = null;
155
+ function getMeasureCtx() {
156
+ if (!_measureCtx) {
157
+ if (typeof OffscreenCanvas !== 'undefined') {
158
+ _measureCtx = new OffscreenCanvas(1, 1).getContext('2d');
159
+ }
160
+ else {
161
+ _measureCtx = document.createElement('canvas').getContext('2d');
162
+ }
163
+ }
164
+ return _measureCtx;
165
+ }
166
+ function measureTextWidth(text, font) {
167
+ const ctx = getMeasureCtx();
168
+ ctx.font = font;
169
+ return ctx.measureText(text).width;
170
+ }
171
+ /**
172
+ * Tokenize inline spans into word/space tokens with bold flag and measured widths.
173
+ */
174
+ function tokenizeSpans(spans, normalFont, boldFont, shouldHyphenate) {
175
+ const tokens = [];
176
+ for (const span of spans) {
177
+ const text = shouldHyphenate && !span.bold ? hyphenateText(span.text) : span.text;
178
+ const font = span.bold ? boldFont : normalFont;
179
+ // Split on word boundaries while preserving spaces
180
+ const parts = text.match(/\S+|\s+/g);
181
+ if (!parts)
182
+ continue;
183
+ for (const part of parts) {
184
+ const isSpace = part.trim().length === 0;
185
+ tokens.push({
186
+ text: part,
187
+ bold: span.bold,
188
+ kind: isSpace ? 'space' : 'text',
189
+ width: measureTextWidth(part, font),
190
+ });
191
+ }
192
+ }
193
+ return tokens;
194
+ }
195
+ /**
196
+ * Measure a rich text block with mixed font weights.
197
+ * Uses canvas measureText for per-token measurement and greedy line-breaking.
198
+ */
199
+ export function measureRichBlock(spans, normalFont, boldFont, maxWidthPx, lineHeightPx, options) {
200
+ const plainText = spans.map((s) => s.text).join('');
201
+ if (plainText.trim() === '') {
202
+ return { lines: [], totalHeight: 0 };
203
+ }
204
+ const shouldHyphenate = options?.hyphenate ?? false;
205
+ const tokens = tokenizeSpans(spans, normalFont, boldFont, shouldHyphenate);
206
+ if (tokens.length === 0) {
207
+ return { lines: [], totalHeight: 0 };
208
+ }
209
+ const lines = [];
210
+ let y = 0;
211
+ let tokenIdx = 0;
212
+ while (tokenIdx < tokens.length) {
213
+ const lineTokens = [];
214
+ let lineWidth = 0;
215
+ // Consume leading spaces at line start (skip them)
216
+ while (tokenIdx < tokens.length && tokens[tokenIdx].kind === 'space') {
217
+ tokenIdx++;
218
+ }
219
+ // Greedy: add tokens until we overflow
220
+ while (tokenIdx < tokens.length) {
221
+ const token = tokens[tokenIdx];
222
+ if (lineWidth + token.width <= maxWidthPx || lineTokens.length === 0) {
223
+ lineTokens.push(token);
224
+ lineWidth += token.width;
225
+ tokenIdx++;
226
+ }
227
+ else {
228
+ // Doesn't fit — break here (before this token)
229
+ break;
230
+ }
231
+ }
232
+ if (lineTokens.length === 0)
233
+ break;
234
+ // Trim trailing spaces from line tokens
235
+ while (lineTokens.length > 0 && lineTokens[lineTokens.length - 1].kind === 'space') {
236
+ lineWidth -= lineTokens[lineTokens.length - 1].width;
237
+ lineTokens.pop();
238
+ }
239
+ // Check if this is the last line
240
+ // Skip remaining leading spaces to check if there's more content
241
+ let peekIdx = tokenIdx;
242
+ while (peekIdx < tokens.length && tokens[peekIdx].kind === 'space') {
243
+ peekIdx++;
244
+ }
245
+ const isLastLine = peekIdx >= tokens.length;
246
+ // Build segments for justified rendering
247
+ const segments = lineTokens.map((t) => ({
248
+ kind: t.kind,
249
+ text: cleanSoftHyphens(t.text),
250
+ width: t.width,
251
+ bold: t.bold || undefined,
252
+ }));
253
+ const lineText = lineTokens.map((t) => cleanSoftHyphens(t.text)).join('');
254
+ const contentWidth = lineTokens.reduce((sum, t) => sum + t.width, 0);
255
+ lines.push({
256
+ text: lineText,
257
+ bbox: createBoundingBox(0, y, contentWidth, lineHeightPx),
258
+ baseline: y + lineHeightPx * 0.8,
259
+ hyphenated: false,
260
+ segments,
261
+ isLastLine,
262
+ });
263
+ y += lineHeightPx;
264
+ }
265
+ return { lines, totalHeight: y };
266
+ }
267
+ //# sourceMappingURL=measure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure.js","sourceRoot":"","sources":["../src/measure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export type ContentBlockType = 'heading' | 'paragraph' | 'blockquote';
2
+ export interface InlineSpan {
3
+ text: string;
4
+ bold: boolean;
5
+ }
6
+ export interface ContentBlock {
7
+ type: ContentBlockType;
8
+ text: string;
9
+ spans: InlineSpan[];
10
+ level?: number;
11
+ }
12
+ /**
13
+ * Merge consecutive blockquote lines into a single block, and consecutive
14
+ * non-blank, non-special lines into paragraphs.
15
+ */
16
+ export declare function parseMarkdown(markdown: string): ContentBlock[];
17
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,CAAC;AAEtE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA8FD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CAkE9D"}
package/dist/parse.js ADDED
@@ -0,0 +1,152 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Minimal block-level markdown tokenizer
3
+ // ---------------------------------------------------------------------------
4
+ const HEADING_RE = /^(#{1,6})\s+(.+)$/;
5
+ /**
6
+ * Strip inline markdown formatting for plain-text extraction.
7
+ * Handles bold, italic, code, links, and images.
8
+ */
9
+ function stripInlineFormatting(text) {
10
+ return text
11
+ .replace(/!\[.*?\]\(.*?\)/g, '') // images
12
+ .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1') // links
13
+ .replace(/\*\*(.+?)\*\*/g, '$1') // bold
14
+ .replace(/__(.+?)__/g, '$1') // bold alt
15
+ .replace(/\*(.+?)\*/g, '$1') // italic
16
+ .replace(/_(.+?)_/g, '$1') // italic alt
17
+ .replace(/`(.+?)`/g, '$1') // inline code
18
+ .trim();
19
+ }
20
+ /**
21
+ * Strip non-bold inline formatting (images, links, italic, code) but keep text.
22
+ */
23
+ function stripNonBoldFormatting(text) {
24
+ return text
25
+ .replace(/!\[.*?\]\(.*?\)/g, '') // images
26
+ .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1') // links
27
+ .replace(/`(.+?)`/g, '$1'); // inline code
28
+ }
29
+ /**
30
+ * Parse inline formatting to produce spans with bold flag.
31
+ * Strips non-bold formatting first, then extracts bold regions.
32
+ */
33
+ function parseInlineFormatting(text) {
34
+ const cleaned = stripNonBoldFormatting(text);
35
+ const spans = [];
36
+ // Match **bold** and __bold__ patterns
37
+ const boldRe = /\*\*(.+?)\*\*|__(.+?)__/g;
38
+ let lastIndex = 0;
39
+ let match;
40
+ while ((match = boldRe.exec(cleaned)) !== null) {
41
+ // Text before the bold marker
42
+ if (match.index > lastIndex) {
43
+ const before = stripItalicFormatting(cleaned.slice(lastIndex, match.index));
44
+ if (before.length > 0) {
45
+ spans.push({ text: before, bold: false });
46
+ }
47
+ }
48
+ // The bold text itself
49
+ const boldText = stripItalicFormatting(match[1] ?? match[2]);
50
+ if (boldText.length > 0) {
51
+ spans.push({ text: boldText, bold: true });
52
+ }
53
+ lastIndex = match.index + match[0].length;
54
+ }
55
+ // Remaining text after last bold
56
+ if (lastIndex < cleaned.length) {
57
+ const remaining = stripItalicFormatting(cleaned.slice(lastIndex));
58
+ if (remaining.length > 0) {
59
+ spans.push({ text: remaining, bold: false });
60
+ }
61
+ }
62
+ // If no spans were produced (empty text), return a single empty span
63
+ if (spans.length === 0) {
64
+ const trimmed = stripItalicFormatting(cleaned).trim();
65
+ if (trimmed.length > 0) {
66
+ spans.push({ text: trimmed, bold: false });
67
+ }
68
+ }
69
+ return spans;
70
+ }
71
+ /**
72
+ * Strip italic markers (* and _) from text.
73
+ */
74
+ function stripItalicFormatting(text) {
75
+ return text
76
+ .replace(/\*(.+?)\*/g, '$1')
77
+ .replace(/_(.+?)_/g, '$1');
78
+ }
79
+ /**
80
+ * Join spans into a single plain text string.
81
+ */
82
+ function spansToText(spans) {
83
+ return spans.map((s) => s.text).join('').trim();
84
+ }
85
+ /**
86
+ * Merge consecutive blockquote lines into a single block, and consecutive
87
+ * non-blank, non-special lines into paragraphs.
88
+ */
89
+ export function parseMarkdown(markdown) {
90
+ const blocks = [];
91
+ const rawLines = markdown.split('\n');
92
+ let i = 0;
93
+ while (i < rawLines.length) {
94
+ const line = rawLines[i];
95
+ const trimmed = line.trim();
96
+ // Skip blank lines
97
+ if (trimmed === '') {
98
+ i++;
99
+ continue;
100
+ }
101
+ // Heading
102
+ const headingMatch = trimmed.match(HEADING_RE);
103
+ if (headingMatch) {
104
+ const text = stripInlineFormatting(headingMatch[2]);
105
+ blocks.push({
106
+ type: 'heading',
107
+ text,
108
+ spans: [{ text, bold: false }],
109
+ level: headingMatch[1].length,
110
+ });
111
+ i++;
112
+ continue;
113
+ }
114
+ // Blockquote — collect consecutive > lines
115
+ if (trimmed.startsWith('>')) {
116
+ const quoteLines = [];
117
+ while (i < rawLines.length) {
118
+ const ql = rawLines[i].trim();
119
+ if (!ql.startsWith('>'))
120
+ break;
121
+ quoteLines.push(ql.replace(/^>\s?/, ''));
122
+ i++;
123
+ }
124
+ const spans = parseInlineFormatting(quoteLines.join(' '));
125
+ blocks.push({
126
+ type: 'blockquote',
127
+ text: spansToText(spans),
128
+ spans,
129
+ });
130
+ continue;
131
+ }
132
+ // Paragraph — collect consecutive non-blank, non-special lines
133
+ const paraLines = [];
134
+ while (i < rawLines.length) {
135
+ const pl = rawLines[i].trim();
136
+ if (pl === '' || pl.match(HEADING_RE) || pl.startsWith('>'))
137
+ break;
138
+ paraLines.push(pl);
139
+ i++;
140
+ }
141
+ if (paraLines.length > 0) {
142
+ const spans = parseInlineFormatting(paraLines.join(' '));
143
+ blocks.push({
144
+ type: 'paragraph',
145
+ text: spansToText(spans),
146
+ spans,
147
+ });
148
+ }
149
+ }
150
+ return blocks;
151
+ }
152
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { PostextContent, PostextConfig } from './types';
2
+ import { type VDTDocument } from './vdt';
3
+ export declare function buildDocument(content: PostextContent, config?: PostextConfig): VDTDocument;
4
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAyC,MAAM,SAAS,CAAC;AAQpG,OAAO,EAQL,KAAK,WAAW,EAKjB,MAAM,OAAO,CAAC;AAyOf,wBAAgB,aAAa,CAC3B,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,aAAa,GACrB,WAAW,CAwNb"}