@cesarandreslopez/occ 0.3.1 → 0.4.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 (150) hide show
  1. package/README.md +130 -4
  2. package/dist/src/cli-validation.d.ts +14 -0
  3. package/dist/src/cli-validation.js +58 -0
  4. package/dist/src/cli-validation.js.map +1 -0
  5. package/dist/src/cli.js +26 -8
  6. package/dist/src/cli.js.map +1 -1
  7. package/dist/src/code/build.d.ts +7 -5
  8. package/dist/src/code/build.js +68 -11
  9. package/dist/src/code/build.js.map +1 -1
  10. package/dist/src/code/command.js +26 -19
  11. package/dist/src/code/command.js.map +1 -1
  12. package/dist/src/code/discover.d.ts +6 -4
  13. package/dist/src/code/discover.js +5 -0
  14. package/dist/src/code/discover.js.map +1 -1
  15. package/dist/src/code/languages.d.ts +28 -7
  16. package/dist/src/code/languages.js +9 -0
  17. package/dist/src/code/languages.js.map +1 -1
  18. package/dist/src/code/output.js +12 -3
  19. package/dist/src/code/output.js.map +1 -1
  20. package/dist/src/code/parsers.js +75 -10
  21. package/dist/src/code/parsers.js.map +1 -1
  22. package/dist/src/code/query.js +82 -22
  23. package/dist/src/code/query.js.map +1 -1
  24. package/dist/src/code/types.d.ts +1201 -145
  25. package/dist/src/code/types.js +150 -1
  26. package/dist/src/code/types.js.map +1 -1
  27. package/dist/src/doc/command.d.ts +2 -0
  28. package/dist/src/doc/command.js +54 -0
  29. package/dist/src/doc/command.js.map +1 -0
  30. package/dist/src/doc/inspect-docx.d.ts +14 -0
  31. package/dist/src/doc/inspect-docx.js +188 -0
  32. package/dist/src/doc/inspect-docx.js.map +1 -0
  33. package/dist/src/doc/inspect-odt.d.ts +8 -0
  34. package/dist/src/doc/inspect-odt.js +92 -0
  35. package/dist/src/doc/inspect-odt.js.map +1 -0
  36. package/dist/src/doc/inspect-pdf.d.ts +8 -0
  37. package/dist/src/doc/inspect-pdf.js +88 -0
  38. package/dist/src/doc/inspect-pdf.js.map +1 -0
  39. package/dist/src/doc/inspect.d.ts +2 -0
  40. package/dist/src/doc/inspect.js +70 -0
  41. package/dist/src/doc/inspect.js.map +1 -0
  42. package/dist/src/doc/output.d.ts +3 -0
  43. package/dist/src/doc/output.js +82 -0
  44. package/dist/src/doc/output.js.map +1 -0
  45. package/dist/src/doc/types.d.ts +172 -0
  46. package/dist/src/doc/types.js +62 -0
  47. package/dist/src/doc/types.js.map +1 -0
  48. package/dist/src/inspect/shared.d.ts +20 -0
  49. package/dist/src/inspect/shared.js +29 -0
  50. package/dist/src/inspect/shared.js.map +1 -0
  51. package/dist/src/inspect/xlsx-cells.d.ts +4 -0
  52. package/dist/src/inspect/xlsx-cells.js +31 -0
  53. package/dist/src/inspect/xlsx-cells.js.map +1 -0
  54. package/dist/src/markdown/convert.js +6 -4
  55. package/dist/src/markdown/convert.js.map +1 -1
  56. package/dist/src/output/tabular.d.ts +6 -4
  57. package/dist/src/output/tabular.js +5 -0
  58. package/dist/src/output/tabular.js.map +1 -1
  59. package/dist/src/output/tree.d.ts +21 -9
  60. package/dist/src/output/tree.js +10 -0
  61. package/dist/src/output/tree.js.map +1 -1
  62. package/dist/src/parsers/docx.js +5 -1
  63. package/dist/src/parsers/docx.js.map +1 -1
  64. package/dist/src/parsers/odf.js +4 -3
  65. package/dist/src/parsers/odf.js.map +1 -1
  66. package/dist/src/parsers/pdf.js +6 -1
  67. package/dist/src/parsers/pdf.js.map +1 -1
  68. package/dist/src/parsers/pptx.js +2 -1
  69. package/dist/src/parsers/pptx.js.map +1 -1
  70. package/dist/src/parsers/xlsx.js +11 -4
  71. package/dist/src/parsers/xlsx.js.map +1 -1
  72. package/dist/src/progress.d.ts +7 -5
  73. package/dist/src/progress.js +6 -0
  74. package/dist/src/progress.js.map +1 -1
  75. package/dist/src/scc.d.ts +35 -26
  76. package/dist/src/scc.js +26 -1
  77. package/dist/src/scc.js.map +1 -1
  78. package/dist/src/sheet/command.d.ts +2 -0
  79. package/dist/src/sheet/command.js +61 -0
  80. package/dist/src/sheet/command.js.map +1 -0
  81. package/dist/src/sheet/inspect.d.ts +3 -0
  82. package/dist/src/sheet/inspect.js +426 -0
  83. package/dist/src/sheet/inspect.js.map +1 -0
  84. package/dist/src/sheet/output.d.ts +3 -0
  85. package/dist/src/sheet/output.js +158 -0
  86. package/dist/src/sheet/output.js.map +1 -0
  87. package/dist/src/sheet/types.d.ts +472 -0
  88. package/dist/src/sheet/types.js +119 -0
  89. package/dist/src/sheet/types.js.map +1 -0
  90. package/dist/src/slide/command.d.ts +2 -0
  91. package/dist/src/slide/command.js +54 -0
  92. package/dist/src/slide/command.js.map +1 -0
  93. package/dist/src/slide/inspect-odp.d.ts +7 -0
  94. package/dist/src/slide/inspect-odp.js +105 -0
  95. package/dist/src/slide/inspect-odp.js.map +1 -0
  96. package/dist/src/slide/inspect-pptx.d.ts +11 -0
  97. package/dist/src/slide/inspect-pptx.js +157 -0
  98. package/dist/src/slide/inspect-pptx.js.map +1 -0
  99. package/dist/src/slide/inspect.d.ts +2 -0
  100. package/dist/src/slide/inspect.js +76 -0
  101. package/dist/src/slide/inspect.js.map +1 -0
  102. package/dist/src/slide/output.d.ts +3 -0
  103. package/dist/src/slide/output.js +92 -0
  104. package/dist/src/slide/output.js.map +1 -0
  105. package/dist/src/slide/types.d.ts +167 -0
  106. package/dist/src/slide/types.js +61 -0
  107. package/dist/src/slide/types.js.map +1 -0
  108. package/dist/src/stats.d.ts +6 -4
  109. package/dist/src/stats.js +5 -0
  110. package/dist/src/stats.js.map +1 -1
  111. package/dist/src/structure/types.d.ts +19 -11
  112. package/dist/src/structure/types.js +26 -21
  113. package/dist/src/structure/types.js.map +1 -1
  114. package/dist/src/table/command.d.ts +2 -0
  115. package/dist/src/table/command.js +58 -0
  116. package/dist/src/table/command.js.map +1 -0
  117. package/dist/src/table/inspect-docx.d.ts +2 -0
  118. package/dist/src/table/inspect-docx.js +108 -0
  119. package/dist/src/table/inspect-docx.js.map +1 -0
  120. package/dist/src/table/inspect-odp.d.ts +2 -0
  121. package/dist/src/table/inspect-odp.js +106 -0
  122. package/dist/src/table/inspect-odp.js.map +1 -0
  123. package/dist/src/table/inspect-odt.d.ts +2 -0
  124. package/dist/src/table/inspect-odt.js +100 -0
  125. package/dist/src/table/inspect-odt.js.map +1 -0
  126. package/dist/src/table/inspect-pptx.d.ts +2 -0
  127. package/dist/src/table/inspect-pptx.js +112 -0
  128. package/dist/src/table/inspect-pptx.js.map +1 -0
  129. package/dist/src/table/inspect-xlsx.d.ts +2 -0
  130. package/dist/src/table/inspect-xlsx.js +161 -0
  131. package/dist/src/table/inspect-xlsx.js.map +1 -0
  132. package/dist/src/table/inspect.d.ts +2 -0
  133. package/dist/src/table/inspect.js +65 -0
  134. package/dist/src/table/inspect.js.map +1 -0
  135. package/dist/src/table/output.d.ts +3 -0
  136. package/dist/src/table/output.js +93 -0
  137. package/dist/src/table/output.js.map +1 -0
  138. package/dist/src/table/types.d.ts +104 -0
  139. package/dist/src/table/types.js +40 -0
  140. package/dist/src/table/types.js.map +1 -0
  141. package/dist/src/types.d.ts +25 -20
  142. package/dist/src/types.js +21 -1
  143. package/dist/src/types.js.map +1 -1
  144. package/dist/src/utils.d.ts +11 -1
  145. package/dist/src/utils.js +2 -0
  146. package/dist/src/utils.js.map +1 -1
  147. package/dist/src/walker.d.ts +21 -12
  148. package/dist/src/walker.js +13 -0
  149. package/dist/src/walker.js.map +1 -1
  150. package/package.json +3 -2
@@ -0,0 +1,106 @@
1
+ import JSZip from 'jszip';
2
+ import { estimateTokens } from '../inspect/shared.js';
3
+ function stripXmlTags(xml) {
4
+ return xml.replace(/<[^>]*>/g, '').trim();
5
+ }
6
+ function extractIntAttribute(tag, attr) {
7
+ const match = tag.match(new RegExp(`${attr}\\s*=\\s*"(\\d+)"`, 'i'));
8
+ if (match) {
9
+ const val = parseInt(match[1], 10);
10
+ return val > 1 ? val : undefined;
11
+ }
12
+ return undefined;
13
+ }
14
+ function detectHeaders(firstRowCells, options) {
15
+ if (options.headerRow === 'none')
16
+ return null;
17
+ if (typeof options.headerRow === 'number' && options.headerRow === 1) {
18
+ return firstRowCells.map(c => c.value);
19
+ }
20
+ if (options.headerRow === 'auto') {
21
+ const values = firstRowCells.map(c => c.value).filter(v => v.length > 0);
22
+ if (values.length > 0 && values.length === firstRowCells.length && new Set(values).size === values.length) {
23
+ return firstRowCells.map(c => c.value);
24
+ }
25
+ }
26
+ return null;
27
+ }
28
+ export async function extractOdpTables(buffer, options) {
29
+ const zip = await JSZip.loadAsync(buffer);
30
+ const contentXml = await zip.file('content.xml')?.async('text');
31
+ if (!contentXml)
32
+ return [];
33
+ // Split by draw:page to get slide context
34
+ const pageMatches = [...contentXml.matchAll(/<draw:page\b([^>]*)>([\s\S]*?)<\/draw:page>/gi)];
35
+ const tables = [];
36
+ let globalTableIndex = 0;
37
+ for (let pi = 0; pi < pageMatches.length; pi++) {
38
+ const pageAttrs = pageMatches[pi][1];
39
+ const pageXml = pageMatches[pi][2];
40
+ // Try to get page name
41
+ const nameMatch = pageAttrs.match(/draw:name\s*=\s*"([^"]*)"/i);
42
+ const pageName = nameMatch?.[1];
43
+ const location = pageName ? `Slide: ${pageName}` : `Slide ${pi + 1}`;
44
+ const tableMatches = [...pageXml.matchAll(/<table:table\b[^>]*>([\s\S]*?)<\/table:table>/gi)];
45
+ for (const tableMatch of tableMatches) {
46
+ globalTableIndex++;
47
+ const tableXml = tableMatch[1];
48
+ const rowMatches = [...tableXml.matchAll(/<table:table-row\b[^>]*>([\s\S]*?)<\/table:table-row>/gi)];
49
+ if (rowMatches.length === 0)
50
+ continue;
51
+ const allRows = [];
52
+ for (const rowMatch of rowMatches) {
53
+ const rowXml = rowMatch[1];
54
+ const cellMatches = [...rowXml.matchAll(/<table:table-cell\b([^>]*?)>([\s\S]*?)<\/table:table-cell>/gi)];
55
+ const cells = [];
56
+ for (const cellMatch of cellMatches) {
57
+ const attrs = cellMatch[1];
58
+ const cellXml = cellMatch[2];
59
+ const value = stripXmlTags(cellXml);
60
+ const cell = { value };
61
+ const colSpan = extractIntAttribute(attrs, 'table:number-columns-spanned');
62
+ const rowSpan = extractIntAttribute(attrs, 'table:number-rows-spanned');
63
+ if (colSpan)
64
+ cell.colSpan = colSpan;
65
+ if (rowSpan)
66
+ cell.rowSpan = rowSpan;
67
+ cells.push(cell);
68
+ }
69
+ allRows.push(cells);
70
+ }
71
+ if (allRows.length === 0)
72
+ continue;
73
+ const headers = detectHeaders(allRows[0], options);
74
+ const dataStartIndex = headers ? 1 : 0;
75
+ const dataRows = allRows.slice(dataStartIndex);
76
+ const truncated = dataRows.length > options.sampleRows;
77
+ const limitedRows = dataRows.slice(0, options.sampleRows);
78
+ const rows = limitedRows.map((cells, idx) => ({
79
+ index: dataStartIndex + idx + 1,
80
+ cells,
81
+ }));
82
+ const columnCount = Math.max(...allRows.map(r => r.length), 0);
83
+ const cellCount = allRows.reduce((sum, r) => sum + r.length, 0);
84
+ let chars = 0;
85
+ for (const row of allRows) {
86
+ for (const cell of row) {
87
+ chars += cell.value.length + 1;
88
+ }
89
+ chars += 1;
90
+ }
91
+ tables.push({
92
+ tableIndex: globalTableIndex,
93
+ location,
94
+ rowCount: allRows.length,
95
+ columnCount,
96
+ cellCount,
97
+ headers,
98
+ rows,
99
+ truncated,
100
+ tokenEstimate: estimateTokens(chars),
101
+ });
102
+ }
103
+ }
104
+ return tables;
105
+ }
106
+ //# sourceMappingURL=inspect-odp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect-odp.js","sourceRoot":"","sources":["../../../src/table/inspect-odp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ExtractedTable, InspectTableOptions } from './types.js';
2
+ export declare function extractOdtTables(buffer: Buffer, options: InspectTableOptions): Promise<ExtractedTable[]>;
@@ -0,0 +1,100 @@
1
+ import JSZip from 'jszip';
2
+ import { estimateTokens } from '../inspect/shared.js';
3
+ function stripXmlTags(xml) {
4
+ return xml.replace(/<[^>]*>/g, '').trim();
5
+ }
6
+ function extractIntAttribute(tag, attr) {
7
+ const match = tag.match(new RegExp(`${attr}\\s*=\\s*"(\\d+)"`, 'i'));
8
+ if (match) {
9
+ const val = parseInt(match[1], 10);
10
+ return val > 1 ? val : undefined;
11
+ }
12
+ return undefined;
13
+ }
14
+ function detectHeaders(firstRowCells, options) {
15
+ if (options.headerRow === 'none')
16
+ return null;
17
+ if (typeof options.headerRow === 'number' && options.headerRow === 1) {
18
+ return firstRowCells.map(c => c.value);
19
+ }
20
+ if (options.headerRow === 'auto') {
21
+ const values = firstRowCells.map(c => c.value).filter(v => v.length > 0);
22
+ if (values.length > 0 && values.length === firstRowCells.length && new Set(values).size === values.length) {
23
+ return firstRowCells.map(c => c.value);
24
+ }
25
+ }
26
+ return null;
27
+ }
28
+ function extractTablesFromXml(contentXml, options, locationPrefix) {
29
+ const tableMatches = [...contentXml.matchAll(/<table:table\b[^>]*>([\s\S]*?)<\/table:table>/gi)];
30
+ if (tableMatches.length === 0)
31
+ return [];
32
+ const tables = [];
33
+ for (let ti = 0; ti < tableMatches.length; ti++) {
34
+ const tableXml = tableMatches[ti][1];
35
+ const rowMatches = [...tableXml.matchAll(/<table:table-row\b[^>]*>([\s\S]*?)<\/table:table-row>/gi)];
36
+ if (rowMatches.length === 0)
37
+ continue;
38
+ const allRows = [];
39
+ for (const rowMatch of rowMatches) {
40
+ const rowXml = rowMatch[1];
41
+ const cellMatches = [...rowXml.matchAll(/<table:table-cell\b([^>]*?)>([\s\S]*?)<\/table:table-cell>/gi)];
42
+ const cells = [];
43
+ for (const cellMatch of cellMatches) {
44
+ const attrs = cellMatch[1];
45
+ const cellXml = cellMatch[2];
46
+ const value = stripXmlTags(cellXml);
47
+ const cell = { value };
48
+ const colSpan = extractIntAttribute(attrs, 'table:number-columns-spanned');
49
+ const rowSpan = extractIntAttribute(attrs, 'table:number-rows-spanned');
50
+ if (colSpan)
51
+ cell.colSpan = colSpan;
52
+ if (rowSpan)
53
+ cell.rowSpan = rowSpan;
54
+ cells.push(cell);
55
+ }
56
+ allRows.push(cells);
57
+ }
58
+ if (allRows.length === 0)
59
+ continue;
60
+ // Detect headers
61
+ const headers = detectHeaders(allRows[0], options);
62
+ const dataStartIndex = headers ? 1 : 0;
63
+ const dataRows = allRows.slice(dataStartIndex);
64
+ const truncated = dataRows.length > options.sampleRows;
65
+ const limitedRows = dataRows.slice(0, options.sampleRows);
66
+ const rows = limitedRows.map((cells, idx) => ({
67
+ index: dataStartIndex + idx + 1,
68
+ cells,
69
+ }));
70
+ const columnCount = Math.max(...allRows.map(r => r.length), 0);
71
+ const cellCount = allRows.reduce((sum, r) => sum + r.length, 0);
72
+ let chars = 0;
73
+ for (const row of allRows) {
74
+ for (const cell of row) {
75
+ chars += cell.value.length + 1;
76
+ }
77
+ chars += 1;
78
+ }
79
+ tables.push({
80
+ tableIndex: ti + 1,
81
+ location: locationPrefix,
82
+ rowCount: allRows.length,
83
+ columnCount,
84
+ cellCount,
85
+ headers,
86
+ rows,
87
+ truncated,
88
+ tokenEstimate: estimateTokens(chars),
89
+ });
90
+ }
91
+ return tables;
92
+ }
93
+ export async function extractOdtTables(buffer, options) {
94
+ const zip = await JSZip.loadAsync(buffer);
95
+ const contentXml = await zip.file('content.xml')?.async('text');
96
+ if (!contentXml)
97
+ return [];
98
+ return extractTablesFromXml(contentXml, options, null);
99
+ }
100
+ //# sourceMappingURL=inspect-odt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect-odt.js","sourceRoot":"","sources":["../../../src/table/inspect-odt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ExtractedTable, InspectTableOptions } from './types.js';
2
+ export declare function extractPptxTables(buffer: Buffer, options: InspectTableOptions): Promise<ExtractedTable[]>;
@@ -0,0 +1,112 @@
1
+ import JSZip from 'jszip';
2
+ import { estimateTokens } from '../inspect/shared.js';
3
+ function extractCellText(tcXml) {
4
+ const matches = tcXml.match(/<a:t>([^<]*)<\/a:t>/g) || [];
5
+ return matches.map(m => {
6
+ const text = m.match(/<a:t>([^<]*)<\/a:t>/);
7
+ return text?.[1] || '';
8
+ }).join(' ').trim();
9
+ }
10
+ function extractIntAttribute(xml, attr) {
11
+ const match = xml.match(new RegExp(`${attr}\\s*=\\s*"(\\d+)"`, 'i'));
12
+ if (match) {
13
+ const val = parseInt(match[1], 10);
14
+ return val > 1 ? val : undefined;
15
+ }
16
+ return undefined;
17
+ }
18
+ function detectHeaders(firstRowCells, options) {
19
+ if (options.headerRow === 'none')
20
+ return null;
21
+ if (typeof options.headerRow === 'number' && options.headerRow === 1) {
22
+ return firstRowCells.map(c => c.value);
23
+ }
24
+ if (options.headerRow === 'auto') {
25
+ const values = firstRowCells.map(c => c.value).filter(v => v.length > 0);
26
+ if (values.length > 0 && values.length === firstRowCells.length && new Set(values).size === values.length) {
27
+ return firstRowCells.map(c => c.value);
28
+ }
29
+ }
30
+ return null;
31
+ }
32
+ export async function extractPptxTables(buffer, options) {
33
+ const zip = await JSZip.loadAsync(buffer);
34
+ const slideFiles = Object.keys(zip.files)
35
+ .filter(name => /^ppt\/slides\/slide\d+\.xml$/.test(name))
36
+ .sort((a, b) => {
37
+ const numA = parseInt(a.match(/slide(\d+)/)?.[1] || '0', 10);
38
+ const numB = parseInt(b.match(/slide(\d+)/)?.[1] || '0', 10);
39
+ return numA - numB;
40
+ });
41
+ const tables = [];
42
+ let tableIndex = 0;
43
+ for (let si = 0; si < slideFiles.length; si++) {
44
+ const slideXml = await zip.file(slideFiles[si])?.async('text');
45
+ if (!slideXml)
46
+ continue;
47
+ // Find all <a:tbl> elements
48
+ const tableMatches = [...slideXml.matchAll(/<a:tbl\b[^>]*>([\s\S]*?)<\/a:tbl>/gi)];
49
+ for (const tableMatch of tableMatches) {
50
+ tableIndex++;
51
+ const tableXml = tableMatch[1];
52
+ // Find rows
53
+ const rowMatches = [...tableXml.matchAll(/<a:tr\b[^>]*>([\s\S]*?)<\/a:tr>/gi)];
54
+ if (rowMatches.length === 0)
55
+ continue;
56
+ const allRows = [];
57
+ for (const rowMatch of rowMatches) {
58
+ const rowXml = rowMatch[1];
59
+ const cellMatches = [...rowXml.matchAll(/<a:tc\b([^>]*?)>([\s\S]*?)<\/a:tc>/gi)];
60
+ const cells = [];
61
+ for (const cellMatch of cellMatches) {
62
+ const attrs = cellMatch[1];
63
+ const cellXml = cellMatch[2];
64
+ const value = extractCellText(cellXml);
65
+ const cell = { value };
66
+ const gridSpan = extractIntAttribute(attrs, 'gridSpan');
67
+ const rowSpan = extractIntAttribute(attrs, 'rowSpan');
68
+ if (gridSpan)
69
+ cell.colSpan = gridSpan;
70
+ if (rowSpan)
71
+ cell.rowSpan = rowSpan;
72
+ cells.push(cell);
73
+ }
74
+ allRows.push(cells);
75
+ }
76
+ if (allRows.length === 0)
77
+ continue;
78
+ // Detect headers
79
+ const headers = detectHeaders(allRows[0], options);
80
+ const dataStartIndex = headers ? 1 : 0;
81
+ const dataRows = allRows.slice(dataStartIndex);
82
+ const truncated = dataRows.length > options.sampleRows;
83
+ const limitedRows = dataRows.slice(0, options.sampleRows);
84
+ const rows = limitedRows.map((cells, idx) => ({
85
+ index: dataStartIndex + idx + 1,
86
+ cells,
87
+ }));
88
+ const columnCount = Math.max(...allRows.map(r => r.length), 0);
89
+ const cellCount = allRows.reduce((sum, r) => sum + r.length, 0);
90
+ let chars = 0;
91
+ for (const row of allRows) {
92
+ for (const cell of row) {
93
+ chars += cell.value.length + 1;
94
+ }
95
+ chars += 1;
96
+ }
97
+ tables.push({
98
+ tableIndex,
99
+ location: `Slide ${si + 1}`,
100
+ rowCount: allRows.length,
101
+ columnCount,
102
+ cellCount,
103
+ headers,
104
+ rows,
105
+ truncated,
106
+ tokenEstimate: estimateTokens(chars),
107
+ });
108
+ }
109
+ }
110
+ return tables;
111
+ }
112
+ //# sourceMappingURL=inspect-pptx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect-pptx.js","sourceRoot":"","sources":["../../../src/table/inspect-pptx.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ExtractedTable, InspectTableOptions } from './types.js';
2
+ export declare function extractXlsxTables(buffer: Buffer, options: InspectTableOptions): Promise<ExtractedTable[]>;
@@ -0,0 +1,161 @@
1
+ import XLSX from 'xlsx';
2
+ import { getCell, renderCell, isNonEmptyCell } from '../inspect/xlsx-cells.js';
3
+ import { estimateTokens } from '../inspect/shared.js';
4
+ function buildMergeMap(sheet) {
5
+ const map = new Map();
6
+ const merges = sheet['!merges'] ?? [];
7
+ for (const merge of merges) {
8
+ const key = XLSX.utils.encode_cell({ r: merge.s.r, c: merge.s.c });
9
+ map.set(key, {
10
+ colSpan: merge.e.c - merge.s.c + 1,
11
+ rowSpan: merge.e.r - merge.s.r + 1,
12
+ });
13
+ }
14
+ return map;
15
+ }
16
+ function buildMergedCellSet(sheet) {
17
+ const set = new Set();
18
+ const merges = sheet['!merges'] ?? [];
19
+ for (const merge of merges) {
20
+ for (let r = merge.s.r; r <= merge.e.r; r++) {
21
+ for (let c = merge.s.c; c <= merge.e.c; c++) {
22
+ if (r === merge.s.r && c === merge.s.c)
23
+ continue;
24
+ set.add(XLSX.utils.encode_cell({ r, c }));
25
+ }
26
+ }
27
+ }
28
+ return set;
29
+ }
30
+ function detectHeaders(sheet, startRow, startCol, endCol, headerRow) {
31
+ if (headerRow === 'none')
32
+ return null;
33
+ const rowIndex = typeof headerRow === 'number' ? headerRow - 1 : startRow;
34
+ const values = [];
35
+ let nonEmpty = 0;
36
+ for (let c = startCol; c <= endCol; c++) {
37
+ const cell = getCell(sheet, rowIndex, c);
38
+ const val = renderCell(cell);
39
+ values.push(val);
40
+ if (val)
41
+ nonEmpty++;
42
+ }
43
+ if (nonEmpty === 0)
44
+ return null;
45
+ if (headerRow === 'auto') {
46
+ // Check if all non-empty values are unique strings
47
+ const nonEmptyValues = values.filter(v => v.length > 0);
48
+ if (nonEmptyValues.length > 0 && new Set(nonEmptyValues).size === nonEmptyValues.length) {
49
+ // Check that values look like headers (all strings in the row)
50
+ let allString = true;
51
+ for (let c = startCol; c <= endCol; c++) {
52
+ const cell = getCell(sheet, rowIndex, c);
53
+ if (cell && isNonEmptyCell(cell) && cell.t !== 's' && cell.t !== 'z') {
54
+ allString = false;
55
+ break;
56
+ }
57
+ }
58
+ if (allString)
59
+ return values;
60
+ }
61
+ return null;
62
+ }
63
+ return values;
64
+ }
65
+ export async function extractXlsxTables(buffer, options) {
66
+ const workbook = XLSX.read(buffer, {
67
+ type: 'buffer',
68
+ cellText: true,
69
+ cellDates: true,
70
+ sheetStubs: true,
71
+ });
72
+ const tables = [];
73
+ let tableIndex = 0;
74
+ for (let si = 0; si < workbook.SheetNames.length; si++) {
75
+ const sheetName = workbook.SheetNames[si];
76
+ const sheet = workbook.Sheets[sheetName];
77
+ if (!sheet || !sheet['!ref'])
78
+ continue;
79
+ tableIndex++;
80
+ const range = XLSX.utils.decode_range(sheet['!ref']);
81
+ const mergeMap = buildMergeMap(sheet);
82
+ const mergedCellSet = buildMergedCellSet(sheet);
83
+ const startRow = range.s.r;
84
+ const startCol = range.s.c;
85
+ const endCol = range.e.c;
86
+ const endRow = range.e.r;
87
+ // Detect headers
88
+ const headers = detectHeaders(sheet, startRow, startCol, endCol, options.headerRow);
89
+ const dataStartRow = headers ? startRow + 1 : startRow;
90
+ const totalRows = endRow - startRow + 1;
91
+ const totalCols = endCol - startCol + 1;
92
+ // Build rows
93
+ const maxRows = options.sampleRows;
94
+ const dataRowCount = endRow - dataStartRow + 1;
95
+ const truncated = dataRowCount > maxRows;
96
+ const rowLimit = Math.min(dataRowCount, maxRows);
97
+ const rows = [];
98
+ let chars = 0;
99
+ // Count total chars for token estimate (including header row)
100
+ if (headers) {
101
+ for (const h of headers)
102
+ chars += h.length + 1;
103
+ chars += 1;
104
+ }
105
+ let nonEmptyRowCount = 0;
106
+ for (let r = dataStartRow; r <= endRow; r++) {
107
+ const cells = [];
108
+ let rowHasContent = false;
109
+ for (let c = startCol; c <= endCol; c++) {
110
+ const cellAddr = XLSX.utils.encode_cell({ r, c });
111
+ if (mergedCellSet.has(cellAddr)) {
112
+ cells.push({ value: '' });
113
+ continue;
114
+ }
115
+ const cell = getCell(sheet, r, c);
116
+ const value = renderCell(cell);
117
+ const tableCell = { value };
118
+ const merge = mergeMap.get(cellAddr);
119
+ if (merge) {
120
+ if (merge.colSpan > 1)
121
+ tableCell.colSpan = merge.colSpan;
122
+ if (merge.rowSpan > 1)
123
+ tableCell.rowSpan = merge.rowSpan;
124
+ }
125
+ if (value)
126
+ rowHasContent = true;
127
+ cells.push(tableCell);
128
+ chars += value.length + 1;
129
+ }
130
+ chars += 1;
131
+ if (!rowHasContent)
132
+ continue;
133
+ nonEmptyRowCount++;
134
+ if (rows.length < rowLimit) {
135
+ rows.push({ index: r - startRow + 1, cells });
136
+ }
137
+ }
138
+ // Cell count
139
+ let cellCount = 0;
140
+ for (let r = startRow; r <= endRow; r++) {
141
+ for (let c = startCol; c <= endCol; c++) {
142
+ const cell = getCell(sheet, r, c);
143
+ if (cell && isNonEmptyCell(cell))
144
+ cellCount++;
145
+ }
146
+ }
147
+ tables.push({
148
+ tableIndex,
149
+ location: `Sheet: ${sheetName}`,
150
+ rowCount: totalRows,
151
+ columnCount: totalCols,
152
+ cellCount,
153
+ headers,
154
+ rows,
155
+ truncated: truncated && rows.length >= rowLimit,
156
+ tokenEstimate: estimateTokens(chars),
157
+ });
158
+ }
159
+ return tables;
160
+ }
161
+ //# sourceMappingURL=inspect-xlsx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect-xlsx.js","sourceRoot":"","sources":["../../../src/table/inspect-xlsx.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { InspectTableOptions, TableInspectionResult } from './types.js';
2
+ export declare function inspectTables(filePath: string, options: InspectTableOptions): Promise<TableInspectionResult>;
@@ -0,0 +1,65 @@
1
+ import { readFile, stat } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { z } from 'zod';
4
+ import { getExtension } from '../utils.js';
5
+ import { extractDocxTables } from './inspect-docx.js';
6
+ import { extractXlsxTables } from './inspect-xlsx.js';
7
+ import { extractPptxTables } from './inspect-pptx.js';
8
+ import { extractOdtTables } from './inspect-odt.js';
9
+ import { extractOdpTables } from './inspect-odp.js';
10
+ const TableFormatSchema = z.enum(['docx', 'xlsx', 'pptx', 'odt', 'odp', 'pdf']);
11
+ const SUPPORTED_FORMATS = new Set(TableFormatSchema.options);
12
+ export async function inspectTables(filePath, options) {
13
+ const resolvedPath = path.resolve(filePath);
14
+ const ext = getExtension(resolvedPath);
15
+ if (!SUPPORTED_FORMATS.has(ext)) {
16
+ throw new Error(`Unsupported format: .${ext || '(none)'} (supported: docx, xlsx, pptx, odt, odp, pdf)`);
17
+ }
18
+ const fileStats = await stat(resolvedPath);
19
+ const format = TableFormatSchema.parse(ext);
20
+ if (format === 'pdf') {
21
+ return {
22
+ file: resolvedPath,
23
+ format,
24
+ size: fileStats.size,
25
+ tableCount: 0,
26
+ tables: [],
27
+ notes: ['PDF format does not support structural table extraction. Tables in PDFs are rendered as positioned text without semantic structure. Consider converting to DOCX first for table extraction.'],
28
+ totalTokenEstimate: 0,
29
+ };
30
+ }
31
+ const buffer = await readFile(resolvedPath);
32
+ let tables;
33
+ switch (format) {
34
+ case 'docx':
35
+ tables = await extractDocxTables(resolvedPath, options);
36
+ break;
37
+ case 'xlsx':
38
+ tables = await extractXlsxTables(buffer, options);
39
+ break;
40
+ case 'pptx':
41
+ tables = await extractPptxTables(buffer, options);
42
+ break;
43
+ case 'odt':
44
+ tables = await extractOdtTables(buffer, options);
45
+ break;
46
+ case 'odp':
47
+ tables = await extractOdpTables(buffer, options);
48
+ break;
49
+ }
50
+ // Filter to specific table if requested
51
+ if (options.table && tables) {
52
+ tables = tables.filter(t => t.tableIndex === options.table);
53
+ }
54
+ const totalTokenEstimate = tables.reduce((sum, t) => sum + t.tokenEstimate, 0);
55
+ return {
56
+ file: resolvedPath,
57
+ format,
58
+ size: fileStats.size,
59
+ tableCount: tables.length,
60
+ tables,
61
+ notes: [],
62
+ totalTokenEstimate,
63
+ };
64
+ }
65
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../../src/table/inspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { TableInspectionResult, TableInspectPayload } from './types.js';
2
+ export declare function formatTablePayloadJson(payload: TableInspectPayload): string;
3
+ export declare function formatTableInspection(result: TableInspectionResult, ci?: boolean): string;