xlsx-to-markdown 0.1.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 (39) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +300 -0
  3. package/dist/__tests__/helpers.d.ts +16 -0
  4. package/dist/__tests__/helpers.d.ts.map +1 -0
  5. package/dist/__tests__/helpers.js +63 -0
  6. package/dist/__tests__/helpers.js.map +1 -0
  7. package/dist/cell-formatter.d.ts +16 -0
  8. package/dist/cell-formatter.d.ts.map +1 -0
  9. package/dist/cell-formatter.js +257 -0
  10. package/dist/cell-formatter.js.map +1 -0
  11. package/dist/index.d.ts +21 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +129 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/options.d.ts +3 -0
  16. package/dist/options.d.ts.map +1 -0
  17. package/dist/options.js +20 -0
  18. package/dist/options.js.map +1 -0
  19. package/dist/paragraph-renderer.d.ts +14 -0
  20. package/dist/paragraph-renderer.d.ts.map +1 -0
  21. package/dist/paragraph-renderer.js +85 -0
  22. package/dist/paragraph-renderer.js.map +1 -0
  23. package/dist/region-detector.d.ts +19 -0
  24. package/dist/region-detector.d.ts.map +1 -0
  25. package/dist/region-detector.js +192 -0
  26. package/dist/region-detector.js.map +1 -0
  27. package/dist/sheet-converter.d.ts +7 -0
  28. package/dist/sheet-converter.d.ts.map +1 -0
  29. package/dist/sheet-converter.js +299 -0
  30. package/dist/sheet-converter.js.map +1 -0
  31. package/dist/table-renderer.d.ts +22 -0
  32. package/dist/table-renderer.d.ts.map +1 -0
  33. package/dist/table-renderer.js +236 -0
  34. package/dist/table-renderer.js.map +1 -0
  35. package/dist/types.d.ts +172 -0
  36. package/dist/types.d.ts.map +1 -0
  37. package/dist/types.js +3 -0
  38. package/dist/types.js.map +1 -0
  39. package/package.json +62 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cell-formatter.js","sourceRoot":"","sources":["../src/cell-formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import * as XLSX from "xlsx";
2
+ import type { ConvertOptions, ConvertResult } from "./types.js";
3
+ export type { ConvertOptions, ConvertResult, SheetResult, Region, RegionType } from "./types.js";
4
+ /**
5
+ * Convert an XLSX file (given as a file path or a Buffer/Uint8Array) to Markdown.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { convertXlsxToMarkdown } from 'xlsx-to-markdown';
10
+ *
11
+ * const result = await convertXlsxToMarkdown('report.xlsx');
12
+ * console.log(result.markdown);
13
+ * ```
14
+ */
15
+ export declare function convertXlsxToMarkdown(input: string | Buffer | Uint8Array, options?: ConvertOptions): Promise<ConvertResult>;
16
+ /**
17
+ * Convert an already-parsed XLSX.WorkBook to Markdown.
18
+ * Useful when you have already read the workbook using SheetJS.
19
+ */
20
+ export declare function convertWorkbook(workbook: XLSX.WorkBook, options?: ConvertOptions): ConvertResult;
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEjG;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,EACnC,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CAYxB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,OAAO,GAAE,cAAmB,GAC3B,aAAa,CAGf"}
package/dist/index.js ADDED
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.convertXlsxToMarkdown = convertXlsxToMarkdown;
37
+ exports.convertWorkbook = convertWorkbook;
38
+ const fs = __importStar(require("fs"));
39
+ const XLSX = __importStar(require("xlsx"));
40
+ const options_js_1 = require("./options.js");
41
+ const sheet_converter_js_1 = require("./sheet-converter.js");
42
+ /**
43
+ * Convert an XLSX file (given as a file path or a Buffer/Uint8Array) to Markdown.
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * import { convertXlsxToMarkdown } from 'xlsx-to-markdown';
48
+ *
49
+ * const result = await convertXlsxToMarkdown('report.xlsx');
50
+ * console.log(result.markdown);
51
+ * ```
52
+ */
53
+ async function convertXlsxToMarkdown(input, options = {}) {
54
+ const opts = (0, options_js_1.resolveOptions)(options);
55
+ let workbook;
56
+ if (typeof input === "string") {
57
+ const buffer = await fs.promises.readFile(input);
58
+ workbook = XLSX.read(buffer, { type: "buffer", cellStyles: true, cellDates: false });
59
+ }
60
+ else {
61
+ workbook = XLSX.read(input, { type: "buffer", cellStyles: true, cellDates: false });
62
+ }
63
+ return _convert(workbook, opts);
64
+ }
65
+ /**
66
+ * Convert an already-parsed XLSX.WorkBook to Markdown.
67
+ * Useful when you have already read the workbook using SheetJS.
68
+ */
69
+ function convertWorkbook(workbook, options = {}) {
70
+ const opts = (0, options_js_1.resolveOptions)(options);
71
+ return _convert(workbook, opts);
72
+ }
73
+ // ---------------------------------------------------------------------------
74
+ // Internal
75
+ // ---------------------------------------------------------------------------
76
+ /**
77
+ * Escape Markdown inline special characters in a sheet name used as a heading.
78
+ * Prevents characters like *, _, `, [, ] from being interpreted as Markdown syntax.
79
+ */
80
+ function escapeMarkdownHeading(name) {
81
+ return name.replace(/[\\*_`[\]<>!]/g, "\\$&");
82
+ }
83
+ function _convert(workbook, opts) {
84
+ const allSheetNames = workbook.SheetNames;
85
+ // Filter sheets
86
+ let sheetNames;
87
+ if (opts.sheets && opts.sheets.length > 0) {
88
+ // When an explicit filter is given, honour it regardless of sheet visibility.
89
+ sheetNames = opts.sheets.map((s) => {
90
+ if (typeof s === "number") {
91
+ const name = allSheetNames[s];
92
+ if (!name)
93
+ throw new Error(`Sheet index ${s} is out of range`);
94
+ return name;
95
+ }
96
+ if (!allSheetNames.includes(s))
97
+ throw new Error(`Sheet "${s}" not found`);
98
+ return s;
99
+ });
100
+ }
101
+ else {
102
+ // Default: process only visible sheets (ADR-0021).
103
+ sheetNames = allSheetNames.filter((_, i) => {
104
+ const meta = workbook.Workbook?.Sheets?.[i];
105
+ return !meta?.Hidden; // Hidden=0 visible, Hidden=1 hidden, Hidden=2 very hidden
106
+ });
107
+ }
108
+ // Resolve heading behaviour
109
+ const addSheetHeadings = opts.sheetHeadings === "auto" ? sheetNames.length > 1 : opts.sheetHeadings;
110
+ const sheetResults = sheetNames.map((name) => {
111
+ const ws = workbook.Sheets[name];
112
+ return (0, sheet_converter_js_1.convertSheet)(ws, name, allSheetNames.indexOf(name), opts);
113
+ });
114
+ // Combine sheets
115
+ const parts = [];
116
+ for (const sheet of sheetResults) {
117
+ if (addSheetHeadings) {
118
+ // Escape special characters so sheet names don't break Markdown inline syntax (ADR-0020).
119
+ parts.push(`## ${escapeMarkdownHeading(sheet.name)}\n\n${sheet.markdown}`);
120
+ }
121
+ else {
122
+ parts.push(sheet.markdown);
123
+ }
124
+ }
125
+ const separator = "\n".repeat(opts.blankLinesBetweenRegions + 2);
126
+ const markdown = parts.filter(Boolean).join(separator);
127
+ return { markdown, sheets: sheetResults };
128
+ }
129
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ConvertOptions, ResolvedOptions } from "./types.js";
2
+ export declare function resolveOptions(opts?: ConvertOptions): ResolvedOptions;
3
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElE,wBAAgB,cAAc,CAAC,IAAI,GAAE,cAAmB,GAAG,eAAe,CAezE"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveOptions = resolveOptions;
4
+ function resolveOptions(opts = {}) {
5
+ return {
6
+ sheets: opts.sheets,
7
+ sheetHeadings: opts.sheetHeadings ?? "auto",
8
+ headerRow: opts.headerRow ?? true,
9
+ tableDetection: {
10
+ minColumns: opts.tableDetection?.minColumns ?? 2,
11
+ minRows: opts.tableDetection?.minRows ?? 2,
12
+ useBorders: opts.tableDetection?.useBorders ?? true,
13
+ },
14
+ richText: opts.richText ?? true,
15
+ emptyCell: opts.emptyCell ?? "",
16
+ dateFormat: opts.dateFormat ?? "YYYY-MM-DD",
17
+ blankLinesBetweenRegions: opts.blankLinesBetweenRegions ?? 1,
18
+ };
19
+ }
20
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":";;AAEA,wCAeC;AAfD,SAAgB,cAAc,CAAC,OAAuB,EAAE;IACtD,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,MAAM;QAC3C,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI;QACjC,cAAc,EAAE;YACd,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,IAAI,CAAC;YAChD,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,IAAI,CAAC;YAC1C,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,IAAI,IAAI;SACpD;QACD,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI;QAC/B,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;QAC/B,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,YAAY;QAC3C,wBAAwB,EAAE,IAAI,CAAC,wBAAwB,IAAI,CAAC;KAC7D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import * as XLSX from "xlsx";
2
+ import type { ResolvedOptions } from "./types.js";
3
+ /**
4
+ * Render a paragraph region as a Markdown paragraph.
5
+ *
6
+ * For each non-empty cell in the region (scanned left-to-right, top-to-bottom),
7
+ * the text content is collected. Multiple cells in the same row are joined
8
+ * with a space. Each row becomes one "line" in the paragraph block.
9
+ * Consecutive non-empty lines are separated by a blank line only when a
10
+ * completely empty row appears between them; otherwise they are joined as a
11
+ * single paragraph.
12
+ */
13
+ export declare function renderParagraph(ws: XLSX.WorkSheet, startRow: number, endRow: number, startCol: number, endCol: number, merges: XLSX.Range[], opts: ResolvedOptions, hiddenRows?: Set<number>, hiddenCols?: Set<number>): string;
14
+ //# sourceMappingURL=paragraph-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paragraph-renderer.d.ts","sourceRoot":"","sources":["../src/paragraph-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,IAAI,CAAC,SAAS,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,EACpB,IAAI,EAAE,eAAe,EACrB,UAAU,GAAE,GAAG,CAAC,MAAM,CAAa,EACnC,UAAU,GAAE,GAAG,CAAC,MAAM,CAAa,GAClC,MAAM,CAuBR"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.renderParagraph = renderParagraph;
37
+ const XLSX = __importStar(require("xlsx"));
38
+ const cell_formatter_js_1 = require("./cell-formatter.js");
39
+ /**
40
+ * Render a paragraph region as a Markdown paragraph.
41
+ *
42
+ * For each non-empty cell in the region (scanned left-to-right, top-to-bottom),
43
+ * the text content is collected. Multiple cells in the same row are joined
44
+ * with a space. Each row becomes one "line" in the paragraph block.
45
+ * Consecutive non-empty lines are separated by a blank line only when a
46
+ * completely empty row appears between them; otherwise they are joined as a
47
+ * single paragraph.
48
+ */
49
+ function renderParagraph(ws, startRow, endRow, startCol, endCol, merges, opts, hiddenRows = new Set(), hiddenCols = new Set()) {
50
+ const mergedChildCells = buildMergedChildSet(merges);
51
+ const lines = [];
52
+ for (let r = startRow; r <= endRow; r++) {
53
+ if (hiddenRows.has(r))
54
+ continue;
55
+ const parts = [];
56
+ for (let c = startCol; c <= endCol; c++) {
57
+ if (hiddenCols.has(c))
58
+ continue;
59
+ const addr = XLSX.utils.encode_cell({ r, c });
60
+ const cell = ws[addr];
61
+ const data = (0, cell_formatter_js_1.extractCellData)(cell, mergedChildCells, addr, opts);
62
+ if (!data.isMergedChild && data.value.trim()) {
63
+ parts.push(data.value.trim());
64
+ }
65
+ }
66
+ if (parts.length > 0) {
67
+ lines.push(parts.join(" "));
68
+ }
69
+ }
70
+ return lines.join("\n\n");
71
+ }
72
+ function buildMergedChildSet(merges) {
73
+ const set = new Set();
74
+ for (const m of merges) {
75
+ for (let r = m.s.r; r <= m.e.r; r++) {
76
+ for (let c = m.s.c; c <= m.e.c; c++) {
77
+ if (r === m.s.r && c === m.s.c)
78
+ continue;
79
+ set.add(XLSX.utils.encode_cell({ r, c }));
80
+ }
81
+ }
82
+ }
83
+ return set;
84
+ }
85
+ //# sourceMappingURL=paragraph-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paragraph-renderer.js","sourceRoot":"","sources":["../src/paragraph-renderer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,0CAiCC;AA/CD,2CAA6B;AAE7B,2DAAsD;AAEtD;;;;;;;;;GASG;AACH,SAAgB,eAAe,CAC7B,EAAkB,EAClB,QAAgB,EAChB,MAAc,EACd,QAAgB,EAChB,MAAc,EACd,MAAoB,EACpB,IAAqB,EACrB,aAA0B,IAAI,GAAG,EAAE,EACnC,aAA0B,IAAI,GAAG,EAAE;IAEnC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAErD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,SAAS;QAChC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,SAAS;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAgC,EAAE,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,IAAI,GAAG,IAAA,mCAAe,EAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACjE,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC7C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAoB;IAC/C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBAAE,SAAS;gBACzC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { RowInfo, RegionType, ResolvedOptions } from "./types.js";
2
+ export interface RawRegion {
3
+ type: RegionType;
4
+ startRow: number;
5
+ endRow: number;
6
+ startCol: number;
7
+ endCol: number;
8
+ }
9
+ /**
10
+ * Detect content regions from a list of RowInfo objects.
11
+ *
12
+ * Algorithm (recursive):
13
+ * 1. Split rows by empty rows → "bands" of consecutive non-empty rows
14
+ * 2. Within each band, find contiguous column groups (split at all-empty columns)
15
+ * 3. If multiple column groups exist → recurse into each (handles side-by-side tables)
16
+ * 4. If a single column group → classify rows as table or paragraph by density
17
+ */
18
+ export declare function detectRegions(rows: RowInfo[], opts: ResolvedOptions): RawRegion[];
19
+ //# sourceMappingURL=region-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"region-detector.d.ts","sourceRoot":"","sources":["../src/region-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,eAAe,GAAG,SAAS,EAAE,CAMjF"}
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectRegions = detectRegions;
4
+ /**
5
+ * Detect content regions from a list of RowInfo objects.
6
+ *
7
+ * Algorithm (recursive):
8
+ * 1. Split rows by empty rows → "bands" of consecutive non-empty rows
9
+ * 2. Within each band, find contiguous column groups (split at all-empty columns)
10
+ * 3. If multiple column groups exist → recurse into each (handles side-by-side tables)
11
+ * 4. If a single column group → classify rows as table or paragraph by density
12
+ */
13
+ function detectRegions(rows, opts) {
14
+ const nonEmpty = rows.filter((r) => r.filledCount > 0);
15
+ if (nonEmpty.length === 0)
16
+ return [];
17
+ const colStart = Math.min(...nonEmpty.map((r) => r.minCol));
18
+ const colEnd = Math.max(...nonEmpty.map((r) => r.maxCol));
19
+ return detectInRange(rows, colStart, colEnd, opts);
20
+ }
21
+ // ---------------------------------------------------------------------------
22
+ // Core recursive implementation
23
+ // ---------------------------------------------------------------------------
24
+ function detectInRange(rows, colStart, colEnd, opts) {
25
+ const regions = [];
26
+ let i = 0;
27
+ while (i < rows.length) {
28
+ if (countInRange(rows[i].filledCols, colStart, colEnd) === 0) {
29
+ i++;
30
+ continue;
31
+ }
32
+ // Collect a band: consecutive rows with ≥1 filled cell in [colStart, colEnd]
33
+ const band = [];
34
+ let j = i;
35
+ while (j < rows.length && countInRange(rows[j].filledCols, colStart, colEnd) > 0) {
36
+ band.push(rows[j]);
37
+ j++;
38
+ }
39
+ // Build the set of filled columns within this band
40
+ const bandFilledCols = new Set();
41
+ for (const r of band) {
42
+ for (const c of r.filledCols) {
43
+ if (c >= colStart && c <= colEnd)
44
+ bandFilledCols.add(c);
45
+ }
46
+ }
47
+ // Split the band by column gaps
48
+ const subRanges = findColSubRanges(bandFilledCols);
49
+ if (subRanges.length > 1) {
50
+ // Multiple column groups → recurse into each (separates side-by-side tables)
51
+ for (const [sc, ec] of subRanges) {
52
+ regions.push(...detectInRange(band, sc, ec, opts));
53
+ }
54
+ }
55
+ else {
56
+ // Single column group → classify rows by density
57
+ const [sc, ec] = subRanges[0] ?? [colStart, colEnd];
58
+ regions.push(...classifyBand(band, sc, ec, opts));
59
+ }
60
+ i = j;
61
+ }
62
+ return regions;
63
+ }
64
+ /**
65
+ * Classify a band of rows (no empty rows) within a fixed column range into
66
+ * table and paragraph regions based on row density.
67
+ *
68
+ * When useBorders is enabled two extra rules apply:
69
+ * 1. Table-start boundary: all rows before the first row that has a vertical
70
+ * border (left or right) are emitted as paragraphs, regardless of density.
71
+ * This lets a caption/title row sitting directly above a bordered table
72
+ * be correctly classified as a paragraph even when it is "dense".
73
+ * 2. Table-row criterion: within the density loop, a row is treated as a
74
+ * table-candidate when it has vertical borders, even if its filled-column
75
+ * count is below minColumns. This ensures that rows with only vertical
76
+ * cell borders (no horizontal borders) are still included in the table.
77
+ */
78
+ function classifyBand(band, colStart, colEnd, opts) {
79
+ const { minColumns, minRows, useBorders } = opts.tableDetection;
80
+ const regions = [];
81
+ let i = 0;
82
+ // Border-based table-start detection: emit leading rows without vertical
83
+ // borders as paragraphs so that the table starts at the first row that has
84
+ // vertical (column-structure) borders.
85
+ if (useBorders) {
86
+ const firstVerticalBorderIdx = band.findIndex((r) => r.hasVerticalBorder);
87
+ if (firstVerticalBorderIdx > 0) {
88
+ const paraRows = band.slice(0, firstVerticalBorderIdx);
89
+ regions.push({
90
+ type: "paragraph",
91
+ startRow: paraRows[0].index,
92
+ endRow: paraRows[paraRows.length - 1].index,
93
+ startCol: colStart,
94
+ endCol: colEnd,
95
+ });
96
+ i = firstVerticalBorderIdx;
97
+ }
98
+ }
99
+ // Helper: is this row a table candidate?
100
+ // When useBorders is on, vertical borders are sufficient even without density.
101
+ const isTableCandidate = (row) => {
102
+ if (countInRange(row.filledCols, colStart, colEnd) >= minColumns)
103
+ return true;
104
+ if (useBorders && row.hasVerticalBorder)
105
+ return true;
106
+ return false;
107
+ };
108
+ while (i < band.length) {
109
+ if (isTableCandidate(band[i])) {
110
+ // Table candidate row — try to extend a table downward
111
+ const tableRows = [band[i]];
112
+ let j = i + 1;
113
+ while (j < band.length && isTableCandidate(band[j])) {
114
+ tableRows.push(band[j]);
115
+ j++;
116
+ }
117
+ if (tableRows.length >= minRows) {
118
+ regions.push({
119
+ type: "table",
120
+ startRow: tableRows[0].index,
121
+ endRow: tableRows[tableRows.length - 1].index,
122
+ startCol: colStart,
123
+ endCol: colEnd,
124
+ });
125
+ }
126
+ else {
127
+ // Below minRows → demote each row to its own paragraph
128
+ for (const r of tableRows) {
129
+ regions.push({
130
+ type: "paragraph",
131
+ startRow: r.index,
132
+ endRow: r.index,
133
+ startCol: colStart,
134
+ endCol: colEnd,
135
+ });
136
+ }
137
+ }
138
+ i = j;
139
+ }
140
+ else {
141
+ // Non-candidate rows → paragraph
142
+ const paraRows = [band[i]];
143
+ let j = i + 1;
144
+ while (j < band.length && !isTableCandidate(band[j])) {
145
+ paraRows.push(band[j]);
146
+ j++;
147
+ }
148
+ regions.push({
149
+ type: "paragraph",
150
+ startRow: paraRows[0].index,
151
+ endRow: paraRows[paraRows.length - 1].index,
152
+ startCol: colStart,
153
+ endCol: colEnd,
154
+ });
155
+ i = j;
156
+ }
157
+ }
158
+ return regions;
159
+ }
160
+ // ---------------------------------------------------------------------------
161
+ // Helpers
162
+ // ---------------------------------------------------------------------------
163
+ /**
164
+ * Find contiguous column sub-ranges from a set of filled column indices.
165
+ * Columns with a gap (≥2 apart) start a new sub-range.
166
+ */
167
+ function findColSubRanges(filledCols) {
168
+ const sorted = [...filledCols].sort((a, b) => a - b);
169
+ if (sorted.length === 0)
170
+ return [];
171
+ const ranges = [];
172
+ let rangeStart = sorted[0];
173
+ let prev = sorted[0];
174
+ for (let i = 1; i < sorted.length; i++) {
175
+ if (sorted[i] > prev + 1) {
176
+ ranges.push([rangeStart, prev]);
177
+ rangeStart = sorted[i];
178
+ }
179
+ prev = sorted[i];
180
+ }
181
+ ranges.push([rangeStart, prev]);
182
+ return ranges;
183
+ }
184
+ function countInRange(filledCols, colStart, colEnd) {
185
+ let count = 0;
186
+ for (const c of filledCols) {
187
+ if (c >= colStart && c <= colEnd)
188
+ count++;
189
+ }
190
+ return count;
191
+ }
192
+ //# sourceMappingURL=region-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"region-detector.js","sourceRoot":"","sources":["../src/region-detector.ts"],"names":[],"mappings":";;AAmBA,sCAMC;AAfD;;;;;;;;GAQG;AACH,SAAgB,aAAa,CAAC,IAAe,EAAE,IAAqB;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;IACvD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1D,OAAO,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC;AAED,8EAA8E;AAC9E,gCAAgC;AAChC,8EAA8E;AAE9E,SAAS,aAAa,CACpB,IAAe,EACf,QAAgB,EAChB,MAAc,EACd,IAAqB;IAErB,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7D,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,6EAA6E;QAC7E,MAAM,IAAI,GAAc,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACjF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC,EAAE,CAAC;QACN,CAAC;QAED,mDAAmD;QACnD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;QACzC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;gBAC7B,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,IAAI,MAAM;oBAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,MAAM,SAAS,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;QAEnD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,6EAA6E;YAC7E,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,iDAAiD;YACjD,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QACpD,CAAC;QAED,CAAC,GAAG,CAAC,CAAC;IACR,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,YAAY,CACnB,IAAe,EACf,QAAgB,EAChB,MAAc,EACd,IAAqB;IAErB,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC;IAChE,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,yEAAyE;IACzE,2EAA2E;IAC3E,uCAAuC;IACvC,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,sBAAsB,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAC1E,IAAI,sBAAsB,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC;YACvD,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK;gBAC3B,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK;gBAC3C,QAAQ,EAAE,QAAQ;gBAClB,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;YACH,CAAC,GAAG,sBAAsB,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,+EAA+E;IAC/E,MAAM,gBAAgB,GAAG,CAAC,GAAY,EAAW,EAAE;QACjD,IAAI,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,UAAU;YAAE,OAAO,IAAI,CAAC;QAC9E,IAAI,UAAU,IAAI,GAAG,CAAC,iBAAiB;YAAE,OAAO,IAAI,CAAC;QACrD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9B,uDAAuD;YACvD,MAAM,SAAS,GAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxB,CAAC,EAAE,CAAC;YACN,CAAC;YAED,IAAI,SAAS,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC;gBAChC,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK;oBAC5B,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK;oBAC7C,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,MAAM;iBACf,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,uDAAuD;gBACvD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;oBAC1B,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,WAAW;wBACjB,QAAQ,EAAE,CAAC,CAAC,KAAK;wBACjB,MAAM,EAAE,CAAC,CAAC,KAAK;wBACf,QAAQ,EAAE,QAAQ;wBAClB,MAAM,EAAE,MAAM;qBACf,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,CAAC,GAAG,CAAC,CAAC;QACR,CAAC;aAAM,CAAC;YACN,iCAAiC;YACjC,MAAM,QAAQ,GAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvB,CAAC,EAAE,CAAC;YACN,CAAC;YACD,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK;gBAC3B,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK;gBAC3C,QAAQ,EAAE,QAAQ;gBAClB,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;YACH,CAAC,GAAG,CAAC,CAAC;QACR,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,gBAAgB,CAAC,UAAuB;IAC/C,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEnC,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,IAAI,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;YAChC,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;IAChC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,UAAuB,EAAE,QAAgB,EAAE,MAAc;IAC7E,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,IAAI,MAAM;YAAE,KAAK,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,7 @@
1
+ import * as XLSX from "xlsx";
2
+ import type { ResolvedOptions, SheetResult } from "./types.js";
3
+ /**
4
+ * Convert a single worksheet to Markdown.
5
+ */
6
+ export declare function convertSheet(ws: XLSX.WorkSheet, sheetName: string, sheetIndex: number, opts: ResolvedOptions): SheetResult;
7
+ //# sourceMappingURL=sheet-converter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheet-converter.d.ts","sourceRoot":"","sources":["../src/sheet-converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAU,eAAe,EAAW,WAAW,EAAE,MAAM,YAAY,CAAC;AAKhF;;GAEG;AACH,wBAAgB,YAAY,CAC1B,EAAE,EAAE,IAAI,CAAC,SAAS,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,eAAe,GACpB,WAAW,CA6Rb"}