ai-document-parser 0.1.101

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 (104) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSES.md +26 -0
  3. package/README.md +106 -0
  4. package/dist/cli.d.ts +3 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +124 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/convert/converter.d.ts +7 -0
  9. package/dist/convert/converter.d.ts.map +1 -0
  10. package/dist/convert/converter.js +201 -0
  11. package/dist/convert/converter.js.map +1 -0
  12. package/dist/convert/emit.d.ts +15 -0
  13. package/dist/convert/emit.d.ts.map +1 -0
  14. package/dist/convert/emit.js +95 -0
  15. package/dist/convert/emit.js.map +1 -0
  16. package/dist/convert/index.d.ts +2 -0
  17. package/dist/convert/index.d.ts.map +1 -0
  18. package/dist/convert/index.js +2 -0
  19. package/dist/convert/index.js.map +1 -0
  20. package/dist/edit/docx-ooxml.d.ts +13 -0
  21. package/dist/edit/docx-ooxml.d.ts.map +1 -0
  22. package/dist/edit/docx-ooxml.js +182 -0
  23. package/dist/edit/docx-ooxml.js.map +1 -0
  24. package/dist/edit/index.d.ts +8 -0
  25. package/dist/edit/index.d.ts.map +1 -0
  26. package/dist/edit/index.js +26 -0
  27. package/dist/edit/index.js.map +1 -0
  28. package/dist/edit/spreadsheet.d.ts +19 -0
  29. package/dist/edit/spreadsheet.d.ts.map +1 -0
  30. package/dist/edit/spreadsheet.js +123 -0
  31. package/dist/edit/spreadsheet.js.map +1 -0
  32. package/dist/fonts/DejaVuSans.ttf +0 -0
  33. package/dist/fonts/LICENSE-DejaVu.txt +2 -0
  34. package/dist/index.d.ts +12 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +11 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/parse/detect.d.ts +19 -0
  39. package/dist/parse/detect.d.ts.map +1 -0
  40. package/dist/parse/detect.js +109 -0
  41. package/dist/parse/detect.js.map +1 -0
  42. package/dist/parse/formats.d.ts +14 -0
  43. package/dist/parse/formats.d.ts.map +1 -0
  44. package/dist/parse/formats.js +23 -0
  45. package/dist/parse/formats.js.map +1 -0
  46. package/dist/parse/index.d.ts +4 -0
  47. package/dist/parse/index.d.ts.map +1 -0
  48. package/dist/parse/index.js +4 -0
  49. package/dist/parse/index.js.map +1 -0
  50. package/dist/parse/legacy-doc.d.ts +15 -0
  51. package/dist/parse/legacy-doc.d.ts.map +1 -0
  52. package/dist/parse/legacy-doc.js +100 -0
  53. package/dist/parse/legacy-doc.js.map +1 -0
  54. package/dist/parse/pdf.d.ts +8 -0
  55. package/dist/parse/pdf.d.ts.map +1 -0
  56. package/dist/parse/pdf.js +34 -0
  57. package/dist/parse/pdf.js.map +1 -0
  58. package/dist/parse/pptx.d.ts +7 -0
  59. package/dist/parse/pptx.d.ts.map +1 -0
  60. package/dist/parse/pptx.js +107 -0
  61. package/dist/parse/pptx.js.map +1 -0
  62. package/dist/parse/router.d.ts +7 -0
  63. package/dist/parse/router.d.ts.map +1 -0
  64. package/dist/parse/router.js +286 -0
  65. package/dist/parse/router.js.map +1 -0
  66. package/dist/parse/text-formats.d.ts +19 -0
  67. package/dist/parse/text-formats.d.ts.map +1 -0
  68. package/dist/parse/text-formats.js +82 -0
  69. package/dist/parse/text-formats.js.map +1 -0
  70. package/dist/types.d.ts +105 -0
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +5 -0
  73. package/dist/types.js.map +1 -0
  74. package/dist/utils/errors.d.ts +8 -0
  75. package/dist/utils/errors.d.ts.map +1 -0
  76. package/dist/utils/errors.js +17 -0
  77. package/dist/utils/errors.js.map +1 -0
  78. package/dist/utils/paths.d.ts +4 -0
  79. package/dist/utils/paths.d.ts.map +1 -0
  80. package/dist/utils/paths.js +20 -0
  81. package/dist/utils/paths.js.map +1 -0
  82. package/dist/utils/text.d.ts +5 -0
  83. package/dist/utils/text.d.ts.map +1 -0
  84. package/dist/utils/text.js +16 -0
  85. package/dist/utils/text.js.map +1 -0
  86. package/dist/write/docx.d.ts +4 -0
  87. package/dist/write/docx.d.ts.map +1 -0
  88. package/dist/write/docx.js +31 -0
  89. package/dist/write/docx.js.map +1 -0
  90. package/dist/write/index.d.ts +9 -0
  91. package/dist/write/index.d.ts.map +1 -0
  92. package/dist/write/index.js +38 -0
  93. package/dist/write/index.js.map +1 -0
  94. package/dist/write/pdf.d.ts +4 -0
  95. package/dist/write/pdf.d.ts.map +1 -0
  96. package/dist/write/pdf.js +70 -0
  97. package/dist/write/pdf.js.map +1 -0
  98. package/dist/write/spreadsheet.d.ts +2 -0
  99. package/dist/write/spreadsheet.d.ts.map +1 -0
  100. package/dist/write/spreadsheet.js +2 -0
  101. package/dist/write/spreadsheet.js.map +1 -0
  102. package/fonts/DejaVuSans.ttf +0 -0
  103. package/fonts/LICENSE-DejaVu.txt +2 -0
  104. package/package.json +88 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/convert/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { DocxStructured } from '../types.js';
2
+ export declare function escapeXml(text: string): string;
3
+ export declare function editDocx(filePath: string, oldString: string, newString: string, replaceAll: boolean): Promise<{
4
+ message: string;
5
+ changes: number;
6
+ }>;
7
+ export declare function appendDocxParagraphs(filePath: string, paragraphs: string[]): Promise<{
8
+ message: string;
9
+ changes: number;
10
+ }>;
11
+ export declare function readDocxStructured(filePath: string): Promise<DocxStructured>;
12
+ export declare function readDocxStructuredFromBuffer(buf: Buffer): Promise<DocxStructured>;
13
+ //# sourceMappingURL=docx-ooxml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docx-ooxml.d.ts","sourceRoot":"","sources":["../../src/edit/docx-ooxml.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQlD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO9C;AA4HD,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,OAAO,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAyC/C;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA4B/C;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,CAAC,CASzB;AAED,wBAAsB,4BAA4B,CAChD,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,cAAc,CAAC,CAQzB"}
@@ -0,0 +1,182 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import JSZip from 'jszip';
3
+ import { DocumentError } from '../utils/errors.js';
4
+ const DOC_PARTS = [
5
+ 'word/document.xml',
6
+ /^word\/header\d*\.xml$/,
7
+ /^word\/footer\d*\.xml$/,
8
+ ];
9
+ export function escapeXml(text) {
10
+ return text
11
+ .replace(/&/g, '&amp;')
12
+ .replace(/</g, '&lt;')
13
+ .replace(/>/g, '&gt;')
14
+ .replace(/"/g, '&quot;')
15
+ .replace(/'/g, '&apos;');
16
+ }
17
+ function decodeXmlEntities(s) {
18
+ return s
19
+ .replace(/&lt;/g, '<')
20
+ .replace(/&gt;/g, '>')
21
+ .replace(/&quot;/g, '"')
22
+ .replace(/&apos;/g, "'")
23
+ .replace(/&amp;/g, '&');
24
+ }
25
+ function paragraphTextsFromXml(xml) {
26
+ const paragraphs = [];
27
+ const paraRegex = /<w:p[\s\S]*?<\/w:p>/g;
28
+ let pm;
29
+ while ((pm = paraRegex.exec(xml)) !== null) {
30
+ const wtRegex = /<w:t(?:\s[^>]*)?>([^<]*)<\/w:t>/g;
31
+ const parts = [];
32
+ let tm;
33
+ while ((tm = wtRegex.exec(pm[0])) !== null) {
34
+ parts.push(decodeXmlEntities(tm[1]));
35
+ }
36
+ const text = parts.join('').trim();
37
+ if (text)
38
+ paragraphs.push(text);
39
+ }
40
+ return paragraphs;
41
+ }
42
+ function isDocPart(name) {
43
+ return DOC_PARTS.some((p) => typeof p === 'string' ? name === p : p.test(name));
44
+ }
45
+ async function loadZip(filePath) {
46
+ const buf = await readFile(filePath);
47
+ return JSZip.loadAsync(buf);
48
+ }
49
+ function replaceInParagraphXml(paraXml, oldString, newString, replaceAll) {
50
+ const wtRegex = /<w:t(?:\s[^>]*)?>([^<]*)<\/w:t>/g;
51
+ const runs = [];
52
+ let m;
53
+ while ((m = wtRegex.exec(paraXml)) !== null) {
54
+ runs.push({ full: m[0], text: m[1] });
55
+ }
56
+ if (runs.length === 0) {
57
+ return { xml: paraXml, count: 0 };
58
+ }
59
+ const combined = runs.map((r) => r.text).join('');
60
+ if (!combined.includes(oldString)) {
61
+ return { xml: paraXml, count: 0 };
62
+ }
63
+ let count = 0;
64
+ let updatedCombined = combined;
65
+ if (replaceAll) {
66
+ const parts = combined.split(oldString);
67
+ count = parts.length - 1;
68
+ updatedCombined = parts.join(newString);
69
+ }
70
+ else {
71
+ const idx = combined.indexOf(oldString);
72
+ if (idx === -1)
73
+ return { xml: paraXml, count: 0 };
74
+ count = 1;
75
+ updatedCombined =
76
+ combined.slice(0, idx) +
77
+ newString +
78
+ combined.slice(idx + oldString.length);
79
+ }
80
+ const escaped = escapeXml(updatedCombined);
81
+ const newRun = `<w:r><w:t xml:space="preserve">${escaped}</w:t></w:r>`;
82
+ const pPrMatch = paraXml.match(/<w:pPr[\s\S]*?<\/w:pPr>/);
83
+ const pPr = pPrMatch ? pPrMatch[0] : '';
84
+ return { xml: `<w:p>${pPr}${newRun}</w:p>`, count };
85
+ }
86
+ function replaceInDocumentXml(xml, oldString, newString, replaceAll) {
87
+ const paraRegex = /<w:p[\s\S]*?<\/w:p>/g;
88
+ let total = 0;
89
+ const result = xml.replace(paraRegex, (para) => {
90
+ const { xml: next, count } = replaceInParagraphXml(para, oldString, newString, replaceAll);
91
+ total += count;
92
+ return next;
93
+ });
94
+ if (total === 0 && xml.includes(oldString)) {
95
+ if (replaceAll) {
96
+ const parts = xml.split(oldString);
97
+ if (parts.length > 1) {
98
+ return { xml: parts.join(escapeXml(newString)), count: parts.length - 1 };
99
+ }
100
+ }
101
+ const idx = xml.indexOf(oldString);
102
+ if (idx !== -1) {
103
+ return {
104
+ xml: xml.slice(0, idx) +
105
+ escapeXml(newString) +
106
+ xml.slice(idx + oldString.length),
107
+ count: 1,
108
+ };
109
+ }
110
+ }
111
+ return { xml: result, count: total };
112
+ }
113
+ export async function editDocx(filePath, oldString, newString, replaceAll) {
114
+ if (!oldString) {
115
+ throw new DocumentError('INVALID_ARGUMENT', 'oldString cannot be empty');
116
+ }
117
+ const zip = await loadZip(filePath);
118
+ let total = 0;
119
+ for (const name of Object.keys(zip.files)) {
120
+ if (!isDocPart(name) || zip.files[name].dir)
121
+ continue;
122
+ const xml = await zip.file(name).async('string');
123
+ const { xml: next, count } = replaceInDocumentXml(xml, oldString, newString, replaceAll);
124
+ total += count;
125
+ zip.file(name, next);
126
+ }
127
+ if (total === 0) {
128
+ throw new DocumentError('EDIT_TARGET_NOT_FOUND', 'Text not found in docx. Parse with output:"structured" and refine oldString.');
129
+ }
130
+ if (total > 1 && !replaceAll) {
131
+ throw new DocumentError('MULTIPLE_MATCHES', `Found ${total} matches. Narrow oldString or set replaceAll: true.`);
132
+ }
133
+ const { writeFile } = await import('node:fs/promises');
134
+ const out = await zip.generateAsync({ type: 'nodebuffer' });
135
+ await writeFile(filePath, out);
136
+ return {
137
+ message: `DOCX updated: ${filePath} (${total} replacement(s); formatting partially preserved)`,
138
+ changes: total,
139
+ };
140
+ }
141
+ export async function appendDocxParagraphs(filePath, paragraphs) {
142
+ const zip = await loadZip(filePath);
143
+ const docFile = zip.file('word/document.xml');
144
+ if (!docFile) {
145
+ throw new DocumentError('PARSE_FAILED', 'Invalid docx: missing word/document.xml');
146
+ }
147
+ let xml = await docFile.async('string');
148
+ const blocks = paragraphs
149
+ .map((p) => `<w:p><w:r><w:t xml:space="preserve">${escapeXml(p || ' ')}</w:t></w:r></w:p>`)
150
+ .join('');
151
+ if (!xml.includes('</w:body>')) {
152
+ throw new DocumentError('PARSE_FAILED', 'Could not find w:body in document.xml');
153
+ }
154
+ xml = xml.replace('</w:body>', `${blocks}</w:body>`);
155
+ zip.file('word/document.xml', xml);
156
+ const { writeFile } = await import('node:fs/promises');
157
+ const out = await zip.generateAsync({ type: 'nodebuffer' });
158
+ await writeFile(filePath, out);
159
+ return {
160
+ message: `DOCX: appended ${paragraphs.length} paragraph(s) to ${filePath}`,
161
+ changes: paragraphs.length,
162
+ };
163
+ }
164
+ export async function readDocxStructured(filePath) {
165
+ const zip = await loadZip(filePath);
166
+ const docFile = zip.file('word/document.xml');
167
+ if (!docFile) {
168
+ throw new DocumentError('PARSE_FAILED', 'Invalid docx: missing word/document.xml');
169
+ }
170
+ const xml = await docFile.async('string');
171
+ return { format: 'docx', paragraphs: paragraphTextsFromXml(xml) };
172
+ }
173
+ export async function readDocxStructuredFromBuffer(buf) {
174
+ const zip = await JSZip.loadAsync(buf);
175
+ const docFile = zip.file('word/document.xml');
176
+ if (!docFile) {
177
+ throw new DocumentError('PARSE_FAILED', 'Invalid docx: missing word/document.xml');
178
+ }
179
+ const xml = await docFile.async('string');
180
+ return { format: 'docx', paragraphs: paragraphTextsFromXml(xml) };
181
+ }
182
+ //# sourceMappingURL=docx-ooxml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docx-ooxml.js","sourceRoot":"","sources":["../../src/edit/docx-ooxml.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { EditDocumentOp, EditResult } from '../types.js';
2
+ /**
3
+ * Surgically edit an existing docx or spreadsheet without full regeneration.
4
+ */
5
+ export declare function editDocument(filePath: string, op: EditDocumentOp): Promise<EditResult>;
6
+ export { editDocx, appendDocxParagraphs, readDocxStructured, escapeXml, } from './docx-ooxml.js';
7
+ export { updateSpreadsheetCells, readSpreadsheetStructured, readSpreadsheetStructuredAsync, type CellUpdate, type SheetGrid, } from './spreadsheet.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/edit/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAO9D;;GAEG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,cAAc,GACjB,OAAO,CAAC,UAAU,CAAC,CA0BrB;AAED,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,kBAAkB,EAClB,SAAS,GACV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,8BAA8B,EAC9B,KAAK,UAAU,EACf,KAAK,SAAS,GACf,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { DocumentError } from '../utils/errors.js';
2
+ import { appendDocxParagraphs, editDocx, } from './docx-ooxml.js';
3
+ import { updateSpreadsheetCells } from './spreadsheet.js';
4
+ /**
5
+ * Surgically edit an existing docx or spreadsheet without full regeneration.
6
+ */
7
+ export async function editDocument(filePath, op) {
8
+ if (op.type === 'docx') {
9
+ if (op.op === 'replace') {
10
+ const result = await editDocx(filePath, op.oldString, op.newString, op.replaceAll ?? false);
11
+ return { path: filePath, message: result.message, changes: result.changes };
12
+ }
13
+ if (op.op === 'append') {
14
+ const result = await appendDocxParagraphs(filePath, op.paragraphs);
15
+ return { path: filePath, message: result.message, changes: result.changes };
16
+ }
17
+ }
18
+ if (op.type === 'spreadsheet' && op.op === 'patchCells') {
19
+ const result = await updateSpreadsheetCells(filePath, op.updates);
20
+ return { path: filePath, message: result.message, changes: result.changes };
21
+ }
22
+ throw new DocumentError('INVALID_ARGUMENT', `Unsupported edit operation: ${JSON.stringify(op)}`);
23
+ }
24
+ export { editDocx, appendDocxParagraphs, readDocxStructured, escapeXml, } from './docx-ooxml.js';
25
+ export { updateSpreadsheetCells, readSpreadsheetStructured, readSpreadsheetStructuredAsync, } from './spreadsheet.js';
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/edit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EACL,oBAAoB,EACpB,QAAQ,GACT,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,EAAkB;IAElB,IAAI,EAAE,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACvB,IAAI,EAAE,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B,QAAQ,EACR,EAAE,CAAC,SAAS,EACZ,EAAE,CAAC,SAAS,EACZ,EAAE,CAAC,UAAU,IAAI,KAAK,CACvB,CAAC;YACF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QAC9E,CAAC;QACD,IAAI,EAAE,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;YACnE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,IAAI,EAAE,CAAC,IAAI,KAAK,aAAa,IAAI,EAAE,CAAC,EAAE,KAAK,YAAY,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;QAClE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IAC9E,CAAC;IAED,MAAM,IAAI,aAAa,CACrB,kBAAkB,EAClB,+BAA+B,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CACpD,CAAC;AACJ,CAAC;AAED,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,kBAAkB,EAClB,SAAS,GACV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,8BAA8B,GAG/B,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { SpreadsheetStructured } from '../types.js';
2
+ export type SheetGrid = Record<string, (string | number | boolean | null)[][]>;
3
+ export type CellUpdate = {
4
+ sheet?: string;
5
+ cell: string;
6
+ value: string | number | boolean | null;
7
+ };
8
+ export declare function writeSpreadsheet(filePath: string, sheets: SheetGrid): Promise<{
9
+ message: string;
10
+ }>;
11
+ export declare function updateSpreadsheetCells(filePath: string, updates: CellUpdate[]): Promise<{
12
+ message: string;
13
+ changes: number;
14
+ }>;
15
+ export declare function readSpreadsheetStructured(filePath: string): SpreadsheetStructured;
16
+ export declare function readSpreadsheetStructuredAsync(filePath: string): Promise<SpreadsheetStructured>;
17
+ export declare function readSpreadsheetStructuredFromBuffer(buf: Buffer, format?: 'xlsx' | 'xls'): SpreadsheetStructured;
18
+ export declare function spreadsheetToText(structured: SpreadsheetStructured): string;
19
+ //# sourceMappingURL=spreadsheet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spreadsheet.d.ts","sourceRoot":"","sources":["../../src/edit/spreadsheet.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AAE/E,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;CACzC,CAAC;AAsDF,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAY9B;AAED,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,UAAU,EAAE,GACpB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAoB/C;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,qBAAqB,CAGjF;AAED,wBAAsB,8BAA8B,CAClD,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,CAAC,CAGhC;AAED,wBAAgB,mCAAmC,CACjD,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,MAAM,GAAG,KAAc,GAC9B,qBAAqB,CAOvB;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,qBAAqB,GAAG,MAAM,CAS3E"}
@@ -0,0 +1,123 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { readFile, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import * as XLSX from '@e965/xlsx';
5
+ import { DocumentError } from '../utils/errors.js';
6
+ import { ensureParentDir } from '../utils/paths.js';
7
+ import { csvEscapeCell } from '../utils/text.js';
8
+ function bookTypeFor(filePath) {
9
+ return path.extname(filePath).toLowerCase() === '.xls' ? 'biff8' : 'xlsx';
10
+ }
11
+ function formatFor(filePath) {
12
+ return path.extname(filePath).toLowerCase() === '.xls' ? 'xls' : 'xlsx';
13
+ }
14
+ function coerceValue(v) {
15
+ if (v === null || v === undefined)
16
+ return null;
17
+ if (typeof v === 'boolean' || typeof v === 'number')
18
+ return v;
19
+ const s = String(v);
20
+ if (s === 'true')
21
+ return true;
22
+ if (s === 'false')
23
+ return false;
24
+ const n = Number(s);
25
+ if (s !== '' && !Number.isNaN(n) && String(n) === s)
26
+ return n;
27
+ return s;
28
+ }
29
+ function cellObject(value) {
30
+ if (value === null)
31
+ return { t: 'z' };
32
+ if (typeof value === 'boolean')
33
+ return { t: 'b', v: value };
34
+ if (typeof value === 'number')
35
+ return { t: 'n', v: value };
36
+ return { t: 's', v: value };
37
+ }
38
+ async function writeWorkbook(filePath, wb) {
39
+ const bookType = bookTypeFor(filePath);
40
+ const data = XLSX.write(wb, { type: 'buffer', bookType });
41
+ await writeFile(filePath, data);
42
+ }
43
+ /** Expand worksheet !ref so a patched A1 address is included. */
44
+ function ensureCellInRange(ws, address) {
45
+ const cell = XLSX.utils.decode_cell(address);
46
+ const range = ws['!ref']
47
+ ? XLSX.utils.decode_range(ws['!ref'])
48
+ : { s: { c: cell.c, r: cell.r }, e: { c: cell.c, r: cell.r } };
49
+ if (cell.c < range.s.c)
50
+ range.s.c = cell.c;
51
+ if (cell.r < range.s.r)
52
+ range.s.r = cell.r;
53
+ if (cell.c > range.e.c)
54
+ range.e.c = cell.c;
55
+ if (cell.r > range.e.r)
56
+ range.e.r = cell.r;
57
+ ws['!ref'] = XLSX.utils.encode_range(range);
58
+ }
59
+ function sheetToGrid(ws) {
60
+ return XLSX.utils.sheet_to_json(ws, {
61
+ header: 1,
62
+ defval: null,
63
+ });
64
+ }
65
+ export async function writeSpreadsheet(filePath, sheets) {
66
+ await ensureParentDir(filePath);
67
+ const wb = XLSX.utils.book_new();
68
+ for (const [name, rows] of Object.entries(sheets)) {
69
+ const ws = XLSX.utils.aoa_to_sheet(rows.map((row) => row.map((c) => (c === null ? '' : coerceValue(c)))));
70
+ XLSX.utils.book_append_sheet(wb, ws, name.slice(0, 31));
71
+ }
72
+ await writeWorkbook(filePath, wb);
73
+ const label = bookTypeFor(filePath) === 'biff8' ? 'XLS' : 'XLSX';
74
+ return { message: `Created ${label}: ${filePath}` };
75
+ }
76
+ export async function updateSpreadsheetCells(filePath, updates) {
77
+ const buf = await readFile(filePath);
78
+ const wb = XLSX.read(buf, { type: 'buffer' });
79
+ let count = 0;
80
+ for (const u of updates) {
81
+ const sheetName = u.sheet ?? wb.SheetNames[0];
82
+ const ws = wb.Sheets[sheetName];
83
+ if (!ws) {
84
+ throw new DocumentError('INVALID_ARGUMENT', `Sheet not found: ${sheetName}`);
85
+ }
86
+ const addr = u.cell.trim().toUpperCase();
87
+ if (!/^[A-Z]+\d+$/.test(addr)) {
88
+ throw new DocumentError('INVALID_ARGUMENT', `Invalid cell address: ${u.cell}`);
89
+ }
90
+ ensureCellInRange(ws, addr);
91
+ ws[addr] = cellObject(coerceValue(u.value));
92
+ count++;
93
+ }
94
+ await writeWorkbook(filePath, wb);
95
+ return { message: `Updated ${count} cell(s) in ${filePath}`, changes: count };
96
+ }
97
+ export function readSpreadsheetStructured(filePath) {
98
+ const buf = readFileSync(filePath);
99
+ return readSpreadsheetStructuredFromBuffer(buf, formatFor(filePath));
100
+ }
101
+ export async function readSpreadsheetStructuredAsync(filePath) {
102
+ const buf = await readFile(filePath);
103
+ return readSpreadsheetStructuredFromBuffer(buf, formatFor(filePath));
104
+ }
105
+ export function readSpreadsheetStructuredFromBuffer(buf, format = 'xlsx') {
106
+ const wb = XLSX.read(buf, { type: 'buffer' });
107
+ const sheets = {};
108
+ for (const name of wb.SheetNames) {
109
+ sheets[name] = sheetToGrid(wb.Sheets[name]);
110
+ }
111
+ return { format, sheets };
112
+ }
113
+ export function spreadsheetToText(structured) {
114
+ const parts = [];
115
+ for (const [name, rows] of Object.entries(structured.sheets)) {
116
+ const csv = rows
117
+ .map((row) => row.map((c) => csvEscapeCell(c)).join(','))
118
+ .join('\n');
119
+ parts.push(`## ${name}\n${csv}`);
120
+ }
121
+ return parts.join('\n\n');
122
+ }
123
+ //# sourceMappingURL=spreadsheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spreadsheet.js","sourceRoot":"","sources":["../../src/edit/spreadsheet.ts"],"names":[],"mappings":"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"}
Binary file
@@ -0,0 +1,2 @@
1
+ DejaVu Sans (DejaVuSans.ttf) — fonts from the DejaVu project.
2
+ See https://dejavu-fonts.github.io/ for license terms (Bitstream Vera / Arev Fonts / Public Domain).
@@ -0,0 +1,12 @@
1
+ /**
2
+ * ai-document-parser — parse, convert, edit, and write office documents.
3
+ *
4
+ * Import from this package root (or subpaths).
5
+ */
6
+ export { parseDocument, convertDocToDocx } from './parse/index.js';
7
+ export { convertDocument } from './convert/index.js';
8
+ export { editDocument, editDocx, appendDocxParagraphs, readDocxStructured, updateSpreadsheetCells, readSpreadsheetStructured, } from './edit/index.js';
9
+ export { writeDocument, writeDocx, writePdf, writeSpreadsheet } from './write/index.js';
10
+ export { DocumentError } from './utils/errors.js';
11
+ export type { ParseOptions, ParseOutputMode, ConvertFormat, ConvertOptions, ConvertResult, DocumentInput, DocumentResult, DocumentWarning, DocxStructured, SpreadsheetStructured, LegacyDocStructured, PptxStructured, EditDocumentOp, EditResult, WriteDocumentInput, WriteResult, DocumentErrorCode, } from './types.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,YAAY,EACV,YAAY,EACZ,eAAe,EACf,aAAa,EACb,cAAc,EACd,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,EACf,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,WAAW,EACX,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ /**
2
+ * ai-document-parser — parse, convert, edit, and write office documents.
3
+ *
4
+ * Import from this package root (or subpaths).
5
+ */
6
+ export { parseDocument, convertDocToDocx } from './parse/index.js';
7
+ export { convertDocument } from './convert/index.js';
8
+ export { editDocument, editDocx, appendDocxParagraphs, readDocxStructured, updateSpreadsheetCells, readSpreadsheetStructured, } from './edit/index.js';
9
+ export { writeDocument, writeDocx, writePdf, writeSpreadsheet } from './write/index.js';
10
+ export { DocumentError } from './utils/errors.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,19 @@
1
+ export type DetectedFormat = 'docx' | 'xlsx' | 'xls' | 'pdf' | 'md' | 'html' | 'csv' | 'doc' | 'pptx' | 'unknown';
2
+ export declare function formatFromExt(filePath: string | undefined): DetectedFormat | null;
3
+ export declare function isZipBuffer(buf: Buffer): boolean;
4
+ /**
5
+ * Detect format from magic bytes, then UTF-8 text heuristics for buffers
6
+ * without a binary signature.
7
+ * ZIP containers return a provisional `'docx'`; callers with a buffer should
8
+ * follow up with `refineZipFormat` when the extension is unknown.
9
+ */
10
+ export declare function detectFormatFromBuffer(buf: Buffer): DetectedFormat | null;
11
+ /**
12
+ * Distinguish OOXML ZIP packages (docx / xlsx / pptx) via package parts
13
+ * and `[Content_Types].xml`.
14
+ */
15
+ export declare function refineZipFormat(buf: Buffer): Promise<DetectedFormat>;
16
+ /** Detect format for a raw string that is not a filesystem path. */
17
+ export declare function detectFormatFromText(text: string): DetectedFormat;
18
+ export declare function assertSupportedParse(format: string): void;
19
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/parse/detect.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,MAAM,GACN,KAAK,GACL,KAAK,GACL,IAAI,GACJ,MAAM,GACN,KAAK,GACL,KAAK,GACL,MAAM,GACN,SAAS,CAAC;AAyBd,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,IAAI,CAUjF;AAQD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAgBzE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAkB1E;AAQD,oEAAoE;AACpE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAEjE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAOzD"}
@@ -0,0 +1,109 @@
1
+ import JSZip from 'jszip';
2
+ import { DocumentError } from '../utils/errors.js';
3
+ import { extOf } from '../utils/paths.js';
4
+ import { CORE_FORMATS_HELP, CORE_PARSE_FORMAT_SET } from './formats.js';
5
+ const EXT_MAP = {
6
+ '.docx': 'docx',
7
+ '.xlsx': 'xlsx',
8
+ '.xls': 'xls',
9
+ '.pptx': 'pptx',
10
+ '.pdf': 'pdf',
11
+ '.md': 'md',
12
+ '.markdown': 'md',
13
+ '.html': 'html',
14
+ '.htm': 'html',
15
+ '.csv': 'csv',
16
+ '.doc': 'doc',
17
+ };
18
+ const UNSUPPORTED_EXT = new Set([
19
+ '.ppt',
20
+ '.odt',
21
+ '.ods',
22
+ '.odp',
23
+ '.rtf',
24
+ '.epub',
25
+ ]);
26
+ export function formatFromExt(filePath) {
27
+ if (!filePath)
28
+ return null;
29
+ const ext = extOf(filePath);
30
+ if (UNSUPPORTED_EXT.has(ext)) {
31
+ throw new DocumentError('UNSUPPORTED_FORMAT', `Unsupported format "${ext}". Core formats: ${CORE_FORMATS_HELP}.`);
32
+ }
33
+ return EXT_MAP[ext] ?? null;
34
+ }
35
+ function detectTextFormat(sample) {
36
+ if (/^\s*</.test(sample))
37
+ return 'html';
38
+ if (sample.includes(',') && !sample.includes('<'))
39
+ return 'csv';
40
+ return 'md';
41
+ }
42
+ export function isZipBuffer(buf) {
43
+ return buf.length >= 2 && buf[0] === 0x50 && buf[1] === 0x4b;
44
+ }
45
+ /**
46
+ * Detect format from magic bytes, then UTF-8 text heuristics for buffers
47
+ * without a binary signature.
48
+ * ZIP containers return a provisional `'docx'`; callers with a buffer should
49
+ * follow up with `refineZipFormat` when the extension is unknown.
50
+ */
51
+ export function detectFormatFromBuffer(buf) {
52
+ if (buf.length >= 4 && buf.slice(0, 4).toString('ascii') === '%PDF')
53
+ return 'pdf';
54
+ if (isZipBuffer(buf)) {
55
+ return 'docx';
56
+ }
57
+ if (buf.length >= 8 &&
58
+ buf[0] === 0xd0 &&
59
+ buf[1] === 0xcf &&
60
+ buf[2] === 0x11 &&
61
+ buf[3] === 0xe0) {
62
+ return 'doc';
63
+ }
64
+ if (buf.length === 0)
65
+ return null;
66
+ return detectTextFormat(buf.slice(0, 200).toString('utf8'));
67
+ }
68
+ /**
69
+ * Distinguish OOXML ZIP packages (docx / xlsx / pptx) via package parts
70
+ * and `[Content_Types].xml`.
71
+ */
72
+ export async function refineZipFormat(buf) {
73
+ try {
74
+ const zip = await JSZip.loadAsync(buf);
75
+ if (zip.file('ppt/presentation.xml') || hasSlidePart(zip))
76
+ return 'pptx';
77
+ if (zip.file('xl/workbook.xml'))
78
+ return 'xlsx';
79
+ if (zip.file('word/document.xml'))
80
+ return 'docx';
81
+ const ct = zip.file('[Content_Types].xml');
82
+ if (ct) {
83
+ const xml = await ct.async('string');
84
+ if (/presentationml/i.test(xml) || /\/ppt\//i.test(xml))
85
+ return 'pptx';
86
+ if (/spreadsheetml/i.test(xml) || /\/xl\//i.test(xml))
87
+ return 'xlsx';
88
+ if (/wordprocessingml/i.test(xml) || /\/word\//i.test(xml))
89
+ return 'docx';
90
+ }
91
+ }
92
+ catch {
93
+ /* fall through */
94
+ }
95
+ return 'docx';
96
+ }
97
+ function hasSlidePart(zip) {
98
+ return Object.keys(zip.files).some((n) => /^ppt\/slides\/slide\d+\.xml$/i.test(n));
99
+ }
100
+ /** Detect format for a raw string that is not a filesystem path. */
101
+ export function detectFormatFromText(text) {
102
+ return detectTextFormat(text.slice(0, 200));
103
+ }
104
+ export function assertSupportedParse(format) {
105
+ if (!CORE_PARSE_FORMAT_SET.has(format)) {
106
+ throw new DocumentError('UNSUPPORTED_FORMAT', `Unsupported format "${format}". Core formats: ${CORE_FORMATS_HELP}.`);
107
+ }
108
+ }
109
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/parse/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Clean-room rules for contributors (also summarized in AGENTS.md):
3
+ *
4
+ * 1. Implement parsers/converters from public format specs and public API behavior
5
+ * (tests + docs/API.md) — do not copy code from historical derived engines.
6
+ * 2. Prefer extending src/edit, src/write, src/parse over large opaque backends.
7
+ * 3. New format support lands behind parseDocument / convertDocument only.
8
+ */
9
+ /** Normalized format ids returned by detect / parseDocument. */
10
+ export declare const CORE_PARSE_FORMATS: readonly ["docx", "xlsx", "xls", "pdf", "md", "html", "csv", "doc", "pptx"];
11
+ export type CoreParseFormat = (typeof CORE_PARSE_FORMATS)[number];
12
+ export declare const CORE_PARSE_FORMAT_SET: Set<string>;
13
+ export declare const CORE_FORMATS_HELP = "docx, xlsx, xls, pptx, pdf, md, html, csv, legacy doc";
14
+ //# sourceMappingURL=formats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formats.d.ts","sourceRoot":"","sources":["../../src/parse/formats.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,gEAAgE;AAChE,eAAO,MAAM,kBAAkB,6EAUrB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,eAAO,MAAM,qBAAqB,aAAsC,CAAC;AAEzE,eAAO,MAAM,iBAAiB,0DAC2B,CAAC"}