@bendyline/squisq-formats 0.1.1 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/dist/__tests__/docxExport.test.d.ts +8 -0
  2. package/dist/__tests__/docxExport.test.d.ts.map +1 -0
  3. package/dist/__tests__/docxExport.test.js +383 -0
  4. package/dist/__tests__/docxExport.test.js.map +1 -0
  5. package/dist/__tests__/docxImport.test.d.ts +8 -0
  6. package/dist/__tests__/docxImport.test.d.ts.map +1 -0
  7. package/dist/__tests__/docxImport.test.js +309 -0
  8. package/dist/__tests__/docxImport.test.js.map +1 -0
  9. package/dist/__tests__/html.test.d.ts +8 -0
  10. package/dist/__tests__/html.test.d.ts.map +1 -0
  11. package/dist/__tests__/html.test.js +243 -0
  12. package/dist/__tests__/html.test.js.map +1 -0
  13. package/dist/__tests__/ooxml.test.d.ts +5 -0
  14. package/dist/__tests__/ooxml.test.d.ts.map +1 -0
  15. package/dist/__tests__/ooxml.test.js +152 -0
  16. package/dist/__tests__/ooxml.test.js.map +1 -0
  17. package/dist/__tests__/pdfExport.test.d.ts +8 -0
  18. package/dist/__tests__/pdfExport.test.d.ts.map +1 -0
  19. package/dist/__tests__/pdfExport.test.js +275 -0
  20. package/dist/__tests__/pdfExport.test.js.map +1 -0
  21. package/dist/__tests__/pdfImport.test.d.ts +11 -0
  22. package/dist/__tests__/pdfImport.test.d.ts.map +1 -0
  23. package/dist/__tests__/pdfImport.test.js +254 -0
  24. package/dist/__tests__/pdfImport.test.js.map +1 -0
  25. package/dist/__tests__/roundTrip.test.d.ts +7 -0
  26. package/dist/__tests__/roundTrip.test.d.ts.map +1 -0
  27. package/dist/__tests__/roundTrip.test.js +173 -0
  28. package/dist/__tests__/roundTrip.test.js.map +1 -0
  29. package/dist/docx/export.d.ts +54 -0
  30. package/dist/docx/export.d.ts.map +1 -0
  31. package/dist/docx/export.js +729 -0
  32. package/dist/docx/export.js.map +1 -0
  33. package/dist/docx/import.d.ts +52 -0
  34. package/dist/docx/import.d.ts.map +1 -0
  35. package/dist/docx/import.js +687 -0
  36. package/dist/docx/import.js.map +1 -0
  37. package/dist/docx/index.d.ts +15 -100
  38. package/dist/docx/index.d.ts.map +1 -0
  39. package/dist/docx/index.js +22 -13
  40. package/dist/docx/index.js.map +1 -1
  41. package/dist/docx/styles.d.ts +68 -0
  42. package/dist/docx/styles.d.ts.map +1 -0
  43. package/dist/docx/styles.js +125 -0
  44. package/dist/docx/styles.js.map +1 -0
  45. package/dist/html/htmlTemplate.d.ts +64 -0
  46. package/dist/html/htmlTemplate.d.ts.map +1 -0
  47. package/dist/html/htmlTemplate.js +235 -0
  48. package/dist/html/htmlTemplate.js.map +1 -0
  49. package/dist/html/imageUtils.d.ts +29 -0
  50. package/dist/html/imageUtils.d.ts.map +1 -0
  51. package/dist/html/imageUtils.js +63 -0
  52. package/dist/html/imageUtils.js.map +1 -0
  53. package/dist/html/index.d.ts +9 -77
  54. package/dist/html/index.d.ts.map +1 -0
  55. package/dist/html/index.js +137 -16
  56. package/dist/html/index.js.map +1 -1
  57. package/dist/index.d.ts +36 -7
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +35 -53
  60. package/dist/index.js.map +1 -1
  61. package/dist/ooxml/index.d.ts +14 -343
  62. package/dist/ooxml/index.d.ts.map +1 -0
  63. package/dist/ooxml/index.js +22 -98
  64. package/dist/ooxml/index.js.map +1 -1
  65. package/dist/ooxml/namespaces.d.ts +67 -0
  66. package/dist/ooxml/namespaces.d.ts.map +1 -0
  67. package/dist/ooxml/namespaces.js +94 -0
  68. package/dist/ooxml/namespaces.js.map +1 -0
  69. package/dist/ooxml/reader.d.ts +52 -0
  70. package/dist/ooxml/reader.d.ts.map +1 -0
  71. package/dist/ooxml/reader.js +190 -0
  72. package/dist/ooxml/reader.js.map +1 -0
  73. package/dist/ooxml/types.d.ts +82 -0
  74. package/dist/ooxml/types.d.ts.map +1 -0
  75. package/dist/ooxml/types.js +9 -0
  76. package/dist/ooxml/types.js.map +1 -0
  77. package/dist/ooxml/writer.d.ts +71 -0
  78. package/dist/ooxml/writer.d.ts.map +1 -0
  79. package/dist/ooxml/writer.js +200 -0
  80. package/dist/ooxml/writer.js.map +1 -0
  81. package/dist/ooxml/xmlUtils.d.ts +76 -0
  82. package/dist/ooxml/xmlUtils.d.ts.map +1 -0
  83. package/dist/ooxml/xmlUtils.js +108 -0
  84. package/dist/ooxml/xmlUtils.js.map +1 -0
  85. package/dist/pdf/export.d.ts +50 -0
  86. package/dist/pdf/export.d.ts.map +1 -0
  87. package/dist/pdf/export.js +740 -0
  88. package/dist/pdf/export.js.map +1 -0
  89. package/dist/pdf/import.d.ts +78 -0
  90. package/dist/pdf/import.d.ts.map +1 -0
  91. package/dist/pdf/import.js +619 -0
  92. package/dist/pdf/import.js.map +1 -0
  93. package/dist/pdf/index.d.ts +17 -121
  94. package/dist/pdf/index.d.ts.map +1 -0
  95. package/dist/pdf/index.js +25 -14
  96. package/dist/pdf/index.js.map +1 -1
  97. package/dist/pdf/styles.d.ts +142 -0
  98. package/dist/pdf/styles.d.ts.map +1 -0
  99. package/dist/pdf/styles.js +145 -0
  100. package/dist/pdf/styles.js.map +1 -0
  101. package/dist/pptx/index.d.ts +9 -12
  102. package/dist/pptx/index.d.ts.map +1 -0
  103. package/dist/pptx/index.js +44 -12
  104. package/dist/pptx/index.js.map +1 -1
  105. package/dist/xlsx/index.d.ts +9 -12
  106. package/dist/xlsx/index.d.ts.map +1 -0
  107. package/dist/xlsx/index.js +44 -12
  108. package/dist/xlsx/index.js.map +1 -1
  109. package/package.json +3 -4
@@ -0,0 +1,619 @@
1
+ /**
2
+ * PDF Import
3
+ *
4
+ * Parses a PDF file and converts its content into a squisq
5
+ * MarkdownDocument (or Doc) using heuristic detection of headings,
6
+ * lists, code blocks, tables, blockquotes, and hyperlinks.
7
+ *
8
+ * Uses pdfjs-dist (Mozilla pdf.js) for text extraction — a battle-tested,
9
+ * browser-compatible PDF parser. Since PDFs encode positioned glyphs
10
+ * rather than semantic structure, all structure detection is inherently
11
+ * heuristic and works best on simply-formatted documents.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * import { pdfToMarkdownDoc } from '@bendyline/squisq-formats/pdf';
16
+ *
17
+ * const response = await fetch('document.pdf');
18
+ * const data = await response.arrayBuffer();
19
+ * const doc = await pdfToMarkdownDoc(data);
20
+ * ```
21
+ */
22
+ import { markdownToDoc } from '@bendyline/squisq/doc';
23
+ import { DEFAULT_FONT_SIZE, IMPORT_HEADING_MIN_SIZE, IMPORT_HEADING_SIZE_RANGES, IMPORT_PARAGRAPH_GAP, IMPORT_BULLET_CHARS, IMPORT_ORDERED_PREFIX, IMPORT_COLUMN_TOLERANCE, IMPORT_TABLE_MIN_ROWS, IMPORT_URL_PATTERN, } from './styles.js';
24
+ /**
25
+ * Convert a PDF file to a MarkdownDocument.
26
+ *
27
+ * Structure detection is heuristic — results are best-effort.
28
+ *
29
+ * @param data - The raw PDF file as ArrayBuffer, Uint8Array, or Blob
30
+ * @param options - Import options
31
+ * @returns A MarkdownDocument representing the detected content
32
+ */
33
+ export async function pdfToMarkdownDoc(data, options = {}) {
34
+ const bytes = data instanceof Blob
35
+ ? new Uint8Array(await data.arrayBuffer())
36
+ : data instanceof ArrayBuffer
37
+ ? new Uint8Array(data)
38
+ : data;
39
+ const textLines = await extractTextLines(bytes);
40
+ if (textLines.length === 0) {
41
+ return { type: 'document', children: [] };
42
+ }
43
+ const bodySize = options.bodyFontSize ?? detectBodyFontSize(textLines);
44
+ const blocks = classifyLines(textLines, bodySize, options);
45
+ return { type: 'document', children: blocks };
46
+ }
47
+ /**
48
+ * Convert a PDF file to a squisq Doc.
49
+ *
50
+ * Convenience wrapper: PDF → MarkdownDocument → Doc.
51
+ */
52
+ export async function pdfToDoc(data, options = {}) {
53
+ const markdownDoc = await pdfToMarkdownDoc(data, options);
54
+ return markdownToDoc(markdownDoc);
55
+ }
56
+ // ============================================
57
+ // PDF Text Extraction (pdfjs-dist)
58
+ // ============================================
59
+ /**
60
+ * Configure the pdfjs-dist PDF worker source URL.
61
+ *
62
+ * pdfjs-dist requires a worker for PDF parsing. In the **browser**, bundlers
63
+ * (Vite, webpack) typically handle this automatically, or you can point to a
64
+ * CDN-hosted worker script. In **Node.js / SSR / test** environments, call
65
+ * this with a `file://` URL to the worker module **before** any import call.
66
+ *
67
+ * @example
68
+ * ```ts
69
+ * // Browser — CDN
70
+ * configurePdfWorker('https://cdn.jsdelivr.net/npm/pdfjs-dist@4/legacy/build/pdf.worker.min.mjs');
71
+ *
72
+ * // Node / vitest — file URL
73
+ * import { pathToFileURL } from 'url';
74
+ * configurePdfWorker(pathToFileURL(require.resolve('pdfjs-dist/legacy/build/pdf.worker.mjs')).href);
75
+ * ```
76
+ */
77
+ export function configurePdfWorker(workerSrc) {
78
+ _workerSrc = workerSrc;
79
+ }
80
+ /** Module-level storage for the worker source URL. */
81
+ let _workerSrc;
82
+ async function applyWorkerConfig(pdfjsLib) {
83
+ if (!pdfjsLib.GlobalWorkerOptions)
84
+ return;
85
+ if (pdfjsLib.GlobalWorkerOptions.workerSrc)
86
+ return;
87
+ if (_workerSrc) {
88
+ pdfjsLib.GlobalWorkerOptions.workerSrc = _workerSrc;
89
+ }
90
+ // If no workerSrc is set, pdfjs-dist's legacy build will attempt its
91
+ // built-in fake-worker fallback. In browsers this usually works; in
92
+ // Node.js the caller must have called configurePdfWorker() first.
93
+ }
94
+ async function extractTextLines(data) {
95
+ // Dynamic import — the legacy build bundles a fake-worker fallback
96
+ // that avoids a real Web Worker in environments that don't support it.
97
+ let pdfjsLib;
98
+ try {
99
+ pdfjsLib = (await import('pdfjs-dist/legacy/build/pdf.mjs'));
100
+ }
101
+ catch {
102
+ pdfjsLib = (await import('pdfjs-dist'));
103
+ }
104
+ await applyWorkerConfig(pdfjsLib);
105
+ const loadingTask = pdfjsLib.getDocument({
106
+ data,
107
+ isEvalSupported: false,
108
+ useSystemFonts: true,
109
+ });
110
+ const pdf = await loadingTask.promise;
111
+ const allLines = [];
112
+ for (let pageNum = 1; pageNum <= pdf.numPages; pageNum++) {
113
+ const page = await pdf.getPage(pageNum);
114
+ const content = await page.getTextContent();
115
+ // Build a fontName → fontFamily lookup from pdfjs styles
116
+ const styleMap = content.styles || {};
117
+ // Group text items into lines by y-coordinate
118
+ const items = [];
119
+ for (const item of content.items) {
120
+ if (!item.str || item.str.trim().length === 0)
121
+ continue;
122
+ const transform = item.transform || [1, 0, 0, 1, 0, 0];
123
+ const x = transform[4];
124
+ const y = transform[5];
125
+ const height = Math.abs(transform[3]) || item.height || 12;
126
+ const width = item.width || 0;
127
+ const fontName = item.fontName || '';
128
+ const fontFamily = styleMap[fontName]?.fontFamily || '';
129
+ items.push({ str: item.str, x, y, width, height, fontName, fontFamily });
130
+ }
131
+ // Group into lines (items within 2pt of same y are same line)
132
+ const lineMap = new Map();
133
+ for (const item of items) {
134
+ const roundedY = Math.round(item.y * 2) / 2;
135
+ let foundKey;
136
+ for (const key of lineMap.keys()) {
137
+ if (Math.abs(key - roundedY) < 2) {
138
+ foundKey = key;
139
+ break;
140
+ }
141
+ }
142
+ if (foundKey !== undefined) {
143
+ lineMap.get(foundKey).push(item);
144
+ }
145
+ else {
146
+ lineMap.set(roundedY, [item]);
147
+ }
148
+ }
149
+ // Sort lines top-to-bottom (highest y first), items left-to-right
150
+ const sortedKeys = [...lineMap.keys()].sort((a, b) => b - a);
151
+ for (const key of sortedKeys) {
152
+ const lineItems = lineMap.get(key).sort((a, b) => a.x - b.x);
153
+ const fontSizes = lineItems.map((i) => i.height);
154
+ const fontSize = mode(fontSizes) || 12;
155
+ const fontFamilies = lineItems.map((i) => i.fontFamily);
156
+ const fontFamily = modeStr(fontFamilies) || '';
157
+ const fontNames = lineItems.map((i) => i.fontName);
158
+ const fontName = modeStr(fontNames) || '';
159
+ const minX = Math.min(...lineItems.map((i) => i.x));
160
+ const text = lineItems.map((i) => i.str).join(' ');
161
+ allLines.push({
162
+ items: lineItems,
163
+ y: key,
164
+ page: pageNum - 1,
165
+ fontSize,
166
+ fontFamily,
167
+ fontName,
168
+ minX,
169
+ text,
170
+ });
171
+ }
172
+ }
173
+ return allLines;
174
+ }
175
+ // ============================================
176
+ // Font Size Detection
177
+ // ============================================
178
+ function detectBodyFontSize(lines) {
179
+ const sizes = lines.map((l) => Math.round(l.fontSize * 2) / 2);
180
+ return mode(sizes) || DEFAULT_FONT_SIZE;
181
+ }
182
+ function mode(arr) {
183
+ const freq = new Map();
184
+ for (const v of arr)
185
+ freq.set(v, (freq.get(v) || 0) + 1);
186
+ let maxCount = 0;
187
+ let maxVal = 0;
188
+ for (const [v, c] of freq) {
189
+ if (c > maxCount) {
190
+ maxCount = c;
191
+ maxVal = v;
192
+ }
193
+ }
194
+ return maxVal;
195
+ }
196
+ function modeStr(arr) {
197
+ const freq = new Map();
198
+ for (const v of arr)
199
+ freq.set(v, (freq.get(v) || 0) + 1);
200
+ let maxCount = 0;
201
+ let maxVal = '';
202
+ for (const [v, c] of freq) {
203
+ if (c > maxCount) {
204
+ maxCount = c;
205
+ maxVal = v;
206
+ }
207
+ }
208
+ return maxVal;
209
+ }
210
+ // ============================================
211
+ // Line Classification → MarkdownBlockNode[]
212
+ // ============================================
213
+ function classifyLines(lines, bodySize, options) {
214
+ const blocks = [];
215
+ const detectTables = options.detectTables !== false;
216
+ const detectCodeBlocks = options.detectCodeBlocks !== false;
217
+ const detectBlockquotes = options.detectBlockquotes !== false;
218
+ const _detectLinks = options.detectLinks !== false;
219
+ // Determine typical left margin (most common minX)
220
+ const leftMargins = lines.map((l) => Math.round(l.minX));
221
+ const typicalLeftMargin = mode(leftMargins) || 72;
222
+ let i = 0;
223
+ while (i < lines.length) {
224
+ const line = lines[i];
225
+ // --- Heading detection ---
226
+ if (line.fontSize >= IMPORT_HEADING_MIN_SIZE && line.fontSize > bodySize + 1) {
227
+ const depth = sizeToHeadingDepth(line.fontSize);
228
+ blocks.push({
229
+ type: 'heading',
230
+ depth,
231
+ children: buildInlineNodes(line, options),
232
+ });
233
+ i++;
234
+ continue;
235
+ }
236
+ // --- Code block detection (monospace font runs) ---
237
+ if (detectCodeBlocks && isMonospaceLine(line)) {
238
+ const codeLines = [];
239
+ while (i < lines.length && isMonospaceLine(lines[i])) {
240
+ codeLines.push(lines[i].text);
241
+ i++;
242
+ }
243
+ blocks.push({
244
+ type: 'code',
245
+ value: codeLines.join('\n'),
246
+ });
247
+ continue;
248
+ }
249
+ // --- Table detection (column-aligned consecutive lines) ---
250
+ if (detectTables && i + 1 < lines.length) {
251
+ const tableLines = tryDetectTable(lines, i, typicalLeftMargin);
252
+ if (tableLines > 0) {
253
+ const table = buildTable(lines.slice(i, i + tableLines), options);
254
+ if (table) {
255
+ blocks.push(table);
256
+ i += tableLines;
257
+ continue;
258
+ }
259
+ }
260
+ }
261
+ // --- List detection ---
262
+ const bulletMatch = tryMatchBullet(line.text);
263
+ const orderedMatch = line.text.match(IMPORT_ORDERED_PREFIX);
264
+ if (bulletMatch || orderedMatch) {
265
+ const listResult = consumeList(lines, i, typicalLeftMargin, bodySize, options);
266
+ blocks.push(listResult.list);
267
+ i = listResult.nextIndex;
268
+ continue;
269
+ }
270
+ // --- Blockquote detection (indented text) ---
271
+ if (detectBlockquotes && line.minX > typicalLeftMargin + 20) {
272
+ const quoteLines = [];
273
+ while (i < lines.length &&
274
+ lines[i].minX > typicalLeftMargin + 20 &&
275
+ !isMonospaceLine(lines[i]) &&
276
+ lines[i].fontSize <= bodySize + 1) {
277
+ quoteLines.push(lines[i]);
278
+ i++;
279
+ }
280
+ const quoteBlocks = quoteLines.map((ql) => ({
281
+ type: 'paragraph',
282
+ children: buildInlineNodes(ql, options),
283
+ }));
284
+ blocks.push({
285
+ type: 'blockquote',
286
+ children: quoteBlocks,
287
+ });
288
+ continue;
289
+ }
290
+ // --- Regular paragraph ---
291
+ // Merge consecutive body-sized lines on the same page with small y-gaps
292
+ const paraLines = [line];
293
+ i++;
294
+ while (i < lines.length) {
295
+ const next = lines[i];
296
+ // Same page, same-ish font size, close y (within line-height gap), not bullet/heading
297
+ if (next.page === line.page &&
298
+ Math.abs(next.fontSize - bodySize) <= 1 &&
299
+ !isMonospaceLine(next) &&
300
+ next.minX <= typicalLeftMargin + 15 &&
301
+ !tryMatchBullet(next.text) &&
302
+ !next.text.match(IMPORT_ORDERED_PREFIX)) {
303
+ // Check y-gap: lines are sorted top-to-bottom so y decreases
304
+ const yGap = paraLines[paraLines.length - 1].y - next.y;
305
+ const lineHeight = bodySize * 1.6;
306
+ if (yGap > 0 && yGap < lineHeight + IMPORT_PARAGRAPH_GAP) {
307
+ paraLines.push(next);
308
+ i++;
309
+ }
310
+ else {
311
+ break;
312
+ }
313
+ }
314
+ else {
315
+ break;
316
+ }
317
+ }
318
+ // Build paragraph from merged lines
319
+ const allInlines = [];
320
+ for (let j = 0; j < paraLines.length; j++) {
321
+ if (j > 0) {
322
+ allInlines.push({ type: 'text', value: ' ' });
323
+ }
324
+ allInlines.push(...buildInlineNodes(paraLines[j], options));
325
+ }
326
+ if (allInlines.length > 0) {
327
+ blocks.push({
328
+ type: 'paragraph',
329
+ children: mergeAdjacentText(allInlines),
330
+ });
331
+ }
332
+ }
333
+ return blocks;
334
+ }
335
+ // ============================================
336
+ // Heading Depth Mapping
337
+ // ============================================
338
+ function sizeToHeadingDepth(fontSize) {
339
+ for (const range of IMPORT_HEADING_SIZE_RANGES) {
340
+ if (fontSize >= range.min)
341
+ return range.depth;
342
+ }
343
+ return 6;
344
+ }
345
+ // ============================================
346
+ // Font Heuristics
347
+ // ============================================
348
+ /**
349
+ * Check if a line is predominantly monospace.
350
+ * Uses the resolved fontFamily from pdfjs styles first,
351
+ * falls back to fontName pattern matching for embedded fonts.
352
+ */
353
+ function isMonospaceLine(line) {
354
+ return isMonospaceFamily(line.fontFamily) || isMonospaceName(line.fontName);
355
+ }
356
+ /**
357
+ * Check if a text item is monospace.
358
+ */
359
+ function isMonospaceItem(item) {
360
+ return isMonospaceFamily(item.fontFamily) || isMonospaceName(item.fontName);
361
+ }
362
+ function isMonospaceFamily(fontFamily) {
363
+ const lower = fontFamily.toLowerCase();
364
+ return lower === 'monospace' || lower.includes('monospace');
365
+ }
366
+ function isMonospaceName(fontName) {
367
+ const lower = fontName.toLowerCase();
368
+ return (lower.includes('courier') ||
369
+ lower.includes('mono') ||
370
+ lower.includes('consolas') ||
371
+ lower.includes('menlo') ||
372
+ lower.includes('inconsolata') ||
373
+ lower.includes('firacode') ||
374
+ lower.includes('source code') ||
375
+ lower.includes('dejavu sans mono'));
376
+ }
377
+ function isBoldFont(fontName) {
378
+ const lower = fontName.toLowerCase();
379
+ return lower.includes('bold') || lower.includes('black') || lower.includes('heavy');
380
+ }
381
+ function isItalicFont(fontName) {
382
+ const lower = fontName.toLowerCase();
383
+ return lower.includes('italic') || lower.includes('oblique') || lower.includes('slanted');
384
+ }
385
+ // ============================================
386
+ // Inline Node Construction
387
+ // ============================================
388
+ function buildInlineNodes(line, options) {
389
+ const nodes = [];
390
+ const detectLinksOpt = options.detectLinks !== false;
391
+ for (const item of line.items) {
392
+ const text = item.str;
393
+ if (!text || text.trim().length === 0)
394
+ continue;
395
+ const bold = isBoldFont(item.fontName);
396
+ const italic = isItalicFont(item.fontName);
397
+ const mono = isMonospaceItem(item);
398
+ let inlineNodes;
399
+ if (mono) {
400
+ inlineNodes = [{ type: 'inlineCode', value: text }];
401
+ }
402
+ else if (detectLinksOpt) {
403
+ inlineNodes = splitTextWithLinks(text);
404
+ }
405
+ else {
406
+ inlineNodes = [{ type: 'text', value: text }];
407
+ }
408
+ // Wrap in formatting
409
+ for (const node of inlineNodes) {
410
+ let wrapped = node;
411
+ if (italic) {
412
+ wrapped = { type: 'emphasis', children: [wrapped] };
413
+ }
414
+ if (bold) {
415
+ wrapped = { type: 'strong', children: [wrapped] };
416
+ }
417
+ nodes.push(wrapped);
418
+ }
419
+ }
420
+ return nodes;
421
+ }
422
+ /**
423
+ * Split a text string into text nodes and link nodes wherever
424
+ * URL patterns are found.
425
+ */
426
+ function splitTextWithLinks(text) {
427
+ const nodes = [];
428
+ let lastIndex = 0;
429
+ // Reset regex state
430
+ IMPORT_URL_PATTERN.lastIndex = 0;
431
+ let match;
432
+ while ((match = IMPORT_URL_PATTERN.exec(text)) !== null) {
433
+ // Text before URL
434
+ if (match.index > lastIndex) {
435
+ nodes.push({ type: 'text', value: text.slice(lastIndex, match.index) });
436
+ }
437
+ // URL as link
438
+ const url = match[0];
439
+ nodes.push({
440
+ type: 'link',
441
+ url,
442
+ children: [{ type: 'text', value: url }],
443
+ });
444
+ lastIndex = match.index + url.length;
445
+ }
446
+ // Remaining text
447
+ if (lastIndex < text.length) {
448
+ nodes.push({ type: 'text', value: text.slice(lastIndex) });
449
+ }
450
+ return nodes.length > 0 ? nodes : [{ type: 'text', value: text }];
451
+ }
452
+ // ============================================
453
+ // List Detection
454
+ // ============================================
455
+ function tryMatchBullet(text) {
456
+ if (text.length === 0)
457
+ return false;
458
+ return IMPORT_BULLET_CHARS.has(text[0]) || IMPORT_BULLET_CHARS.has(text.trimStart()[0]);
459
+ }
460
+ function stripBullet(text) {
461
+ const trimmed = text.trimStart();
462
+ if (IMPORT_BULLET_CHARS.has(trimmed[0])) {
463
+ return trimmed.slice(1).trimStart();
464
+ }
465
+ return text;
466
+ }
467
+ function stripOrderedPrefix(text) {
468
+ return text.replace(IMPORT_ORDERED_PREFIX, '');
469
+ }
470
+ function consumeList(lines, startIdx, _typicalLeftMargin, _bodySize, _options) {
471
+ const firstLine = lines[startIdx];
472
+ const isOrdered = !!firstLine.text.match(IMPORT_ORDERED_PREFIX);
473
+ const items = [];
474
+ let i = startIdx;
475
+ while (i < lines.length) {
476
+ const line = lines[i];
477
+ const isBullet = tryMatchBullet(line.text);
478
+ const isOrd = !!line.text.match(IMPORT_ORDERED_PREFIX);
479
+ if (!isBullet && !isOrd)
480
+ break;
481
+ // All items in one list should be same type
482
+ if (isOrdered && !isOrd)
483
+ break;
484
+ if (!isOrdered && !isBullet)
485
+ break;
486
+ const cleanText = isOrdered ? stripOrderedPrefix(line.text) : stripBullet(line.text);
487
+ const para = {
488
+ type: 'paragraph',
489
+ children: splitTextWithLinks(cleanText),
490
+ };
491
+ items.push({
492
+ type: 'listItem',
493
+ children: [para],
494
+ });
495
+ i++;
496
+ }
497
+ return {
498
+ list: {
499
+ type: 'list',
500
+ ordered: isOrdered,
501
+ children: items,
502
+ },
503
+ nextIndex: i,
504
+ };
505
+ }
506
+ // ============================================
507
+ // Table Detection
508
+ // ============================================
509
+ /**
510
+ * Look ahead from index `start` and return the number of consecutive
511
+ * lines that form an aligned table, or 0 if no table detected.
512
+ */
513
+ function tryDetectTable(lines, start, _typicalLeftMargin) {
514
+ // A table needs multiple items per line (columns) on consecutive lines
515
+ // with roughly the same x-alignment pattern.
516
+ const firstLine = lines[start];
517
+ if (firstLine.items.length < 2)
518
+ return 0;
519
+ const cols = getColumnPositions(firstLine);
520
+ if (cols.length < 2)
521
+ return 0;
522
+ let count = 1;
523
+ for (let i = start + 1; i < lines.length; i++) {
524
+ const line = lines[i];
525
+ if (line.items.length < 2)
526
+ break;
527
+ // Check if this line's columns align with the first line's
528
+ const lineCols = getColumnPositions(line);
529
+ if (lineCols.length !== cols.length)
530
+ break;
531
+ let aligned = true;
532
+ for (let c = 0; c < cols.length; c++) {
533
+ if (Math.abs(lineCols[c] - cols[c]) > IMPORT_COLUMN_TOLERANCE) {
534
+ aligned = false;
535
+ break;
536
+ }
537
+ }
538
+ if (!aligned)
539
+ break;
540
+ count++;
541
+ }
542
+ return count >= IMPORT_TABLE_MIN_ROWS ? count : 0;
543
+ }
544
+ function getColumnPositions(line) {
545
+ // Cluster item x-positions
546
+ const positions = [];
547
+ for (const item of line.items) {
548
+ const x = Math.round(item.x);
549
+ // Check if this x is close to an existing column
550
+ let found = false;
551
+ for (const p of positions) {
552
+ if (Math.abs(p - x) < IMPORT_COLUMN_TOLERANCE) {
553
+ found = true;
554
+ break;
555
+ }
556
+ }
557
+ if (!found)
558
+ positions.push(x);
559
+ }
560
+ return positions.sort((a, b) => a - b);
561
+ }
562
+ function buildTable(lines, _options) {
563
+ if (lines.length === 0)
564
+ return null;
565
+ // Use the first line's column positions as anchors
566
+ const cols = getColumnPositions(lines[0]);
567
+ if (cols.length < 2)
568
+ return null;
569
+ const rows = [];
570
+ for (let ri = 0; ri < lines.length; ri++) {
571
+ const line = lines[ri];
572
+ const cells = [];
573
+ for (let ci = 0; ci < cols.length; ci++) {
574
+ const colLeft = cols[ci] - IMPORT_COLUMN_TOLERANCE;
575
+ const colRight = ci + 1 < cols.length ? cols[ci + 1] - IMPORT_COLUMN_TOLERANCE : Infinity;
576
+ // Collect items in this column
577
+ const cellItems = line.items.filter((item) => item.x >= colLeft && item.x < colRight);
578
+ const text = cellItems
579
+ .map((i) => i.str)
580
+ .join(' ')
581
+ .trim();
582
+ cells.push({
583
+ type: 'tableCell',
584
+ isHeader: ri === 0,
585
+ children: text.length > 0 ? [{ type: 'text', value: text }] : [],
586
+ });
587
+ }
588
+ rows.push({
589
+ type: 'tableRow',
590
+ children: cells,
591
+ });
592
+ }
593
+ return {
594
+ type: 'table',
595
+ children: rows,
596
+ };
597
+ }
598
+ // ============================================
599
+ // Text Merging
600
+ // ============================================
601
+ /**
602
+ * Merge adjacent text nodes to reduce fragmentation.
603
+ */
604
+ function mergeAdjacentText(nodes) {
605
+ if (nodes.length <= 1)
606
+ return nodes;
607
+ const result = [];
608
+ for (const node of nodes) {
609
+ const prev = result[result.length - 1];
610
+ if (prev && prev.type === 'text' && node.type === 'text') {
611
+ prev.value += node.value;
612
+ }
613
+ else {
614
+ result.push(node);
615
+ }
616
+ }
617
+ return result;
618
+ }
619
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/pdf/import.ts"],"names":[],"mappings":"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"}