documents.js 1.47.0 → 1.48.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 +26 -20
- package/dist/index.cjs +448 -60
- package/dist/index.d.cts +7 -2
- package/dist/index.d.ts +7 -2
- package/dist/index.js +447 -62
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -536,7 +536,7 @@ function needsSpacePreserve(text) {
|
|
|
536
536
|
}
|
|
537
537
|
//#endregion
|
|
538
538
|
//#region src/edit/docx/run.ts
|
|
539
|
-
function directChild$
|
|
539
|
+
function directChild$11(parent, tag) {
|
|
540
540
|
for (const child of parent.children) if (child.type === "element" && child.tag === tag) return child;
|
|
541
541
|
}
|
|
542
542
|
function appendUElement(rPr, value) {
|
|
@@ -545,7 +545,7 @@ function appendUElement(rPr, value) {
|
|
|
545
545
|
return created;
|
|
546
546
|
}
|
|
547
547
|
function findOrCreateT(run) {
|
|
548
|
-
const existing = directChild$
|
|
548
|
+
const existing = directChild$11(run, "w:t");
|
|
549
549
|
if (existing !== void 0) return existing;
|
|
550
550
|
const created = el("w:t");
|
|
551
551
|
run.children.push(created);
|
|
@@ -565,7 +565,7 @@ var DocxRun = class {
|
|
|
565
565
|
}
|
|
566
566
|
rPr(create) {
|
|
567
567
|
const node = this.live();
|
|
568
|
-
return create ? ensureFirstChild(node, "w:rPr") : directChild$
|
|
568
|
+
return create ? ensureFirstChild(node, "w:rPr") : directChild$11(node, "w:rPr");
|
|
569
569
|
}
|
|
570
570
|
get text() {
|
|
571
571
|
return (0, ooxml_js.textContent)(this.live());
|
|
@@ -589,14 +589,14 @@ var DocxRun = class {
|
|
|
589
589
|
}
|
|
590
590
|
get underline() {
|
|
591
591
|
const rPr = this.rPr(false);
|
|
592
|
-
const uElement = rPr === void 0 ? void 0 : directChild$
|
|
592
|
+
const uElement = rPr === void 0 ? void 0 : directChild$11(rPr, "w:u");
|
|
593
593
|
if (uElement === void 0) return false;
|
|
594
594
|
for (const a of uElement.attributes) if (a.name === "w:val") return a.value !== "none";
|
|
595
595
|
return true;
|
|
596
596
|
}
|
|
597
597
|
set underline(value) {
|
|
598
598
|
const rPr = this.rPr(true);
|
|
599
|
-
const existing = directChild$
|
|
599
|
+
const existing = directChild$11(rPr, "w:u");
|
|
600
600
|
if (existing === void 0) {
|
|
601
601
|
appendUElement(rPr, value);
|
|
602
602
|
return;
|
|
@@ -670,7 +670,7 @@ function buildRun$1(init = {}) {
|
|
|
670
670
|
}
|
|
671
671
|
//#endregion
|
|
672
672
|
//#region src/edit/docx/paragraph.ts
|
|
673
|
-
function directChild$
|
|
673
|
+
function directChild$10(parent, tag) {
|
|
674
674
|
for (const child of parent.children) if (child.type === "element" && child.tag === tag) return child;
|
|
675
675
|
}
|
|
676
676
|
var DocxParagraph = class {
|
|
@@ -689,7 +689,7 @@ var DocxParagraph = class {
|
|
|
689
689
|
}
|
|
690
690
|
pPr(create) {
|
|
691
691
|
const node = this.live();
|
|
692
|
-
return create ? ensureFirstChild(node, "w:pPr") : directChild$
|
|
692
|
+
return create ? ensureFirstChild(node, "w:pPr") : directChild$10(node, "w:pPr");
|
|
693
693
|
}
|
|
694
694
|
get text() {
|
|
695
695
|
return (0, ooxml_js.textContent)(this.live());
|
|
@@ -726,7 +726,7 @@ var DocxParagraph = class {
|
|
|
726
726
|
set styleId(value) {
|
|
727
727
|
if (value === void 0) {
|
|
728
728
|
const pPr = this.pPr(false);
|
|
729
|
-
const existing = pPr === void 0 ? void 0 : directChild$
|
|
729
|
+
const existing = pPr === void 0 ? void 0 : directChild$10(pPr, "w:pStyle");
|
|
730
730
|
if (existing !== void 0 && pPr !== void 0) removeChild(pPr.children, existing);
|
|
731
731
|
return;
|
|
732
732
|
}
|
|
@@ -738,7 +738,7 @@ var DocxParagraph = class {
|
|
|
738
738
|
set alignment(value) {
|
|
739
739
|
if (value === void 0) {
|
|
740
740
|
const pPr = this.pPr(false);
|
|
741
|
-
const existing = pPr === void 0 ? void 0 : directChild$
|
|
741
|
+
const existing = pPr === void 0 ? void 0 : directChild$10(pPr, "w:jc");
|
|
742
742
|
if (existing !== void 0 && pPr !== void 0) removeChild(pPr.children, existing);
|
|
743
743
|
return;
|
|
744
744
|
}
|
|
@@ -746,12 +746,12 @@ var DocxParagraph = class {
|
|
|
746
746
|
}
|
|
747
747
|
get list() {
|
|
748
748
|
const pPr = this.pPr(false);
|
|
749
|
-
const numPr = pPr === void 0 ? void 0 : directChild$
|
|
749
|
+
const numPr = pPr === void 0 ? void 0 : directChild$10(pPr, "w:numPr");
|
|
750
750
|
if (numPr === void 0) return;
|
|
751
|
-
const numIdElement = directChild$
|
|
751
|
+
const numIdElement = directChild$10(numPr, "w:numId");
|
|
752
752
|
const numId = numIdElement === void 0 ? void 0 : (0, ooxml_js.attr)(numIdElement, "w:val");
|
|
753
753
|
if (numId === void 0) return;
|
|
754
|
-
const ilvlElement = directChild$
|
|
754
|
+
const ilvlElement = directChild$10(numPr, "w:ilvl");
|
|
755
755
|
const ilvl = ilvlElement === void 0 ? void 0 : (0, ooxml_js.attr)(ilvlElement, "w:val");
|
|
756
756
|
return {
|
|
757
757
|
numId,
|
|
@@ -761,7 +761,7 @@ var DocxParagraph = class {
|
|
|
761
761
|
set list(value) {
|
|
762
762
|
const pPr = this.pPr(true);
|
|
763
763
|
if (value === void 0) {
|
|
764
|
-
const existing = directChild$
|
|
764
|
+
const existing = directChild$10(pPr, "w:numPr");
|
|
765
765
|
if (existing !== void 0) removeChild(pPr.children, existing);
|
|
766
766
|
return;
|
|
767
767
|
}
|
|
@@ -1426,7 +1426,7 @@ function createEmptyPptxPackage() {
|
|
|
1426
1426
|
}
|
|
1427
1427
|
//#endregion
|
|
1428
1428
|
//#region src/edit/pptx/shape.ts
|
|
1429
|
-
function directChild$
|
|
1429
|
+
function directChild$9(parent, tag) {
|
|
1430
1430
|
for (const child of parent.children) if (child.type === "element" && child.tag === tag) return child;
|
|
1431
1431
|
}
|
|
1432
1432
|
function parseEmuAttr(element, name) {
|
|
@@ -1447,7 +1447,7 @@ var PptxShape = class {
|
|
|
1447
1447
|
}
|
|
1448
1448
|
spPrElement(create) {
|
|
1449
1449
|
const node = this.live();
|
|
1450
|
-
const existing = directChild$
|
|
1450
|
+
const existing = directChild$9(node, "p:spPr");
|
|
1451
1451
|
if (existing !== void 0 || !create) return existing;
|
|
1452
1452
|
const created = el("p:spPr");
|
|
1453
1453
|
node.children.push(created);
|
|
@@ -1455,10 +1455,10 @@ var PptxShape = class {
|
|
|
1455
1455
|
}
|
|
1456
1456
|
get frame() {
|
|
1457
1457
|
const spPr = this.spPrElement(false);
|
|
1458
|
-
const xfrm = spPr === void 0 ? void 0 : directChild$
|
|
1458
|
+
const xfrm = spPr === void 0 ? void 0 : directChild$9(spPr, "a:xfrm");
|
|
1459
1459
|
if (xfrm === void 0) return;
|
|
1460
|
-
const off = directChild$
|
|
1461
|
-
const ext = directChild$
|
|
1460
|
+
const off = directChild$9(xfrm, "a:off");
|
|
1461
|
+
const ext = directChild$9(xfrm, "a:ext");
|
|
1462
1462
|
if (off === void 0 || ext === void 0) return;
|
|
1463
1463
|
const x = parseEmuAttr(off, "x");
|
|
1464
1464
|
const y = parseEmuAttr(off, "y");
|
|
@@ -1474,7 +1474,7 @@ var PptxShape = class {
|
|
|
1474
1474
|
}
|
|
1475
1475
|
set frame(value) {
|
|
1476
1476
|
const spPr = this.spPrElement(true);
|
|
1477
|
-
let xfrm = directChild$
|
|
1477
|
+
let xfrm = directChild$9(spPr, "a:xfrm");
|
|
1478
1478
|
if (xfrm === void 0) {
|
|
1479
1479
|
xfrm = el("a:xfrm");
|
|
1480
1480
|
spPr.children.unshift(xfrm);
|
|
@@ -1488,12 +1488,12 @@ var PptxShape = class {
|
|
|
1488
1488
|
})];
|
|
1489
1489
|
}
|
|
1490
1490
|
get text() {
|
|
1491
|
-
const txBody = directChild$
|
|
1491
|
+
const txBody = directChild$9(this.live(), "p:txBody");
|
|
1492
1492
|
return txBody === void 0 ? "" : (0, ooxml_js.textContent)(txBody);
|
|
1493
1493
|
}
|
|
1494
1494
|
set text(value) {
|
|
1495
1495
|
const node = this.live();
|
|
1496
|
-
let txBody = directChild$
|
|
1496
|
+
let txBody = directChild$9(node, "p:txBody");
|
|
1497
1497
|
if (txBody === void 0) {
|
|
1498
1498
|
txBody = el("p:txBody", {}, [el("a:bodyPr"), el("a:lstStyle")]);
|
|
1499
1499
|
node.children.push(txBody);
|
|
@@ -1504,7 +1504,7 @@ var PptxShape = class {
|
|
|
1504
1504
|
}
|
|
1505
1505
|
setParagraphs(paragraphs) {
|
|
1506
1506
|
const node = this.live();
|
|
1507
|
-
let txBody = directChild$
|
|
1507
|
+
let txBody = directChild$9(node, "p:txBody");
|
|
1508
1508
|
if (txBody === void 0) {
|
|
1509
1509
|
txBody = el("p:txBody", {}, [el("a:bodyPr"), el("a:lstStyle")]);
|
|
1510
1510
|
node.children.push(txBody);
|
|
@@ -1615,12 +1615,12 @@ function insertPictureShapeMedia(context, slideRoot, frame, image) {
|
|
|
1615
1615
|
}
|
|
1616
1616
|
//#endregion
|
|
1617
1617
|
//#region src/edit/pptx/slide.ts
|
|
1618
|
-
function directChild$
|
|
1618
|
+
function directChild$8(parent, tag) {
|
|
1619
1619
|
for (const child of parent.children) if (child.type === "element" && child.tag === tag) return child;
|
|
1620
1620
|
}
|
|
1621
1621
|
function findSpTree(slideRoot) {
|
|
1622
|
-
const cSld = directChild$
|
|
1623
|
-
const spTree = cSld === void 0 ? void 0 : directChild$
|
|
1622
|
+
const cSld = directChild$8(slideRoot, "p:cSld");
|
|
1623
|
+
const spTree = cSld === void 0 ? void 0 : directChild$8(cSld, "p:spTree");
|
|
1624
1624
|
if (spTree === void 0) throw new Error("slide has no p:cSld/p:spTree element");
|
|
1625
1625
|
return spTree;
|
|
1626
1626
|
}
|
|
@@ -1752,7 +1752,7 @@ const PRESENTATION_PART_PATH = "ppt/presentation.xml";
|
|
|
1752
1752
|
const MEDIA_DIR = "ppt/media";
|
|
1753
1753
|
const SLIDE_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.presentationml.slide+xml";
|
|
1754
1754
|
const SLIDE_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide";
|
|
1755
|
-
function directChild$
|
|
1755
|
+
function directChild$7(parent, tag) {
|
|
1756
1756
|
for (const child of parent.children) if (child.type === "element" && child.tag === tag) return child;
|
|
1757
1757
|
}
|
|
1758
1758
|
function attrValue(element, name) {
|
|
@@ -1764,12 +1764,12 @@ function findPresentationRoot(pkg) {
|
|
|
1764
1764
|
return root;
|
|
1765
1765
|
}
|
|
1766
1766
|
function findSldIdLst(presentationRoot) {
|
|
1767
|
-
const sldIdLst = directChild$
|
|
1767
|
+
const sldIdLst = directChild$7(presentationRoot, "p:sldIdLst");
|
|
1768
1768
|
if (sldIdLst === void 0) throw new Error(`${PRESENTATION_PART_PATH} has no p:sldIdLst element`);
|
|
1769
1769
|
return sldIdLst;
|
|
1770
1770
|
}
|
|
1771
1771
|
function findSldSz(presentationRoot) {
|
|
1772
|
-
const sldSz = directChild$
|
|
1772
|
+
const sldSz = directChild$7(presentationRoot, "p:sldSz");
|
|
1773
1773
|
if (sldSz === void 0) throw new Error(`${PRESENTATION_PART_PATH} has no p:sldSz element`);
|
|
1774
1774
|
return sldSz;
|
|
1775
1775
|
}
|
|
@@ -1968,12 +1968,12 @@ function appendShape$2(slide, shape) {
|
|
|
1968
1968
|
}
|
|
1969
1969
|
//#endregion
|
|
1970
1970
|
//#region src/edit/odt/automatic-styles.ts
|
|
1971
|
-
const CONTENT_PART_PATH$
|
|
1971
|
+
const CONTENT_PART_PATH$5 = "content.xml";
|
|
1972
1972
|
function ensureAutomaticStyles(pkg) {
|
|
1973
|
-
const part = pkg.parts[CONTENT_PART_PATH$
|
|
1974
|
-
if (part?.kind !== "xml") throw new Error(`ensureAutomaticStyles: package has no ${CONTENT_PART_PATH$
|
|
1973
|
+
const part = pkg.parts[CONTENT_PART_PATH$5];
|
|
1974
|
+
if (part?.kind !== "xml") throw new Error(`ensureAutomaticStyles: package has no ${CONTENT_PART_PATH$5} part`);
|
|
1975
1975
|
const root = part.nodes.find((n) => n.type === "element");
|
|
1976
|
-
if (root === void 0) throw new Error(`ensureAutomaticStyles: ${CONTENT_PART_PATH$
|
|
1976
|
+
if (root === void 0) throw new Error(`ensureAutomaticStyles: ${CONTENT_PART_PATH$5} has no root element`);
|
|
1977
1977
|
for (const child of root.children) if (child.type === "element" && child.tag === "office:automatic-styles") return child;
|
|
1978
1978
|
const created = el("office:automatic-styles");
|
|
1979
1979
|
const insertBeforeTags = /* @__PURE__ */ new Set([
|
|
@@ -2067,7 +2067,7 @@ function applyStyleChange(pkg, element, family, change) {
|
|
|
2067
2067
|
...readCurrentStyleProperties(pkg, element, family),
|
|
2068
2068
|
...change
|
|
2069
2069
|
};
|
|
2070
|
-
const name = odf_js.StyleRegistry.forPart(pkg, CONTENT_PART_PATH$
|
|
2070
|
+
const name = odf_js.StyleRegistry.forPart(pkg, CONTENT_PART_PATH$5).intern({
|
|
2071
2071
|
family,
|
|
2072
2072
|
properties: merged
|
|
2073
2073
|
});
|
|
@@ -2326,7 +2326,7 @@ const META_NS_PREFIXES$3 = [
|
|
|
2326
2326
|
const ODF_VERSION$3 = "1.3";
|
|
2327
2327
|
const PAGE_LAYOUT_NAME$3 = "PM1";
|
|
2328
2328
|
const MASTER_PAGE_NAME$3 = "Standard";
|
|
2329
|
-
const DEFAULT_MARGIN_PT = 72;
|
|
2329
|
+
const DEFAULT_MARGIN_PT$1 = 72;
|
|
2330
2330
|
function declaration$3() {
|
|
2331
2331
|
return {
|
|
2332
2332
|
type: "declaration",
|
|
@@ -2350,10 +2350,10 @@ function buildPageLayout$3() {
|
|
|
2350
2350
|
return el("style:page-layout", { "style:name": PAGE_LAYOUT_NAME$3 }, [el("style:page-layout-properties", {
|
|
2351
2351
|
"fo:page-width": `${document_content_model.PAGE_SIZE_LETTER.widthPt}pt`,
|
|
2352
2352
|
"fo:page-height": `${document_content_model.PAGE_SIZE_LETTER.heightPt}pt`,
|
|
2353
|
-
"fo:margin-top": `${DEFAULT_MARGIN_PT}pt`,
|
|
2354
|
-
"fo:margin-right": `${DEFAULT_MARGIN_PT}pt`,
|
|
2355
|
-
"fo:margin-bottom": `${DEFAULT_MARGIN_PT}pt`,
|
|
2356
|
-
"fo:margin-left": `${DEFAULT_MARGIN_PT}pt`
|
|
2353
|
+
"fo:margin-top": `${DEFAULT_MARGIN_PT$1}pt`,
|
|
2354
|
+
"fo:margin-right": `${DEFAULT_MARGIN_PT$1}pt`,
|
|
2355
|
+
"fo:margin-bottom": `${DEFAULT_MARGIN_PT$1}pt`,
|
|
2356
|
+
"fo:margin-left": `${DEFAULT_MARGIN_PT$1}pt`
|
|
2357
2357
|
})]);
|
|
2358
2358
|
}
|
|
2359
2359
|
function buildStylesXml$3() {
|
|
@@ -2514,20 +2514,20 @@ function buildTable(pkg, init) {
|
|
|
2514
2514
|
}
|
|
2515
2515
|
//#endregion
|
|
2516
2516
|
//#region src/edit/odt/editor.ts
|
|
2517
|
-
const CONTENT_PART_PATH$
|
|
2517
|
+
const CONTENT_PART_PATH$4 = "content.xml";
|
|
2518
2518
|
function findContentRoot(pkg) {
|
|
2519
|
-
const part = pkg.parts[CONTENT_PART_PATH$
|
|
2519
|
+
const part = pkg.parts[CONTENT_PART_PATH$4];
|
|
2520
2520
|
const root = part?.kind === "xml" ? part.nodes.find((n) => n.type === "element") : void 0;
|
|
2521
|
-
if (root === void 0) throw new Error(`package has no root element at ${CONTENT_PART_PATH$
|
|
2521
|
+
if (root === void 0) throw new Error(`package has no root element at ${CONTENT_PART_PATH$4}`);
|
|
2522
2522
|
return root;
|
|
2523
2523
|
}
|
|
2524
|
-
function directChild$
|
|
2524
|
+
function directChild$6(parent, tag) {
|
|
2525
2525
|
for (const child of parent.children) if (child.type === "element" && child.tag === tag) return child;
|
|
2526
2526
|
}
|
|
2527
2527
|
function findOfficeText(contentRoot) {
|
|
2528
|
-
const body = directChild$
|
|
2529
|
-
const text = body === void 0 ? void 0 : directChild$
|
|
2530
|
-
if (text === void 0) throw new Error(`${CONTENT_PART_PATH$
|
|
2528
|
+
const body = directChild$6(contentRoot, "office:body");
|
|
2529
|
+
const text = body === void 0 ? void 0 : directChild$6(body, "office:text");
|
|
2530
|
+
if (text === void 0) throw new Error(`${CONTENT_PART_PATH$4} has no office:body/office:text element`);
|
|
2531
2531
|
return text;
|
|
2532
2532
|
}
|
|
2533
2533
|
var OdtBodyImpl = class {
|
|
@@ -2790,7 +2790,7 @@ function addImageMedia(pkg, imageBytes, format) {
|
|
|
2790
2790
|
}
|
|
2791
2791
|
//#endregion
|
|
2792
2792
|
//#region src/edit/odp/shape.ts
|
|
2793
|
-
function directChild$
|
|
2793
|
+
function directChild$5(parent, tag) {
|
|
2794
2794
|
for (const child of parent.children) if (child.type === "element" && child.tag === tag) return child;
|
|
2795
2795
|
}
|
|
2796
2796
|
function buildTransformAttr(frame, rotationDeg) {
|
|
@@ -2858,7 +2858,7 @@ var OdpShape = class {
|
|
|
2858
2858
|
}
|
|
2859
2859
|
textBox(create) {
|
|
2860
2860
|
const node = this.live();
|
|
2861
|
-
const existing = directChild$
|
|
2861
|
+
const existing = directChild$5(node, "draw:text-box");
|
|
2862
2862
|
if (existing !== void 0 || !create) return existing;
|
|
2863
2863
|
const created = el("draw:text-box");
|
|
2864
2864
|
node.children.push(created);
|
|
@@ -2919,7 +2919,7 @@ function insertImageFrameMedia(context, frame, image) {
|
|
|
2919
2919
|
}
|
|
2920
2920
|
//#endregion
|
|
2921
2921
|
//#region src/edit/odp/slide.ts
|
|
2922
|
-
function directChild$
|
|
2922
|
+
function directChild$4(parent, tag) {
|
|
2923
2923
|
for (const child of parent.children) if (child.type === "element" && child.tag === tag) return child;
|
|
2924
2924
|
}
|
|
2925
2925
|
const NOTES_FRAME_X_PT = 20;
|
|
@@ -2968,13 +2968,13 @@ var OdpSlide = class {
|
|
|
2968
2968
|
return new OdpShape(node.children, frameElement, this.context.pkg);
|
|
2969
2969
|
}
|
|
2970
2970
|
get notes() {
|
|
2971
|
-
const notesElement = directChild$
|
|
2971
|
+
const notesElement = directChild$4(this.live(), "presentation:notes");
|
|
2972
2972
|
if (notesElement === void 0) return "";
|
|
2973
2973
|
return (0, ooxml_js.elementsWithTag)(notesElement.children, "text:p").map((p) => decodeOdfText(p.children)).join("\n");
|
|
2974
2974
|
}
|
|
2975
2975
|
set notes(value) {
|
|
2976
2976
|
const node = this.live();
|
|
2977
|
-
const existing = directChild$
|
|
2977
|
+
const existing = directChild$4(node, "presentation:notes");
|
|
2978
2978
|
const notesElement = buildNotesElement(this.context.pkg, value);
|
|
2979
2979
|
if (existing === void 0) node.children.push(notesElement);
|
|
2980
2980
|
else existing.children = notesElement.children;
|
|
@@ -2986,27 +2986,27 @@ var OdpSlide = class {
|
|
|
2986
2986
|
};
|
|
2987
2987
|
//#endregion
|
|
2988
2988
|
//#region src/edit/odp/editor.ts
|
|
2989
|
-
const CONTENT_PART_PATH$
|
|
2990
|
-
const STYLES_PART_PATH$
|
|
2991
|
-
function directChild$
|
|
2989
|
+
const CONTENT_PART_PATH$3 = "content.xml";
|
|
2990
|
+
const STYLES_PART_PATH$2 = "styles.xml";
|
|
2991
|
+
function directChild$3(parent, tag) {
|
|
2992
2992
|
for (const child of parent.children) if (child.type === "element" && child.tag === tag) return child;
|
|
2993
2993
|
}
|
|
2994
|
-
function findRoot$
|
|
2994
|
+
function findRoot$3(pkg, partPath) {
|
|
2995
2995
|
const part = pkg.parts[partPath];
|
|
2996
2996
|
const root = part?.kind === "xml" ? part.nodes.find((n) => n.type === "element") : void 0;
|
|
2997
2997
|
if (root === void 0) throw new Error(`package has no root element at ${partPath}`);
|
|
2998
2998
|
return root;
|
|
2999
2999
|
}
|
|
3000
3000
|
function findOfficePresentation(pkg) {
|
|
3001
|
-
const body = directChild$
|
|
3002
|
-
const presentation = body === void 0 ? void 0 : directChild$
|
|
3003
|
-
if (presentation === void 0) throw new Error(`${CONTENT_PART_PATH$
|
|
3001
|
+
const body = directChild$3(findRoot$3(pkg, CONTENT_PART_PATH$3), "office:body");
|
|
3002
|
+
const presentation = body === void 0 ? void 0 : directChild$3(body, "office:presentation");
|
|
3003
|
+
if (presentation === void 0) throw new Error(`${CONTENT_PART_PATH$3} has no office:body/office:presentation element`);
|
|
3004
3004
|
return presentation;
|
|
3005
3005
|
}
|
|
3006
3006
|
function findPageLayoutProperties$1(pkg) {
|
|
3007
|
-
const pageLayout = directChild$
|
|
3008
|
-
const properties = pageLayout === void 0 ? void 0 : directChild$
|
|
3009
|
-
if (properties === void 0) throw new Error(`${STYLES_PART_PATH$
|
|
3007
|
+
const pageLayout = directChild$3(findRoot$3(pkg, STYLES_PART_PATH$2), "office:automatic-styles")?.children.find((c) => c.type === "element" && c.tag === "style:page-layout" && (0, ooxml_js.attr)(c, "style:name") === "PM1");
|
|
3008
|
+
const properties = pageLayout === void 0 ? void 0 : directChild$3(pageLayout, "style:page-layout-properties");
|
|
3009
|
+
if (properties === void 0) throw new Error(`${STYLES_PART_PATH$2} has no style:page-layout[style:name="PM1"]/style:page-layout-properties element`);
|
|
3010
3010
|
return properties;
|
|
3011
3011
|
}
|
|
3012
3012
|
var OdpEditor = class {
|
|
@@ -3508,6 +3508,87 @@ var OdsCell = class {
|
|
|
3508
3508
|
}
|
|
3509
3509
|
};
|
|
3510
3510
|
//#endregion
|
|
3511
|
+
//#region src/edit/ods/print-settings.ts
|
|
3512
|
+
const STYLES_PART_PATH$1 = "styles.xml";
|
|
3513
|
+
const CONTENT_PART_PATH$2 = "content.xml";
|
|
3514
|
+
function findRoot$2(pkg, partPath) {
|
|
3515
|
+
const part = pkg.parts[partPath];
|
|
3516
|
+
const root = part?.kind === "xml" ? part.nodes.find((n) => n.type === "element") : void 0;
|
|
3517
|
+
if (root === void 0) throw new Error(`package has no root element at ${partPath}`);
|
|
3518
|
+
return root;
|
|
3519
|
+
}
|
|
3520
|
+
function directChild$2(parent, tag) {
|
|
3521
|
+
for (const child of parent.children) if (child.type === "element" && child.tag === tag) return child;
|
|
3522
|
+
}
|
|
3523
|
+
function findStylesAutomaticStyles(pkg) {
|
|
3524
|
+
const found = directChild$2(findRoot$2(pkg, STYLES_PART_PATH$1), "office:automatic-styles");
|
|
3525
|
+
if (found === void 0) throw new Error(`${STYLES_PART_PATH$1} has no office:automatic-styles element`);
|
|
3526
|
+
return found;
|
|
3527
|
+
}
|
|
3528
|
+
function findMasterStyles(pkg) {
|
|
3529
|
+
const found = directChild$2(findRoot$2(pkg, STYLES_PART_PATH$1), "office:master-styles");
|
|
3530
|
+
if (found === void 0) throw new Error(`${STYLES_PART_PATH$1} has no office:master-styles element`);
|
|
3531
|
+
return found;
|
|
3532
|
+
}
|
|
3533
|
+
function findContentAutomaticStyles(pkg) {
|
|
3534
|
+
const found = directChild$2(findRoot$2(pkg, CONTENT_PART_PATH$2), "office:automatic-styles");
|
|
3535
|
+
if (found === void 0) throw new Error(`${CONTENT_PART_PATH$2} has no office:automatic-styles element`);
|
|
3536
|
+
return found;
|
|
3537
|
+
}
|
|
3538
|
+
const DEFAULT_MARGIN_PT = 56.69291338582677;
|
|
3539
|
+
const DEFAULT_MARGINS = {
|
|
3540
|
+
topPt: DEFAULT_MARGIN_PT,
|
|
3541
|
+
rightPt: DEFAULT_MARGIN_PT,
|
|
3542
|
+
bottomPt: DEFAULT_MARGIN_PT,
|
|
3543
|
+
leftPt: DEFAULT_MARGIN_PT
|
|
3544
|
+
};
|
|
3545
|
+
function readSheetPrintSettings(pkg, tableElement) {
|
|
3546
|
+
const tableStyleName = (0, ooxml_js.attr)(tableElement, "table:style-name");
|
|
3547
|
+
const tableStyleElement = tableStyleName === void 0 ? void 0 : (0, odf_js.findStyleElement)(tableStyleName, "table", pkg);
|
|
3548
|
+
const masterPageName = tableStyleElement === void 0 ? void 0 : (0, ooxml_js.attr)(tableStyleElement, "style:master-page-name");
|
|
3549
|
+
const layoutProperties = (0, odf_js.resolvePageLayoutProperties)(pkg, masterPageName);
|
|
3550
|
+
const pageSize = layoutProperties === void 0 ? void 0 : (0, odf_js.parsePageSize)(layoutProperties);
|
|
3551
|
+
const margins = layoutProperties === void 0 ? void 0 : (0, odf_js.parseMargins)(layoutProperties);
|
|
3552
|
+
const printTokens = new Set((layoutProperties === void 0 ? void 0 : (0, ooxml_js.attr)(layoutProperties, "style:print"))?.split(" ").filter((token) => token.length > 0) ?? []);
|
|
3553
|
+
const pageOrder = (layoutProperties === void 0 ? void 0 : (0, ooxml_js.attr)(layoutProperties, "style:print-page-order")) === "ltr" ? "overThenDown" : "downThenOver";
|
|
3554
|
+
return {
|
|
3555
|
+
pageSize: pageSize ?? document_content_model.PAGE_SIZE_A4,
|
|
3556
|
+
margins: margins ?? DEFAULT_MARGINS,
|
|
3557
|
+
gridlines: printTokens.has("grid"),
|
|
3558
|
+
headers: printTokens.has("headers"),
|
|
3559
|
+
pageOrder
|
|
3560
|
+
};
|
|
3561
|
+
}
|
|
3562
|
+
function writeSheetPrintSettings(pkg, tableElement, settings) {
|
|
3563
|
+
const stylesAutomaticStyles = findStylesAutomaticStyles(pkg);
|
|
3564
|
+
const masterStyles = findMasterStyles(pkg);
|
|
3565
|
+
const contentAutomaticStyles = findContentAutomaticStyles(pkg);
|
|
3566
|
+
const printTokens = [settings.gridlines ? "grid" : void 0, settings.headers ? "headers" : void 0].filter((token) => token !== void 0);
|
|
3567
|
+
const pageLayoutName = nextStyleName(stylesAutomaticStyles, "style:page-layout", "OdsPageLayout");
|
|
3568
|
+
stylesAutomaticStyles.children.push(el("style:page-layout", { "style:name": pageLayoutName }, [el("style:page-layout-properties", {
|
|
3569
|
+
"fo:page-width": (0, odf_js.formatOdfLength)(settings.pageSize.widthPt),
|
|
3570
|
+
"fo:page-height": (0, odf_js.formatOdfLength)(settings.pageSize.heightPt),
|
|
3571
|
+
"fo:margin-top": (0, odf_js.formatOdfLength)(settings.margins.topPt),
|
|
3572
|
+
"fo:margin-right": (0, odf_js.formatOdfLength)(settings.margins.rightPt),
|
|
3573
|
+
"fo:margin-bottom": (0, odf_js.formatOdfLength)(settings.margins.bottomPt),
|
|
3574
|
+
"fo:margin-left": (0, odf_js.formatOdfLength)(settings.margins.leftPt),
|
|
3575
|
+
...printTokens.length > 0 ? { "style:print": printTokens.join(" ") } : {},
|
|
3576
|
+
"style:print-page-order": settings.pageOrder === "overThenDown" ? "ltr" : "ttb"
|
|
3577
|
+
})]));
|
|
3578
|
+
const masterPageName = nextStyleName(masterStyles, "style:master-page", "OdsMasterPage");
|
|
3579
|
+
masterStyles.children.push(el("style:master-page", {
|
|
3580
|
+
"style:name": masterPageName,
|
|
3581
|
+
"style:page-layout-name": pageLayoutName
|
|
3582
|
+
}));
|
|
3583
|
+
const tableStyleName = nextStyleName(contentAutomaticStyles, "style:style", "OdsSheetPrint");
|
|
3584
|
+
contentAutomaticStyles.children.push(el("style:style", {
|
|
3585
|
+
"style:name": tableStyleName,
|
|
3586
|
+
"style:family": "table",
|
|
3587
|
+
"style:master-page-name": masterPageName
|
|
3588
|
+
}));
|
|
3589
|
+
setAttr(tableElement, "table:style-name", tableStyleName);
|
|
3590
|
+
}
|
|
3591
|
+
//#endregion
|
|
3511
3592
|
//#region src/edit/ods/sheet.ts
|
|
3512
3593
|
const NAME_ATTR = "table:name";
|
|
3513
3594
|
var OdsSheet = class {
|
|
@@ -3532,6 +3613,12 @@ var OdsSheet = class {
|
|
|
3532
3613
|
set name(value) {
|
|
3533
3614
|
setAttr(this.live(), NAME_ATTR, value);
|
|
3534
3615
|
}
|
|
3616
|
+
get printSettings() {
|
|
3617
|
+
return readSheetPrintSettings(this.pkg, this.live());
|
|
3618
|
+
}
|
|
3619
|
+
set printSettings(value) {
|
|
3620
|
+
writeSheetPrintSettings(this.pkg, this.live(), value);
|
|
3621
|
+
}
|
|
3535
3622
|
cell(row, column) {
|
|
3536
3623
|
const node = resolveCellNode(this.live(), row, column);
|
|
3537
3624
|
if (node.tag === "table:covered-table-cell") throw new Error(`cell (${row}, ${column}) is covered by a merged range -- address the merge's own anchor cell instead`);
|
|
@@ -3644,6 +3731,7 @@ function buildOdsPackage(content) {
|
|
|
3644
3731
|
if (content.sheets.length > 0) editor.removeSheetAt(0);
|
|
3645
3732
|
for (const sheet of content.sheets) {
|
|
3646
3733
|
const odsSheet = editor.addSheet(sheet.name);
|
|
3734
|
+
odsSheet.printSettings = sheet.printSettings;
|
|
3647
3735
|
for (const cell of sheet.cells) appendCell(odsSheet, cell);
|
|
3648
3736
|
}
|
|
3649
3737
|
return editor.toPackage();
|
|
@@ -11024,6 +11112,275 @@ function layoutTextToShape(item, pageHeightPt) {
|
|
|
11024
11112
|
}]
|
|
11025
11113
|
};
|
|
11026
11114
|
}
|
|
11115
|
+
function extractLineCandidates(items) {
|
|
11116
|
+
const segments = [];
|
|
11117
|
+
for (const item of items) {
|
|
11118
|
+
if (item.kind === "line") {
|
|
11119
|
+
segments.push({
|
|
11120
|
+
x1Pt: item.x1Pt,
|
|
11121
|
+
y1Pt: item.y1Pt,
|
|
11122
|
+
x2Pt: item.x2Pt,
|
|
11123
|
+
y2Pt: item.y2Pt
|
|
11124
|
+
});
|
|
11125
|
+
continue;
|
|
11126
|
+
}
|
|
11127
|
+
if (item.kind === "path" && item.stroke !== void 0 && item.subpaths.length === 1) {
|
|
11128
|
+
const subpath = item.subpaths[0];
|
|
11129
|
+
if (subpath.segments.length === 1 && subpath.segments[0].kind === "line") {
|
|
11130
|
+
const segment = subpath.segments[0];
|
|
11131
|
+
segments.push({
|
|
11132
|
+
x1Pt: subpath.startXPt,
|
|
11133
|
+
y1Pt: subpath.startYPt,
|
|
11134
|
+
x2Pt: segment.xPt,
|
|
11135
|
+
y2Pt: segment.yPt
|
|
11136
|
+
});
|
|
11137
|
+
}
|
|
11138
|
+
}
|
|
11139
|
+
}
|
|
11140
|
+
return segments;
|
|
11141
|
+
}
|
|
11142
|
+
const AXIS_ALIGNMENT_TOLERANCE_PT = .5;
|
|
11143
|
+
const MIN_GRIDLINE_LENGTH_PT = 4;
|
|
11144
|
+
function classifyAxisLine(seg) {
|
|
11145
|
+
const dx = Math.abs(seg.x2Pt - seg.x1Pt);
|
|
11146
|
+
const dy = Math.abs(seg.y2Pt - seg.y1Pt);
|
|
11147
|
+
if (dy <= AXIS_ALIGNMENT_TOLERANCE_PT && dx >= MIN_GRIDLINE_LENGTH_PT) return {
|
|
11148
|
+
axis: "horizontal",
|
|
11149
|
+
position: (seg.y1Pt + seg.y2Pt) / 2,
|
|
11150
|
+
spanPt: dx
|
|
11151
|
+
};
|
|
11152
|
+
if (dx <= AXIS_ALIGNMENT_TOLERANCE_PT && dy >= MIN_GRIDLINE_LENGTH_PT) return {
|
|
11153
|
+
axis: "vertical",
|
|
11154
|
+
position: (seg.x1Pt + seg.x2Pt) / 2,
|
|
11155
|
+
spanPt: dy
|
|
11156
|
+
};
|
|
11157
|
+
}
|
|
11158
|
+
const POSITION_DEDUPE_TOLERANCE_PT = .5;
|
|
11159
|
+
function dedupeAxisLines(lines, descending) {
|
|
11160
|
+
const sorted = [...lines].sort((a, b) => descending ? b.position - a.position : a.position - b.position);
|
|
11161
|
+
const result = [];
|
|
11162
|
+
for (const candidate of sorted) {
|
|
11163
|
+
const last = result[result.length - 1];
|
|
11164
|
+
if (last !== void 0 && Math.abs(candidate.position - last.position) <= POSITION_DEDUPE_TOLERANCE_PT) last.spanPt = Math.max(last.spanPt, candidate.spanPt);
|
|
11165
|
+
else result.push({
|
|
11166
|
+
position: candidate.position,
|
|
11167
|
+
spanPt: candidate.spanPt
|
|
11168
|
+
});
|
|
11169
|
+
}
|
|
11170
|
+
return result;
|
|
11171
|
+
}
|
|
11172
|
+
const MIN_GRIDLINE_COUNT_PER_AXIS = 3;
|
|
11173
|
+
const GRID_SPAN_CONSISTENCY_RATIO = .9;
|
|
11174
|
+
function isRegularLattice(lines) {
|
|
11175
|
+
if (lines.length < MIN_GRIDLINE_COUNT_PER_AXIS) return false;
|
|
11176
|
+
const maxSpanPt = Math.max(...lines.map((l) => l.spanPt));
|
|
11177
|
+
return lines.filter((l) => l.spanPt >= maxSpanPt * GRID_SPAN_CONSISTENCY_RATIO).length >= MIN_GRIDLINE_COUNT_PER_AXIS;
|
|
11178
|
+
}
|
|
11179
|
+
function detectGridLattice(items) {
|
|
11180
|
+
const horizontal = [];
|
|
11181
|
+
const vertical = [];
|
|
11182
|
+
for (const seg of extractLineCandidates(items)) {
|
|
11183
|
+
const classified = classifyAxisLine(seg);
|
|
11184
|
+
if (classified === void 0) continue;
|
|
11185
|
+
(classified.axis === "horizontal" ? horizontal : vertical).push(classified);
|
|
11186
|
+
}
|
|
11187
|
+
const rowBoundaries = dedupeAxisLines(horizontal, true);
|
|
11188
|
+
const columnBoundaries = dedupeAxisLines(vertical, false);
|
|
11189
|
+
if (!isRegularLattice(rowBoundaries) || !isRegularLattice(columnBoundaries)) return;
|
|
11190
|
+
return {
|
|
11191
|
+
rowBoundariesDescPt: rowBoundaries.map((l) => l.position),
|
|
11192
|
+
columnBoundariesAscPt: columnBoundaries.map((l) => l.position)
|
|
11193
|
+
};
|
|
11194
|
+
}
|
|
11195
|
+
const OUTER_EDGE_TOLERANCE_PT = 3;
|
|
11196
|
+
function findRowIndex(rowBoundariesDescPt, yPt) {
|
|
11197
|
+
const lastIndex = rowBoundariesDescPt.length - 1;
|
|
11198
|
+
if (yPt > rowBoundariesDescPt[0] + OUTER_EDGE_TOLERANCE_PT || yPt < rowBoundariesDescPt[lastIndex] - OUTER_EDGE_TOLERANCE_PT) return;
|
|
11199
|
+
for (let i = 0; i < lastIndex; i++) if (yPt > rowBoundariesDescPt[i + 1]) return i;
|
|
11200
|
+
return lastIndex - 1;
|
|
11201
|
+
}
|
|
11202
|
+
function findColumnIndex(columnBoundariesAscPt, xPt) {
|
|
11203
|
+
const lastIndex = columnBoundariesAscPt.length - 1;
|
|
11204
|
+
if (xPt < columnBoundariesAscPt[0] - OUTER_EDGE_TOLERANCE_PT || xPt > columnBoundariesAscPt[lastIndex] + OUTER_EDGE_TOLERANCE_PT) return;
|
|
11205
|
+
for (let j = 0; j < lastIndex; j++) if (xPt < columnBoundariesAscPt[j + 1]) return j;
|
|
11206
|
+
return lastIndex - 1;
|
|
11207
|
+
}
|
|
11208
|
+
function joinCellText(items) {
|
|
11209
|
+
const sorted = [...items].sort((a, b) => a.xPt - b.xPt);
|
|
11210
|
+
let text = "";
|
|
11211
|
+
sorted.forEach((item, i) => {
|
|
11212
|
+
if (i > 0) {
|
|
11213
|
+
const prev = sorted[i - 1];
|
|
11214
|
+
if (item.xPt - (prev.xPt + (prev.widthPt ?? 0)) > MIN_WORD_GAP_PT) text += " ";
|
|
11215
|
+
}
|
|
11216
|
+
text += item.text;
|
|
11217
|
+
});
|
|
11218
|
+
return text;
|
|
11219
|
+
}
|
|
11220
|
+
function groupKey(row, column) {
|
|
11221
|
+
return `${row},${column}`;
|
|
11222
|
+
}
|
|
11223
|
+
function addToGroup(groups, row, column, item) {
|
|
11224
|
+
const key = groupKey(row, column);
|
|
11225
|
+
const existing = groups.get(key);
|
|
11226
|
+
if (existing === void 0) groups.set(key, [item]);
|
|
11227
|
+
else existing.push(item);
|
|
11228
|
+
}
|
|
11229
|
+
function buildCellsFromGroups(groups) {
|
|
11230
|
+
const cells = [];
|
|
11231
|
+
for (const [key, items] of groups) {
|
|
11232
|
+
const displayText = joinCellText(items);
|
|
11233
|
+
if (displayText.length === 0) continue;
|
|
11234
|
+
const [rowPart, columnPart] = key.split(",");
|
|
11235
|
+
cells.push({
|
|
11236
|
+
row: Number(rowPart),
|
|
11237
|
+
column: Number(columnPart),
|
|
11238
|
+
value: {
|
|
11239
|
+
kind: "string",
|
|
11240
|
+
value: displayText
|
|
11241
|
+
},
|
|
11242
|
+
displayText
|
|
11243
|
+
});
|
|
11244
|
+
}
|
|
11245
|
+
cells.sort((a, b) => a.row - b.row || a.column - b.column);
|
|
11246
|
+
return cells;
|
|
11247
|
+
}
|
|
11248
|
+
function buildGridFromLattice(textItems, lattice) {
|
|
11249
|
+
const groups = /* @__PURE__ */ new Map();
|
|
11250
|
+
for (const item of textItems) {
|
|
11251
|
+
const row = findRowIndex(lattice.rowBoundariesDescPt, item.yPt);
|
|
11252
|
+
const column = findColumnIndex(lattice.columnBoundariesAscPt, item.xPt);
|
|
11253
|
+
if (row === void 0 || column === void 0) continue;
|
|
11254
|
+
addToGroup(groups, row, column, item);
|
|
11255
|
+
}
|
|
11256
|
+
const columns = [];
|
|
11257
|
+
for (let j = 0; j < lattice.columnBoundariesAscPt.length - 1; j++) columns.push({
|
|
11258
|
+
index: j,
|
|
11259
|
+
widthPt: lattice.columnBoundariesAscPt[j + 1] - lattice.columnBoundariesAscPt[j]
|
|
11260
|
+
});
|
|
11261
|
+
const rows = [];
|
|
11262
|
+
for (let i = 0; i < lattice.rowBoundariesDescPt.length - 1; i++) rows.push({
|
|
11263
|
+
index: i,
|
|
11264
|
+
heightPt: lattice.rowBoundariesDescPt[i] - lattice.rowBoundariesDescPt[i + 1]
|
|
11265
|
+
});
|
|
11266
|
+
return {
|
|
11267
|
+
cells: buildCellsFromGroups(groups),
|
|
11268
|
+
columns,
|
|
11269
|
+
rows,
|
|
11270
|
+
gridlines: true
|
|
11271
|
+
};
|
|
11272
|
+
}
|
|
11273
|
+
const COLUMN_ALIGNMENT_TOLERANCE_PT = 3;
|
|
11274
|
+
const MIN_COLUMN_RECURRENCE = 2;
|
|
11275
|
+
function detectColumnPositions(segmentsByLine) {
|
|
11276
|
+
const allXs = segmentsByLine.flatMap((segments) => segments.map((segment) => segment.items[0].xPt));
|
|
11277
|
+
if (allXs.length === 0) return [];
|
|
11278
|
+
const counts = bucketCounts(allXs, COLUMN_ALIGNMENT_TOLERANCE_PT);
|
|
11279
|
+
const recurring = [...counts.entries()].filter(([, count]) => count >= MIN_COLUMN_RECURRENCE).map(([bucket]) => bucket);
|
|
11280
|
+
const positions = recurring.length > 0 ? recurring : [...counts.keys()];
|
|
11281
|
+
positions.sort((a, b) => a - b);
|
|
11282
|
+
return positions;
|
|
11283
|
+
}
|
|
11284
|
+
function nearestColumnIndex(positions, xPt) {
|
|
11285
|
+
let bestIndex = 0;
|
|
11286
|
+
let bestDistancePt = Number.POSITIVE_INFINITY;
|
|
11287
|
+
positions.forEach((position, index) => {
|
|
11288
|
+
const distancePt = Math.abs(position - xPt);
|
|
11289
|
+
if (distancePt < bestDistancePt) {
|
|
11290
|
+
bestDistancePt = distancePt;
|
|
11291
|
+
bestIndex = index;
|
|
11292
|
+
}
|
|
11293
|
+
});
|
|
11294
|
+
return bestIndex;
|
|
11295
|
+
}
|
|
11296
|
+
const DEFAULT_COLUMN_WIDTH_FALLBACK_PT = 40;
|
|
11297
|
+
function lastColumnWidthPt(groups, columnIndex, anchorXPt) {
|
|
11298
|
+
let maxWidthPt = 0;
|
|
11299
|
+
for (const [key, items] of groups) {
|
|
11300
|
+
const [, columnPart] = key.split(",");
|
|
11301
|
+
if (Number(columnPart) !== columnIndex) continue;
|
|
11302
|
+
for (const item of items) maxWidthPt = Math.max(maxWidthPt, item.xPt + (item.widthPt ?? 0) - anchorXPt);
|
|
11303
|
+
}
|
|
11304
|
+
return maxWidthPt > 0 ? maxWidthPt : DEFAULT_COLUMN_WIDTH_FALLBACK_PT;
|
|
11305
|
+
}
|
|
11306
|
+
function buildGridFromTextClustering(textItems) {
|
|
11307
|
+
const lines = clusterIntoLines(textItems);
|
|
11308
|
+
if (lines.length === 0) return {
|
|
11309
|
+
cells: [],
|
|
11310
|
+
columns: [],
|
|
11311
|
+
rows: [],
|
|
11312
|
+
gridlines: false
|
|
11313
|
+
};
|
|
11314
|
+
const segmentsByLine = lines.map((l) => splitLineByLargeGaps(l));
|
|
11315
|
+
const columnPositions = detectColumnPositions(segmentsByLine);
|
|
11316
|
+
const groups = /* @__PURE__ */ new Map();
|
|
11317
|
+
segmentsByLine.forEach((segments, rowIndex) => {
|
|
11318
|
+
for (const segment of segments) {
|
|
11319
|
+
const key = groupKey(rowIndex, nearestColumnIndex(columnPositions, segment.items[0].xPt));
|
|
11320
|
+
const existing = groups.get(key);
|
|
11321
|
+
if (existing === void 0) groups.set(key, [...segment.items]);
|
|
11322
|
+
else existing.push(...segment.items);
|
|
11323
|
+
}
|
|
11324
|
+
});
|
|
11325
|
+
const nominalRowHeightPt = estimateModalLineSpacing(lines);
|
|
11326
|
+
const rows = lines.map((line, i) => {
|
|
11327
|
+
const nextBaselineY = lines[i + 1]?.baselineY;
|
|
11328
|
+
const heightPt = nextBaselineY !== void 0 ? line.baselineY - nextBaselineY : nominalRowHeightPt;
|
|
11329
|
+
return {
|
|
11330
|
+
index: i,
|
|
11331
|
+
heightPt: heightPt > 0 ? heightPt : nominalRowHeightPt
|
|
11332
|
+
};
|
|
11333
|
+
});
|
|
11334
|
+
const columns = columnPositions.map((position, j) => {
|
|
11335
|
+
const nextPosition = columnPositions[j + 1];
|
|
11336
|
+
return {
|
|
11337
|
+
index: j,
|
|
11338
|
+
widthPt: nextPosition !== void 0 ? nextPosition - position : lastColumnWidthPt(groups, j, position)
|
|
11339
|
+
};
|
|
11340
|
+
});
|
|
11341
|
+
return {
|
|
11342
|
+
cells: buildCellsFromGroups(groups),
|
|
11343
|
+
columns,
|
|
11344
|
+
rows,
|
|
11345
|
+
gridlines: false
|
|
11346
|
+
};
|
|
11347
|
+
}
|
|
11348
|
+
function reconstructSheet(page, pageIndex) {
|
|
11349
|
+
const textItems = page.items.filter((i) => i.kind === "text");
|
|
11350
|
+
const lattice = detectGridLattice(page.items);
|
|
11351
|
+
const grid = lattice !== void 0 ? buildGridFromLattice(textItems, lattice) : buildGridFromTextClustering(textItems);
|
|
11352
|
+
const printSettings = {
|
|
11353
|
+
pageSize: {
|
|
11354
|
+
widthPt: page.widthPt,
|
|
11355
|
+
heightPt: page.heightPt
|
|
11356
|
+
},
|
|
11357
|
+
margins: ZERO_MARGINS,
|
|
11358
|
+
gridlines: grid.gridlines,
|
|
11359
|
+
headers: false,
|
|
11360
|
+
pageOrder: "downThenOver"
|
|
11361
|
+
};
|
|
11362
|
+
return {
|
|
11363
|
+
name: `Sheet${pageIndex + 1}`,
|
|
11364
|
+
cells: grid.cells,
|
|
11365
|
+
columns: grid.columns,
|
|
11366
|
+
rows: grid.rows,
|
|
11367
|
+
images: [],
|
|
11368
|
+
printSettings
|
|
11369
|
+
};
|
|
11370
|
+
}
|
|
11371
|
+
function reconstructSpreadsheet(doc, options) {
|
|
11372
|
+
const signal = options?.signal;
|
|
11373
|
+
const sheets = doc.pages.map((page, index) => {
|
|
11374
|
+
throwIfAborted(signal);
|
|
11375
|
+
return reconstructSheet(page, index);
|
|
11376
|
+
});
|
|
11377
|
+
return {
|
|
11378
|
+
kind: "spreadsheet",
|
|
11379
|
+
formatVersion: 1,
|
|
11380
|
+
metadata: doc.metadata,
|
|
11381
|
+
sheets
|
|
11382
|
+
};
|
|
11383
|
+
}
|
|
11027
11384
|
//#endregion
|
|
11028
11385
|
//#region src/convert/convert.ts
|
|
11029
11386
|
function docxToPdf(bytes, options) {
|
|
@@ -11112,6 +11469,13 @@ function pdfToOdg(bytes, options) {
|
|
|
11112
11469
|
}), { signal: options?.signal });
|
|
11113
11470
|
return (0, odf_js.encodePackage)(buildOdgPackage(content));
|
|
11114
11471
|
}
|
|
11472
|
+
function pdfToOds(bytes, options) {
|
|
11473
|
+
const content = reconstructSpreadsheet(readPdf(bytes, {
|
|
11474
|
+
signal: options?.signal,
|
|
11475
|
+
sink: options?.sink
|
|
11476
|
+
}), { signal: options?.signal });
|
|
11477
|
+
return (0, odf_js.encodePackage)(buildOdsPackage(content));
|
|
11478
|
+
}
|
|
11115
11479
|
//#endregion
|
|
11116
11480
|
//#region src/convert/codec.ts
|
|
11117
11481
|
const docxPdfCodec = zod.z.codec(DocxBytesSchema, PdfBytesSchema, {
|
|
@@ -11130,6 +11494,10 @@ const odpPdfCodec = zod.z.codec(OdpBytesSchema, PdfBytesSchema, {
|
|
|
11130
11494
|
decode: (odpBytes) => odpToPdf(odpBytes),
|
|
11131
11495
|
encode: (pdfBytes) => pdfToOdp(pdfBytes)
|
|
11132
11496
|
});
|
|
11497
|
+
const odsPdfCodec = zod.z.codec(OdsBytesSchema, PdfBytesSchema, {
|
|
11498
|
+
decode: (odsBytes) => odsToPdf(odsBytes),
|
|
11499
|
+
encode: (pdfBytes) => pdfToOds(pdfBytes)
|
|
11500
|
+
});
|
|
11133
11501
|
const odgPdfCodec = zod.z.codec(OdgBytesSchema, PdfBytesSchema, {
|
|
11134
11502
|
decode: (odgBytes) => odgToPdf(odgBytes),
|
|
11135
11503
|
encode: (pdfBytes) => pdfToOdg(pdfBytes)
|
|
@@ -11177,6 +11545,10 @@ const SUPPORTED_CONVERSIONS = [
|
|
|
11177
11545
|
source: "pdf",
|
|
11178
11546
|
target: "odp"
|
|
11179
11547
|
},
|
|
11548
|
+
{
|
|
11549
|
+
source: "pdf",
|
|
11550
|
+
target: "ods"
|
|
11551
|
+
},
|
|
11180
11552
|
{
|
|
11181
11553
|
source: "pdf",
|
|
11182
11554
|
target: "odg"
|
|
@@ -11335,6 +11707,19 @@ function createLocalDocumentConverter() {
|
|
|
11335
11707
|
diagnostics
|
|
11336
11708
|
});
|
|
11337
11709
|
}
|
|
11710
|
+
if (source.format === "pdf" && targetFormat === "ods") {
|
|
11711
|
+
const bytes = pdfToOds(source.bytes, {
|
|
11712
|
+
signal: options.signal,
|
|
11713
|
+
sink: (d) => diagnostics.push(fromPdfDiagnostic(d))
|
|
11714
|
+
});
|
|
11715
|
+
return Promise.resolve({
|
|
11716
|
+
document: {
|
|
11717
|
+
format: "ods",
|
|
11718
|
+
bytes
|
|
11719
|
+
},
|
|
11720
|
+
diagnostics
|
|
11721
|
+
});
|
|
11722
|
+
}
|
|
11338
11723
|
if (source.format === "pdf" && targetFormat === "odg") {
|
|
11339
11724
|
const bytes = pdfToOdg(source.bytes, {
|
|
11340
11725
|
signal: options.signal,
|
|
@@ -11820,6 +12205,7 @@ exports.odgPdfCodec = odgPdfCodec;
|
|
|
11820
12205
|
exports.odgToPdf = odgToPdf;
|
|
11821
12206
|
exports.odpPdfCodec = odpPdfCodec;
|
|
11822
12207
|
exports.odpToPdf = odpToPdf;
|
|
12208
|
+
exports.odsPdfCodec = odsPdfCodec;
|
|
11823
12209
|
exports.odsToPdf = odsToPdf;
|
|
11824
12210
|
exports.odtPdfCodec = odtPdfCodec;
|
|
11825
12211
|
exports.odtToPdf = odtToPdf;
|
|
@@ -11851,6 +12237,7 @@ exports.pdfCodec = pdfCodec;
|
|
|
11851
12237
|
exports.pdfToDocx = pdfToDocx;
|
|
11852
12238
|
exports.pdfToOdg = pdfToOdg;
|
|
11853
12239
|
exports.pdfToOdp = pdfToOdp;
|
|
12240
|
+
exports.pdfToOds = pdfToOds;
|
|
11854
12241
|
exports.pdfToOdt = pdfToOdt;
|
|
11855
12242
|
exports.pdfToPptx = pdfToPptx;
|
|
11856
12243
|
exports.pptxPdfCodec = pptxPdfCodec;
|
|
@@ -11864,6 +12251,7 @@ exports.readPdf = readPdf;
|
|
|
11864
12251
|
exports.readPptxContent = readPptxContent;
|
|
11865
12252
|
exports.reconstructDrawing = reconstructDrawing;
|
|
11866
12253
|
exports.reconstructPresentation = reconstructPresentation;
|
|
12254
|
+
exports.reconstructSpreadsheet = reconstructSpreadsheet;
|
|
11867
12255
|
exports.reconstructWordprocessing = reconstructWordprocessing;
|
|
11868
12256
|
Object.defineProperty(exports, "resolveRelationships", {
|
|
11869
12257
|
enumerable: true,
|