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.
- package/LICENSE +21 -0
- package/README.md +300 -0
- package/dist/__tests__/helpers.d.ts +16 -0
- package/dist/__tests__/helpers.d.ts.map +1 -0
- package/dist/__tests__/helpers.js +63 -0
- package/dist/__tests__/helpers.js.map +1 -0
- package/dist/cell-formatter.d.ts +16 -0
- package/dist/cell-formatter.d.ts.map +1 -0
- package/dist/cell-formatter.js +257 -0
- package/dist/cell-formatter.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +129 -0
- package/dist/index.js.map +1 -0
- package/dist/options.d.ts +3 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +20 -0
- package/dist/options.js.map +1 -0
- package/dist/paragraph-renderer.d.ts +14 -0
- package/dist/paragraph-renderer.d.ts.map +1 -0
- package/dist/paragraph-renderer.js +85 -0
- package/dist/paragraph-renderer.js.map +1 -0
- package/dist/region-detector.d.ts +19 -0
- package/dist/region-detector.d.ts.map +1 -0
- package/dist/region-detector.js +192 -0
- package/dist/region-detector.js.map +1 -0
- package/dist/sheet-converter.d.ts +7 -0
- package/dist/sheet-converter.d.ts.map +1 -0
- package/dist/sheet-converter.js +299 -0
- package/dist/sheet-converter.js.map +1 -0
- package/dist/table-renderer.d.ts +22 -0
- package/dist/table-renderer.d.ts.map +1 -0
- package/dist/table-renderer.js +236 -0
- package/dist/table-renderer.js.map +1 -0
- package/dist/types.d.ts +172 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +62 -0
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options for XLSX to Markdown conversion
|
|
3
|
+
*/
|
|
4
|
+
export interface ConvertOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Sheets to include by name or index (0-based).
|
|
7
|
+
* Default: all sheets
|
|
8
|
+
*/
|
|
9
|
+
sheets?: (string | number)[];
|
|
10
|
+
/**
|
|
11
|
+
* Add "## Sheet Name" heading before each sheet's content.
|
|
12
|
+
* Default: true when the workbook has multiple sheets
|
|
13
|
+
*/
|
|
14
|
+
sheetHeadings?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Treat the first row of each detected table as a header row.
|
|
17
|
+
* Default: true
|
|
18
|
+
*/
|
|
19
|
+
headerRow?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Table detection thresholds.
|
|
22
|
+
*/
|
|
23
|
+
tableDetection?: {
|
|
24
|
+
/**
|
|
25
|
+
* Minimum number of columns for a region to be treated as a table.
|
|
26
|
+
* Default: 2
|
|
27
|
+
*/
|
|
28
|
+
minColumns?: number;
|
|
29
|
+
/**
|
|
30
|
+
* Minimum number of rows for a region to be treated as a table.
|
|
31
|
+
* Default: 2
|
|
32
|
+
*/
|
|
33
|
+
minRows?: number;
|
|
34
|
+
/**
|
|
35
|
+
* Use cell borders as a hint when classifying regions.
|
|
36
|
+
* Default: true
|
|
37
|
+
*/
|
|
38
|
+
useBorders?: boolean;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Preserve rich-text formatting (bold → **, italic → _, etc.)
|
|
42
|
+
* Default: true
|
|
43
|
+
*/
|
|
44
|
+
richText?: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Placeholder text for empty table cells.
|
|
47
|
+
* Default: "" (empty string)
|
|
48
|
+
*/
|
|
49
|
+
emptyCell?: string;
|
|
50
|
+
/**
|
|
51
|
+
* Format string for dates.
|
|
52
|
+
* Uses simple tokens: YYYY MM DD HH mm ss
|
|
53
|
+
* Default: ISO 8601 (YYYY-MM-DD)
|
|
54
|
+
*/
|
|
55
|
+
dateFormat?: string;
|
|
56
|
+
/**
|
|
57
|
+
* Number of blank lines to insert between regions.
|
|
58
|
+
* Default: 1
|
|
59
|
+
*/
|
|
60
|
+
blankLinesBetweenRegions?: number;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Resolved options with all defaults filled in.
|
|
64
|
+
*/
|
|
65
|
+
export interface ResolvedOptions {
|
|
66
|
+
sheets?: (string | number)[];
|
|
67
|
+
sheetHeadings: boolean | "auto";
|
|
68
|
+
headerRow: boolean;
|
|
69
|
+
tableDetection: {
|
|
70
|
+
minColumns: number;
|
|
71
|
+
minRows: number;
|
|
72
|
+
useBorders: boolean;
|
|
73
|
+
};
|
|
74
|
+
richText: boolean;
|
|
75
|
+
emptyCell: string;
|
|
76
|
+
dateFormat: string;
|
|
77
|
+
blankLinesBetweenRegions: number;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Type of a detected region within a sheet.
|
|
81
|
+
*/
|
|
82
|
+
export type RegionType = "table" | "paragraph" | "heading";
|
|
83
|
+
/**
|
|
84
|
+
* A detected content region in a sheet.
|
|
85
|
+
*/
|
|
86
|
+
export interface Region {
|
|
87
|
+
type: RegionType;
|
|
88
|
+
/** Inclusive 0-based row index where this region starts */
|
|
89
|
+
startRow: number;
|
|
90
|
+
/** Inclusive 0-based row index where this region ends */
|
|
91
|
+
endRow: number;
|
|
92
|
+
/** Inclusive 0-based column index where this region starts */
|
|
93
|
+
startCol: number;
|
|
94
|
+
/** Inclusive 0-based column index where this region ends */
|
|
95
|
+
endCol: number;
|
|
96
|
+
/** The rendered Markdown for this region */
|
|
97
|
+
markdown: string;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Conversion result for a single sheet.
|
|
101
|
+
*/
|
|
102
|
+
export interface SheetResult {
|
|
103
|
+
name: string;
|
|
104
|
+
index: number;
|
|
105
|
+
markdown: string;
|
|
106
|
+
regions: Region[];
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Full conversion result.
|
|
110
|
+
*/
|
|
111
|
+
export interface ConvertResult {
|
|
112
|
+
/** Combined Markdown for all sheets */
|
|
113
|
+
markdown: string;
|
|
114
|
+
sheets: SheetResult[];
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Represents a single parsed cell value (after formatting).
|
|
118
|
+
*/
|
|
119
|
+
export interface CellData {
|
|
120
|
+
/**
|
|
121
|
+
* Plain text value with no inline formatting applied.
|
|
122
|
+
* Used by renderers that handle their own markup (e.g. HTML table renderer).
|
|
123
|
+
*/
|
|
124
|
+
rawValue: string;
|
|
125
|
+
/**
|
|
126
|
+
* Markdown-formatted value (bold → **, italic → _, hyperlink → [text](url)).
|
|
127
|
+
* Used by the paragraph renderer.
|
|
128
|
+
*/
|
|
129
|
+
value: string;
|
|
130
|
+
/** Whether the cell has a bold format */
|
|
131
|
+
bold: boolean;
|
|
132
|
+
/** Whether the cell has an italic format */
|
|
133
|
+
italic: boolean;
|
|
134
|
+
/** Hyperlink URL, if any */
|
|
135
|
+
hyperlink?: string;
|
|
136
|
+
/** Horizontal alignment */
|
|
137
|
+
alignment?: "left" | "center" | "right";
|
|
138
|
+
/** True when this cell is part of a merge but is not the top-left "master" cell */
|
|
139
|
+
isMergedChild: boolean;
|
|
140
|
+
/** True when this cell has any border (used for table detection) */
|
|
141
|
+
hasBorder: boolean;
|
|
142
|
+
/**
|
|
143
|
+
* Pre-built HTML string for inline rich-text runs (bold/italic applied per run).
|
|
144
|
+
* Set when cell.r XML was parsed successfully; undefined for plain cells.
|
|
145
|
+
* Used by the HTML table renderer instead of rawValue + cell-level bold/italic.
|
|
146
|
+
*/
|
|
147
|
+
richTextHtml?: string;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Internal row data used during region detection.
|
|
151
|
+
*/
|
|
152
|
+
export interface RowInfo {
|
|
153
|
+
/** 0-based row index */
|
|
154
|
+
index: number;
|
|
155
|
+
/** Columns with content, as a Set of 0-based column indices */
|
|
156
|
+
filledCols: Set<number>;
|
|
157
|
+
/** Min filled column index (-1 if empty row) */
|
|
158
|
+
minCol: number;
|
|
159
|
+
/** Max filled column index (-1 if empty row) */
|
|
160
|
+
maxCol: number;
|
|
161
|
+
/** Number of filled (non-child-merge) cells */
|
|
162
|
+
filledCount: number;
|
|
163
|
+
/** True when at least one cell in this row has any border */
|
|
164
|
+
hasBorder: boolean;
|
|
165
|
+
/**
|
|
166
|
+
* True when at least one cell in this row has a vertical border (left or right).
|
|
167
|
+
* Vertical borders indicate column structure and are the primary signal for
|
|
168
|
+
* table-boundary detection when `useBorders` is enabled.
|
|
169
|
+
*/
|
|
170
|
+
hasVerticalBorder: boolean;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "xlsx-to-markdown",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Convert XLSX files to Markdown, handling mixed content (tables and paragraphs)",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"require": "./dist/index.js",
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=14.0.0"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"README.md",
|
|
20
|
+
"LICENSE"
|
|
21
|
+
],
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "https://github.com/khatada/xlsx-to-markdown.git"
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc",
|
|
28
|
+
"dev": "tsc --watch",
|
|
29
|
+
"test": "vitest run",
|
|
30
|
+
"test:watch": "vitest",
|
|
31
|
+
"test:coverage": "vitest run --coverage",
|
|
32
|
+
"lint": "oxlint src/",
|
|
33
|
+
"lint:fix": "oxlint src/ --fix",
|
|
34
|
+
"fmt": "oxfmt src/",
|
|
35
|
+
"fmt:check": "oxfmt src/ --check",
|
|
36
|
+
"secretlint": "secretlint \"**/*\"",
|
|
37
|
+
"prepublishOnly": "npm run build",
|
|
38
|
+
"prepare": "husky"
|
|
39
|
+
},
|
|
40
|
+
"keywords": [
|
|
41
|
+
"xlsx",
|
|
42
|
+
"excel",
|
|
43
|
+
"markdown",
|
|
44
|
+
"converter"
|
|
45
|
+
],
|
|
46
|
+
"author": "khatada",
|
|
47
|
+
"license": "MIT",
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"xlsx": "^0.18.5"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@secretlint/secretlint-rule-preset-recommend": "^11.4.1",
|
|
53
|
+
"@types/node": "^20.0.0",
|
|
54
|
+
"@vitest/coverage-v8": "^1.0.0",
|
|
55
|
+
"husky": "^9.1.7",
|
|
56
|
+
"oxfmt": "^0.43.0",
|
|
57
|
+
"oxlint": "^1.58.0",
|
|
58
|
+
"secretlint": "^11.4.1",
|
|
59
|
+
"typescript": "^5.3.0",
|
|
60
|
+
"vitest": "^1.0.0"
|
|
61
|
+
}
|
|
62
|
+
}
|