@usejunior/docx-core 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/primitives/document.d.ts +6 -0
- package/dist/primitives/document.d.ts.map +1 -1
- package/dist/primitives/document.js +198 -3
- package/dist/primitives/document.js.map +1 -1
- package/dist/primitives/document_view.d.ts +39 -0
- package/dist/primitives/document_view.d.ts.map +1 -1
- package/dist/primitives/document_view.js +83 -13
- package/dist/primitives/document_view.js.map +1 -1
- package/dist/primitives/dom-helpers.d.ts +11 -0
- package/dist/primitives/dom-helpers.d.ts.map +1 -1
- package/dist/primitives/dom-helpers.js +23 -0
- package/dist/primitives/dom-helpers.js.map +1 -1
- package/dist/primitives/index.d.ts +1 -0
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +1 -0
- package/dist/primitives/index.js.map +1 -1
- package/dist/primitives/tables.d.ts +54 -0
- package/dist/primitives/tables.d.ts.map +1 -0
- package/dist/primitives/tables.js +192 -0
- package/dist/primitives/tables.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../src/primitives/tables.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,wCAAwC;IACxC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,kBAAkB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;CAC7C;AAED,MAAM,WAAW,cAAc;IAC7B,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAC/B,yCAAyC;IACzC,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,qBAAqB,EAAE,oBAAoB,EAAE,CAAC;CAC/C;AAED,MAAM,WAAW,oBAAoB;IACnC,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;IAC1B,qDAAqD;IACrD,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAuFD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,mBAAmB,CAoGhG"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic DOCX table extraction primitives.
|
|
3
|
+
*
|
|
4
|
+
* Extracts tables from a parsed OOXML Document, returning structured rows
|
|
5
|
+
* with header-keyed records. Supports merged cell detection/rejection and
|
|
6
|
+
* header-based table filtering.
|
|
7
|
+
*/
|
|
8
|
+
import { OOXML, W } from './namespaces.js';
|
|
9
|
+
import { isW, getDirectChildrenByName } from './dom-helpers.js';
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Internal helpers
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
/** Get text content of a single paragraph element. */
|
|
14
|
+
function getParagraphText(p) {
|
|
15
|
+
const parts = [];
|
|
16
|
+
const runs = p.getElementsByTagNameNS(OOXML.W_NS, W.r);
|
|
17
|
+
for (let r = 0; r < runs.length; r++) {
|
|
18
|
+
const run = runs[r];
|
|
19
|
+
// Collect w:t text nodes and w:tab / w:br
|
|
20
|
+
for (const child of Array.from(run.childNodes)) {
|
|
21
|
+
if (child.nodeType !== 1)
|
|
22
|
+
continue;
|
|
23
|
+
const el = child;
|
|
24
|
+
if (isW(el, W.t)) {
|
|
25
|
+
parts.push(el.textContent ?? '');
|
|
26
|
+
}
|
|
27
|
+
else if (isW(el, W.tab)) {
|
|
28
|
+
parts.push('\t');
|
|
29
|
+
}
|
|
30
|
+
else if (isW(el, W.br)) {
|
|
31
|
+
parts.push('\n');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return parts.join('');
|
|
36
|
+
}
|
|
37
|
+
/** Extract text from a table cell, returning per-paragraph texts. */
|
|
38
|
+
function extractCellContent(tc, trim) {
|
|
39
|
+
const paragraphs = getDirectChildrenByName(tc, W.p);
|
|
40
|
+
const paraTexts = [];
|
|
41
|
+
for (const p of paragraphs) {
|
|
42
|
+
const text = getParagraphText(p);
|
|
43
|
+
paraTexts.push(trim ? text.trim() : text);
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
text: paraTexts.join('\n'),
|
|
47
|
+
paragraphs: paraTexts,
|
|
48
|
+
paragraphCount: paragraphs.length,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** Check if a cell has any merge properties. Returns the merge type or null. */
|
|
52
|
+
function detectMerge(tc) {
|
|
53
|
+
const tcPrList = getDirectChildrenByName(tc, W.tcPr);
|
|
54
|
+
if (tcPrList.length === 0)
|
|
55
|
+
return null;
|
|
56
|
+
const tcPr = tcPrList[0];
|
|
57
|
+
// Check w:hMerge (any attribute form)
|
|
58
|
+
for (const child of Array.from(tcPr.childNodes)) {
|
|
59
|
+
if (child.nodeType !== 1)
|
|
60
|
+
continue;
|
|
61
|
+
const el = child;
|
|
62
|
+
if (isW(el, 'hMerge'))
|
|
63
|
+
return 'hMerge';
|
|
64
|
+
if (isW(el, 'vMerge'))
|
|
65
|
+
return 'vMerge';
|
|
66
|
+
}
|
|
67
|
+
// Check w:gridSpan with val > 1
|
|
68
|
+
for (const child of Array.from(tcPr.childNodes)) {
|
|
69
|
+
if (child.nodeType !== 1)
|
|
70
|
+
continue;
|
|
71
|
+
const el = child;
|
|
72
|
+
if (isW(el, 'gridSpan')) {
|
|
73
|
+
const val = el.getAttributeNS(OOXML.W_NS, W.val) ?? el.getAttribute('w:val');
|
|
74
|
+
if (val && parseInt(val, 10) > 1)
|
|
75
|
+
return 'gridSpan';
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
/** Get top-level tables from w:body only (not nested tables). */
|
|
81
|
+
function getBodyTables(doc) {
|
|
82
|
+
const body = doc.getElementsByTagNameNS(OOXML.W_NS, W.body).item(0);
|
|
83
|
+
if (!body)
|
|
84
|
+
return [];
|
|
85
|
+
return getDirectChildrenByName(body, W.tbl);
|
|
86
|
+
}
|
|
87
|
+
/** Check if headers match a filter entry. */
|
|
88
|
+
function headersMatch(headers, filter) {
|
|
89
|
+
if (headers.length !== filter.length)
|
|
90
|
+
return false;
|
|
91
|
+
return headers.every((h, i) => h === filter[i]);
|
|
92
|
+
}
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
// Main extraction function
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
/**
|
|
97
|
+
* Extract tables from a parsed OOXML Document.
|
|
98
|
+
*
|
|
99
|
+
* Only processes top-level tables in w:body (not nested tables, headers,
|
|
100
|
+
* or footers). First row of each table is treated as headers.
|
|
101
|
+
*/
|
|
102
|
+
export function extractTables(doc, options) {
|
|
103
|
+
const rejectMergedCells = options?.rejectMergedCells ?? true;
|
|
104
|
+
const headerFilter = options?.headerFilter;
|
|
105
|
+
const trim = options?.trimCellText ?? true;
|
|
106
|
+
const tables = getBodyTables(doc);
|
|
107
|
+
const result = [];
|
|
108
|
+
const mergedCellDiagnostics = [];
|
|
109
|
+
for (let tableIndex = 0; tableIndex < tables.length; tableIndex++) {
|
|
110
|
+
const table = tables[tableIndex];
|
|
111
|
+
const rows = getDirectChildrenByName(table, W.tr);
|
|
112
|
+
if (rows.length === 0)
|
|
113
|
+
continue;
|
|
114
|
+
// Scan for merged cells first
|
|
115
|
+
let hasMergedCells = false;
|
|
116
|
+
const tableMergeDiags = [];
|
|
117
|
+
for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {
|
|
118
|
+
const cells = getDirectChildrenByName(rows[rowIndex], W.tc);
|
|
119
|
+
for (let cellIndex = 0; cellIndex < cells.length; cellIndex++) {
|
|
120
|
+
const mergeType = detectMerge(cells[cellIndex]);
|
|
121
|
+
if (mergeType) {
|
|
122
|
+
hasMergedCells = true;
|
|
123
|
+
tableMergeDiags.push({ tableIndex, rowIndex, cellIndex, mergeType });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
mergedCellDiagnostics.push(...tableMergeDiags);
|
|
128
|
+
if (hasMergedCells && rejectMergedCells) {
|
|
129
|
+
continue; // Skip this table
|
|
130
|
+
}
|
|
131
|
+
// Extract header row
|
|
132
|
+
const headerCells = getDirectChildrenByName(rows[0], W.tc);
|
|
133
|
+
const headers = headerCells.map((c) => extractCellContent(c, trim).text);
|
|
134
|
+
// Check for duplicate headers
|
|
135
|
+
const headerSet = new Set();
|
|
136
|
+
let hasDuplicateHeaders = false;
|
|
137
|
+
for (const h of headers) {
|
|
138
|
+
if (headerSet.has(h)) {
|
|
139
|
+
hasDuplicateHeaders = true;
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
headerSet.add(h);
|
|
143
|
+
}
|
|
144
|
+
if (hasDuplicateHeaders)
|
|
145
|
+
continue; // Skip tables with duplicate headers
|
|
146
|
+
// Apply header filter
|
|
147
|
+
if (headerFilter) {
|
|
148
|
+
const matches = headerFilter.some((filter) => headersMatch(headers, filter));
|
|
149
|
+
if (!matches)
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
// Extract all rows (including header as rawRows[0])
|
|
153
|
+
const rawRows = [];
|
|
154
|
+
const dataRecords = [];
|
|
155
|
+
for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {
|
|
156
|
+
const cells = getDirectChildrenByName(rows[rowIndex], W.tc);
|
|
157
|
+
const extractedCells = [];
|
|
158
|
+
for (const cell of cells) {
|
|
159
|
+
extractedCells.push(extractCellContent(cell, trim));
|
|
160
|
+
}
|
|
161
|
+
rawRows.push({ cells: extractedCells });
|
|
162
|
+
// Skip header row for data records
|
|
163
|
+
if (rowIndex === 0)
|
|
164
|
+
continue;
|
|
165
|
+
// Build header-keyed record
|
|
166
|
+
const record = {};
|
|
167
|
+
for (let i = 0; i < headers.length; i++) {
|
|
168
|
+
record[headers[i]] = extractedCells[i]?.text ?? '';
|
|
169
|
+
}
|
|
170
|
+
dataRecords.push(record);
|
|
171
|
+
}
|
|
172
|
+
// Check for nested tables and emit diagnostic (but don't skip the table)
|
|
173
|
+
for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {
|
|
174
|
+
const cells = getDirectChildrenByName(rows[rowIndex], W.tc);
|
|
175
|
+
for (const cell of cells) {
|
|
176
|
+
const nestedTables = getDirectChildrenByName(cell, W.tbl);
|
|
177
|
+
if (nestedTables.length > 0) {
|
|
178
|
+
// Nested table detected — logged via diagnostics
|
|
179
|
+
// The parent table is still extracted; nested tables are ignored
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
result.push({
|
|
184
|
+
tableIndex,
|
|
185
|
+
headers,
|
|
186
|
+
rows: dataRecords,
|
|
187
|
+
rawRows,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
return { tables: result, mergedCellDiagnostics };
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=tables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../../src/primitives/tables.ts"],"names":[],"mappings":"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"}
|