@bendyline/squisq-formats 1.3.0 → 1.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/chunk-6M7Z25LA.js +46 -0
- package/dist/chunk-6M7Z25LA.js.map +1 -0
- package/dist/{chunk-S3Y7H2BK.js → chunk-APSIAEXL.js} +9 -8
- package/dist/chunk-APSIAEXL.js.map +1 -0
- package/dist/{chunk-UDS45KUJ.js → chunk-BJQIJ4S4.js} +36 -52
- package/dist/chunk-BJQIJ4S4.js.map +1 -0
- package/dist/{chunk-33YRFXZZ.js → chunk-CRTC6DEX.js} +259 -13
- package/dist/chunk-CRTC6DEX.js.map +1 -0
- package/dist/chunk-FMOIGA5T.js +201 -0
- package/dist/chunk-FMOIGA5T.js.map +1 -0
- package/dist/{chunk-VN2KEOYB.js → chunk-I2GFTEOV.js} +321 -91
- package/dist/chunk-I2GFTEOV.js.map +1 -0
- package/dist/chunk-JBNVE2GV.js +116 -0
- package/dist/chunk-JBNVE2GV.js.map +1 -0
- package/dist/chunk-L53YIGYS.js +141 -0
- package/dist/chunk-L53YIGYS.js.map +1 -0
- package/dist/{chunk-ERZ627GR.js → chunk-ON232HJR.js} +11 -26
- package/dist/chunk-ON232HJR.js.map +1 -0
- package/dist/chunk-PN52A5AA.js +32 -0
- package/dist/chunk-PN52A5AA.js.map +1 -0
- package/dist/{chunk-7DEUGIOO.js → chunk-QSE7EWE7.js} +12 -87
- package/dist/chunk-QSE7EWE7.js.map +1 -0
- package/dist/container/index.d.ts +7 -5
- package/dist/container/index.js +39 -70
- package/dist/container/index.js.map +1 -1
- package/dist/csv/index.d.ts +37 -0
- package/dist/csv/index.js +13 -0
- package/dist/csv/index.js.map +1 -0
- package/dist/docx/index.d.ts +128 -15
- package/dist/docx/index.js +19 -22
- package/dist/docx/index.js.map +1 -1
- package/dist/epub/index.d.ts +66 -11
- package/dist/epub/index.js +11 -18
- package/dist/epub/index.js.map +1 -1
- package/dist/html/index.d.ts +315 -15
- package/dist/html/index.js +32 -165
- package/dist/html/index.js.map +1 -1
- package/dist/index.d.ts +10 -38
- package/dist/index.js +80 -37
- package/dist/index.js.map +1 -1
- package/dist/ooxml/index.d.ts +353 -14
- package/dist/ooxml/index.js +116 -22
- package/dist/ooxml/index.js.map +1 -1
- package/dist/pdf/index.d.ts +143 -17
- package/dist/pdf/index.js +16 -25
- package/dist/pdf/index.js.map +1 -1
- package/dist/pptx/index.d.ts +98 -21
- package/dist/pptx/index.js +18 -34
- package/dist/pptx/index.js.map +1 -1
- package/dist/xlsx/index.d.ts +29 -25
- package/dist/xlsx/index.js +13 -44
- package/dist/xlsx/index.js.map +1 -1
- package/package.json +7 -2
- package/src/__tests__/csvImport.test.ts +51 -0
- package/src/__tests__/exportThemeReconciliation.test.ts +87 -0
- package/src/__tests__/htmlImport.test.ts +57 -0
- package/src/__tests__/plainHtml.test.ts +31 -0
- package/src/__tests__/pptxExport.test.ts +138 -0
- package/src/__tests__/pptxImport.test.ts +70 -0
- package/src/__tests__/roundTripMatrix.fixtures.ts +86 -0
- package/src/__tests__/roundTripMatrix.helpers.ts +154 -0
- package/src/__tests__/roundTripMatrix.test.ts +136 -0
- package/src/__tests__/xlsxImport.test.ts +80 -0
- package/src/csv/index.ts +165 -0
- package/src/docx/export.ts +27 -44
- package/src/docx/import.ts +1 -2
- package/src/epub/export.ts +10 -27
- package/src/html/import.ts +297 -0
- package/src/html/index.ts +4 -0
- package/src/html/plainHtml.ts +66 -16
- package/src/index.ts +10 -3
- package/src/ooxml/namespaces.ts +3 -0
- package/src/pdf/export.ts +10 -5
- package/src/pdf/import.ts +1 -1
- package/src/pptx/export.ts +225 -85
- package/src/pptx/import.ts +156 -0
- package/src/pptx/index.ts +10 -28
- package/src/shared/inlineRuns.ts +99 -0
- package/src/shared/text.ts +41 -0
- package/src/xlsx/import.ts +159 -0
- package/src/xlsx/index.ts +11 -28
- package/dist/__tests__/container.test.d.ts +0 -8
- package/dist/__tests__/container.test.d.ts.map +0 -1
- package/dist/__tests__/container.test.js +0 -147
- package/dist/__tests__/container.test.js.map +0 -1
- package/dist/__tests__/docxExport.test.d.ts +0 -8
- package/dist/__tests__/docxExport.test.d.ts.map +0 -1
- package/dist/__tests__/docxExport.test.js +0 -383
- package/dist/__tests__/docxExport.test.js.map +0 -1
- package/dist/__tests__/docxImport.test.d.ts +0 -8
- package/dist/__tests__/docxImport.test.d.ts.map +0 -1
- package/dist/__tests__/docxImport.test.js +0 -309
- package/dist/__tests__/docxImport.test.js.map +0 -1
- package/dist/__tests__/epub.test.d.ts +0 -8
- package/dist/__tests__/epub.test.d.ts.map +0 -1
- package/dist/__tests__/epub.test.js +0 -472
- package/dist/__tests__/epub.test.js.map +0 -1
- package/dist/__tests__/html.test.d.ts +0 -8
- package/dist/__tests__/html.test.d.ts.map +0 -1
- package/dist/__tests__/html.test.js +0 -317
- package/dist/__tests__/html.test.js.map +0 -1
- package/dist/__tests__/ooxml.test.d.ts +0 -5
- package/dist/__tests__/ooxml.test.d.ts.map +0 -1
- package/dist/__tests__/ooxml.test.js +0 -152
- package/dist/__tests__/ooxml.test.js.map +0 -1
- package/dist/__tests__/pdfExport.test.d.ts +0 -8
- package/dist/__tests__/pdfExport.test.d.ts.map +0 -1
- package/dist/__tests__/pdfExport.test.js +0 -275
- package/dist/__tests__/pdfExport.test.js.map +0 -1
- package/dist/__tests__/pdfImport.test.d.ts +0 -11
- package/dist/__tests__/pdfImport.test.d.ts.map +0 -1
- package/dist/__tests__/pdfImport.test.js +0 -254
- package/dist/__tests__/pdfImport.test.js.map +0 -1
- package/dist/__tests__/plainHtml.test.d.ts +0 -5
- package/dist/__tests__/plainHtml.test.d.ts.map +0 -1
- package/dist/__tests__/plainHtml.test.js +0 -327
- package/dist/__tests__/plainHtml.test.js.map +0 -1
- package/dist/__tests__/plainHtmlBundle.test.d.ts +0 -11
- package/dist/__tests__/plainHtmlBundle.test.d.ts.map +0 -1
- package/dist/__tests__/plainHtmlBundle.test.js +0 -210
- package/dist/__tests__/plainHtmlBundle.test.js.map +0 -1
- package/dist/__tests__/roundTrip.test.d.ts +0 -7
- package/dist/__tests__/roundTrip.test.d.ts.map +0 -1
- package/dist/__tests__/roundTrip.test.js +0 -173
- package/dist/__tests__/roundTrip.test.js.map +0 -1
- package/dist/chunk-33YRFXZZ.js.map +0 -1
- package/dist/chunk-67KIJHV2.js +0 -21
- package/dist/chunk-67KIJHV2.js.map +0 -1
- package/dist/chunk-7DEUGIOO.js.map +0 -1
- package/dist/chunk-ERZ627GR.js.map +0 -1
- package/dist/chunk-S3Y7H2BK.js.map +0 -1
- package/dist/chunk-UDS45KUJ.js.map +0 -1
- package/dist/chunk-VN2KEOYB.js.map +0 -1
- package/dist/chunk-YN5HFCEW.js +0 -120
- package/dist/chunk-YN5HFCEW.js.map +0 -1
- package/dist/container/index.d.ts.map +0 -1
- package/dist/docx/export.d.ts +0 -69
- package/dist/docx/export.d.ts.map +0 -1
- package/dist/docx/export.js +0 -985
- package/dist/docx/export.js.map +0 -1
- package/dist/docx/import.d.ts +0 -65
- package/dist/docx/import.d.ts.map +0 -1
- package/dist/docx/import.js +0 -779
- package/dist/docx/import.js.map +0 -1
- package/dist/docx/index.d.ts.map +0 -1
- package/dist/docx/styles.d.ts +0 -68
- package/dist/docx/styles.d.ts.map +0 -1
- package/dist/docx/styles.js +0 -125
- package/dist/docx/styles.js.map +0 -1
- package/dist/epub/export.d.ts +0 -72
- package/dist/epub/export.d.ts.map +0 -1
- package/dist/epub/export.js +0 -698
- package/dist/epub/export.js.map +0 -1
- package/dist/epub/index.d.ts.map +0 -1
- package/dist/html/docsHtmlBundle.d.ts +0 -53
- package/dist/html/docsHtmlBundle.d.ts.map +0 -1
- package/dist/html/docsHtmlBundle.js +0 -299
- package/dist/html/docsHtmlBundle.js.map +0 -1
- package/dist/html/htmlTemplate.d.ts +0 -70
- package/dist/html/htmlTemplate.d.ts.map +0 -1
- package/dist/html/htmlTemplate.js +0 -282
- package/dist/html/htmlTemplate.js.map +0 -1
- package/dist/html/imageUtils.d.ts +0 -29
- package/dist/html/imageUtils.d.ts.map +0 -1
- package/dist/html/imageUtils.js +0 -63
- package/dist/html/imageUtils.js.map +0 -1
- package/dist/html/index.d.ts.map +0 -1
- package/dist/html/plainHtml.d.ts +0 -79
- package/dist/html/plainHtml.d.ts.map +0 -1
- package/dist/html/plainHtml.js +0 -614
- package/dist/html/plainHtml.js.map +0 -1
- package/dist/html/plainHtmlBundle.d.ts +0 -93
- package/dist/html/plainHtmlBundle.d.ts.map +0 -1
- package/dist/html/plainHtmlBundle.js +0 -357
- package/dist/html/plainHtmlBundle.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/ooxml/index.d.ts.map +0 -1
- package/dist/ooxml/namespaces.d.ts +0 -77
- package/dist/ooxml/namespaces.d.ts.map +0 -1
- package/dist/ooxml/namespaces.js +0 -104
- package/dist/ooxml/namespaces.js.map +0 -1
- package/dist/ooxml/reader.d.ts +0 -52
- package/dist/ooxml/reader.d.ts.map +0 -1
- package/dist/ooxml/reader.js +0 -190
- package/dist/ooxml/reader.js.map +0 -1
- package/dist/ooxml/types.d.ts +0 -82
- package/dist/ooxml/types.d.ts.map +0 -1
- package/dist/ooxml/types.js +0 -9
- package/dist/ooxml/types.js.map +0 -1
- package/dist/ooxml/writer.d.ts +0 -71
- package/dist/ooxml/writer.d.ts.map +0 -1
- package/dist/ooxml/writer.js +0 -200
- package/dist/ooxml/writer.js.map +0 -1
- package/dist/ooxml/xmlUtils.d.ts +0 -76
- package/dist/ooxml/xmlUtils.d.ts.map +0 -1
- package/dist/ooxml/xmlUtils.js +0 -108
- package/dist/ooxml/xmlUtils.js.map +0 -1
- package/dist/pdf/export.d.ts +0 -56
- package/dist/pdf/export.d.ts.map +0 -1
- package/dist/pdf/export.js +0 -768
- package/dist/pdf/export.js.map +0 -1
- package/dist/pdf/import.d.ts +0 -94
- package/dist/pdf/import.d.ts.map +0 -1
- package/dist/pdf/import.js +0 -796
- package/dist/pdf/import.js.map +0 -1
- package/dist/pdf/index.d.ts.map +0 -1
- package/dist/pdf/styles.d.ts +0 -142
- package/dist/pdf/styles.d.ts.map +0 -1
- package/dist/pdf/styles.js +0 -145
- package/dist/pdf/styles.js.map +0 -1
- package/dist/pptx/export.d.ts +0 -75
- package/dist/pptx/export.d.ts.map +0 -1
- package/dist/pptx/export.js +0 -724
- package/dist/pptx/export.js.map +0 -1
- package/dist/pptx/index.d.ts.map +0 -1
- package/dist/pptx/styles.d.ts +0 -54
- package/dist/pptx/styles.d.ts.map +0 -1
- package/dist/pptx/styles.js +0 -73
- package/dist/pptx/styles.js.map +0 -1
- package/dist/pptx/templates.d.ts +0 -24
- package/dist/pptx/templates.d.ts.map +0 -1
- package/dist/pptx/templates.js +0 -158
- package/dist/pptx/templates.js.map +0 -1
- package/dist/xlsx/index.d.ts.map +0 -1
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared inline walker for the "run-based" exporters.
|
|
3
|
+
*
|
|
4
|
+
* DOCX (`<w:r>`) and PPTX (`<a:r>`) both render inline markdown by threading an
|
|
5
|
+
* active character-format object DOWN through nested nodes (strong → bold,
|
|
6
|
+
* emphasis → italic, …) and emitting flat styled runs at the leaves — as
|
|
7
|
+
* opposed to the HTML exporters, which WRAP children in tags, or the PDF
|
|
8
|
+
* exporter, which accumulates positioned spans. That control flow is identical
|
|
9
|
+
* between DOCX and PPTX; only the leaf serialization differs.
|
|
10
|
+
*
|
|
11
|
+
* This module owns the traversal once. Each exporter supplies the handful of
|
|
12
|
+
* leaf handlers (`run`, `link`, `image`, `lineBreak`, optional `footnoteRef`)
|
|
13
|
+
* via {@link InlineRunHandlers}. Because the handler interface is typed, adding
|
|
14
|
+
* a new inline node type here forces both exporters to be considered — there's
|
|
15
|
+
* no longer a per-exporter `default:` that can silently drift.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import type {
|
|
19
|
+
MarkdownInlineNode,
|
|
20
|
+
MarkdownLink,
|
|
21
|
+
MarkdownImage,
|
|
22
|
+
MarkdownFootnoteReference,
|
|
23
|
+
} from '@bendyline/squisq/markdown';
|
|
24
|
+
import { stripHtmlTags } from './text.js';
|
|
25
|
+
|
|
26
|
+
/** Active character formatting threaded down through nested inline nodes. */
|
|
27
|
+
export interface InlineRunFormat {
|
|
28
|
+
bold?: boolean;
|
|
29
|
+
italic?: boolean;
|
|
30
|
+
strike?: boolean;
|
|
31
|
+
code?: boolean;
|
|
32
|
+
/** Explicit run color (hex without `#`); only some exporters use this. */
|
|
33
|
+
color?: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Per-format leaf handlers. The walker handles the shared format-threading
|
|
38
|
+
* control flow; these turn the leaves into the target dialect's markup.
|
|
39
|
+
*/
|
|
40
|
+
export interface InlineRunHandlers {
|
|
41
|
+
/** Emit a styled text run for `text`, given the active format. */
|
|
42
|
+
run(text: string, format: InlineRunFormat): string;
|
|
43
|
+
/** Emit a hyperlink (the handler manages its own child rendering). */
|
|
44
|
+
link(node: MarkdownLink, format: InlineRunFormat): string;
|
|
45
|
+
/** Emit an inline image. */
|
|
46
|
+
image(node: MarkdownImage, format: InlineRunFormat): string;
|
|
47
|
+
/** Emit a hard line break. */
|
|
48
|
+
lineBreak(): string;
|
|
49
|
+
/** Emit a footnote reference. Omit to drop footnote refs (PPTX). */
|
|
50
|
+
footnoteRef?(node: MarkdownFootnoteReference): string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Walk a list of inline nodes, concatenating each rendered run. */
|
|
54
|
+
export function inlineNodesToRuns(
|
|
55
|
+
nodes: MarkdownInlineNode[],
|
|
56
|
+
handlers: InlineRunHandlers,
|
|
57
|
+
format: InlineRunFormat = {},
|
|
58
|
+
): string {
|
|
59
|
+
let out = '';
|
|
60
|
+
for (const node of nodes) {
|
|
61
|
+
out += inlineNodeToRuns(node, handlers, format);
|
|
62
|
+
}
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Render a single inline node under the active format. */
|
|
67
|
+
export function inlineNodeToRuns(
|
|
68
|
+
node: MarkdownInlineNode,
|
|
69
|
+
handlers: InlineRunHandlers,
|
|
70
|
+
format: InlineRunFormat,
|
|
71
|
+
): string {
|
|
72
|
+
switch (node.type) {
|
|
73
|
+
case 'text':
|
|
74
|
+
return handlers.run(node.value, format);
|
|
75
|
+
case 'strong':
|
|
76
|
+
return inlineNodesToRuns(node.children, handlers, { ...format, bold: true });
|
|
77
|
+
case 'emphasis':
|
|
78
|
+
return inlineNodesToRuns(node.children, handlers, { ...format, italic: true });
|
|
79
|
+
case 'delete':
|
|
80
|
+
return inlineNodesToRuns(node.children, handlers, { ...format, strike: true });
|
|
81
|
+
case 'inlineCode':
|
|
82
|
+
return handlers.run(node.value, { ...format, code: true });
|
|
83
|
+
case 'inlineMath':
|
|
84
|
+
return handlers.run(node.value, { ...format, code: true });
|
|
85
|
+
case 'htmlInline':
|
|
86
|
+
return handlers.run(stripHtmlTags(node.rawHtml), format);
|
|
87
|
+
case 'link':
|
|
88
|
+
return handlers.link(node, format);
|
|
89
|
+
case 'image':
|
|
90
|
+
return handlers.image(node, format);
|
|
91
|
+
case 'break':
|
|
92
|
+
return handlers.lineBreak();
|
|
93
|
+
case 'footnoteReference':
|
|
94
|
+
return handlers.footnoteRef ? handlers.footnoteRef(node) : '';
|
|
95
|
+
default:
|
|
96
|
+
// linkReference, imageReference, textDirective, inlineIcon, … — skip.
|
|
97
|
+
return '';
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared plain-text helpers used by every format exporter.
|
|
3
|
+
*
|
|
4
|
+
* These were previously copy-pasted into the docx / pptx / epub exporters with
|
|
5
|
+
* subtle drift (e.g. some handled `inlineMath`, some handled `break`). Keeping a
|
|
6
|
+
* single implementation here means a fix or a newly-supported inline node type
|
|
7
|
+
* only has to be added in one place.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { MarkdownInlineNode } from '@bendyline/squisq/markdown';
|
|
11
|
+
|
|
12
|
+
/** Strip HTML tags from a string, keeping only the text content. */
|
|
13
|
+
export function stripHtmlTags(html: string): string {
|
|
14
|
+
return html.replace(/<[^>]*>/g, '');
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Flatten a single inline node to its plain-text content. */
|
|
18
|
+
export function inlineToPlainText(node: MarkdownInlineNode): string {
|
|
19
|
+
switch (node.type) {
|
|
20
|
+
case 'text':
|
|
21
|
+
case 'inlineCode':
|
|
22
|
+
case 'inlineMath':
|
|
23
|
+
return node.value;
|
|
24
|
+
case 'emphasis':
|
|
25
|
+
case 'strong':
|
|
26
|
+
case 'delete':
|
|
27
|
+
case 'link':
|
|
28
|
+
return extractPlainText(node.children);
|
|
29
|
+
case 'image':
|
|
30
|
+
return node.alt ?? '';
|
|
31
|
+
case 'break':
|
|
32
|
+
return ' ';
|
|
33
|
+
default:
|
|
34
|
+
return '';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Flatten an array of inline nodes to their concatenated plain-text content. */
|
|
39
|
+
export function extractPlainText(nodes: MarkdownInlineNode[]): string {
|
|
40
|
+
return nodes.map(inlineToPlainText).join('');
|
|
41
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XLSX import — SpreadsheetML (.xlsx) → MarkdownDocument.
|
|
3
|
+
*
|
|
4
|
+
* Reuses the shared ooxml/ reader (zip + DOMParser). Reads the workbook's
|
|
5
|
+
* sheet list, resolves each sheet part via relationships, pulls shared strings,
|
|
6
|
+
* and turns each worksheet's cell grid into a markdown table (first row treated
|
|
7
|
+
* as the header). By default every sheet is imported, each preceded by an H1 of
|
|
8
|
+
* the sheet name; pass `options.sheet` (index or name) to import just one.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type {
|
|
12
|
+
MarkdownBlockNode,
|
|
13
|
+
MarkdownDocument,
|
|
14
|
+
MarkdownTable,
|
|
15
|
+
MarkdownTableCell,
|
|
16
|
+
MarkdownTableRow,
|
|
17
|
+
} from '@bendyline/squisq/markdown';
|
|
18
|
+
import { getPartXml, getPartRelationships, openPackage } from '../ooxml/reader.js';
|
|
19
|
+
import type { OoxmlPackage } from '../ooxml/types.js';
|
|
20
|
+
import { NS_R, NS_SML } from '../ooxml/namespaces.js';
|
|
21
|
+
|
|
22
|
+
export interface XlsxImportOptions {
|
|
23
|
+
/** Which sheet to import (0-based index or sheet name). Default: all sheets. */
|
|
24
|
+
sheet?: number | string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface SheetRef {
|
|
28
|
+
name: string;
|
|
29
|
+
path: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function attrNS(el: Element, ns: string, local: string, fallback: string): string | null {
|
|
33
|
+
return el.getAttributeNS(ns, local) ?? el.getAttribute(fallback);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Resolve a relationship target (relative to its part's dir) to a zip path. */
|
|
37
|
+
function resolveTarget(baseDir: string, target: string): string {
|
|
38
|
+
if (target.startsWith('/')) return target.replace(/^\//, '');
|
|
39
|
+
const stack = baseDir ? baseDir.split('/') : [];
|
|
40
|
+
for (const seg of target.split('/')) {
|
|
41
|
+
if (seg === '..') stack.pop();
|
|
42
|
+
else if (seg !== '.') stack.push(seg);
|
|
43
|
+
}
|
|
44
|
+
return stack.join('/');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async function readSheets(pkg: OoxmlPackage): Promise<SheetRef[]> {
|
|
48
|
+
const wb = await getPartXml(pkg, 'xl/workbook.xml');
|
|
49
|
+
if (!wb) return [];
|
|
50
|
+
const rels = await getPartRelationships(pkg, 'xl/workbook.xml');
|
|
51
|
+
const relById = new Map(rels.map((r) => [r.id, r.target]));
|
|
52
|
+
const out: SheetRef[] = [];
|
|
53
|
+
const sheetEls = wb.getElementsByTagNameNS(NS_SML, 'sheet');
|
|
54
|
+
for (let i = 0; i < sheetEls.length; i++) {
|
|
55
|
+
const el = sheetEls[i]!;
|
|
56
|
+
const name = el.getAttribute('name') ?? `Sheet${i + 1}`;
|
|
57
|
+
const rid = attrNS(el, NS_R, 'id', 'r:id');
|
|
58
|
+
const target = rid ? relById.get(rid) : undefined;
|
|
59
|
+
if (target) out.push({ name, path: resolveTarget('xl', target) });
|
|
60
|
+
}
|
|
61
|
+
return out;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async function readSharedStrings(pkg: OoxmlPackage): Promise<string[]> {
|
|
65
|
+
const doc = await getPartXml(pkg, 'xl/sharedStrings.xml');
|
|
66
|
+
if (!doc) return [];
|
|
67
|
+
const siEls = doc.getElementsByTagNameNS(NS_SML, 'si');
|
|
68
|
+
const out: string[] = [];
|
|
69
|
+
for (let i = 0; i < siEls.length; i++) out.push(siEls[i]!.textContent ?? '');
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** Column letters of a cell ref ("B7" → 1, "AA1" → 26). */
|
|
74
|
+
function colIndex(ref: string): number {
|
|
75
|
+
const m = /^([A-Za-z]+)/.exec(ref);
|
|
76
|
+
if (!m) return 0;
|
|
77
|
+
let n = 0;
|
|
78
|
+
for (const ch of m[1]!.toUpperCase()) n = n * 26 + (ch.charCodeAt(0) - 64);
|
|
79
|
+
return n - 1;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function cellText(cell: Element, shared: string[]): string {
|
|
83
|
+
const t = cell.getAttribute('t');
|
|
84
|
+
if (t === 'inlineStr') {
|
|
85
|
+
const is = cell.getElementsByTagNameNS(NS_SML, 't');
|
|
86
|
+
return is.length ? (is[0]!.textContent ?? '') : '';
|
|
87
|
+
}
|
|
88
|
+
const vEls = cell.getElementsByTagNameNS(NS_SML, 'v');
|
|
89
|
+
const v = vEls.length ? (vEls[0]!.textContent ?? '') : '';
|
|
90
|
+
if (t === 's') return shared[Number.parseInt(v, 10)] ?? '';
|
|
91
|
+
if (t === 'b') return v === '1' ? 'TRUE' : 'FALSE';
|
|
92
|
+
return v;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async function sheetToGrid(pkg: OoxmlPackage, path: string, shared: string[]): Promise<string[][]> {
|
|
96
|
+
const doc = await getPartXml(pkg, path);
|
|
97
|
+
if (!doc) return [];
|
|
98
|
+
const rowEls = doc.getElementsByTagNameNS(NS_SML, 'row');
|
|
99
|
+
const grid: string[][] = [];
|
|
100
|
+
for (let r = 0; r < rowEls.length; r++) {
|
|
101
|
+
const cells = rowEls[r]!.getElementsByTagNameNS(NS_SML, 'c');
|
|
102
|
+
const rowArr: string[] = [];
|
|
103
|
+
for (let c = 0; c < cells.length; c++) {
|
|
104
|
+
const cell = cells[c]!;
|
|
105
|
+
const ref = cell.getAttribute('r');
|
|
106
|
+
const idx = ref ? colIndex(ref) : rowArr.length;
|
|
107
|
+
while (rowArr.length < idx) rowArr.push('');
|
|
108
|
+
rowArr[idx] = cellText(cell, shared);
|
|
109
|
+
}
|
|
110
|
+
grid.push(rowArr);
|
|
111
|
+
}
|
|
112
|
+
return grid;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function gridToTable(grid: string[][]): MarkdownTable {
|
|
116
|
+
const maxCols = grid.reduce((m, r) => Math.max(m, r.length), 1);
|
|
117
|
+
const rows: MarkdownTableRow[] = grid.map((cells, rowIdx) => {
|
|
118
|
+
const children: MarkdownTableCell[] = [];
|
|
119
|
+
for (let c = 0; c < maxCols; c++) {
|
|
120
|
+
const value = cells[c] ?? '';
|
|
121
|
+
children.push({
|
|
122
|
+
type: 'tableCell',
|
|
123
|
+
...(rowIdx === 0 ? { isHeader: true } : {}),
|
|
124
|
+
children: value ? [{ type: 'text', value }] : [],
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return { type: 'tableRow', children };
|
|
128
|
+
});
|
|
129
|
+
return { type: 'table', children: rows };
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export async function xlsxToMarkdownDoc(
|
|
133
|
+
data: ArrayBuffer | Blob,
|
|
134
|
+
options: XlsxImportOptions = {},
|
|
135
|
+
): Promise<MarkdownDocument> {
|
|
136
|
+
const pkg = await openPackage(data);
|
|
137
|
+
const sheets = await readSheets(pkg);
|
|
138
|
+
const shared = await readSharedStrings(pkg);
|
|
139
|
+
|
|
140
|
+
let selected = sheets;
|
|
141
|
+
if (options.sheet !== undefined) {
|
|
142
|
+
const picked =
|
|
143
|
+
typeof options.sheet === 'number'
|
|
144
|
+
? sheets[options.sheet]
|
|
145
|
+
: sheets.find((s) => s.name === options.sheet);
|
|
146
|
+
selected = picked ? [picked] : [];
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const children: MarkdownBlockNode[] = [];
|
|
150
|
+
const single = selected.length === 1 && options.sheet !== undefined;
|
|
151
|
+
for (const sheet of selected) {
|
|
152
|
+
const grid = await sheetToGrid(pkg, sheet.path, shared);
|
|
153
|
+
if (!single) {
|
|
154
|
+
children.push({ type: 'heading', depth: 1, children: [{ type: 'text', value: sheet.name }] });
|
|
155
|
+
}
|
|
156
|
+
if (grid.length > 0) children.push(gridToTable(grid));
|
|
157
|
+
}
|
|
158
|
+
return { type: 'document', children };
|
|
159
|
+
}
|
package/src/xlsx/index.ts
CHANGED
|
@@ -11,8 +11,13 @@
|
|
|
11
11
|
* ```
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
+
import { markdownToDoc } from '@bendyline/squisq/doc';
|
|
14
15
|
import type { MarkdownDocument } from '@bendyline/squisq/markdown';
|
|
15
16
|
import type { Doc } from '@bendyline/squisq/schemas';
|
|
17
|
+
import { type XlsxImportOptions, xlsxToMarkdownDoc } from './import.js';
|
|
18
|
+
|
|
19
|
+
export type { XlsxImportOptions } from './import.js';
|
|
20
|
+
export { xlsxToMarkdownDoc } from './import.js';
|
|
16
21
|
|
|
17
22
|
/**
|
|
18
23
|
* Options for XLSX export (placeholder).
|
|
@@ -24,18 +29,10 @@ export interface XlsxExportOptions {
|
|
|
24
29
|
author?: string;
|
|
25
30
|
}
|
|
26
31
|
|
|
27
|
-
/**
|
|
28
|
-
* Options for XLSX import (placeholder).
|
|
29
|
-
*/
|
|
30
|
-
export interface XlsxImportOptions {
|
|
31
|
-
/** Which sheet to import (0-based index or name). Default: 0 */
|
|
32
|
-
sheet?: number | string;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
32
|
/**
|
|
36
33
|
* Convert a MarkdownDocument to a .xlsx Blob.
|
|
37
34
|
*
|
|
38
|
-
* @throws Error — XLSX
|
|
35
|
+
* @throws Error — XLSX export is not yet implemented
|
|
39
36
|
*/
|
|
40
37
|
export async function markdownDocToXlsx(
|
|
41
38
|
_doc: MarkdownDocument,
|
|
@@ -47,32 +44,18 @@ export async function markdownDocToXlsx(
|
|
|
47
44
|
/**
|
|
48
45
|
* Convert a squisq Doc to a .xlsx Blob.
|
|
49
46
|
*
|
|
50
|
-
* @throws Error — XLSX
|
|
47
|
+
* @throws Error — XLSX export is not yet implemented
|
|
51
48
|
*/
|
|
52
49
|
export async function docToXlsx(_doc: Doc, _options?: XlsxExportOptions): Promise<Blob> {
|
|
53
50
|
throw new Error('XLSX export is not yet implemented');
|
|
54
51
|
}
|
|
55
52
|
|
|
56
53
|
/**
|
|
57
|
-
* Convert a .xlsx file to a
|
|
58
|
-
*
|
|
59
|
-
* @throws Error — XLSX support is not yet implemented
|
|
60
|
-
*/
|
|
61
|
-
export async function xlsxToMarkdownDoc(
|
|
62
|
-
_data: ArrayBuffer | Blob,
|
|
63
|
-
_options?: XlsxImportOptions,
|
|
64
|
-
): Promise<MarkdownDocument> {
|
|
65
|
-
throw new Error('XLSX import is not yet implemented');
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Convert a .xlsx file to a squisq Doc.
|
|
70
|
-
*
|
|
71
|
-
* @throws Error — XLSX support is not yet implemented
|
|
54
|
+
* Convert a .xlsx file to a squisq Doc (via the markdown table model).
|
|
72
55
|
*/
|
|
73
56
|
export async function xlsxToDoc(
|
|
74
|
-
|
|
75
|
-
|
|
57
|
+
data: ArrayBuffer | Blob,
|
|
58
|
+
options?: XlsxImportOptions,
|
|
76
59
|
): Promise<Doc> {
|
|
77
|
-
|
|
60
|
+
return markdownToDoc(await xlsxToMarkdownDoc(data, options));
|
|
78
61
|
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for container ZIP serialization: containerToZip, zipToContainer.
|
|
3
|
-
*
|
|
4
|
-
* Verifies round-trip fidelity: write files to a container, serialize to ZIP,
|
|
5
|
-
* deserialize back, and confirm all files are intact.
|
|
6
|
-
*/
|
|
7
|
-
export {};
|
|
8
|
-
//# sourceMappingURL=container.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"container.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/container.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for container ZIP serialization: containerToZip, zipToContainer.
|
|
3
|
-
*
|
|
4
|
-
* Verifies round-trip fidelity: write files to a container, serialize to ZIP,
|
|
5
|
-
* deserialize back, and confirm all files are intact.
|
|
6
|
-
*/
|
|
7
|
-
import { describe, it, expect } from 'vitest';
|
|
8
|
-
import JSZip from 'jszip';
|
|
9
|
-
import { MemoryContentContainer } from '@bendyline/squisq/storage';
|
|
10
|
-
import { containerToZip, zipToContainer } from '../container/index';
|
|
11
|
-
// ============================================
|
|
12
|
-
// Helpers
|
|
13
|
-
// ============================================
|
|
14
|
-
/** Helper to read a Blob as ArrayBuffer (works in jsdom) */
|
|
15
|
-
async function blobToArrayBuffer(blob) {
|
|
16
|
-
return new Promise((resolve, reject) => {
|
|
17
|
-
const reader = new FileReader();
|
|
18
|
-
reader.onload = () => resolve(reader.result);
|
|
19
|
-
reader.onerror = () => reject(reader.error);
|
|
20
|
-
reader.readAsArrayBuffer(blob);
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
// ============================================
|
|
24
|
-
// containerToZip
|
|
25
|
-
// ============================================
|
|
26
|
-
describe('containerToZip', () => {
|
|
27
|
-
it('creates a valid ZIP from an empty container', async () => {
|
|
28
|
-
const container = new MemoryContentContainer();
|
|
29
|
-
const blob = await containerToZip(container);
|
|
30
|
-
expect(blob).toBeInstanceOf(Blob);
|
|
31
|
-
expect(blob.size).toBeGreaterThan(0);
|
|
32
|
-
// Should be parseable as a ZIP with no files
|
|
33
|
-
const zip = await JSZip.loadAsync(await blobToArrayBuffer(blob));
|
|
34
|
-
expect(Object.keys(zip.files)).toHaveLength(0);
|
|
35
|
-
});
|
|
36
|
-
it('includes all files from the container', async () => {
|
|
37
|
-
const container = new MemoryContentContainer();
|
|
38
|
-
await container.writeDocument('# Hello World');
|
|
39
|
-
await container.writeFile('images/hero.jpg', new Uint8Array([0xff, 0xd8, 0xff]), 'image/jpeg');
|
|
40
|
-
await container.writeFile('timing.json', new TextEncoder().encode('{"duration":10}'));
|
|
41
|
-
const blob = await containerToZip(container);
|
|
42
|
-
const zip = await JSZip.loadAsync(await blobToArrayBuffer(blob));
|
|
43
|
-
const filenames = Object.keys(zip.files)
|
|
44
|
-
.filter((f) => !zip.files[f].dir)
|
|
45
|
-
.sort();
|
|
46
|
-
expect(filenames).toEqual(['images/hero.jpg', 'index.md', 'timing.json']);
|
|
47
|
-
});
|
|
48
|
-
it('preserves file content', async () => {
|
|
49
|
-
const container = new MemoryContentContainer();
|
|
50
|
-
const markdown = '# Test Document\n\nSome content.';
|
|
51
|
-
await container.writeDocument(markdown);
|
|
52
|
-
const blob = await containerToZip(container);
|
|
53
|
-
const zip = await JSZip.loadAsync(await blobToArrayBuffer(blob));
|
|
54
|
-
const content = await zip.file('index.md').async('string');
|
|
55
|
-
expect(content).toBe(markdown);
|
|
56
|
-
});
|
|
57
|
-
it('preserves binary content', async () => {
|
|
58
|
-
const container = new MemoryContentContainer();
|
|
59
|
-
const binaryData = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
|
|
60
|
-
await container.writeFile('image.png', binaryData, 'image/png');
|
|
61
|
-
const blob = await containerToZip(container);
|
|
62
|
-
const zip = await JSZip.loadAsync(await blobToArrayBuffer(blob));
|
|
63
|
-
const data = await zip.file('image.png').async('uint8array');
|
|
64
|
-
expect(data).toEqual(binaryData);
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
// ============================================
|
|
68
|
-
// zipToContainer
|
|
69
|
-
// ============================================
|
|
70
|
-
describe('zipToContainer', () => {
|
|
71
|
-
it('loads files from a ZIP', async () => {
|
|
72
|
-
const zip = new JSZip();
|
|
73
|
-
zip.file('index.md', '# Hello');
|
|
74
|
-
zip.file('images/photo.jpg', new Uint8Array([0xff, 0xd8]));
|
|
75
|
-
const zipBlob = await zip.generateAsync({ type: 'blob' });
|
|
76
|
-
const container = await zipToContainer(zipBlob);
|
|
77
|
-
const entries = await container.listFiles();
|
|
78
|
-
expect(entries.map((e) => e.path).sort()).toEqual(['images/photo.jpg', 'index.md']);
|
|
79
|
-
});
|
|
80
|
-
it('preserves text content', async () => {
|
|
81
|
-
const zip = new JSZip();
|
|
82
|
-
zip.file('index.md', '# My Document\n\nParagraph.');
|
|
83
|
-
const zipBlob = await zip.generateAsync({ type: 'blob' });
|
|
84
|
-
const container = await zipToContainer(zipBlob);
|
|
85
|
-
expect(await container.readDocument()).toBe('# My Document\n\nParagraph.');
|
|
86
|
-
});
|
|
87
|
-
it('preserves binary content', async () => {
|
|
88
|
-
const original = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
|
|
89
|
-
const zip = new JSZip();
|
|
90
|
-
zip.file('data.bin', original);
|
|
91
|
-
const zipBlob = await zip.generateAsync({ type: 'blob' });
|
|
92
|
-
const container = await zipToContainer(zipBlob);
|
|
93
|
-
const data = await container.readFile('data.bin');
|
|
94
|
-
expect(new Uint8Array(data)).toEqual(original);
|
|
95
|
-
});
|
|
96
|
-
it('skips directory entries', async () => {
|
|
97
|
-
const zip = new JSZip();
|
|
98
|
-
zip.folder('images');
|
|
99
|
-
zip.file('images/photo.jpg', new Uint8Array([0xff]));
|
|
100
|
-
const zipBlob = await zip.generateAsync({ type: 'blob' });
|
|
101
|
-
const container = await zipToContainer(zipBlob);
|
|
102
|
-
const entries = await container.listFiles();
|
|
103
|
-
// Only the file, not the directory
|
|
104
|
-
expect(entries).toHaveLength(1);
|
|
105
|
-
expect(entries[0].path).toBe('images/photo.jpg');
|
|
106
|
-
});
|
|
107
|
-
it('works with ArrayBuffer input', async () => {
|
|
108
|
-
const zip = new JSZip();
|
|
109
|
-
zip.file('readme.md', '# Read me');
|
|
110
|
-
const ab = await zip.generateAsync({ type: 'arraybuffer' });
|
|
111
|
-
const container = await zipToContainer(ab);
|
|
112
|
-
expect(await container.readDocument()).toBe('# Read me');
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
// ============================================
|
|
116
|
-
// Round-trip
|
|
117
|
-
// ============================================
|
|
118
|
-
describe('containerToZip / zipToContainer round-trip', () => {
|
|
119
|
-
it('round-trips a container with markdown and media', async () => {
|
|
120
|
-
// Create original container
|
|
121
|
-
const original = new MemoryContentContainer();
|
|
122
|
-
const markdown = '# Round Trip Test\n\n\n\nSome text.';
|
|
123
|
-
await original.writeDocument(markdown);
|
|
124
|
-
await original.writeFile('images/hero.jpg', new Uint8Array([0xff, 0xd8, 0xff, 0xe0]), 'image/jpeg');
|
|
125
|
-
await original.writeFile('audio/narration.mp3', new Uint8Array([0x49, 0x44, 0x33]), 'audio/mpeg');
|
|
126
|
-
await original.writeFile('timing.json', new TextEncoder().encode('{"segments":[]}'));
|
|
127
|
-
// Serialize to ZIP
|
|
128
|
-
const zipBlob = await containerToZip(original);
|
|
129
|
-
// Deserialize back
|
|
130
|
-
const restored = await zipToContainer(zipBlob);
|
|
131
|
-
// Verify document
|
|
132
|
-
expect(await restored.readDocument()).toBe(markdown);
|
|
133
|
-
expect(await restored.getDocumentPath()).toBe('index.md');
|
|
134
|
-
// Verify all files present
|
|
135
|
-
const entries = (await restored.listFiles()).map((e) => e.path).sort();
|
|
136
|
-
expect(entries).toEqual(['audio/narration.mp3', 'images/hero.jpg', 'index.md', 'timing.json']);
|
|
137
|
-
// Verify binary content
|
|
138
|
-
const heroData = new Uint8Array((await restored.readFile('images/hero.jpg')));
|
|
139
|
-
expect(heroData).toEqual(new Uint8Array([0xff, 0xd8, 0xff, 0xe0]));
|
|
140
|
-
const audioData = new Uint8Array((await restored.readFile('audio/narration.mp3')));
|
|
141
|
-
expect(audioData).toEqual(new Uint8Array([0x49, 0x44, 0x33]));
|
|
142
|
-
// Verify JSON sidecar
|
|
143
|
-
const timingData = new TextDecoder().decode((await restored.readFile('timing.json')));
|
|
144
|
-
expect(timingData).toBe('{"segments":[]}');
|
|
145
|
-
});
|
|
146
|
-
});
|
|
147
|
-
//# sourceMappingURL=container.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"container.test.js","sourceRoot":"","sources":["../../src/__tests__/container.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"docxExport.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/docxExport.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|