documents.js 1.44.0 → 1.46.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/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { AttributeSchema, BinaryPartSchema, CommentSchema, CompactPackageSchema, CompactPartSchema, CompactXmlNodeSchema, DefinedNameSchema, PackageSchema, PartSchema, XmlCdataSchema, XmlCommentSchema, XmlDeclarationSchema, XmlElementSchema, XmlNodeSchema, XmlPartSchema, XmlPiSchema, XmlTextSchema, attr, attr as attr$1, base64ToBytes, base64ToBytes as base64ToBytes$1, buildXml, bytesToBase64, bytesToBase64 as bytesToBase64$1, childrenWithTag, compactCodec, compactPackageCodec, decodeCompactPackage, decodeEntities, decodePackage, decodePackage as decodePackage$1, elementsWithTag, elementsWithTag as elementsWithTag$1, encodeCompactPackage, encodePackage, encodePackage as encodePackage$1, fromCompact, isCompactXmlNode, isXmlNode, packageCodec, parsePackage, parseXml, readDocx, readPptx, resolveRelationships, resolveRelationships as resolveRelationships$1, rootElement, rootElement as rootElement$1, serializePackage, textContent, textContent as textContent$1, toCompact, unzipPackage, walk, xmlCodec, zipPackage } from "ooxml.js";
2
2
  import { COLOR_BLACK, ContentBlockSchema, ContentCellValueSchema, ContentDrawPageSchema, ContentDrawPageSchema as ContentDrawPageSchema$1, ContentImageBlockSchema, ContentPageBreakSchema, ContentParagraphSchema, ContentPathPointSchema, ContentPathSegmentSchema, ContentRunSchema, ContentSectionSchema, ContentSectionSchema as ContentSectionSchema$1, ContentShapeSchema, ContentSheetCellSchema, ContentSheetColumnSchema, ContentSheetPrintRangeSchema, ContentSheetPrintSettingsSchema, ContentSheetRepeatRangeSchema, ContentSheetRowSchema, ContentSheetSchema, ContentSheetSchema as ContentSheetSchema$1, ContentSlideSchema, ContentSlideSchema as ContentSlideSchema$1, ContentStrokeSchema, ContentSubpathSchema, ContentTableCellSchema, ContentTableRowSchema, ContentTableSchema, ContentVectorSchema, DEFAULT_LAYOUT_FONT, LAYOUT_FORMAT_VERSION, LAYOUT_FORMAT_VERSION as LAYOUT_FORMAT_VERSION$1, LayoutDocumentSchema, LayoutMetadataSchema, PAGE_SIZE_A4, PAGE_SIZE_LETTER, SLIDE_SIZE_STANDARD, SLIDE_SIZE_WIDESCREEN, colorToRgbHex, isContentBlock, rgbHexToColor } from "document-content-model";
3
3
  import { z } from "zod";
4
- import { ODF_MEDIA_TYPES, StyleRegistry, applyOdfTransform, base64ToBytes as base64ToBytes$2, bytesToBase64 as bytesToBase64$2, decodeOdfText, decodePackage as decodePackage$2, encodePackage as encodePackage$2, formatOdfLength, parseCellReference, parseOdfLength, readOdg, readOdp, readOds, readOdt, resolveOdfShapeGeometry, resolveStyle, setDocumentMediaType, syncManifest, syncManifest as syncManifest$1, xmlnsAttributes } from "odf.js";
4
+ import { ODF_MEDIA_TYPES, StyleRegistry, applyOdfTransform, base64ToBytes as base64ToBytes$2, buildOdfSubpaths, bytesToBase64 as bytesToBase64$2, decodeOdfText, decodePackage as decodePackage$2, encodePackage as encodePackage$2, formatOdfColor, formatOdfLength, parseBox, parseCellReference, parseLinePoints, parseOdfColor, parseOdfLength, parseOdfPathData, parseOdfViewBox, readOdg, readOdp, readOds, readOdt, resolveOdfShapeGeometry, resolveStyle, setDocumentMediaType, syncManifest, syncManifest as syncManifest$1, xmlnsAttributes } from "odf.js";
5
5
  import { Unzlib, inflateSync, unzlibSync, zlibSync } from "fflate";
6
6
  //#region src/model/content.ts
7
7
  const CONTENT_FORMAT_VERSION = 1;
@@ -535,7 +535,7 @@ function needsSpacePreserve(text) {
535
535
  }
536
536
  //#endregion
537
537
  //#region src/edit/docx/run.ts
538
- function directChild$9(parent, tag) {
538
+ function directChild$10(parent, tag) {
539
539
  for (const child of parent.children) if (child.type === "element" && child.tag === tag) return child;
540
540
  }
541
541
  function appendUElement(rPr, value) {
@@ -544,7 +544,7 @@ function appendUElement(rPr, value) {
544
544
  return created;
545
545
  }
546
546
  function findOrCreateT(run) {
547
- const existing = directChild$9(run, "w:t");
547
+ const existing = directChild$10(run, "w:t");
548
548
  if (existing !== void 0) return existing;
549
549
  const created = el("w:t");
550
550
  run.children.push(created);
@@ -564,7 +564,7 @@ var DocxRun = class {
564
564
  }
565
565
  rPr(create) {
566
566
  const node = this.live();
567
- return create ? ensureFirstChild(node, "w:rPr") : directChild$9(node, "w:rPr");
567
+ return create ? ensureFirstChild(node, "w:rPr") : directChild$10(node, "w:rPr");
568
568
  }
569
569
  get text() {
570
570
  return textContent$1(this.live());
@@ -588,14 +588,14 @@ var DocxRun = class {
588
588
  }
589
589
  get underline() {
590
590
  const rPr = this.rPr(false);
591
- const uElement = rPr === void 0 ? void 0 : directChild$9(rPr, "w:u");
591
+ const uElement = rPr === void 0 ? void 0 : directChild$10(rPr, "w:u");
592
592
  if (uElement === void 0) return false;
593
593
  for (const a of uElement.attributes) if (a.name === "w:val") return a.value !== "none";
594
594
  return true;
595
595
  }
596
596
  set underline(value) {
597
597
  const rPr = this.rPr(true);
598
- const existing = directChild$9(rPr, "w:u");
598
+ const existing = directChild$10(rPr, "w:u");
599
599
  if (existing === void 0) {
600
600
  appendUElement(rPr, value);
601
601
  return;
@@ -669,7 +669,7 @@ function buildRun$1(init = {}) {
669
669
  }
670
670
  //#endregion
671
671
  //#region src/edit/docx/paragraph.ts
672
- function directChild$8(parent, tag) {
672
+ function directChild$9(parent, tag) {
673
673
  for (const child of parent.children) if (child.type === "element" && child.tag === tag) return child;
674
674
  }
675
675
  var DocxParagraph = class {
@@ -688,7 +688,7 @@ var DocxParagraph = class {
688
688
  }
689
689
  pPr(create) {
690
690
  const node = this.live();
691
- return create ? ensureFirstChild(node, "w:pPr") : directChild$8(node, "w:pPr");
691
+ return create ? ensureFirstChild(node, "w:pPr") : directChild$9(node, "w:pPr");
692
692
  }
693
693
  get text() {
694
694
  return textContent$1(this.live());
@@ -725,7 +725,7 @@ var DocxParagraph = class {
725
725
  set styleId(value) {
726
726
  if (value === void 0) {
727
727
  const pPr = this.pPr(false);
728
- const existing = pPr === void 0 ? void 0 : directChild$8(pPr, "w:pStyle");
728
+ const existing = pPr === void 0 ? void 0 : directChild$9(pPr, "w:pStyle");
729
729
  if (existing !== void 0 && pPr !== void 0) removeChild(pPr.children, existing);
730
730
  return;
731
731
  }
@@ -737,7 +737,7 @@ var DocxParagraph = class {
737
737
  set alignment(value) {
738
738
  if (value === void 0) {
739
739
  const pPr = this.pPr(false);
740
- const existing = pPr === void 0 ? void 0 : directChild$8(pPr, "w:jc");
740
+ const existing = pPr === void 0 ? void 0 : directChild$9(pPr, "w:jc");
741
741
  if (existing !== void 0 && pPr !== void 0) removeChild(pPr.children, existing);
742
742
  return;
743
743
  }
@@ -745,12 +745,12 @@ var DocxParagraph = class {
745
745
  }
746
746
  get list() {
747
747
  const pPr = this.pPr(false);
748
- const numPr = pPr === void 0 ? void 0 : directChild$8(pPr, "w:numPr");
748
+ const numPr = pPr === void 0 ? void 0 : directChild$9(pPr, "w:numPr");
749
749
  if (numPr === void 0) return;
750
- const numIdElement = directChild$8(numPr, "w:numId");
750
+ const numIdElement = directChild$9(numPr, "w:numId");
751
751
  const numId = numIdElement === void 0 ? void 0 : attr$1(numIdElement, "w:val");
752
752
  if (numId === void 0) return;
753
- const ilvlElement = directChild$8(numPr, "w:ilvl");
753
+ const ilvlElement = directChild$9(numPr, "w:ilvl");
754
754
  const ilvl = ilvlElement === void 0 ? void 0 : attr$1(ilvlElement, "w:val");
755
755
  return {
756
756
  numId,
@@ -760,7 +760,7 @@ var DocxParagraph = class {
760
760
  set list(value) {
761
761
  const pPr = this.pPr(true);
762
762
  if (value === void 0) {
763
- const existing = directChild$8(pPr, "w:numPr");
763
+ const existing = directChild$9(pPr, "w:numPr");
764
764
  if (existing !== void 0) removeChild(pPr.children, existing);
765
765
  return;
766
766
  }
@@ -794,7 +794,7 @@ function buildParagraph$1(init = {}) {
794
794
  const CONTENT_TYPES_NS$1 = "http://schemas.openxmlformats.org/package/2006/content-types";
795
795
  const RELS_NS$1 = "http://schemas.openxmlformats.org/package/2006/relationships";
796
796
  const WORDML_NS = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
797
- function declaration$4() {
797
+ function declaration$5() {
798
798
  return {
799
799
  type: "declaration",
800
800
  attributes: [
@@ -863,23 +863,23 @@ function createEmptyDocxPackage() {
863
863
  return { parts: {
864
864
  "[Content_Types].xml": {
865
865
  kind: "xml",
866
- nodes: [declaration$4(), contentTypes]
866
+ nodes: [declaration$5(), contentTypes]
867
867
  },
868
868
  "_rels/.rels": {
869
869
  kind: "xml",
870
- nodes: [declaration$4(), rootRels]
870
+ nodes: [declaration$5(), rootRels]
871
871
  },
872
872
  "word/document.xml": {
873
873
  kind: "xml",
874
- nodes: [declaration$4(), document]
874
+ nodes: [declaration$5(), document]
875
875
  },
876
876
  "word/_rels/document.xml.rels": {
877
877
  kind: "xml",
878
- nodes: [declaration$4(), documentRels]
878
+ nodes: [declaration$5(), documentRels]
879
879
  },
880
880
  "word/styles.xml": {
881
881
  kind: "xml",
882
- nodes: [declaration$4(), styles]
882
+ nodes: [declaration$5(), styles]
883
883
  }
884
884
  } };
885
885
  }
@@ -1170,7 +1170,7 @@ const SLIDE_LAYOUT_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/
1170
1170
  const THEME_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme";
1171
1171
  const NOTES_MASTER_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster";
1172
1172
  const MIN_MASTER_OR_LAYOUT_ID = 2147483648;
1173
- function declaration$3() {
1173
+ function declaration$4() {
1174
1174
  return {
1175
1175
  type: "declaration",
1176
1176
  attributes: [
@@ -1320,7 +1320,7 @@ function ensureNotesMaster(pkg) {
1320
1320
  });
1321
1321
  pkg.parts[NOTES_MASTER_PART_PATH] = {
1322
1322
  kind: "xml",
1323
- nodes: [declaration$3(), buildNotesMaster()]
1323
+ nodes: [declaration$4(), buildNotesMaster()]
1324
1324
  };
1325
1325
  ensureContentTypeOverride(pkg, NOTES_MASTER_PART_PATH, NOTES_MASTER_CONTENT_TYPE);
1326
1326
  const presentationToNotesMasterTarget = buildRelativeTarget(PRESENTATION_PART_PATH$1, NOTES_MASTER_PART_PATH);
@@ -1359,15 +1359,15 @@ function createEmptyPptxPackage() {
1359
1359
  const pkg = { parts: {
1360
1360
  "[Content_Types].xml": {
1361
1361
  kind: "xml",
1362
- nodes: [declaration$3(), contentTypes]
1362
+ nodes: [declaration$4(), contentTypes]
1363
1363
  },
1364
1364
  "_rels/.rels": {
1365
1365
  kind: "xml",
1366
- nodes: [declaration$3(), rootRels]
1366
+ nodes: [declaration$4(), rootRels]
1367
1367
  },
1368
1368
  [PRESENTATION_PART_PATH$1]: {
1369
1369
  kind: "xml",
1370
- nodes: [declaration$3(), el("p:presentation", {
1370
+ nodes: [declaration$4(), el("p:presentation", {
1371
1371
  "xmlns:p": PML_NS,
1372
1372
  "xmlns:r": R_NS
1373
1373
  })]
@@ -1380,7 +1380,7 @@ function createEmptyPptxPackage() {
1380
1380
  });
1381
1381
  pkg.parts[SLIDE_LAYOUT_PART_PATH] = {
1382
1382
  kind: "xml",
1383
- nodes: [declaration$3(), buildSlideLayout()]
1383
+ nodes: [declaration$4(), buildSlideLayout()]
1384
1384
  };
1385
1385
  ensureContentTypeOverride(pkg, SLIDE_LAYOUT_PART_PATH, SLIDE_LAYOUT_CONTENT_TYPE);
1386
1386
  const masterToLayoutTarget = buildRelativeTarget(SLIDE_MASTER_PART_PATH, SLIDE_LAYOUT_PART_PATH);
@@ -1395,12 +1395,12 @@ function createEmptyPptxPackage() {
1395
1395
  });
1396
1396
  pkg.parts[SLIDE_MASTER_PART_PATH] = {
1397
1397
  kind: "xml",
1398
- nodes: [declaration$3(), buildSlideMaster(masterToLayoutRelId)]
1398
+ nodes: [declaration$4(), buildSlideMaster(masterToLayoutRelId)]
1399
1399
  };
1400
1400
  ensureContentTypeOverride(pkg, SLIDE_MASTER_PART_PATH, SLIDE_MASTER_CONTENT_TYPE);
1401
1401
  pkg.parts[THEME_PART_PATH] = {
1402
1402
  kind: "xml",
1403
- nodes: [declaration$3(), buildTheme()]
1403
+ nodes: [declaration$4(), buildTheme()]
1404
1404
  };
1405
1405
  ensureContentTypeOverride(pkg, THEME_PART_PATH, THEME_CONTENT_TYPE);
1406
1406
  const presentationToMasterTarget = buildRelativeTarget(PRESENTATION_PART_PATH$1, SLIDE_MASTER_PART_PATH);
@@ -1425,7 +1425,7 @@ function createEmptyPptxPackage() {
1425
1425
  }
1426
1426
  //#endregion
1427
1427
  //#region src/edit/pptx/shape.ts
1428
- function directChild$7(parent, tag) {
1428
+ function directChild$8(parent, tag) {
1429
1429
  for (const child of parent.children) if (child.type === "element" && child.tag === tag) return child;
1430
1430
  }
1431
1431
  function parseEmuAttr(element, name) {
@@ -1446,7 +1446,7 @@ var PptxShape = class {
1446
1446
  }
1447
1447
  spPrElement(create) {
1448
1448
  const node = this.live();
1449
- const existing = directChild$7(node, "p:spPr");
1449
+ const existing = directChild$8(node, "p:spPr");
1450
1450
  if (existing !== void 0 || !create) return existing;
1451
1451
  const created = el("p:spPr");
1452
1452
  node.children.push(created);
@@ -1454,10 +1454,10 @@ var PptxShape = class {
1454
1454
  }
1455
1455
  get frame() {
1456
1456
  const spPr = this.spPrElement(false);
1457
- const xfrm = spPr === void 0 ? void 0 : directChild$7(spPr, "a:xfrm");
1457
+ const xfrm = spPr === void 0 ? void 0 : directChild$8(spPr, "a:xfrm");
1458
1458
  if (xfrm === void 0) return;
1459
- const off = directChild$7(xfrm, "a:off");
1460
- const ext = directChild$7(xfrm, "a:ext");
1459
+ const off = directChild$8(xfrm, "a:off");
1460
+ const ext = directChild$8(xfrm, "a:ext");
1461
1461
  if (off === void 0 || ext === void 0) return;
1462
1462
  const x = parseEmuAttr(off, "x");
1463
1463
  const y = parseEmuAttr(off, "y");
@@ -1473,7 +1473,7 @@ var PptxShape = class {
1473
1473
  }
1474
1474
  set frame(value) {
1475
1475
  const spPr = this.spPrElement(true);
1476
- let xfrm = directChild$7(spPr, "a:xfrm");
1476
+ let xfrm = directChild$8(spPr, "a:xfrm");
1477
1477
  if (xfrm === void 0) {
1478
1478
  xfrm = el("a:xfrm");
1479
1479
  spPr.children.unshift(xfrm);
@@ -1487,12 +1487,12 @@ var PptxShape = class {
1487
1487
  })];
1488
1488
  }
1489
1489
  get text() {
1490
- const txBody = directChild$7(this.live(), "p:txBody");
1490
+ const txBody = directChild$8(this.live(), "p:txBody");
1491
1491
  return txBody === void 0 ? "" : textContent$1(txBody);
1492
1492
  }
1493
1493
  set text(value) {
1494
1494
  const node = this.live();
1495
- let txBody = directChild$7(node, "p:txBody");
1495
+ let txBody = directChild$8(node, "p:txBody");
1496
1496
  if (txBody === void 0) {
1497
1497
  txBody = el("p:txBody", {}, [el("a:bodyPr"), el("a:lstStyle")]);
1498
1498
  node.children.push(txBody);
@@ -1503,7 +1503,7 @@ var PptxShape = class {
1503
1503
  }
1504
1504
  setParagraphs(paragraphs) {
1505
1505
  const node = this.live();
1506
- let txBody = directChild$7(node, "p:txBody");
1506
+ let txBody = directChild$8(node, "p:txBody");
1507
1507
  if (txBody === void 0) {
1508
1508
  txBody = el("p:txBody", {}, [el("a:bodyPr"), el("a:lstStyle")]);
1509
1509
  node.children.push(txBody);
@@ -1614,12 +1614,12 @@ function insertPictureShapeMedia(context, slideRoot, frame, image) {
1614
1614
  }
1615
1615
  //#endregion
1616
1616
  //#region src/edit/pptx/slide.ts
1617
- function directChild$6(parent, tag) {
1617
+ function directChild$7(parent, tag) {
1618
1618
  for (const child of parent.children) if (child.type === "element" && child.tag === tag) return child;
1619
1619
  }
1620
1620
  function findSpTree(slideRoot) {
1621
- const cSld = directChild$6(slideRoot, "p:cSld");
1622
- const spTree = cSld === void 0 ? void 0 : directChild$6(cSld, "p:spTree");
1621
+ const cSld = directChild$7(slideRoot, "p:cSld");
1622
+ const spTree = cSld === void 0 ? void 0 : directChild$7(cSld, "p:spTree");
1623
1623
  if (spTree === void 0) throw new Error("slide has no p:cSld/p:spTree element");
1624
1624
  return spTree;
1625
1625
  }
@@ -1751,7 +1751,7 @@ const PRESENTATION_PART_PATH = "ppt/presentation.xml";
1751
1751
  const MEDIA_DIR = "ppt/media";
1752
1752
  const SLIDE_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.presentationml.slide+xml";
1753
1753
  const SLIDE_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide";
1754
- function directChild$5(parent, tag) {
1754
+ function directChild$6(parent, tag) {
1755
1755
  for (const child of parent.children) if (child.type === "element" && child.tag === tag) return child;
1756
1756
  }
1757
1757
  function attrValue(element, name) {
@@ -1763,12 +1763,12 @@ function findPresentationRoot(pkg) {
1763
1763
  return root;
1764
1764
  }
1765
1765
  function findSldIdLst(presentationRoot) {
1766
- const sldIdLst = directChild$5(presentationRoot, "p:sldIdLst");
1766
+ const sldIdLst = directChild$6(presentationRoot, "p:sldIdLst");
1767
1767
  if (sldIdLst === void 0) throw new Error(`${PRESENTATION_PART_PATH} has no p:sldIdLst element`);
1768
1768
  return sldIdLst;
1769
1769
  }
1770
1770
  function findSldSz(presentationRoot) {
1771
- const sldSz = directChild$5(presentationRoot, "p:sldSz");
1771
+ const sldSz = directChild$6(presentationRoot, "p:sldSz");
1772
1772
  if (sldSz === void 0) throw new Error(`${PRESENTATION_PART_PATH} has no p:sldSz element`);
1773
1773
  return sldSz;
1774
1774
  }
@@ -1929,12 +1929,12 @@ function buildPptxPackage(content) {
1929
1929
  if (firstSlide !== void 0) editor.slideSize = firstSlide.size;
1930
1930
  for (const slide of content.slides) {
1931
1931
  const pptxSlide = editor.addSlide();
1932
- for (const shape of slide.shapes) appendShape$1(pptxSlide, shape);
1932
+ for (const shape of slide.shapes) appendShape$2(pptxSlide, shape);
1933
1933
  if (slide.notes.length > 0) pptxSlide.notes = slide.notes;
1934
1934
  }
1935
1935
  return editor.toPackage();
1936
1936
  }
1937
- function appendShape$1(slide, shape) {
1937
+ function appendShape$2(slide, shape) {
1938
1938
  const [onlyBlock] = shape.blocks;
1939
1939
  if (shape.blocks.length === 1 && onlyBlock?.kind === "image") {
1940
1940
  slide.addImage({
@@ -1967,12 +1967,12 @@ function appendShape$1(slide, shape) {
1967
1967
  }
1968
1968
  //#endregion
1969
1969
  //#region src/edit/odt/automatic-styles.ts
1970
- const CONTENT_PART_PATH$3 = "content.xml";
1970
+ const CONTENT_PART_PATH$4 = "content.xml";
1971
1971
  function ensureAutomaticStyles(pkg) {
1972
- const part = pkg.parts[CONTENT_PART_PATH$3];
1973
- if (part?.kind !== "xml") throw new Error(`ensureAutomaticStyles: package has no ${CONTENT_PART_PATH$3} part`);
1972
+ const part = pkg.parts[CONTENT_PART_PATH$4];
1973
+ if (part?.kind !== "xml") throw new Error(`ensureAutomaticStyles: package has no ${CONTENT_PART_PATH$4} part`);
1974
1974
  const root = part.nodes.find((n) => n.type === "element");
1975
- if (root === void 0) throw new Error(`ensureAutomaticStyles: ${CONTENT_PART_PATH$3} has no root element`);
1975
+ if (root === void 0) throw new Error(`ensureAutomaticStyles: ${CONTENT_PART_PATH$4} has no root element`);
1976
1976
  for (const child of root.children) if (child.type === "element" && child.tag === "office:automatic-styles") return child;
1977
1977
  const created = el("office:automatic-styles");
1978
1978
  const insertBeforeTags = /* @__PURE__ */ new Set([
@@ -2066,7 +2066,7 @@ function applyStyleChange(pkg, element, family, change) {
2066
2066
  ...readCurrentStyleProperties(pkg, element, family),
2067
2067
  ...change
2068
2068
  };
2069
- const name = StyleRegistry.forPart(pkg, CONTENT_PART_PATH$3).intern({
2069
+ const name = StyleRegistry.forPart(pkg, CONTENT_PART_PATH$4).intern({
2070
2070
  family,
2071
2071
  properties: merged
2072
2072
  });
@@ -2297,7 +2297,7 @@ function buildList(pkg) {
2297
2297
  }
2298
2298
  //#endregion
2299
2299
  //#region src/edit/odt/scaffold.ts
2300
- const CONTENT_NS_PREFIXES$2 = [
2300
+ const CONTENT_NS_PREFIXES$3 = [
2301
2301
  "office",
2302
2302
  "style",
2303
2303
  "text",
@@ -2307,7 +2307,7 @@ const CONTENT_NS_PREFIXES$2 = [
2307
2307
  "svg",
2308
2308
  "xlink"
2309
2309
  ];
2310
- const STYLES_NS_PREFIXES$2 = [
2310
+ const STYLES_NS_PREFIXES$3 = [
2311
2311
  "office",
2312
2312
  "style",
2313
2313
  "text",
@@ -2317,16 +2317,16 @@ const STYLES_NS_PREFIXES$2 = [
2317
2317
  "svg",
2318
2318
  "xlink"
2319
2319
  ];
2320
- const META_NS_PREFIXES$2 = [
2320
+ const META_NS_PREFIXES$3 = [
2321
2321
  "office",
2322
2322
  "meta",
2323
2323
  "dc"
2324
2324
  ];
2325
- const ODF_VERSION$2 = "1.3";
2326
- const PAGE_LAYOUT_NAME$2 = "PM1";
2327
- const MASTER_PAGE_NAME$2 = "Standard";
2325
+ const ODF_VERSION$3 = "1.3";
2326
+ const PAGE_LAYOUT_NAME$3 = "PM1";
2327
+ const MASTER_PAGE_NAME$3 = "Standard";
2328
2328
  const DEFAULT_MARGIN_PT = 72;
2329
- function declaration$2() {
2329
+ function declaration$3() {
2330
2330
  return {
2331
2331
  type: "declaration",
2332
2332
  attributes: [
@@ -2345,8 +2345,8 @@ function declaration$2() {
2345
2345
  ]
2346
2346
  };
2347
2347
  }
2348
- function buildPageLayout$2() {
2349
- return el("style:page-layout", { "style:name": PAGE_LAYOUT_NAME$2 }, [el("style:page-layout-properties", {
2348
+ function buildPageLayout$3() {
2349
+ return el("style:page-layout", { "style:name": PAGE_LAYOUT_NAME$3 }, [el("style:page-layout-properties", {
2350
2350
  "fo:page-width": `${PAGE_SIZE_LETTER.widthPt}pt`,
2351
2351
  "fo:page-height": `${PAGE_SIZE_LETTER.heightPt}pt`,
2352
2352
  "fo:margin-top": `${DEFAULT_MARGIN_PT}pt`,
@@ -2355,44 +2355,44 @@ function buildPageLayout$2() {
2355
2355
  "fo:margin-left": `${DEFAULT_MARGIN_PT}pt`
2356
2356
  })]);
2357
2357
  }
2358
- function buildStylesXml$2() {
2358
+ function buildStylesXml$3() {
2359
2359
  return el("office:document-styles", {
2360
- ...xmlnsAttributes([...STYLES_NS_PREFIXES$2]),
2361
- "office:version": ODF_VERSION$2
2360
+ ...xmlnsAttributes([...STYLES_NS_PREFIXES$3]),
2361
+ "office:version": ODF_VERSION$3
2362
2362
  }, [
2363
2363
  el("office:styles"),
2364
- el("office:automatic-styles", {}, [buildPageLayout$2()]),
2364
+ el("office:automatic-styles", {}, [buildPageLayout$3()]),
2365
2365
  el("office:master-styles", {}, [el("style:master-page", {
2366
- "style:name": MASTER_PAGE_NAME$2,
2367
- "style:page-layout-name": PAGE_LAYOUT_NAME$2
2366
+ "style:name": MASTER_PAGE_NAME$3,
2367
+ "style:page-layout-name": PAGE_LAYOUT_NAME$3
2368
2368
  })])
2369
2369
  ]);
2370
2370
  }
2371
- function buildContentXml$2() {
2371
+ function buildContentXml$3() {
2372
2372
  return el("office:document-content", {
2373
- ...xmlnsAttributes([...CONTENT_NS_PREFIXES$2]),
2374
- "office:version": ODF_VERSION$2
2373
+ ...xmlnsAttributes([...CONTENT_NS_PREFIXES$3]),
2374
+ "office:version": ODF_VERSION$3
2375
2375
  }, [el("office:automatic-styles"), el("office:body", {}, [el("office:text")])]);
2376
2376
  }
2377
- function buildMetaXml$2() {
2377
+ function buildMetaXml$3() {
2378
2378
  return el("office:document-meta", {
2379
- ...xmlnsAttributes([...META_NS_PREFIXES$2]),
2380
- "office:version": ODF_VERSION$2
2379
+ ...xmlnsAttributes([...META_NS_PREFIXES$3]),
2380
+ "office:version": ODF_VERSION$3
2381
2381
  }, [el("office:meta")]);
2382
2382
  }
2383
2383
  function createEmptyOdtPackage() {
2384
2384
  const pkg = { parts: {
2385
2385
  "content.xml": {
2386
2386
  kind: "xml",
2387
- nodes: [declaration$2(), buildContentXml$2()]
2387
+ nodes: [declaration$3(), buildContentXml$3()]
2388
2388
  },
2389
2389
  "styles.xml": {
2390
2390
  kind: "xml",
2391
- nodes: [declaration$2(), buildStylesXml$2()]
2391
+ nodes: [declaration$3(), buildStylesXml$3()]
2392
2392
  },
2393
2393
  "meta.xml": {
2394
2394
  kind: "xml",
2395
- nodes: [declaration$2(), buildMetaXml$2()]
2395
+ nodes: [declaration$3(), buildMetaXml$3()]
2396
2396
  }
2397
2397
  } };
2398
2398
  setDocumentMediaType(pkg, ODF_MEDIA_TYPES.odt);
@@ -2513,20 +2513,20 @@ function buildTable(pkg, init) {
2513
2513
  }
2514
2514
  //#endregion
2515
2515
  //#region src/edit/odt/editor.ts
2516
- const CONTENT_PART_PATH$2 = "content.xml";
2516
+ const CONTENT_PART_PATH$3 = "content.xml";
2517
2517
  function findContentRoot(pkg) {
2518
- const part = pkg.parts[CONTENT_PART_PATH$2];
2518
+ const part = pkg.parts[CONTENT_PART_PATH$3];
2519
2519
  const root = part?.kind === "xml" ? part.nodes.find((n) => n.type === "element") : void 0;
2520
- if (root === void 0) throw new Error(`package has no root element at ${CONTENT_PART_PATH$2}`);
2520
+ if (root === void 0) throw new Error(`package has no root element at ${CONTENT_PART_PATH$3}`);
2521
2521
  return root;
2522
2522
  }
2523
- function directChild$4(parent, tag) {
2523
+ function directChild$5(parent, tag) {
2524
2524
  for (const child of parent.children) if (child.type === "element" && child.tag === tag) return child;
2525
2525
  }
2526
2526
  function findOfficeText(contentRoot) {
2527
- const body = directChild$4(contentRoot, "office:body");
2528
- const text = body === void 0 ? void 0 : directChild$4(body, "office:text");
2529
- if (text === void 0) throw new Error(`${CONTENT_PART_PATH$2} has no office:body/office:text element`);
2527
+ const body = directChild$5(contentRoot, "office:body");
2528
+ const text = body === void 0 ? void 0 : directChild$5(body, "office:text");
2529
+ if (text === void 0) throw new Error(`${CONTENT_PART_PATH$3} has no office:body/office:text element`);
2530
2530
  return text;
2531
2531
  }
2532
2532
  var OdtBodyImpl = class {
@@ -2658,7 +2658,7 @@ function appendBlock(body, block) {
2658
2658
  }
2659
2659
  //#endregion
2660
2660
  //#region src/edit/odp/scaffold.ts
2661
- const CONTENT_NS_PREFIXES$1 = [
2661
+ const CONTENT_NS_PREFIXES$2 = [
2662
2662
  "office",
2663
2663
  "style",
2664
2664
  "text",
@@ -2669,7 +2669,7 @@ const CONTENT_NS_PREFIXES$1 = [
2669
2669
  "svg",
2670
2670
  "xlink"
2671
2671
  ];
2672
- const STYLES_NS_PREFIXES$1 = [
2672
+ const STYLES_NS_PREFIXES$2 = [
2673
2673
  "office",
2674
2674
  "style",
2675
2675
  "text",
@@ -2680,14 +2680,14 @@ const STYLES_NS_PREFIXES$1 = [
2680
2680
  "svg",
2681
2681
  "xlink"
2682
2682
  ];
2683
- const META_NS_PREFIXES$1 = [
2683
+ const META_NS_PREFIXES$2 = [
2684
2684
  "office",
2685
2685
  "meta",
2686
2686
  "dc"
2687
2687
  ];
2688
- const ODF_VERSION$1 = "1.3";
2689
- const MASTER_PAGE_NAME$1 = "Standard";
2690
- function declaration$1() {
2688
+ const ODF_VERSION$2 = "1.3";
2689
+ const MASTER_PAGE_NAME$2 = "Standard";
2690
+ function declaration$2() {
2691
2691
  return {
2692
2692
  type: "declaration",
2693
2693
  attributes: [
@@ -2706,50 +2706,50 @@ function declaration$1() {
2706
2706
  ]
2707
2707
  };
2708
2708
  }
2709
- function buildPageLayout$1() {
2709
+ function buildPageLayout$2() {
2710
2710
  return el("style:page-layout", { "style:name": "PM1" }, [el("style:page-layout-properties", {
2711
2711
  "fo:page-width": `${SLIDE_SIZE_WIDESCREEN.widthPt}pt`,
2712
2712
  "fo:page-height": `${SLIDE_SIZE_WIDESCREEN.heightPt}pt`
2713
2713
  })]);
2714
2714
  }
2715
- function buildStylesXml$1() {
2715
+ function buildStylesXml$2() {
2716
2716
  return el("office:document-styles", {
2717
- ...xmlnsAttributes([...STYLES_NS_PREFIXES$1]),
2718
- "office:version": ODF_VERSION$1
2717
+ ...xmlnsAttributes([...STYLES_NS_PREFIXES$2]),
2718
+ "office:version": ODF_VERSION$2
2719
2719
  }, [
2720
2720
  el("office:styles"),
2721
- el("office:automatic-styles", {}, [buildPageLayout$1()]),
2721
+ el("office:automatic-styles", {}, [buildPageLayout$2()]),
2722
2722
  el("office:master-styles", {}, [el("style:master-page", {
2723
- "style:name": MASTER_PAGE_NAME$1,
2723
+ "style:name": MASTER_PAGE_NAME$2,
2724
2724
  "style:page-layout-name": "PM1"
2725
2725
  })])
2726
2726
  ]);
2727
2727
  }
2728
- function buildContentXml$1() {
2728
+ function buildContentXml$2() {
2729
2729
  return el("office:document-content", {
2730
- ...xmlnsAttributes([...CONTENT_NS_PREFIXES$1]),
2731
- "office:version": ODF_VERSION$1
2730
+ ...xmlnsAttributes([...CONTENT_NS_PREFIXES$2]),
2731
+ "office:version": ODF_VERSION$2
2732
2732
  }, [el("office:automatic-styles"), el("office:body", {}, [el("office:presentation")])]);
2733
2733
  }
2734
- function buildMetaXml$1() {
2734
+ function buildMetaXml$2() {
2735
2735
  return el("office:document-meta", {
2736
- ...xmlnsAttributes([...META_NS_PREFIXES$1]),
2737
- "office:version": ODF_VERSION$1
2736
+ ...xmlnsAttributes([...META_NS_PREFIXES$2]),
2737
+ "office:version": ODF_VERSION$2
2738
2738
  }, [el("office:meta")]);
2739
2739
  }
2740
2740
  function createEmptyOdpPackage() {
2741
2741
  const pkg = { parts: {
2742
2742
  "content.xml": {
2743
2743
  kind: "xml",
2744
- nodes: [declaration$1(), buildContentXml$1()]
2744
+ nodes: [declaration$2(), buildContentXml$2()]
2745
2745
  },
2746
2746
  "styles.xml": {
2747
2747
  kind: "xml",
2748
- nodes: [declaration$1(), buildStylesXml$1()]
2748
+ nodes: [declaration$2(), buildStylesXml$2()]
2749
2749
  },
2750
2750
  "meta.xml": {
2751
2751
  kind: "xml",
2752
- nodes: [declaration$1(), buildMetaXml$1()]
2752
+ nodes: [declaration$2(), buildMetaXml$2()]
2753
2753
  }
2754
2754
  } };
2755
2755
  setDocumentMediaType(pkg, ODF_MEDIA_TYPES.odp);
@@ -2789,7 +2789,7 @@ function addImageMedia(pkg, imageBytes, format) {
2789
2789
  }
2790
2790
  //#endregion
2791
2791
  //#region src/edit/odp/shape.ts
2792
- function directChild$3(parent, tag) {
2792
+ function directChild$4(parent, tag) {
2793
2793
  for (const child of parent.children) if (child.type === "element" && child.tag === tag) return child;
2794
2794
  }
2795
2795
  function buildTransformAttr(frame, rotationDeg) {
@@ -2857,7 +2857,7 @@ var OdpShape = class {
2857
2857
  }
2858
2858
  textBox(create) {
2859
2859
  const node = this.live();
2860
- const existing = directChild$3(node, "draw:text-box");
2860
+ const existing = directChild$4(node, "draw:text-box");
2861
2861
  if (existing !== void 0 || !create) return existing;
2862
2862
  const created = el("draw:text-box");
2863
2863
  node.children.push(created);
@@ -2918,7 +2918,7 @@ function insertImageFrameMedia(context, frame, image) {
2918
2918
  }
2919
2919
  //#endregion
2920
2920
  //#region src/edit/odp/slide.ts
2921
- function directChild$2(parent, tag) {
2921
+ function directChild$3(parent, tag) {
2922
2922
  for (const child of parent.children) if (child.type === "element" && child.tag === tag) return child;
2923
2923
  }
2924
2924
  const NOTES_FRAME_X_PT = 20;
@@ -2967,13 +2967,13 @@ var OdpSlide = class {
2967
2967
  return new OdpShape(node.children, frameElement, this.context.pkg);
2968
2968
  }
2969
2969
  get notes() {
2970
- const notesElement = directChild$2(this.live(), "presentation:notes");
2970
+ const notesElement = directChild$3(this.live(), "presentation:notes");
2971
2971
  if (notesElement === void 0) return "";
2972
2972
  return elementsWithTag$1(notesElement.children, "text:p").map((p) => decodeOdfText$1(p.children)).join("\n");
2973
2973
  }
2974
2974
  set notes(value) {
2975
2975
  const node = this.live();
2976
- const existing = directChild$2(node, "presentation:notes");
2976
+ const existing = directChild$3(node, "presentation:notes");
2977
2977
  const notesElement = buildNotesElement(this.context.pkg, value);
2978
2978
  if (existing === void 0) node.children.push(notesElement);
2979
2979
  else existing.children = notesElement.children;
@@ -2985,27 +2985,27 @@ var OdpSlide = class {
2985
2985
  };
2986
2986
  //#endregion
2987
2987
  //#region src/edit/odp/editor.ts
2988
- const CONTENT_PART_PATH$1 = "content.xml";
2989
- const STYLES_PART_PATH = "styles.xml";
2990
- function directChild$1(parent, tag) {
2988
+ const CONTENT_PART_PATH$2 = "content.xml";
2989
+ const STYLES_PART_PATH$1 = "styles.xml";
2990
+ function directChild$2(parent, tag) {
2991
2991
  for (const child of parent.children) if (child.type === "element" && child.tag === tag) return child;
2992
2992
  }
2993
- function findRoot$1(pkg, partPath) {
2993
+ function findRoot$2(pkg, partPath) {
2994
2994
  const part = pkg.parts[partPath];
2995
2995
  const root = part?.kind === "xml" ? part.nodes.find((n) => n.type === "element") : void 0;
2996
2996
  if (root === void 0) throw new Error(`package has no root element at ${partPath}`);
2997
2997
  return root;
2998
2998
  }
2999
2999
  function findOfficePresentation(pkg) {
3000
- const body = directChild$1(findRoot$1(pkg, CONTENT_PART_PATH$1), "office:body");
3001
- const presentation = body === void 0 ? void 0 : directChild$1(body, "office:presentation");
3002
- if (presentation === void 0) throw new Error(`${CONTENT_PART_PATH$1} has no office:body/office:presentation element`);
3000
+ const body = directChild$2(findRoot$2(pkg, CONTENT_PART_PATH$2), "office:body");
3001
+ const presentation = body === void 0 ? void 0 : directChild$2(body, "office:presentation");
3002
+ if (presentation === void 0) throw new Error(`${CONTENT_PART_PATH$2} has no office:body/office:presentation element`);
3003
3003
  return presentation;
3004
3004
  }
3005
- function findPageLayoutProperties(pkg) {
3006
- const pageLayout = directChild$1(findRoot$1(pkg, STYLES_PART_PATH), "office:automatic-styles")?.children.find((c) => c.type === "element" && c.tag === "style:page-layout" && attr$1(c, "style:name") === "PM1");
3007
- const properties = pageLayout === void 0 ? void 0 : directChild$1(pageLayout, "style:page-layout-properties");
3008
- if (properties === void 0) throw new Error(`${STYLES_PART_PATH} has no style:page-layout[style:name="PM1"]/style:page-layout-properties element`);
3005
+ function findPageLayoutProperties$1(pkg) {
3006
+ const pageLayout = directChild$2(findRoot$2(pkg, STYLES_PART_PATH$1), "office:automatic-styles")?.children.find((c) => c.type === "element" && c.tag === "style:page-layout" && attr$1(c, "style:name") === "PM1");
3007
+ const properties = pageLayout === void 0 ? void 0 : directChild$2(pageLayout, "style:page-layout-properties");
3008
+ if (properties === void 0) throw new Error(`${STYLES_PART_PATH$1} has no style:page-layout[style:name="PM1"]/style:page-layout-properties element`);
3009
3009
  return properties;
3010
3010
  }
3011
3011
  var OdpEditor = class {
@@ -3024,7 +3024,7 @@ var OdpEditor = class {
3024
3024
  }
3025
3025
  addSlide() {
3026
3026
  const presentation = findOfficePresentation(this.pkg);
3027
- const pageElement = el("draw:page", { "draw:master-page-name": MASTER_PAGE_NAME$1 });
3027
+ const pageElement = el("draw:page", { "draw:master-page-name": MASTER_PAGE_NAME$2 });
3028
3028
  presentation.children.push(pageElement);
3029
3029
  const context = { pkg: this.pkg };
3030
3030
  return new OdpSlide(presentation.children, pageElement, context);
@@ -3054,7 +3054,7 @@ var OdpEditor = class {
3054
3054
  presentation.children.splice(insertAt, 0, moved);
3055
3055
  }
3056
3056
  get slideSize() {
3057
- const properties = findPageLayoutProperties(this.pkg);
3057
+ const properties = findPageLayoutProperties$1(this.pkg);
3058
3058
  const widthValue = attr$1(properties, "fo:page-width");
3059
3059
  const heightValue = attr$1(properties, "fo:page-height");
3060
3060
  const widthPt = widthValue === void 0 ? void 0 : parseOdfLength(widthValue);
@@ -3065,7 +3065,7 @@ var OdpEditor = class {
3065
3065
  };
3066
3066
  }
3067
3067
  set slideSize(size) {
3068
- const properties = findPageLayoutProperties(this.pkg);
3068
+ const properties = findPageLayoutProperties$1(this.pkg);
3069
3069
  properties.attributes = [{
3070
3070
  name: "fo:page-width",
3071
3071
  value: formatOdfLength(size.widthPt)
@@ -3096,12 +3096,12 @@ function buildOdpPackage(content) {
3096
3096
  if (firstSlide !== void 0) editor.slideSize = firstSlide.size;
3097
3097
  for (const slide of content.slides) {
3098
3098
  const odpSlide = editor.addSlide();
3099
- for (const shape of slide.shapes) appendShape(odpSlide, shape);
3099
+ for (const shape of slide.shapes) appendShape$1(odpSlide, shape);
3100
3100
  if (slide.notes.length > 0) odpSlide.notes = slide.notes;
3101
3101
  }
3102
3102
  return editor.toPackage();
3103
3103
  }
3104
- function appendShape(slide, shape) {
3104
+ function appendShape$1(slide, shape) {
3105
3105
  const [onlyBlock] = shape.blocks;
3106
3106
  if (shape.blocks.length === 1 && onlyBlock?.kind === "image") {
3107
3107
  const imageShape = slide.addImage({
@@ -3126,31 +3126,31 @@ function appendShape(slide, shape) {
3126
3126
  }
3127
3127
  //#endregion
3128
3128
  //#region src/edit/ods/scaffold.ts
3129
- const CONTENT_NS_PREFIXES = [
3129
+ const CONTENT_NS_PREFIXES$1 = [
3130
3130
  "office",
3131
3131
  "style",
3132
3132
  "text",
3133
3133
  "table",
3134
3134
  "fo"
3135
3135
  ];
3136
- const STYLES_NS_PREFIXES = [
3136
+ const STYLES_NS_PREFIXES$1 = [
3137
3137
  "office",
3138
3138
  "style",
3139
3139
  "table",
3140
3140
  "fo"
3141
3141
  ];
3142
- const META_NS_PREFIXES = [
3142
+ const META_NS_PREFIXES$1 = [
3143
3143
  "office",
3144
3144
  "meta",
3145
3145
  "dc"
3146
3146
  ];
3147
3147
  const OF_NAMESPACE_ATTR = { "xmlns:of": "urn:oasis:names:tc:opendocument:xmlns:of:1.2" };
3148
- const ODF_VERSION = "1.3";
3149
- const MASTER_PAGE_NAME = "Standard";
3148
+ const ODF_VERSION$1 = "1.3";
3149
+ const MASTER_PAGE_NAME$1 = "Standard";
3150
3150
  const SHEET_TABLE_STYLE_NAME = "OdsTable";
3151
3151
  const DEFAULT_SHEET_NAME = "Sheet1";
3152
3152
  const DEFAULT_MARGIN = "2cm";
3153
- function declaration() {
3153
+ function declaration$1() {
3154
3154
  return {
3155
3155
  type: "declaration",
3156
3156
  attributes: [
@@ -3169,7 +3169,7 @@ function declaration() {
3169
3169
  ]
3170
3170
  };
3171
3171
  }
3172
- function buildPageLayout() {
3172
+ function buildPageLayout$1() {
3173
3173
  return el("style:page-layout", { "style:name": "PM1" }, [el("style:page-layout-properties", {
3174
3174
  "fo:page-width": `${PAGE_SIZE_A4.widthPt}pt`,
3175
3175
  "fo:page-height": `${PAGE_SIZE_A4.heightPt}pt`,
@@ -3179,15 +3179,15 @@ function buildPageLayout() {
3179
3179
  "fo:margin-left": DEFAULT_MARGIN
3180
3180
  })]);
3181
3181
  }
3182
- function buildStylesXml() {
3182
+ function buildStylesXml$1() {
3183
3183
  return el("office:document-styles", {
3184
- ...xmlnsAttributes([...STYLES_NS_PREFIXES]),
3185
- "office:version": ODF_VERSION
3184
+ ...xmlnsAttributes([...STYLES_NS_PREFIXES$1]),
3185
+ "office:version": ODF_VERSION$1
3186
3186
  }, [
3187
3187
  el("office:styles"),
3188
- el("office:automatic-styles", {}, [buildPageLayout()]),
3188
+ el("office:automatic-styles", {}, [buildPageLayout$1()]),
3189
3189
  el("office:master-styles", {}, [el("style:master-page", {
3190
- "style:name": MASTER_PAGE_NAME,
3190
+ "style:name": MASTER_PAGE_NAME$1,
3191
3191
  "style:page-layout-name": "PM1"
3192
3192
  })])
3193
3193
  ]);
@@ -3196,7 +3196,7 @@ function buildSheetTableStyle() {
3196
3196
  return el("style:style", {
3197
3197
  "style:name": SHEET_TABLE_STYLE_NAME,
3198
3198
  "style:family": "table",
3199
- "style:master-page-name": MASTER_PAGE_NAME
3199
+ "style:master-page-name": MASTER_PAGE_NAME$1
3200
3200
  });
3201
3201
  }
3202
3202
  function buildCalculationSettings() {
@@ -3207,36 +3207,36 @@ function buildCalculationSettings() {
3207
3207
  "table:null-year": "1950"
3208
3208
  });
3209
3209
  }
3210
- function buildContentXml() {
3210
+ function buildContentXml$1() {
3211
3211
  const table = el("table:table", {
3212
3212
  "table:name": DEFAULT_SHEET_NAME,
3213
3213
  "table:style-name": SHEET_TABLE_STYLE_NAME
3214
3214
  });
3215
3215
  return el("office:document-content", {
3216
- ...xmlnsAttributes([...CONTENT_NS_PREFIXES]),
3216
+ ...xmlnsAttributes([...CONTENT_NS_PREFIXES$1]),
3217
3217
  ...OF_NAMESPACE_ATTR,
3218
- "office:version": ODF_VERSION
3218
+ "office:version": ODF_VERSION$1
3219
3219
  }, [el("office:automatic-styles", {}, [buildSheetTableStyle()]), el("office:body", {}, [el("office:spreadsheet", {}, [buildCalculationSettings(), table])])]);
3220
3220
  }
3221
- function buildMetaXml() {
3221
+ function buildMetaXml$1() {
3222
3222
  return el("office:document-meta", {
3223
- ...xmlnsAttributes([...META_NS_PREFIXES]),
3224
- "office:version": ODF_VERSION
3223
+ ...xmlnsAttributes([...META_NS_PREFIXES$1]),
3224
+ "office:version": ODF_VERSION$1
3225
3225
  }, [el("office:meta")]);
3226
3226
  }
3227
3227
  function createEmptyOdsPackage() {
3228
3228
  const pkg = { parts: {
3229
3229
  "content.xml": {
3230
3230
  kind: "xml",
3231
- nodes: [declaration(), buildContentXml()]
3231
+ nodes: [declaration$1(), buildContentXml$1()]
3232
3232
  },
3233
3233
  "styles.xml": {
3234
3234
  kind: "xml",
3235
- nodes: [declaration(), buildStylesXml()]
3235
+ nodes: [declaration$1(), buildStylesXml$1()]
3236
3236
  },
3237
3237
  "meta.xml": {
3238
3238
  kind: "xml",
3239
- nodes: [declaration(), buildMetaXml()]
3239
+ nodes: [declaration$1(), buildMetaXml$1()]
3240
3240
  }
3241
3241
  } };
3242
3242
  setDocumentMediaType(pkg, ODF_MEDIA_TYPES.ods);
@@ -3494,68 +3494,608 @@ var OdsCell = class {
3494
3494
  get displayText() {
3495
3495
  return this.node.children.filter((child) => child.type === "element" && child.tag === "text:p").map((paragraph) => decodeOdfText$1(paragraph.children)).join("\n");
3496
3496
  }
3497
- set displayText(value) {
3498
- this.node.children = [el("text:p", {}, encodeOdfText(value))];
3497
+ set displayText(value) {
3498
+ this.node.children = [el("text:p", {}, encodeOdfText(value))];
3499
+ }
3500
+ setStyledRuns(runs) {
3501
+ const textParagraph = el("text:p");
3502
+ this.node.children = [textParagraph];
3503
+ populateParagraph(new OdtParagraph(this.node.children, textParagraph, this.pkg), {
3504
+ kind: "paragraph",
3505
+ runs: [...runs]
3506
+ });
3507
+ }
3508
+ };
3509
+ //#endregion
3510
+ //#region src/edit/ods/sheet.ts
3511
+ const NAME_ATTR = "table:name";
3512
+ var OdsSheet = class {
3513
+ container;
3514
+ node;
3515
+ pkg;
3516
+ removed = false;
3517
+ constructor(container, node, pkg) {
3518
+ this.container = container;
3519
+ this.node = node;
3520
+ this.pkg = pkg;
3521
+ }
3522
+ live() {
3523
+ if (this.removed) throw new Error("this OdsSheet has been removed from the spreadsheet and can no longer be used");
3524
+ return this.node;
3525
+ }
3526
+ get name() {
3527
+ const value = attr$1(this.live(), NAME_ATTR);
3528
+ if (value === void 0) throw new Error("this table:table element has no table:name attribute");
3529
+ return value;
3530
+ }
3531
+ set name(value) {
3532
+ setAttr(this.live(), NAME_ATTR, value);
3533
+ }
3534
+ cell(row, column) {
3535
+ const node = resolveCellNode(this.live(), row, column);
3536
+ 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`);
3537
+ return new OdsCell(node, this.pkg);
3538
+ }
3539
+ cellAt(reference) {
3540
+ const parsed = parseCellReference(reference);
3541
+ if (parsed === void 0) throw new Error(`cellAt: "${reference}" is not a valid A1-style cell reference`);
3542
+ return this.cell(parsed.row, parsed.column);
3543
+ }
3544
+ mergeCells(startRow, startColumn, rowSpan, colSpan) {
3545
+ if (!Number.isInteger(rowSpan) || rowSpan < 1 || !Number.isInteger(colSpan) || colSpan < 1) throw new Error(`mergeCells: rowSpan and colSpan must be positive integers, got rowSpan=${rowSpan}, colSpan=${colSpan}`);
3546
+ const tableElement = this.live();
3547
+ const anchorNode = resolveCellNode(tableElement, startRow, startColumn);
3548
+ if (anchorNode.tag === "table:covered-table-cell") throw new Error(`mergeCells: (${startRow}, ${startColumn}) is already covered by another merged range`);
3549
+ if (rowSpan > 1) setAttr(anchorNode, "table:number-rows-spanned", String(rowSpan));
3550
+ if (colSpan > 1) setAttr(anchorNode, "table:number-columns-spanned", String(colSpan));
3551
+ for (let rowOffset = 0; rowOffset < rowSpan; rowOffset++) for (let columnOffset = 0; columnOffset < colSpan; columnOffset++) {
3552
+ if (rowOffset === 0 && columnOffset === 0) continue;
3553
+ const coveredNode = resolveCellNode(tableElement, startRow + rowOffset, startColumn + columnOffset);
3554
+ coveredNode.tag = COVERED_CELL_TAG;
3555
+ coveredNode.attributes = [];
3556
+ coveredNode.children = [];
3557
+ }
3558
+ return new OdsCell(anchorNode, this.pkg);
3559
+ }
3560
+ remove() {
3561
+ removeChild(this.container, this.live());
3562
+ this.removed = true;
3563
+ }
3564
+ };
3565
+ //#endregion
3566
+ //#region src/edit/ods/editor.ts
3567
+ const CONTENT_PART_PATH$1 = "content.xml";
3568
+ function directChild$1(parent, tag) {
3569
+ for (const child of parent.children) if (child.type === "element" && child.tag === tag) return child;
3570
+ }
3571
+ function findRoot$1(pkg) {
3572
+ const part = pkg.parts[CONTENT_PART_PATH$1];
3573
+ const root = part?.kind === "xml" ? part.nodes.find((n) => n.type === "element") : void 0;
3574
+ if (root === void 0) throw new Error(`package has no root element at ${CONTENT_PART_PATH$1}`);
3575
+ return root;
3576
+ }
3577
+ function findOfficeSpreadsheet(pkg) {
3578
+ const body = directChild$1(findRoot$1(pkg), "office:body");
3579
+ const spreadsheet = body === void 0 ? void 0 : directChild$1(body, "office:spreadsheet");
3580
+ if (spreadsheet === void 0) throw new Error(`${CONTENT_PART_PATH$1} has no office:body/office:spreadsheet element`);
3581
+ return spreadsheet;
3582
+ }
3583
+ function ensureSheetTableStyleName(pkg) {
3584
+ const automaticStyles = ensureAutomaticStyles(pkg);
3585
+ if (automaticStyles.children.find((child) => child.type === "element" && child.tag === "style:style" && attr$1(child, "style:name") === "OdsTable") !== void 0) return SHEET_TABLE_STYLE_NAME;
3586
+ automaticStyles.children.push(el("style:style", {
3587
+ "style:name": SHEET_TABLE_STYLE_NAME,
3588
+ "style:family": "table",
3589
+ "style:master-page-name": MASTER_PAGE_NAME$1
3590
+ }));
3591
+ return SHEET_TABLE_STYLE_NAME;
3592
+ }
3593
+ var OdsEditor = class {
3594
+ pkg;
3595
+ constructor(pkg) {
3596
+ this.pkg = pkg;
3597
+ }
3598
+ sheets() {
3599
+ const spreadsheet = findOfficeSpreadsheet(this.pkg);
3600
+ const out = [];
3601
+ for (const child of spreadsheet.children) if (child.type === "element" && child.tag === "table:table") out.push(new OdsSheet(spreadsheet.children, child, this.pkg));
3602
+ return out;
3603
+ }
3604
+ sheet(name) {
3605
+ const found = this.sheets().find((candidate) => candidate.name === name);
3606
+ if (found === void 0) throw new Error(`no sheet named "${name}" exists in this spreadsheet`);
3607
+ return found;
3608
+ }
3609
+ addSheet(name) {
3610
+ const spreadsheet = findOfficeSpreadsheet(this.pkg);
3611
+ const tableElement = el("table:table", {
3612
+ "table:name": name,
3613
+ "table:style-name": ensureSheetTableStyleName(this.pkg)
3614
+ });
3615
+ spreadsheet.children.push(tableElement);
3616
+ return new OdsSheet(spreadsheet.children, tableElement, this.pkg);
3617
+ }
3618
+ removeSheetAt(index) {
3619
+ const spreadsheet = findOfficeSpreadsheet(this.pkg);
3620
+ const target = spreadsheet.children.filter((child) => child.type === "element" && child.tag === "table:table")[index];
3621
+ if (target === void 0) throw new Error(`sheet index ${index} does not exist`);
3622
+ const listIndex = spreadsheet.children.indexOf(target);
3623
+ spreadsheet.children.splice(listIndex, 1);
3624
+ }
3625
+ toPackage() {
3626
+ return this.pkg;
3627
+ }
3628
+ toBytes() {
3629
+ return encodePackage$2(this.pkg);
3630
+ }
3631
+ };
3632
+ function openOds(bytes) {
3633
+ return new OdsEditor(decodePackage$2(bytes));
3634
+ }
3635
+ function createOds() {
3636
+ return new OdsEditor(createEmptyOdsPackage());
3637
+ }
3638
+ //#endregion
3639
+ //#region src/edit/ods/content.ts
3640
+ function buildOdsPackage(content) {
3641
+ if (content.kind !== "spreadsheet") throw new Error("buildOdsPackage requires a spreadsheet ContentDocument");
3642
+ const editor = createOds();
3643
+ if (content.sheets.length > 0) editor.removeSheetAt(0);
3644
+ for (const sheet of content.sheets) {
3645
+ const odsSheet = editor.addSheet(sheet.name);
3646
+ for (const cell of sheet.cells) appendCell(odsSheet, cell);
3647
+ }
3648
+ return editor.toPackage();
3649
+ }
3650
+ function appendCell(odsSheet, cell) {
3651
+ const odsCell = odsSheet.cell(cell.row, cell.column);
3652
+ odsCell.value = cell.value;
3653
+ if (cell.formula !== void 0) odsCell.formula = cell.formula;
3654
+ if (cell.runs !== void 0 && cell.runs.length > 0) odsCell.setStyledRuns(cell.runs);
3655
+ else odsCell.displayText = cell.displayText;
3656
+ const rowSpan = cell.rowSpan ?? 1;
3657
+ const colSpan = cell.colSpan ?? 1;
3658
+ if (rowSpan > 1 || colSpan > 1) odsSheet.mergeCells(cell.row, cell.column, rowSpan, colSpan);
3659
+ }
3660
+ //#endregion
3661
+ //#region src/edit/odg/scaffold.ts
3662
+ const CONTENT_NS_PREFIXES = [
3663
+ "office",
3664
+ "style",
3665
+ "text",
3666
+ "table",
3667
+ "draw",
3668
+ "fo",
3669
+ "svg",
3670
+ "xlink"
3671
+ ];
3672
+ const STYLES_NS_PREFIXES = [
3673
+ "office",
3674
+ "style",
3675
+ "text",
3676
+ "table",
3677
+ "draw",
3678
+ "fo",
3679
+ "svg",
3680
+ "xlink"
3681
+ ];
3682
+ const META_NS_PREFIXES = [
3683
+ "office",
3684
+ "meta",
3685
+ "dc"
3686
+ ];
3687
+ const ODF_VERSION = "1.3";
3688
+ const MASTER_PAGE_NAME = "Standard";
3689
+ function declaration() {
3690
+ return {
3691
+ type: "declaration",
3692
+ attributes: [
3693
+ {
3694
+ name: "version",
3695
+ value: "1.0"
3696
+ },
3697
+ {
3698
+ name: "encoding",
3699
+ value: "UTF-8"
3700
+ },
3701
+ {
3702
+ name: "standalone",
3703
+ value: "yes"
3704
+ }
3705
+ ]
3706
+ };
3707
+ }
3708
+ function buildPageLayout() {
3709
+ return el("style:page-layout", { "style:name": "PM1" }, [el("style:page-layout-properties", {
3710
+ "fo:page-width": `${PAGE_SIZE_A4.widthPt}pt`,
3711
+ "fo:page-height": `${PAGE_SIZE_A4.heightPt}pt`
3712
+ })]);
3713
+ }
3714
+ function buildStylesXml() {
3715
+ return el("office:document-styles", {
3716
+ ...xmlnsAttributes([...STYLES_NS_PREFIXES]),
3717
+ "office:version": ODF_VERSION
3718
+ }, [
3719
+ el("office:styles"),
3720
+ el("office:automatic-styles", {}, [buildPageLayout()]),
3721
+ el("office:master-styles", {}, [el("style:master-page", {
3722
+ "style:name": MASTER_PAGE_NAME,
3723
+ "style:page-layout-name": "PM1"
3724
+ })])
3725
+ ]);
3726
+ }
3727
+ function buildContentXml() {
3728
+ return el("office:document-content", {
3729
+ ...xmlnsAttributes([...CONTENT_NS_PREFIXES]),
3730
+ "office:version": ODF_VERSION
3731
+ }, [el("office:automatic-styles"), el("office:body", {}, [el("office:drawing")])]);
3732
+ }
3733
+ function buildMetaXml() {
3734
+ return el("office:document-meta", {
3735
+ ...xmlnsAttributes([...META_NS_PREFIXES]),
3736
+ "office:version": ODF_VERSION
3737
+ }, [el("office:meta")]);
3738
+ }
3739
+ function createEmptyOdgPackage() {
3740
+ const pkg = { parts: {
3741
+ "content.xml": {
3742
+ kind: "xml",
3743
+ nodes: [declaration(), buildContentXml()]
3744
+ },
3745
+ "styles.xml": {
3746
+ kind: "xml",
3747
+ nodes: [declaration(), buildStylesXml()]
3748
+ },
3749
+ "meta.xml": {
3750
+ kind: "xml",
3751
+ nodes: [declaration(), buildMetaXml()]
3752
+ }
3753
+ } };
3754
+ setDocumentMediaType(pkg, ODF_MEDIA_TYPES.odg);
3755
+ syncManifest(pkg);
3756
+ return pkg;
3757
+ }
3758
+ //#endregion
3759
+ //#region src/edit/odg/style.ts
3760
+ const GRAPHIC_STYLE_PREFIX = "gr";
3761
+ function graphicPropertyAttrs(init) {
3762
+ const attrs = {};
3763
+ if (init.fill === void 0) attrs["draw:fill"] = "none";
3764
+ else attrs["draw:fill-color"] = formatOdfColor(init.fill);
3765
+ if (init.stroke === void 0) attrs["draw:stroke"] = "none";
3766
+ else {
3767
+ attrs["svg:stroke-color"] = formatOdfColor(init.stroke.color);
3768
+ attrs["svg:stroke-width"] = formatOdfLength(init.stroke.widthPt);
3769
+ }
3770
+ return attrs;
3771
+ }
3772
+ function buildGraphicStyle(pkg, init) {
3773
+ const automaticStyles = ensureAutomaticStyles(pkg);
3774
+ const name = nextStyleName(automaticStyles, "style:style", GRAPHIC_STYLE_PREFIX);
3775
+ automaticStyles.children.push(el("style:style", {
3776
+ "style:name": name,
3777
+ "style:family": "graphic"
3778
+ }, [el("style:graphic-properties", graphicPropertyAttrs(init))]));
3779
+ return name;
3780
+ }
3781
+ function findAutomaticStylesReadOnly(pkg) {
3782
+ const part = pkg.parts["content.xml"];
3783
+ const root = part?.kind === "xml" ? part.nodes.find((n) => n.type === "element") : void 0;
3784
+ if (root === void 0) return;
3785
+ for (const child of root.children) if (child.type === "element" && child.tag === "office:automatic-styles") return child;
3786
+ }
3787
+ function findGraphicStyle(pkg, element) {
3788
+ const styleName = attr$1(element, "draw:style-name");
3789
+ if (styleName === void 0) return;
3790
+ return findAutomaticStylesReadOnly(pkg)?.children.find((c) => c.type === "element" && c.tag === "style:style" && attr$1(c, "style:name") === styleName);
3791
+ }
3792
+ function graphicProperties(pkg, element) {
3793
+ return findGraphicStyle(pkg, element)?.children.find((c) => c.type === "element" && c.tag === "style:graphic-properties");
3794
+ }
3795
+ function readGraphicFill(pkg, element) {
3796
+ const props = graphicProperties(pkg, element);
3797
+ if (props === void 0 || attr$1(props, "draw:fill") === "none") return;
3798
+ const value = attr$1(props, "draw:fill-color");
3799
+ return value === void 0 ? void 0 : parseOdfColor(value);
3800
+ }
3801
+ function readGraphicStroke(pkg, element) {
3802
+ const props = graphicProperties(pkg, element);
3803
+ if (props === void 0 || attr$1(props, "draw:stroke") === "none") return;
3804
+ const colorValue = attr$1(props, "svg:stroke-color");
3805
+ const widthValue = attr$1(props, "svg:stroke-width");
3806
+ const color = colorValue === void 0 ? void 0 : parseOdfColor(colorValue);
3807
+ const widthPt = widthValue === void 0 ? void 0 : parseOdfLength(widthValue);
3808
+ return color === void 0 || widthPt === void 0 ? void 0 : {
3809
+ color,
3810
+ widthPt
3811
+ };
3812
+ }
3813
+ function setGraphicFill(pkg, element, fill) {
3814
+ setAttr(element, "draw:style-name", buildGraphicStyle(pkg, {
3815
+ fill,
3816
+ stroke: readGraphicStroke(pkg, element)
3817
+ }));
3818
+ }
3819
+ function setGraphicStroke(pkg, element, stroke) {
3820
+ setAttr(element, "draw:style-name", buildGraphicStyle(pkg, {
3821
+ fill: readGraphicFill(pkg, element),
3822
+ stroke
3823
+ }));
3824
+ }
3825
+ //#endregion
3826
+ //#region src/edit/odg/svg-path.ts
3827
+ const PATH_NUMBER_DECIMALS = 6;
3828
+ const PATH_NUMBER_SCALE = 10 ** PATH_NUMBER_DECIMALS;
3829
+ function formatPathNumber(value) {
3830
+ if (!Number.isFinite(value)) throw new Error(`cannot format a non-finite path coordinate: ${value}`);
3831
+ const rounded = Math.round(value * PATH_NUMBER_SCALE) / PATH_NUMBER_SCALE;
3832
+ if (rounded === 0) return "0";
3833
+ return rounded.toFixed(PATH_NUMBER_DECIMALS).replace(/0+$/, "").replace(/\.$/, "");
3834
+ }
3835
+ function formatPathPoint(point) {
3836
+ return `${formatPathNumber(point.xPt)} ${formatPathNumber(point.yPt)}`;
3837
+ }
3838
+ function buildSvgPathData(subpaths) {
3839
+ const commands = [];
3840
+ for (const subpath of subpaths) {
3841
+ commands.push(`M${formatPathPoint(subpath.start)}`);
3842
+ for (const segment of subpath.segments) if (segment.kind === "line") commands.push(`L${formatPathPoint(segment.to)}`);
3843
+ else commands.push(`C${formatPathPoint(segment.control1)} ${formatPathPoint(segment.control2)} ${formatPathPoint(segment.to)}`);
3844
+ if (subpath.closed) commands.push("Z");
3845
+ }
3846
+ return commands.join(" ");
3847
+ }
3848
+ function buildSvgViewBox(widthPt, heightPt) {
3849
+ return `0 0 ${formatPathNumber(widthPt)} ${formatPathNumber(heightPt)}`;
3850
+ }
3851
+ //#endregion
3852
+ //#region src/edit/odg/vector.ts
3853
+ function directTextP() {
3854
+ return el("text:p");
3855
+ }
3856
+ function buildBoxVectorElement(pkg, tag, init) {
3857
+ return el(tag, {
3858
+ "draw:style-name": buildGraphicStyle(pkg, {
3859
+ fill: init.fill,
3860
+ stroke: init.stroke
3861
+ }),
3862
+ "svg:x": formatOdfLength(init.frame.xPt),
3863
+ "svg:y": formatOdfLength(init.frame.yPt),
3864
+ "svg:width": formatOdfLength(init.frame.widthPt),
3865
+ "svg:height": formatOdfLength(init.frame.heightPt)
3866
+ }, [directTextP()]);
3867
+ }
3868
+ function buildRectElement(pkg, init) {
3869
+ return buildBoxVectorElement(pkg, "draw:rect", init);
3870
+ }
3871
+ function buildEllipseElement(pkg, init) {
3872
+ return buildBoxVectorElement(pkg, "draw:ellipse", init);
3873
+ }
3874
+ var OdgBoxVector = class {
3875
+ container;
3876
+ node;
3877
+ pkg;
3878
+ removed = false;
3879
+ constructor(container, node, pkg) {
3880
+ this.container = container;
3881
+ this.node = node;
3882
+ this.pkg = pkg;
3883
+ }
3884
+ live() {
3885
+ if (this.removed) throw new Error("this OdgBoxVector has been removed from its page and can no longer be used");
3886
+ return this.node;
3887
+ }
3888
+ get kind() {
3889
+ return this.live().tag === "draw:ellipse" ? "ellipse" : "rect";
3890
+ }
3891
+ get name() {
3892
+ return attr$1(this.live(), "draw:name");
3893
+ }
3894
+ get frame() {
3895
+ return parseBox(this.live());
3896
+ }
3897
+ set frame(value) {
3898
+ const node = this.live();
3899
+ setAttr(node, "svg:x", formatOdfLength(value.xPt));
3900
+ setAttr(node, "svg:y", formatOdfLength(value.yPt));
3901
+ setAttr(node, "svg:width", formatOdfLength(value.widthPt));
3902
+ setAttr(node, "svg:height", formatOdfLength(value.heightPt));
3903
+ }
3904
+ get fill() {
3905
+ return readGraphicFill(this.pkg, this.live());
3906
+ }
3907
+ set fill(value) {
3908
+ setGraphicFill(this.pkg, this.live(), value);
3909
+ }
3910
+ get stroke() {
3911
+ return readGraphicStroke(this.pkg, this.live());
3912
+ }
3913
+ set stroke(value) {
3914
+ setGraphicStroke(this.pkg, this.live(), value);
3915
+ }
3916
+ remove() {
3917
+ removeChild(this.container, this.live());
3918
+ this.removed = true;
3919
+ }
3920
+ };
3921
+ function buildLineElement(pkg, init) {
3922
+ return el("draw:line", {
3923
+ "draw:style-name": buildGraphicStyle(pkg, { stroke: init.stroke }),
3924
+ "svg:x1": formatOdfLength(init.from.xPt),
3925
+ "svg:y1": formatOdfLength(init.from.yPt),
3926
+ "svg:x2": formatOdfLength(init.to.xPt),
3927
+ "svg:y2": formatOdfLength(init.to.yPt)
3928
+ }, [directTextP()]);
3929
+ }
3930
+ var OdgLineVector = class {
3931
+ container;
3932
+ node;
3933
+ pkg;
3934
+ removed = false;
3935
+ constructor(container, node, pkg) {
3936
+ this.container = container;
3937
+ this.node = node;
3938
+ this.pkg = pkg;
3939
+ }
3940
+ live() {
3941
+ if (this.removed) throw new Error("this OdgLineVector has been removed from its page and can no longer be used");
3942
+ return this.node;
3943
+ }
3944
+ get name() {
3945
+ return attr$1(this.live(), "draw:name");
3946
+ }
3947
+ get from() {
3948
+ return parseLinePoints(this.live())?.from;
3949
+ }
3950
+ set from(value) {
3951
+ const node = this.live();
3952
+ setAttr(node, "svg:x1", formatOdfLength(value.xPt));
3953
+ setAttr(node, "svg:y1", formatOdfLength(value.yPt));
3954
+ }
3955
+ get to() {
3956
+ return parseLinePoints(this.live())?.to;
3957
+ }
3958
+ set to(value) {
3959
+ const node = this.live();
3960
+ setAttr(node, "svg:x2", formatOdfLength(value.xPt));
3961
+ setAttr(node, "svg:y2", formatOdfLength(value.yPt));
3962
+ }
3963
+ get stroke() {
3964
+ return readGraphicStroke(this.pkg, this.live());
3965
+ }
3966
+ set stroke(value) {
3967
+ setGraphicStroke(this.pkg, this.live(), value);
3968
+ }
3969
+ remove() {
3970
+ removeChild(this.container, this.live());
3971
+ this.removed = true;
3972
+ }
3973
+ };
3974
+ function buildPathElement(pkg, init) {
3975
+ return el("draw:path", {
3976
+ "draw:style-name": buildGraphicStyle(pkg, {
3977
+ fill: init.fill,
3978
+ stroke: init.stroke
3979
+ }),
3980
+ "svg:x": formatOdfLength(init.frame.xPt),
3981
+ "svg:y": formatOdfLength(init.frame.yPt),
3982
+ "svg:width": formatOdfLength(init.frame.widthPt),
3983
+ "svg:height": formatOdfLength(init.frame.heightPt),
3984
+ "svg:viewBox": buildSvgViewBox(init.frame.widthPt, init.frame.heightPt),
3985
+ "svg:d": buildSvgPathData(init.subpaths)
3986
+ }, [directTextP()]);
3987
+ }
3988
+ var OdgPathVector = class {
3989
+ container;
3990
+ node;
3991
+ pkg;
3992
+ removed = false;
3993
+ constructor(container, node, pkg) {
3994
+ this.container = container;
3995
+ this.node = node;
3996
+ this.pkg = pkg;
3997
+ }
3998
+ live() {
3999
+ if (this.removed) throw new Error("this OdgPathVector has been removed from its page and can no longer be used");
4000
+ return this.node;
4001
+ }
4002
+ get name() {
4003
+ return attr$1(this.live(), "draw:name");
4004
+ }
4005
+ get frame() {
4006
+ return parseBox(this.live());
4007
+ }
4008
+ set frame(value) {
4009
+ const node = this.live();
4010
+ setAttr(node, "svg:x", formatOdfLength(value.xPt));
4011
+ setAttr(node, "svg:y", formatOdfLength(value.yPt));
4012
+ setAttr(node, "svg:width", formatOdfLength(value.widthPt));
4013
+ setAttr(node, "svg:height", formatOdfLength(value.heightPt));
4014
+ }
4015
+ get fill() {
4016
+ return readGraphicFill(this.pkg, this.live());
4017
+ }
4018
+ set fill(value) {
4019
+ setGraphicFill(this.pkg, this.live(), value);
4020
+ }
4021
+ get stroke() {
4022
+ return readGraphicStroke(this.pkg, this.live());
4023
+ }
4024
+ set stroke(value) {
4025
+ setGraphicStroke(this.pkg, this.live(), value);
4026
+ }
4027
+ get subpaths() {
4028
+ const node = this.live();
4029
+ const viewBoxValue = attr$1(node, "svg:viewBox");
4030
+ const dValue = attr$1(node, "svg:d");
4031
+ const frame = parseBox(node);
4032
+ if (viewBoxValue === void 0 || dValue === void 0 || frame === void 0) return [];
4033
+ const viewBox = parseOdfViewBox(viewBoxValue);
4034
+ if (viewBox === void 0) return [];
4035
+ return buildOdfSubpaths(parseOdfPathData(dValue), viewBox, frame);
3499
4036
  }
3500
- setStyledRuns(runs) {
3501
- const textParagraph = el("text:p");
3502
- this.node.children = [textParagraph];
3503
- populateParagraph(new OdtParagraph(this.node.children, textParagraph, this.pkg), {
3504
- kind: "paragraph",
3505
- runs: [...runs]
3506
- });
4037
+ remove() {
4038
+ removeChild(this.container, this.live());
4039
+ this.removed = true;
3507
4040
  }
3508
4041
  };
3509
4042
  //#endregion
3510
- //#region src/edit/ods/sheet.ts
3511
- const NAME_ATTR = "table:name";
3512
- var OdsSheet = class {
4043
+ //#region src/edit/odg/page.ts
4044
+ var OdgPage = class {
3513
4045
  container;
3514
4046
  node;
3515
- pkg;
4047
+ context;
3516
4048
  removed = false;
3517
- constructor(container, node, pkg) {
4049
+ constructor(container, node, context) {
3518
4050
  this.container = container;
3519
4051
  this.node = node;
3520
- this.pkg = pkg;
4052
+ this.context = context;
3521
4053
  }
3522
4054
  live() {
3523
- if (this.removed) throw new Error("this OdsSheet has been removed from the spreadsheet and can no longer be used");
4055
+ if (this.removed) throw new Error("this OdgPage has been removed from the drawing and can no longer be used");
3524
4056
  return this.node;
3525
4057
  }
3526
- get name() {
3527
- const value = attr$1(this.live(), NAME_ATTR);
3528
- if (value === void 0) throw new Error("this table:table element has no table:name attribute");
3529
- return value;
4058
+ shapes() {
4059
+ const node = this.live();
4060
+ const out = [];
4061
+ for (const child of node.children) if (child.type === "element" && child.tag === "draw:frame") out.push(new OdpShape(node.children, child, this.context.pkg));
4062
+ return out;
3530
4063
  }
3531
- set name(value) {
3532
- setAttr(this.live(), NAME_ATTR, value);
4064
+ addTextBox(init) {
4065
+ const node = this.live();
4066
+ const frameElement = buildTextBoxFrame(this.context.pkg, init.frame, init.text);
4067
+ node.children.push(frameElement);
4068
+ return new OdpShape(node.children, frameElement, this.context.pkg);
3533
4069
  }
3534
- cell(row, column) {
3535
- const node = resolveCellNode(this.live(), row, column);
3536
- 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`);
3537
- return new OdsCell(node, this.pkg);
4070
+ addImage(init) {
4071
+ const node = this.live();
4072
+ const frameElement = insertImageFrameMedia({ pkg: this.context.pkg }, init.frame, init);
4073
+ node.children.push(frameElement);
4074
+ return new OdpShape(node.children, frameElement, this.context.pkg);
3538
4075
  }
3539
- cellAt(reference) {
3540
- const parsed = parseCellReference(reference);
3541
- if (parsed === void 0) throw new Error(`cellAt: "${reference}" is not a valid A1-style cell reference`);
3542
- return this.cell(parsed.row, parsed.column);
4076
+ addRect(init) {
4077
+ const node = this.live();
4078
+ const element = buildRectElement(this.context.pkg, init);
4079
+ node.children.push(element);
4080
+ return new OdgBoxVector(node.children, element, this.context.pkg);
3543
4081
  }
3544
- mergeCells(startRow, startColumn, rowSpan, colSpan) {
3545
- if (!Number.isInteger(rowSpan) || rowSpan < 1 || !Number.isInteger(colSpan) || colSpan < 1) throw new Error(`mergeCells: rowSpan and colSpan must be positive integers, got rowSpan=${rowSpan}, colSpan=${colSpan}`);
3546
- const tableElement = this.live();
3547
- const anchorNode = resolveCellNode(tableElement, startRow, startColumn);
3548
- if (anchorNode.tag === "table:covered-table-cell") throw new Error(`mergeCells: (${startRow}, ${startColumn}) is already covered by another merged range`);
3549
- if (rowSpan > 1) setAttr(anchorNode, "table:number-rows-spanned", String(rowSpan));
3550
- if (colSpan > 1) setAttr(anchorNode, "table:number-columns-spanned", String(colSpan));
3551
- for (let rowOffset = 0; rowOffset < rowSpan; rowOffset++) for (let columnOffset = 0; columnOffset < colSpan; columnOffset++) {
3552
- if (rowOffset === 0 && columnOffset === 0) continue;
3553
- const coveredNode = resolveCellNode(tableElement, startRow + rowOffset, startColumn + columnOffset);
3554
- coveredNode.tag = COVERED_CELL_TAG;
3555
- coveredNode.attributes = [];
3556
- coveredNode.children = [];
3557
- }
3558
- return new OdsCell(anchorNode, this.pkg);
4082
+ addEllipse(init) {
4083
+ const node = this.live();
4084
+ const element = buildEllipseElement(this.context.pkg, init);
4085
+ node.children.push(element);
4086
+ return new OdgBoxVector(node.children, element, this.context.pkg);
4087
+ }
4088
+ addLine(init) {
4089
+ const node = this.live();
4090
+ const element = buildLineElement(this.context.pkg, init);
4091
+ node.children.push(element);
4092
+ return new OdgLineVector(node.children, element, this.context.pkg);
4093
+ }
4094
+ addPath(init) {
4095
+ const node = this.live();
4096
+ const element = buildPathElement(this.context.pkg, init);
4097
+ node.children.push(element);
4098
+ return new OdgPathVector(node.children, element, this.context.pkg);
3559
4099
  }
3560
4100
  remove() {
3561
4101
  removeChild(this.container, this.live());
@@ -3563,64 +4103,78 @@ var OdsSheet = class {
3563
4103
  }
3564
4104
  };
3565
4105
  //#endregion
3566
- //#region src/edit/ods/editor.ts
4106
+ //#region src/edit/odg/editor.ts
3567
4107
  const CONTENT_PART_PATH = "content.xml";
4108
+ const STYLES_PART_PATH = "styles.xml";
3568
4109
  function directChild(parent, tag) {
3569
4110
  for (const child of parent.children) if (child.type === "element" && child.tag === tag) return child;
3570
4111
  }
3571
- function findRoot(pkg) {
3572
- const part = pkg.parts[CONTENT_PART_PATH];
4112
+ function findRoot(pkg, partPath) {
4113
+ const part = pkg.parts[partPath];
3573
4114
  const root = part?.kind === "xml" ? part.nodes.find((n) => n.type === "element") : void 0;
3574
- if (root === void 0) throw new Error(`package has no root element at ${CONTENT_PART_PATH}`);
4115
+ if (root === void 0) throw new Error(`package has no root element at ${partPath}`);
3575
4116
  return root;
3576
4117
  }
3577
- function findOfficeSpreadsheet(pkg) {
3578
- const body = directChild(findRoot(pkg), "office:body");
3579
- const spreadsheet = body === void 0 ? void 0 : directChild(body, "office:spreadsheet");
3580
- if (spreadsheet === void 0) throw new Error(`${CONTENT_PART_PATH} has no office:body/office:spreadsheet element`);
3581
- return spreadsheet;
4118
+ function findOfficeDrawing(pkg) {
4119
+ const body = directChild(findRoot(pkg, CONTENT_PART_PATH), "office:body");
4120
+ const drawing = body === void 0 ? void 0 : directChild(body, "office:drawing");
4121
+ if (drawing === void 0) throw new Error(`${CONTENT_PART_PATH} has no office:body/office:drawing element`);
4122
+ return drawing;
3582
4123
  }
3583
- function ensureSheetTableStyleName(pkg) {
3584
- const automaticStyles = ensureAutomaticStyles(pkg);
3585
- if (automaticStyles.children.find((child) => child.type === "element" && child.tag === "style:style" && attr$1(child, "style:name") === "OdsTable") !== void 0) return SHEET_TABLE_STYLE_NAME;
3586
- automaticStyles.children.push(el("style:style", {
3587
- "style:name": SHEET_TABLE_STYLE_NAME,
3588
- "style:family": "table",
3589
- "style:master-page-name": MASTER_PAGE_NAME
3590
- }));
3591
- return SHEET_TABLE_STYLE_NAME;
4124
+ function findPageLayoutProperties(pkg) {
4125
+ const pageLayout = directChild(findRoot(pkg, STYLES_PART_PATH), "office:automatic-styles")?.children.find((c) => c.type === "element" && c.tag === "style:page-layout" && attr$1(c, "style:name") === "PM1");
4126
+ const properties = pageLayout === void 0 ? void 0 : directChild(pageLayout, "style:page-layout-properties");
4127
+ if (properties === void 0) throw new Error(`${STYLES_PART_PATH} has no style:page-layout[style:name="PM1"]/style:page-layout-properties element`);
4128
+ return properties;
3592
4129
  }
3593
- var OdsEditor = class {
4130
+ var OdgEditor = class {
3594
4131
  pkg;
3595
4132
  constructor(pkg) {
3596
4133
  this.pkg = pkg;
3597
4134
  }
3598
- sheets() {
3599
- const spreadsheet = findOfficeSpreadsheet(this.pkg);
4135
+ pages() {
4136
+ const drawing = findOfficeDrawing(this.pkg);
3600
4137
  const out = [];
3601
- for (const child of spreadsheet.children) if (child.type === "element" && child.tag === "table:table") out.push(new OdsSheet(spreadsheet.children, child, this.pkg));
4138
+ for (const child of drawing.children) if (child.type === "element" && child.tag === "draw:page") {
4139
+ const context = { pkg: this.pkg };
4140
+ out.push(new OdgPage(drawing.children, child, context));
4141
+ }
3602
4142
  return out;
3603
4143
  }
3604
- sheet(name) {
3605
- const found = this.sheets().find((candidate) => candidate.name === name);
3606
- if (found === void 0) throw new Error(`no sheet named "${name}" exists in this spreadsheet`);
3607
- return found;
4144
+ addPage() {
4145
+ const drawing = findOfficeDrawing(this.pkg);
4146
+ const pageElement = el("draw:page", { "draw:master-page-name": MASTER_PAGE_NAME });
4147
+ drawing.children.push(pageElement);
4148
+ const context = { pkg: this.pkg };
4149
+ return new OdgPage(drawing.children, pageElement, context);
3608
4150
  }
3609
- addSheet(name) {
3610
- const spreadsheet = findOfficeSpreadsheet(this.pkg);
3611
- const tableElement = el("table:table", {
3612
- "table:name": name,
3613
- "table:style-name": ensureSheetTableStyleName(this.pkg)
3614
- });
3615
- spreadsheet.children.push(tableElement);
3616
- return new OdsSheet(spreadsheet.children, tableElement, this.pkg);
4151
+ removePageAt(index) {
4152
+ const drawing = findOfficeDrawing(this.pkg);
4153
+ const target = drawing.children.filter((c) => c.type === "element" && c.tag === "draw:page")[index];
4154
+ if (target === void 0) throw new Error(`page index ${index} does not exist`);
4155
+ const listIndex = drawing.children.indexOf(target);
4156
+ drawing.children.splice(listIndex, 1);
3617
4157
  }
3618
- removeSheetAt(index) {
3619
- const spreadsheet = findOfficeSpreadsheet(this.pkg);
3620
- const target = spreadsheet.children.filter((child) => child.type === "element" && child.tag === "table:table")[index];
3621
- if (target === void 0) throw new Error(`sheet index ${index} does not exist`);
3622
- const listIndex = spreadsheet.children.indexOf(target);
3623
- spreadsheet.children.splice(listIndex, 1);
4158
+ get pageSize() {
4159
+ const properties = findPageLayoutProperties(this.pkg);
4160
+ const widthValue = attr$1(properties, "fo:page-width");
4161
+ const heightValue = attr$1(properties, "fo:page-height");
4162
+ const widthPt = widthValue === void 0 ? void 0 : parseOdfLength(widthValue);
4163
+ const heightPt = heightValue === void 0 ? void 0 : parseOdfLength(heightValue);
4164
+ return {
4165
+ widthPt: widthPt ?? 0,
4166
+ heightPt: heightPt ?? 0
4167
+ };
4168
+ }
4169
+ set pageSize(size) {
4170
+ const properties = findPageLayoutProperties(this.pkg);
4171
+ properties.attributes = [{
4172
+ name: "fo:page-width",
4173
+ value: formatOdfLength(size.widthPt)
4174
+ }, {
4175
+ name: "fo:page-height",
4176
+ value: formatOdfLength(size.heightPt)
4177
+ }];
3624
4178
  }
3625
4179
  toPackage() {
3626
4180
  return this.pkg;
@@ -3629,33 +4183,71 @@ var OdsEditor = class {
3629
4183
  return encodePackage$2(this.pkg);
3630
4184
  }
3631
4185
  };
3632
- function openOds(bytes) {
3633
- return new OdsEditor(decodePackage$2(bytes));
4186
+ function openOdg(bytes) {
4187
+ return new OdgEditor(decodePackage$2(bytes));
3634
4188
  }
3635
- function createOds() {
3636
- return new OdsEditor(createEmptyOdsPackage());
4189
+ function createOdg() {
4190
+ return new OdgEditor(createEmptyOdgPackage());
3637
4191
  }
3638
4192
  //#endregion
3639
- //#region src/edit/ods/content.ts
3640
- function buildOdsPackage(content) {
3641
- if (content.kind !== "spreadsheet") throw new Error("buildOdsPackage requires a spreadsheet ContentDocument");
3642
- const editor = createOds();
3643
- if (content.sheets.length > 0) editor.removeSheetAt(0);
3644
- for (const sheet of content.sheets) {
3645
- const odsSheet = editor.addSheet(sheet.name);
3646
- for (const cell of sheet.cells) appendCell(odsSheet, cell);
4193
+ //#region src/edit/odg/content.ts
4194
+ function buildOdgPackage(content) {
4195
+ if (content.kind !== "drawing") throw new Error("buildOdgPackage requires a drawing ContentDocument");
4196
+ const editor = createOdg();
4197
+ const firstPage = content.pages[0];
4198
+ if (firstPage !== void 0) editor.pageSize = firstPage.size;
4199
+ for (const page of content.pages) {
4200
+ const odgPage = editor.addPage();
4201
+ for (const vector of page.vectors) appendVector(odgPage, vector);
4202
+ for (const shape of page.shapes) appendShape(odgPage, shape);
3647
4203
  }
3648
4204
  return editor.toPackage();
3649
4205
  }
3650
- function appendCell(odsSheet, cell) {
3651
- const odsCell = odsSheet.cell(cell.row, cell.column);
3652
- odsCell.value = cell.value;
3653
- if (cell.formula !== void 0) odsCell.formula = cell.formula;
3654
- if (cell.runs !== void 0 && cell.runs.length > 0) odsCell.setStyledRuns(cell.runs);
3655
- else odsCell.displayText = cell.displayText;
3656
- const rowSpan = cell.rowSpan ?? 1;
3657
- const colSpan = cell.colSpan ?? 1;
3658
- if (rowSpan > 1 || colSpan > 1) odsSheet.mergeCells(cell.row, cell.column, rowSpan, colSpan);
4206
+ function appendVector(page, vector) {
4207
+ if (vector.kind === "rect") page.addRect({
4208
+ frame: vector.frame,
4209
+ fill: vector.fill,
4210
+ stroke: vector.stroke
4211
+ });
4212
+ else if (vector.kind === "ellipse") page.addEllipse({
4213
+ frame: vector.frame,
4214
+ fill: vector.fill,
4215
+ stroke: vector.stroke
4216
+ });
4217
+ else if (vector.kind === "line") page.addLine({
4218
+ from: vector.from,
4219
+ to: vector.to,
4220
+ stroke: vector.stroke
4221
+ });
4222
+ else page.addPath({
4223
+ frame: vector.frame,
4224
+ subpaths: vector.subpaths,
4225
+ fill: vector.fill,
4226
+ stroke: vector.stroke
4227
+ });
4228
+ }
4229
+ function appendShape(page, shape) {
4230
+ const [onlyBlock] = shape.blocks;
4231
+ if (shape.blocks.length === 1 && onlyBlock?.kind === "image") {
4232
+ const imageShape = page.addImage({
4233
+ frame: shape.frame,
4234
+ format: onlyBlock.format,
4235
+ bytes: base64ToBytes$2(onlyBlock.base64),
4236
+ altText: onlyBlock.altText
4237
+ });
4238
+ if (shape.rotationDeg !== void 0) imageShape.rotationDeg = shape.rotationDeg;
4239
+ return;
4240
+ }
4241
+ const textShape = page.addTextBox({
4242
+ frame: shape.frame,
4243
+ text: ""
4244
+ });
4245
+ if (shape.rotationDeg !== void 0) textShape.rotationDeg = shape.rotationDeg;
4246
+ textShape.paragraphs()[0]?.remove();
4247
+ for (const block of shape.blocks) {
4248
+ if (block.kind !== "paragraph") continue;
4249
+ populateParagraph(textShape.appendParagraph(), block);
4250
+ }
3659
4251
  }
3660
4252
  //#endregion
3661
4253
  //#region src/bytes/crc32.ts
@@ -6951,6 +7543,7 @@ function readInlineImage(reader, sink) {
6951
7543
  //#region src/pdf/interpret.ts
6952
7544
  const MAX_FORM_XOBJECT_DEPTH = 12;
6953
7545
  const FALLBACK_GLYPH_WIDTH_PER_1000 = 500;
7546
+ const DEFAULT_LINE_WIDTH_PT = 1;
6954
7547
  function defaultTextState() {
6955
7548
  return {
6956
7549
  tm: IDENTITY_MATRIX,
@@ -7043,16 +7636,118 @@ function interpretContentStream(bytes, resources, context) {
7043
7636
  runContentStream(bytes, resources, {
7044
7637
  ctm: IDENTITY_MATRIX,
7045
7638
  fillColor: COLOR_BLACK,
7046
- strokeColor: COLOR_BLACK
7639
+ strokeColor: COLOR_BLACK,
7640
+ lineWidth: DEFAULT_LINE_WIDTH_PT
7047
7641
  }, context, items, 0);
7048
7642
  return items;
7049
7643
  }
7644
+ function lastPointOf(subpath) {
7645
+ const last = subpath.segments[subpath.segments.length - 1];
7646
+ return last === void 0 ? {
7647
+ x: subpath.startXPt,
7648
+ y: subpath.startYPt
7649
+ } : {
7650
+ x: last.xPt,
7651
+ y: last.yPt
7652
+ };
7653
+ }
7050
7654
  function runContentStream(bytes, resources, initialState, context, items, depth) {
7051
7655
  const operations = readContentStream(bytes, context.sink);
7052
7656
  const gsStack = [];
7053
7657
  let gs = initialState;
7054
7658
  let ts = defaultTextState();
7055
7659
  let pendingRect;
7660
+ let pathSubpaths = [];
7661
+ let currentSubpath;
7662
+ const finalizeCurrentSubpath = () => {
7663
+ if (currentSubpath !== void 0) {
7664
+ pathSubpaths.push(currentSubpath);
7665
+ currentSubpath = void 0;
7666
+ }
7667
+ };
7668
+ const resetPath = () => {
7669
+ pendingRect = void 0;
7670
+ pathSubpaths = [];
7671
+ currentSubpath = void 0;
7672
+ };
7673
+ const appendRectSubpath = (operands, ctm) => {
7674
+ finalizeCurrentSubpath();
7675
+ const x = numAt(operands, 0);
7676
+ const y = numAt(operands, 1);
7677
+ const w = numAt(operands, 2);
7678
+ const h = numAt(operands, 3);
7679
+ const p1 = applyMatrix(ctm, {
7680
+ x,
7681
+ y
7682
+ });
7683
+ const p2 = applyMatrix(ctm, {
7684
+ x: x + w,
7685
+ y
7686
+ });
7687
+ const p3 = applyMatrix(ctm, {
7688
+ x: x + w,
7689
+ y: y + h
7690
+ });
7691
+ const p4 = applyMatrix(ctm, {
7692
+ x,
7693
+ y: y + h
7694
+ });
7695
+ pathSubpaths.push({
7696
+ startXPt: p1.x,
7697
+ startYPt: p1.y,
7698
+ segments: [
7699
+ {
7700
+ kind: "line",
7701
+ xPt: p2.x,
7702
+ yPt: p2.y
7703
+ },
7704
+ {
7705
+ kind: "line",
7706
+ xPt: p3.x,
7707
+ yPt: p3.y
7708
+ },
7709
+ {
7710
+ kind: "line",
7711
+ xPt: p4.x,
7712
+ yPt: p4.y
7713
+ }
7714
+ ],
7715
+ closed: true
7716
+ });
7717
+ };
7718
+ const paintFillRuleFor = (operator) => operator.endsWith("*") ? "evenodd" : "nonzero";
7719
+ const emitPaint = (operator) => {
7720
+ if (operator === "n") {
7721
+ resetPath();
7722
+ return;
7723
+ }
7724
+ if ((operator === "s" || operator === "b" || operator === "b*") && currentSubpath !== void 0) currentSubpath.closed = true;
7725
+ if ((operator === "f" || operator === "F" || operator === "f*") && currentSubpath === void 0 && pathSubpaths.length === 1 && pendingRect !== void 0) {
7726
+ items.push({
7727
+ kind: "rect",
7728
+ ...pendingRect,
7729
+ color: gs.fillColor
7730
+ });
7731
+ resetPath();
7732
+ return;
7733
+ }
7734
+ finalizeCurrentSubpath();
7735
+ if (pathSubpaths.length > 0) {
7736
+ const isFillOp = operator === "f" || operator === "F" || operator === "f*" || operator === "B" || operator === "B*" || operator === "b" || operator === "b*";
7737
+ const isStrokeOp = operator === "S" || operator === "s" || operator === "B" || operator === "B*" || operator === "b" || operator === "b*";
7738
+ items.push({
7739
+ kind: "path",
7740
+ subpaths: pathSubpaths,
7741
+ fillRule: paintFillRuleFor(operator),
7742
+ fill: isFillOp ? gs.fillColor : void 0,
7743
+ stroke: isStrokeOp ? {
7744
+ color: gs.strokeColor,
7745
+ widthPt: gs.lineWidth
7746
+ } : void 0
7747
+ });
7748
+ }
7749
+ resetPath();
7750
+ };
7056
7751
  const advanceThroughString = (codes) => {
7057
7752
  if (ts.fontResourceName === void 0) return;
7058
7753
  let offset = 0;
@@ -7236,25 +7931,118 @@ function runContentStream(bytes, resources, initialState, context, items, depth)
7236
7931
  }
7237
7932
  case "re":
7238
7933
  pendingRect = rectFromOperands(operands, gs.ctm);
7934
+ appendRectSubpath(operands, gs.ctm);
7935
+ break;
7936
+ case "m": {
7937
+ finalizeCurrentSubpath();
7938
+ const p = applyMatrix(gs.ctm, {
7939
+ x: numAt(operands, 0),
7940
+ y: numAt(operands, 1)
7941
+ });
7942
+ currentSubpath = {
7943
+ startXPt: p.x,
7944
+ startYPt: p.y,
7945
+ segments: [],
7946
+ closed: false
7947
+ };
7948
+ pendingRect = void 0;
7949
+ break;
7950
+ }
7951
+ case "l": {
7952
+ const p = applyMatrix(gs.ctm, {
7953
+ x: numAt(operands, 0),
7954
+ y: numAt(operands, 1)
7955
+ });
7956
+ currentSubpath?.segments.push({
7957
+ kind: "line",
7958
+ xPt: p.x,
7959
+ yPt: p.y
7960
+ });
7961
+ pendingRect = void 0;
7962
+ break;
7963
+ }
7964
+ case "c": {
7965
+ const c1 = applyMatrix(gs.ctm, {
7966
+ x: numAt(operands, 0),
7967
+ y: numAt(operands, 1)
7968
+ });
7969
+ const c2 = applyMatrix(gs.ctm, {
7970
+ x: numAt(operands, 2),
7971
+ y: numAt(operands, 3)
7972
+ });
7973
+ const p = applyMatrix(gs.ctm, {
7974
+ x: numAt(operands, 4),
7975
+ y: numAt(operands, 5)
7976
+ });
7977
+ currentSubpath?.segments.push({
7978
+ kind: "cubic",
7979
+ c1xPt: c1.x,
7980
+ c1yPt: c1.y,
7981
+ c2xPt: c2.x,
7982
+ c2yPt: c2.y,
7983
+ xPt: p.x,
7984
+ yPt: p.y
7985
+ });
7986
+ pendingRect = void 0;
7239
7987
  break;
7240
- case "m":
7241
- case "l":
7242
- case "c":
7988
+ }
7243
7989
  case "v":
7244
- case "y":
7990
+ if (currentSubpath !== void 0) {
7991
+ const cur = lastPointOf(currentSubpath);
7992
+ const c2 = applyMatrix(gs.ctm, {
7993
+ x: numAt(operands, 0),
7994
+ y: numAt(operands, 1)
7995
+ });
7996
+ const p = applyMatrix(gs.ctm, {
7997
+ x: numAt(operands, 2),
7998
+ y: numAt(operands, 3)
7999
+ });
8000
+ currentSubpath.segments.push({
8001
+ kind: "cubic",
8002
+ c1xPt: cur.x,
8003
+ c1yPt: cur.y,
8004
+ c2xPt: c2.x,
8005
+ c2yPt: c2.y,
8006
+ xPt: p.x,
8007
+ yPt: p.y
8008
+ });
8009
+ }
8010
+ pendingRect = void 0;
8011
+ break;
8012
+ case "y": {
8013
+ const c1 = applyMatrix(gs.ctm, {
8014
+ x: numAt(operands, 0),
8015
+ y: numAt(operands, 1)
8016
+ });
8017
+ const p = applyMatrix(gs.ctm, {
8018
+ x: numAt(operands, 2),
8019
+ y: numAt(operands, 3)
8020
+ });
8021
+ currentSubpath?.segments.push({
8022
+ kind: "cubic",
8023
+ c1xPt: c1.x,
8024
+ c1yPt: c1.y,
8025
+ c2xPt: p.x,
8026
+ c2yPt: p.y,
8027
+ xPt: p.x,
8028
+ yPt: p.y
8029
+ });
8030
+ pendingRect = void 0;
8031
+ break;
8032
+ }
7245
8033
  case "h":
8034
+ if (currentSubpath !== void 0) currentSubpath.closed = true;
7246
8035
  pendingRect = void 0;
7247
8036
  break;
8037
+ case "w":
8038
+ gs = {
8039
+ ...gs,
8040
+ lineWidth: numAt(operands, 0)
8041
+ };
8042
+ break;
7248
8043
  case "f":
7249
8044
  case "F":
7250
8045
  case "f*":
7251
- if (pendingRect !== void 0) items.push({
7252
- kind: "rect",
7253
- ...pendingRect,
7254
- color: gs.fillColor
7255
- });
7256
- pendingRect = void 0;
7257
- break;
7258
8046
  case "S":
7259
8047
  case "s":
7260
8048
  case "B":
@@ -7262,7 +8050,7 @@ function runContentStream(bytes, resources, initialState, context, items, depth)
7262
8050
  case "b":
7263
8051
  case "b*":
7264
8052
  case "n":
7265
- pendingRect = void 0;
8053
+ emitPaint(operator);
7266
8054
  break;
7267
8055
  case "BT":
7268
8056
  ts = defaultTextState();
@@ -8244,6 +9032,7 @@ function readPage(page, resolver, fontResolver, images, imageIdCache, sink) {
8244
9032
  function convertExtractedItem(item, pageMatrix, fontResolver, images, imageIdCache, resolver, sink) {
8245
9033
  if (item.kind === "text") return convertText(item, pageMatrix, fontResolver);
8246
9034
  if (item.kind === "rect") return convertRect(item, pageMatrix);
9035
+ if (item.kind === "path") return convertPath(item, pageMatrix);
8247
9036
  if (item.kind === "image") return convertImage(item, pageMatrix, images, imageIdCache, resolver, sink);
8248
9037
  return convertInlineImage(item, pageMatrix, images, resolver, sink);
8249
9038
  }
@@ -8291,6 +9080,61 @@ function convertRect(item, pageMatrix) {
8291
9080
  fill: item.color
8292
9081
  };
8293
9082
  }
9083
+ function transformSubpath(subpath, pageMatrix) {
9084
+ const start = applyMatrix(pageMatrix, {
9085
+ x: subpath.startXPt,
9086
+ y: subpath.startYPt
9087
+ });
9088
+ const segments = subpath.segments.map((segment) => {
9089
+ if (segment.kind === "line") {
9090
+ const p = applyMatrix(pageMatrix, {
9091
+ x: segment.xPt,
9092
+ y: segment.yPt
9093
+ });
9094
+ return {
9095
+ kind: "line",
9096
+ xPt: p.x,
9097
+ yPt: p.y
9098
+ };
9099
+ }
9100
+ const c1 = applyMatrix(pageMatrix, {
9101
+ x: segment.c1xPt,
9102
+ y: segment.c1yPt
9103
+ });
9104
+ const c2 = applyMatrix(pageMatrix, {
9105
+ x: segment.c2xPt,
9106
+ y: segment.c2yPt
9107
+ });
9108
+ const p = applyMatrix(pageMatrix, {
9109
+ x: segment.xPt,
9110
+ y: segment.yPt
9111
+ });
9112
+ return {
9113
+ kind: "cubic",
9114
+ c1xPt: c1.x,
9115
+ c1yPt: c1.y,
9116
+ c2xPt: c2.x,
9117
+ c2yPt: c2.y,
9118
+ xPt: p.x,
9119
+ yPt: p.y
9120
+ };
9121
+ });
9122
+ return {
9123
+ startXPt: start.x,
9124
+ startYPt: start.y,
9125
+ segments,
9126
+ closed: subpath.closed
9127
+ };
9128
+ }
9129
+ function convertPath(item, pageMatrix) {
9130
+ return {
9131
+ kind: "path",
9132
+ subpaths: item.subpaths.map((subpath) => transformSubpath(subpath, pageMatrix)),
9133
+ ...item.fill !== void 0 ? { fill: item.fill } : {},
9134
+ ...item.fill !== void 0 && item.fillRule === "evenodd" ? { fillRule: "evenodd" } : {},
9135
+ ...item.stroke !== void 0 ? { stroke: item.stroke } : {}
9136
+ };
9137
+ }
8294
9138
  function imagePlacementFrom(matrix) {
8295
9139
  const rotationDeg = matrixRotationDegrees(matrix);
8296
9140
  return {
@@ -10286,4 +11130,4 @@ function fixedClock(date) {
10286
11130
  return { now: () => date };
10287
11131
  }
10288
11132
  //#endregion
10289
- export { AttributeSchema, BinaryPartSchema, COLOR_BLACK, CONTENT_FORMAT_VERSION, CommentSchema, CompactPackageSchema, CompactPartSchema, CompactXmlNodeSchema, ContentBlockSchema, ContentCellValueSchema, ContentDocumentSchema, ContentDrawPageSchema, ContentImageBlockSchema, ContentPageBreakSchema, ContentParagraphSchema, ContentPathPointSchema, ContentPathSegmentSchema, ContentRunSchema, ContentSectionSchema, ContentShapeSchema, ContentSheetCellSchema, ContentSheetColumnSchema, ContentSheetPrintRangeSchema, ContentSheetPrintSettingsSchema, ContentSheetRepeatRangeSchema, ContentSheetRowSchema, ContentSheetSchema, ContentSlideSchema, ContentStrokeSchema, ContentSubpathSchema, ContentTableCellSchema, ContentTableRowSchema, ContentTableSchema, ContentVectorSchema, DEFAULT_LAYOUT_FONT, DefinedNameSchema, DocxBytesSchema, DocxEditor, DocxParagraph, DocxRun, DocxTable, DocxTableCell, DocxTableRow, LAYOUT_FORMAT_VERSION, NOOP_DIAGNOSTIC_SINK, OdgBytesSchema, OdpBytesSchema, OdpEditor, OdpShape, OdpSlide, OdsBytesSchema, OdsCell, OdsEditor, OdsSheet, OdtBytesSchema, OdtEditor, OdtList, OdtListItem, OdtParagraph, OdtRun, OdtTable, OdtTableCell, OdtTableRow, PAGE_SIZE_A4, PAGE_SIZE_LETTER, PackageSchema, PartSchema, PdfBytesSchema, PdfEncryptedError, PdfParseError, PptxBytesSchema, PptxEditor, PptxShape, PptxSlide, SLIDE_SIZE_STANDARD, SLIDE_SIZE_WIDESCREEN, XmlCdataSchema, XmlCommentSchema, XmlDeclarationSchema, XmlElementSchema, XmlNodeSchema, XmlPartSchema, XmlPiSchema, XmlTextSchema, attr, base64ToBytes, buildDocxPackage, buildOdpPackage, buildOdsPackage, buildOdtPackage, buildPptxPackage, buildXml, bytesToBase64, childrenWithTag, compactCodec, compactPackageCodec, convertDrawingToLayout, convertPresentationToLayout, convertSpreadsheetToLayout, convertWordprocessingToLayout, createDocx, createLocalDocumentConverter, createOdp, createOds, createOdt, createPptx, decodeCompactPackage, decodeEntities, decodePackage, docxPdfCodec, docxToPdf, elementsWithTag, encodeCompactPackage, encodePackage, fixedClock, flipY, fromCompact, isCompactXmlNode, isContentBlock, isXmlNode, odgToPdf, odpPdfCodec, odpToPdf, odsToPdf, odtPdfCodec, odtToPdf, openDocx, openOdp, openOds, openOdt, openPptx, packageCodec, parsePackage, parseXml, pdfCodec, pdfToDocx, pdfToOdp, pdfToOdt, pdfToPptx, pptxPdfCodec, pptxToPdf, readDocxContent, readOdgContent, readOdpContent, readOdsContent, readOdtContent, readPdf, readPptxContent, reconstructPresentation, reconstructWordprocessing, resolveRelationships, rgbHexToColor, rootElement, serializePackage, systemClock, textContent, throwIfAborted, toCompact, unzipPackage, walk, writePdf, xmlCodec, zipPackage };
11133
+ export { AttributeSchema, BinaryPartSchema, COLOR_BLACK, CONTENT_FORMAT_VERSION, CommentSchema, CompactPackageSchema, CompactPartSchema, CompactXmlNodeSchema, ContentBlockSchema, ContentCellValueSchema, ContentDocumentSchema, ContentDrawPageSchema, ContentImageBlockSchema, ContentPageBreakSchema, ContentParagraphSchema, ContentPathPointSchema, ContentPathSegmentSchema, ContentRunSchema, ContentSectionSchema, ContentShapeSchema, ContentSheetCellSchema, ContentSheetColumnSchema, ContentSheetPrintRangeSchema, ContentSheetPrintSettingsSchema, ContentSheetRepeatRangeSchema, ContentSheetRowSchema, ContentSheetSchema, ContentSlideSchema, ContentStrokeSchema, ContentSubpathSchema, ContentTableCellSchema, ContentTableRowSchema, ContentTableSchema, ContentVectorSchema, DEFAULT_LAYOUT_FONT, DefinedNameSchema, DocxBytesSchema, DocxEditor, DocxParagraph, DocxRun, DocxTable, DocxTableCell, DocxTableRow, LAYOUT_FORMAT_VERSION, NOOP_DIAGNOSTIC_SINK, OdgBoxVector, OdgBytesSchema, OdgEditor, OdgLineVector, OdgPage, OdgPathVector, OdpBytesSchema, OdpEditor, OdpShape, OdpSlide, OdsBytesSchema, OdsCell, OdsEditor, OdsSheet, OdtBytesSchema, OdtEditor, OdtList, OdtListItem, OdtParagraph, OdtRun, OdtTable, OdtTableCell, OdtTableRow, PAGE_SIZE_A4, PAGE_SIZE_LETTER, PackageSchema, PartSchema, PdfBytesSchema, PdfEncryptedError, PdfParseError, PptxBytesSchema, PptxEditor, PptxShape, PptxSlide, SLIDE_SIZE_STANDARD, SLIDE_SIZE_WIDESCREEN, XmlCdataSchema, XmlCommentSchema, XmlDeclarationSchema, XmlElementSchema, XmlNodeSchema, XmlPartSchema, XmlPiSchema, XmlTextSchema, attr, base64ToBytes, buildDocxPackage, buildOdgPackage, buildOdpPackage, buildOdsPackage, buildOdtPackage, buildPptxPackage, buildXml, bytesToBase64, childrenWithTag, compactCodec, compactPackageCodec, convertDrawingToLayout, convertPresentationToLayout, convertSpreadsheetToLayout, convertWordprocessingToLayout, createDocx, createLocalDocumentConverter, createOdg, createOdp, createOds, createOdt, createPptx, decodeCompactPackage, decodeEntities, decodePackage, docxPdfCodec, docxToPdf, elementsWithTag, encodeCompactPackage, encodePackage, fixedClock, flipY, fromCompact, isCompactXmlNode, isContentBlock, isXmlNode, odgToPdf, odpPdfCodec, odpToPdf, odsToPdf, odtPdfCodec, odtToPdf, openDocx, openOdg, openOdp, openOds, openOdt, openPptx, packageCodec, parsePackage, parseXml, pdfCodec, pdfToDocx, pdfToOdp, pdfToOdt, pdfToPptx, pptxPdfCodec, pptxToPdf, readDocxContent, readOdgContent, readOdpContent, readOdsContent, readOdtContent, readPdf, readPptxContent, reconstructPresentation, reconstructWordprocessing, resolveRelationships, rgbHexToColor, rootElement, serializePackage, systemClock, textContent, throwIfAborted, toCompact, unzipPackage, walk, writePdf, xmlCodec, zipPackage };