documents.js 2.3.2 → 3.0.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/README.md +27 -14
- package/dist/codecs/registry.d.cts +8 -3
- package/dist/codecs/registry.d.ts +8 -3
- package/dist/convert/canonicalise.cjs +20 -0
- package/dist/convert/canonicalise.d.cts +5 -0
- package/dist/convert/canonicalise.d.ts +5 -0
- package/dist/convert/canonicalise.js +18 -0
- package/dist/convert/composition.cjs +29 -28
- package/dist/convert/composition.d.cts +1 -1
- package/dist/convert/composition.d.ts +1 -1
- package/dist/convert/composition.js +29 -28
- package/dist/convert/convert.cjs +14 -26
- package/dist/convert/convert.d.cts +1 -1
- package/dist/convert/convert.d.ts +1 -1
- package/dist/convert/convert.js +14 -26
- package/dist/convert/decompose.cjs +134 -0
- package/dist/convert/decompose.d.cts +13 -0
- package/dist/convert/decompose.d.ts +13 -0
- package/dist/convert/decompose.js +126 -0
- package/dist/convert/factor-styles.cjs +364 -0
- package/dist/convert/factor-styles.d.cts +6 -0
- package/dist/convert/factor-styles.d.ts +6 -0
- package/dist/convert/factor-styles.js +362 -0
- package/dist/convert/flatten.cjs +137 -0
- package/dist/convert/flatten.d.cts +5 -0
- package/dist/convert/flatten.d.ts +5 -0
- package/dist/convert/flatten.js +136 -0
- package/dist/convert/from-package.cjs +4 -3
- package/dist/convert/from-package.d.cts +2 -1
- package/dist/convert/from-package.d.ts +2 -1
- package/dist/convert/from-package.js +5 -4
- package/dist/convert/local.cjs +1 -1
- package/dist/convert/local.js +1 -1
- package/dist/convert/variant-bridges.cjs +0 -4
- package/dist/convert/variant-bridges.js +1 -5
- package/dist/csv/read.cjs +0 -1
- package/dist/csv/read.js +1 -2
- package/dist/edit/docx/numbering.d.cts +1 -1
- package/dist/edit/docx/numbering.d.ts +1 -1
- package/dist/edit/docx/paragraph.cjs +1 -0
- package/dist/edit/docx/paragraph.js +1 -0
- package/dist/edit/pdf/editor.cjs +1 -2
- package/dist/edit/pdf/editor.d.cts +2 -2
- package/dist/edit/pdf/editor.d.ts +2 -2
- package/dist/edit/pdf/editor.js +1 -2
- package/dist/edit/pdf/item.d.cts +1 -1
- package/dist/edit/pdf/item.d.ts +1 -1
- package/dist/edit/pdf/page.d.cts +2 -2
- package/dist/edit/pdf/page.d.ts +2 -2
- package/dist/edit/pdf/util.d.cts +1 -1
- package/dist/edit/pdf/util.d.ts +1 -1
- package/dist/fonts/registry.d.cts +1 -1
- package/dist/fonts/registry.d.ts +1 -1
- package/dist/index.cjs +10 -15
- package/dist/index.d.cts +7 -4
- package/dist/index.d.ts +7 -4
- package/dist/index.js +6 -3
- package/dist/{item-Dj6f1VTE.d.cts → item-D9vQKT0T.d.cts} +2 -1
- package/dist/{item-Dj6f1VTE.d.ts → item-D9vQKT0T.d.ts} +2 -1
- package/dist/latex/lint.cjs +3 -2
- package/dist/latex/lint.js +3 -2
- package/dist/layout/drawing.d.cts +2 -1
- package/dist/layout/drawing.d.ts +2 -1
- package/dist/layout/engine.cjs +8 -5
- package/dist/layout/engine.d.cts +2 -1
- package/dist/layout/engine.d.ts +2 -1
- package/dist/layout/engine.js +8 -5
- package/dist/layout/lattice.d.cts +1 -1
- package/dist/layout/lattice.d.ts +1 -1
- package/dist/layout/reconstruct.cjs +0 -5
- package/dist/layout/reconstruct.d.cts +2 -1
- package/dist/layout/reconstruct.d.ts +2 -1
- package/dist/layout/reconstruct.js +0 -5
- package/dist/layout/shared.cjs +2 -1
- package/dist/layout/shared.d.cts +2 -1
- package/dist/layout/shared.d.ts +2 -1
- package/dist/layout/shared.js +2 -1
- package/dist/layout/sheets.d.cts +2 -1
- package/dist/layout/sheets.d.ts +2 -1
- package/dist/layout/slides.d.cts +2 -1
- package/dist/layout/slides.d.ts +2 -1
- package/dist/markdown/render.cjs +0 -1
- package/dist/markdown/render.js +1 -2
- package/dist/model/embedded-drawing.cjs +5 -8
- package/dist/model/embedded-drawing.js +5 -8
- package/dist/model/formula.cjs +0 -2
- package/dist/model/formula.js +0 -2
- package/dist/odb/report/render.cjs +0 -1
- package/dist/odb/report/render.js +1 -2
- package/dist/odb/spreadsheet.cjs +0 -1
- package/dist/odb/spreadsheet.js +1 -2
- package/dist/odf/odg/read.cjs +0 -2
- package/dist/odf/odg/read.js +0 -2
- package/dist/odf/odp/read.cjs +0 -2
- package/dist/odf/odp/read.js +0 -2
- package/dist/odf/ods/read.cjs +0 -2
- package/dist/odf/ods/read.js +0 -2
- package/dist/odf/odt/read.cjs +0 -2
- package/dist/odf/odt/read.js +0 -2
- package/dist/ooxml/docx/read.cjs +0 -2
- package/dist/ooxml/docx/read.js +0 -2
- package/dist/ooxml/pptx/read.cjs +0 -2
- package/dist/ooxml/pptx/read.js +0 -2
- package/dist/svg/read.cjs +8 -11
- package/dist/svg/read.js +8 -11
- package/package.json +6 -6
package/dist/convert/convert.js
CHANGED
|
@@ -11,11 +11,12 @@ import { throwIfAborted } from "../ports/abort.js";
|
|
|
11
11
|
import { buildOdbTableCsv } from "../odb/csv.js";
|
|
12
12
|
import { readOdbTables } from "../odb/read.js";
|
|
13
13
|
import { odbTablesToSpreadsheetDocument } from "../odb/spreadsheet.js";
|
|
14
|
+
import { assemblePackage } from "./factor-styles.js";
|
|
14
15
|
import { convertDocument } from "./composition.js";
|
|
15
16
|
import { buildXlsxPackage, encodePackage } from "ooxml.js";
|
|
16
|
-
import { COLOR_BLACK,
|
|
17
|
+
import { COLOR_BLACK, PAGE_SIZE_A4 } from "document-schema.js";
|
|
18
|
+
import { LAYOUT_FORMAT_VERSION, createFontMeasurer, createFontRegistry, loadMathFont, writePdf } from "pdf-codec";
|
|
17
19
|
import { decodePackage as decodePackage$1, encodePackage as encodePackage$1, readOdfMetadata, readOdfParagraph, readOdfTable, readOdm } from "odf.js";
|
|
18
|
-
import { createFontMeasurer, createFontRegistry, loadMathFont, writePdf } from "pdf-codec";
|
|
19
20
|
//#region src/convert/convert.ts
|
|
20
21
|
const mathMetricsAt = (sizePt) => loadMathFont().metricsAt(sizePt);
|
|
21
22
|
function docxToPdf(bytes, options) {
|
|
@@ -78,16 +79,8 @@ function odfToPdf(bytes, options) {
|
|
|
78
79
|
}],
|
|
79
80
|
images: {}
|
|
80
81
|
};
|
|
81
|
-
options?.onDocument?.({
|
|
82
|
-
formatVersion: DOCUMENT_PACKAGE_FORMAT_VERSION,
|
|
83
|
-
content,
|
|
84
|
-
pages: [{
|
|
85
|
-
widthPt: PAGE_SIZE_A4.widthPt,
|
|
86
|
-
heightPt: PAGE_SIZE_A4.heightPt
|
|
87
|
-
}]
|
|
88
|
-
});
|
|
89
82
|
throwIfAborted(options?.signal);
|
|
90
|
-
|
|
83
|
+
const out = writePdf(layout, {
|
|
91
84
|
signal: options?.signal,
|
|
92
85
|
formulas: [{
|
|
93
86
|
pageIndex: 0,
|
|
@@ -96,6 +89,11 @@ function odfToPdf(bytes, options) {
|
|
|
96
89
|
box
|
|
97
90
|
}]
|
|
98
91
|
});
|
|
92
|
+
options?.onDocument?.(assemblePackage(content, [{
|
|
93
|
+
widthPt: PAGE_SIZE_A4.widthPt,
|
|
94
|
+
heightPt: PAGE_SIZE_A4.heightPt
|
|
95
|
+
}]));
|
|
96
|
+
return out;
|
|
99
97
|
}
|
|
100
98
|
function pdfToDocx(bytes, options) {
|
|
101
99
|
return convertDocument("pdf", "docx", bytes, options);
|
|
@@ -279,7 +277,6 @@ function odmToPdf(bytes, options) {
|
|
|
279
277
|
throwIfAborted(options?.signal);
|
|
280
278
|
const content = {
|
|
281
279
|
kind: "wordprocessing",
|
|
282
|
-
formatVersion: CONTENT_FORMAT_VERSION,
|
|
283
280
|
metadata: resolveMetadataTimestamps(readOdfMetadata(pkg), options?.clock),
|
|
284
281
|
sections: combinedSections
|
|
285
282
|
};
|
|
@@ -306,10 +303,7 @@ function odbToXlsx(bytes, options) {
|
|
|
306
303
|
throwIfAborted(options?.signal);
|
|
307
304
|
const content = odbTablesToSpreadsheetDocument(tables);
|
|
308
305
|
const out = encodePackage(buildXlsxPackage(content));
|
|
309
|
-
options?.onDocument?.(
|
|
310
|
-
formatVersion: DOCUMENT_PACKAGE_FORMAT_VERSION,
|
|
311
|
-
content
|
|
312
|
-
});
|
|
306
|
+
options?.onDocument?.(assemblePackage(content));
|
|
313
307
|
return out;
|
|
314
308
|
}
|
|
315
309
|
function odbToCsv(bytes, options) {
|
|
@@ -318,10 +312,7 @@ function odbToCsv(bytes, options) {
|
|
|
318
312
|
const tables = readOdbTables(pkg, { timeZone: options?.timeZone });
|
|
319
313
|
throwIfAborted(options?.signal);
|
|
320
314
|
const csv = buildOdbTableCsv(tables, options?.table);
|
|
321
|
-
if (options?.onDocument !== void 0) options.onDocument(
|
|
322
|
-
formatVersion: DOCUMENT_PACKAGE_FORMAT_VERSION,
|
|
323
|
-
content: odbTablesToSpreadsheetDocument(tables)
|
|
324
|
-
});
|
|
315
|
+
if (options?.onDocument !== void 0) options.onDocument(assemblePackage(odbTablesToSpreadsheetDocument(tables)));
|
|
325
316
|
return csv;
|
|
326
317
|
}
|
|
327
318
|
function odbReportToDocx(content, options) {
|
|
@@ -343,17 +334,14 @@ function odbReportToPdf(content, options) {
|
|
|
343
334
|
measurer: createFontMeasurer(fonts),
|
|
344
335
|
mathMetricsAt
|
|
345
336
|
});
|
|
346
|
-
|
|
347
|
-
formatVersion: DOCUMENT_PACKAGE_FORMAT_VERSION,
|
|
348
|
-
content,
|
|
349
|
-
pages: [...pages]
|
|
350
|
-
});
|
|
351
|
-
return writePdf(layout, {
|
|
337
|
+
const out = writePdf(layout, {
|
|
352
338
|
signal: options?.signal,
|
|
353
339
|
onSubstitution: options?.onSubstitution,
|
|
354
340
|
formulas,
|
|
355
341
|
fonts
|
|
356
342
|
});
|
|
343
|
+
options?.onDocument?.(assemblePackage(content, pages));
|
|
344
|
+
return out;
|
|
357
345
|
}
|
|
358
346
|
//#endregion
|
|
359
347
|
export { OdmUnresolvedSectionError, csvToMarkdown, csvToOds, csvToPdf, csvToXlsx, docxToMarkdown, docxToOdt, docxToPdf, docxToPptx, inlineOdmSectionToContentSection, markdownToCsv, markdownToDocx, markdownToOdt, markdownToPdf, markdownToXlsx, odbReportToDocx, odbReportToOdt, odbReportToPdf, odbToCsv, odbToXlsx, odfToPdf, odgToPdf, odgToSvg, odmToPdf, odpToOdt, odpToPdf, odpToPptx, odsToCsv, odsToPdf, odsToXlsx, odtToDocx, odtToMarkdown, odtToOdp, odtToPdf, pdfToCsv, pdfToDocx, pdfToMarkdown, pdfToOdg, pdfToOdp, pdfToOds, pdfToOdt, pdfToPptx, pdfToSvg, pdfToXlsx, pptxToDocx, pptxToOdp, pptxToPdf, svgToOdg, svgToPdf, xlsxToCsv, xlsxToMarkdown, xlsxToOds, xlsxToPdf };
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
//#region src/convert/decompose.ts
|
|
3
|
+
function isHeadingParagraph(paragraph) {
|
|
4
|
+
return paragraph.headingLevel !== void 0;
|
|
5
|
+
}
|
|
6
|
+
function isListParagraph(paragraph) {
|
|
7
|
+
return paragraph.list !== void 0;
|
|
8
|
+
}
|
|
9
|
+
function decompose(content) {
|
|
10
|
+
switch (content.kind) {
|
|
11
|
+
case "wordprocessing": return content.sections.map(decomposeSection);
|
|
12
|
+
case "presentation": return content.slides.map(decomposeSlide);
|
|
13
|
+
case "spreadsheet": return content.sheets.map(decomposeSheet);
|
|
14
|
+
case "drawing": return content.pages.map(decomposeDrawPage);
|
|
15
|
+
case "formula": return [content.formula];
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function decomposeSection(section) {
|
|
19
|
+
const { blocks, ...rest } = section;
|
|
20
|
+
return {
|
|
21
|
+
node: {
|
|
22
|
+
kind: "section",
|
|
23
|
+
...rest
|
|
24
|
+
},
|
|
25
|
+
children: decomposeSectionBlocks(blocks)
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function decomposeSectionBlocks(blocks) {
|
|
29
|
+
const root = [];
|
|
30
|
+
const headingStack = [];
|
|
31
|
+
const listStack = [];
|
|
32
|
+
const headingScope = () => headingStack.at(-1)?.children ?? root;
|
|
33
|
+
for (const block of blocks) {
|
|
34
|
+
if (block.kind !== "paragraph") {
|
|
35
|
+
const parent = listStack.at(-1);
|
|
36
|
+
(parent !== void 0 ? parent.children : headingScope()).push(block);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (isHeadingParagraph(block)) {
|
|
40
|
+
listStack.length = 0;
|
|
41
|
+
const level = block.headingLevel;
|
|
42
|
+
for (let top = headingStack.at(-1); top !== void 0 && top.node.headingLevel >= level; top = headingStack.at(-1)) headingStack.pop();
|
|
43
|
+
const group = {
|
|
44
|
+
node: block,
|
|
45
|
+
children: []
|
|
46
|
+
};
|
|
47
|
+
const parent = headingStack.at(-1);
|
|
48
|
+
(parent !== void 0 ? parent.children : root).push(group);
|
|
49
|
+
headingStack.push(group);
|
|
50
|
+
} else if (isListParagraph(block)) openListGroup(listStack, headingScope(), block);
|
|
51
|
+
else {
|
|
52
|
+
listStack.length = 0;
|
|
53
|
+
headingScope().push(block);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return root;
|
|
57
|
+
}
|
|
58
|
+
function decomposeSlide(slide) {
|
|
59
|
+
const { shapes, ...rest } = slide;
|
|
60
|
+
return {
|
|
61
|
+
node: {
|
|
62
|
+
kind: "slide",
|
|
63
|
+
...rest
|
|
64
|
+
},
|
|
65
|
+
children: shapes.map(decomposeShape)
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function decomposeSheet(sheet) {
|
|
69
|
+
const { images, embeddedObjects, ...rest } = sheet;
|
|
70
|
+
const children = [...images, ...embeddedObjects ?? []];
|
|
71
|
+
return {
|
|
72
|
+
node: {
|
|
73
|
+
kind: "sheet",
|
|
74
|
+
...rest
|
|
75
|
+
},
|
|
76
|
+
children
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function decomposeDrawPage(page) {
|
|
80
|
+
const { shapes, vectors, ...rest } = page;
|
|
81
|
+
const children = [...shapes.map(decomposeShape), ...vectors];
|
|
82
|
+
return {
|
|
83
|
+
node: {
|
|
84
|
+
kind: "drawPage",
|
|
85
|
+
...rest
|
|
86
|
+
},
|
|
87
|
+
children
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function decomposeShape(shape) {
|
|
91
|
+
const { blocks, ...rest } = shape;
|
|
92
|
+
return {
|
|
93
|
+
node: rest,
|
|
94
|
+
children: decomposeShapeBlocks(blocks)
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function decomposeShapeBlocks(blocks) {
|
|
98
|
+
const root = [];
|
|
99
|
+
const listStack = [];
|
|
100
|
+
for (const block of blocks) {
|
|
101
|
+
if (block.kind !== "paragraph") {
|
|
102
|
+
const parent = listStack.at(-1);
|
|
103
|
+
(parent !== void 0 ? parent.children : root).push(block);
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (isListParagraph(block)) {
|
|
107
|
+
openListGroup(listStack, root, block);
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
listStack.length = 0;
|
|
111
|
+
root.push(block);
|
|
112
|
+
}
|
|
113
|
+
return root;
|
|
114
|
+
}
|
|
115
|
+
function openListGroup(listStack, scopeChildren, paragraph) {
|
|
116
|
+
const level = paragraph.list.level;
|
|
117
|
+
for (let top = listStack.at(-1); top !== void 0 && top.node.list.level >= level; top = listStack.at(-1)) listStack.pop();
|
|
118
|
+
const group = {
|
|
119
|
+
node: paragraph,
|
|
120
|
+
children: []
|
|
121
|
+
};
|
|
122
|
+
const parent = listStack.at(-1);
|
|
123
|
+
(parent !== void 0 ? parent.children : scopeChildren).push(group);
|
|
124
|
+
listStack.push(group);
|
|
125
|
+
}
|
|
126
|
+
//#endregion
|
|
127
|
+
exports.decompose = decompose;
|
|
128
|
+
exports.decomposeDrawPage = decomposeDrawPage;
|
|
129
|
+
exports.decomposeSection = decomposeSection;
|
|
130
|
+
exports.decomposeShape = decomposeShape;
|
|
131
|
+
exports.decomposeSheet = decomposeSheet;
|
|
132
|
+
exports.decomposeSlide = decomposeSlide;
|
|
133
|
+
exports.isHeadingParagraph = isHeadingParagraph;
|
|
134
|
+
exports.isListParagraph = isListParagraph;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ContentDocument, ContentDrawPage, ContentFormula, ContentParagraph, ContentSection, ContentShape, ContentSheet, ContentSlide, DrawPageGroupNode, HeadingParagraph, ListParagraph, SectionGroupNode, ShapeGroupNode, SheetGroupNode, SlideGroupNode } from "document-schema.js";
|
|
2
|
+
//#region src/convert/decompose.d.ts
|
|
3
|
+
declare function isHeadingParagraph(paragraph: ContentParagraph): paragraph is HeadingParagraph;
|
|
4
|
+
declare function isListParagraph(paragraph: ContentParagraph): paragraph is ListParagraph;
|
|
5
|
+
type PackageChildren = SectionGroupNode[] | SlideGroupNode[] | SheetGroupNode[] | DrawPageGroupNode[] | ContentFormula[];
|
|
6
|
+
declare function decompose(content: ContentDocument): PackageChildren;
|
|
7
|
+
declare function decomposeSection(section: ContentSection): SectionGroupNode;
|
|
8
|
+
declare function decomposeSlide(slide: ContentSlide): SlideGroupNode;
|
|
9
|
+
declare function decomposeSheet(sheet: ContentSheet): SheetGroupNode;
|
|
10
|
+
declare function decomposeDrawPage(page: ContentDrawPage): DrawPageGroupNode;
|
|
11
|
+
declare function decomposeShape(shape: ContentShape): ShapeGroupNode;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { PackageChildren, decompose, decomposeDrawPage, decomposeSection, decomposeShape, decomposeSheet, decomposeSlide, isHeadingParagraph, isListParagraph };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ContentDocument, ContentDrawPage, ContentFormula, ContentParagraph, ContentSection, ContentShape, ContentSheet, ContentSlide, DrawPageGroupNode, HeadingParagraph, ListParagraph, SectionGroupNode, ShapeGroupNode, SheetGroupNode, SlideGroupNode } from "document-schema.js";
|
|
2
|
+
//#region src/convert/decompose.d.ts
|
|
3
|
+
declare function isHeadingParagraph(paragraph: ContentParagraph): paragraph is HeadingParagraph;
|
|
4
|
+
declare function isListParagraph(paragraph: ContentParagraph): paragraph is ListParagraph;
|
|
5
|
+
type PackageChildren = SectionGroupNode[] | SlideGroupNode[] | SheetGroupNode[] | DrawPageGroupNode[] | ContentFormula[];
|
|
6
|
+
declare function decompose(content: ContentDocument): PackageChildren;
|
|
7
|
+
declare function decomposeSection(section: ContentSection): SectionGroupNode;
|
|
8
|
+
declare function decomposeSlide(slide: ContentSlide): SlideGroupNode;
|
|
9
|
+
declare function decomposeSheet(sheet: ContentSheet): SheetGroupNode;
|
|
10
|
+
declare function decomposeDrawPage(page: ContentDrawPage): DrawPageGroupNode;
|
|
11
|
+
declare function decomposeShape(shape: ContentShape): ShapeGroupNode;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { PackageChildren, decompose, decomposeDrawPage, decomposeSection, decomposeShape, decomposeSheet, decomposeSlide, isHeadingParagraph, isListParagraph };
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
//#region src/convert/decompose.ts
|
|
2
|
+
function isHeadingParagraph(paragraph) {
|
|
3
|
+
return paragraph.headingLevel !== void 0;
|
|
4
|
+
}
|
|
5
|
+
function isListParagraph(paragraph) {
|
|
6
|
+
return paragraph.list !== void 0;
|
|
7
|
+
}
|
|
8
|
+
function decompose(content) {
|
|
9
|
+
switch (content.kind) {
|
|
10
|
+
case "wordprocessing": return content.sections.map(decomposeSection);
|
|
11
|
+
case "presentation": return content.slides.map(decomposeSlide);
|
|
12
|
+
case "spreadsheet": return content.sheets.map(decomposeSheet);
|
|
13
|
+
case "drawing": return content.pages.map(decomposeDrawPage);
|
|
14
|
+
case "formula": return [content.formula];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function decomposeSection(section) {
|
|
18
|
+
const { blocks, ...rest } = section;
|
|
19
|
+
return {
|
|
20
|
+
node: {
|
|
21
|
+
kind: "section",
|
|
22
|
+
...rest
|
|
23
|
+
},
|
|
24
|
+
children: decomposeSectionBlocks(blocks)
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function decomposeSectionBlocks(blocks) {
|
|
28
|
+
const root = [];
|
|
29
|
+
const headingStack = [];
|
|
30
|
+
const listStack = [];
|
|
31
|
+
const headingScope = () => headingStack.at(-1)?.children ?? root;
|
|
32
|
+
for (const block of blocks) {
|
|
33
|
+
if (block.kind !== "paragraph") {
|
|
34
|
+
const parent = listStack.at(-1);
|
|
35
|
+
(parent !== void 0 ? parent.children : headingScope()).push(block);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (isHeadingParagraph(block)) {
|
|
39
|
+
listStack.length = 0;
|
|
40
|
+
const level = block.headingLevel;
|
|
41
|
+
for (let top = headingStack.at(-1); top !== void 0 && top.node.headingLevel >= level; top = headingStack.at(-1)) headingStack.pop();
|
|
42
|
+
const group = {
|
|
43
|
+
node: block,
|
|
44
|
+
children: []
|
|
45
|
+
};
|
|
46
|
+
const parent = headingStack.at(-1);
|
|
47
|
+
(parent !== void 0 ? parent.children : root).push(group);
|
|
48
|
+
headingStack.push(group);
|
|
49
|
+
} else if (isListParagraph(block)) openListGroup(listStack, headingScope(), block);
|
|
50
|
+
else {
|
|
51
|
+
listStack.length = 0;
|
|
52
|
+
headingScope().push(block);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return root;
|
|
56
|
+
}
|
|
57
|
+
function decomposeSlide(slide) {
|
|
58
|
+
const { shapes, ...rest } = slide;
|
|
59
|
+
return {
|
|
60
|
+
node: {
|
|
61
|
+
kind: "slide",
|
|
62
|
+
...rest
|
|
63
|
+
},
|
|
64
|
+
children: shapes.map(decomposeShape)
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function decomposeSheet(sheet) {
|
|
68
|
+
const { images, embeddedObjects, ...rest } = sheet;
|
|
69
|
+
const children = [...images, ...embeddedObjects ?? []];
|
|
70
|
+
return {
|
|
71
|
+
node: {
|
|
72
|
+
kind: "sheet",
|
|
73
|
+
...rest
|
|
74
|
+
},
|
|
75
|
+
children
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function decomposeDrawPage(page) {
|
|
79
|
+
const { shapes, vectors, ...rest } = page;
|
|
80
|
+
const children = [...shapes.map(decomposeShape), ...vectors];
|
|
81
|
+
return {
|
|
82
|
+
node: {
|
|
83
|
+
kind: "drawPage",
|
|
84
|
+
...rest
|
|
85
|
+
},
|
|
86
|
+
children
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function decomposeShape(shape) {
|
|
90
|
+
const { blocks, ...rest } = shape;
|
|
91
|
+
return {
|
|
92
|
+
node: rest,
|
|
93
|
+
children: decomposeShapeBlocks(blocks)
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function decomposeShapeBlocks(blocks) {
|
|
97
|
+
const root = [];
|
|
98
|
+
const listStack = [];
|
|
99
|
+
for (const block of blocks) {
|
|
100
|
+
if (block.kind !== "paragraph") {
|
|
101
|
+
const parent = listStack.at(-1);
|
|
102
|
+
(parent !== void 0 ? parent.children : root).push(block);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (isListParagraph(block)) {
|
|
106
|
+
openListGroup(listStack, root, block);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
listStack.length = 0;
|
|
110
|
+
root.push(block);
|
|
111
|
+
}
|
|
112
|
+
return root;
|
|
113
|
+
}
|
|
114
|
+
function openListGroup(listStack, scopeChildren, paragraph) {
|
|
115
|
+
const level = paragraph.list.level;
|
|
116
|
+
for (let top = listStack.at(-1); top !== void 0 && top.node.list.level >= level; top = listStack.at(-1)) listStack.pop();
|
|
117
|
+
const group = {
|
|
118
|
+
node: paragraph,
|
|
119
|
+
children: []
|
|
120
|
+
};
|
|
121
|
+
const parent = listStack.at(-1);
|
|
122
|
+
(parent !== void 0 ? parent.children : scopeChildren).push(group);
|
|
123
|
+
listStack.push(group);
|
|
124
|
+
}
|
|
125
|
+
//#endregion
|
|
126
|
+
export { decompose, decomposeDrawPage, decomposeSection, decomposeShape, decomposeSheet, decomposeSlide, isHeadingParagraph, isListParagraph };
|