ooxml-core 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -13
- package/dist/crypto/aes-ecb.d.ts +13 -0
- package/dist/crypto/aes-ecb.d.ts.map +1 -0
- package/dist/crypto/decrypt.d.ts +63 -0
- package/dist/crypto/decrypt.d.ts.map +1 -0
- package/dist/crypto/detect.d.ts +56 -0
- package/dist/crypto/detect.d.ts.map +1 -0
- package/dist/crypto/encrypt.d.ts +27 -0
- package/dist/crypto/encrypt.d.ts.map +1 -0
- package/dist/crypto/encryption-info-write.d.ts +46 -0
- package/dist/crypto/encryption-info-write.d.ts.map +1 -0
- package/dist/crypto/encryption-info.d.ts +22 -0
- package/dist/crypto/encryption-info.d.ts.map +1 -0
- package/dist/crypto/errors.d.ts +39 -0
- package/dist/crypto/errors.d.ts.map +1 -0
- package/dist/crypto/index.cjs +1805 -0
- package/dist/crypto/index.d.ts +26 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.mjs +1774 -0
- package/dist/crypto/key-derivation.d.ts +73 -0
- package/dist/crypto/key-derivation.d.ts.map +1 -0
- package/dist/crypto/types.d.ts +104 -0
- package/dist/crypto/types.d.ts.map +1 -0
- package/dist/docx/embedded.cjs +2 -0
- package/dist/docx/embedded.mjs +2 -0
- package/dist/docx/index.cjs +2 -0
- package/dist/docx/index.mjs +2 -0
- package/dist/docx/load/detect.d.ts +14 -2
- package/dist/docx/load/detect.d.ts.map +1 -1
- package/dist/docx/load/index.cjs +8995 -7728
- package/dist/docx/load/index.d.ts +3 -1
- package/dist/docx/load/index.d.ts.map +1 -1
- package/dist/docx/load/index.mjs +8990 -7729
- package/dist/docx/load/legacy-doc.d.ts.map +1 -1
- package/dist/index.cjs +749 -19
- package/dist/index.mjs +749 -19
- package/dist/opc/index.cjs +797 -1
- package/dist/opc/index.d.ts +2 -0
- package/dist/opc/index.d.ts.map +1 -1
- package/dist/opc/index.mjs +784 -3
- package/dist/opc/properties/app.d.ts +10 -0
- package/dist/opc/properties/app.d.ts.map +1 -0
- package/dist/opc/properties/core.d.ts +13 -0
- package/dist/opc/properties/core.d.ts.map +1 -0
- package/dist/opc/properties/custom.d.ts +15 -0
- package/dist/opc/properties/custom.d.ts.map +1 -0
- package/dist/opc/properties/index.d.ts +5 -0
- package/dist/opc/properties/index.d.ts.map +1 -0
- package/dist/opc/properties/types.d.ts +114 -0
- package/dist/opc/properties/types.d.ts.map +1 -0
- package/dist/opc/relationship-types.d.ts +1 -0
- package/dist/opc/relationship-types.d.ts.map +1 -1
- package/dist/opc/safe-href.d.ts +34 -0
- package/dist/opc/safe-href.d.ts.map +1 -1
- package/dist/opc/signature/constants.d.ts +42 -0
- package/dist/opc/signature/constants.d.ts.map +1 -0
- package/dist/opc/signature/detection.d.ts +97 -0
- package/dist/opc/signature/detection.d.ts.map +1 -0
- package/dist/opc/signature/digest.d.ts +16 -0
- package/dist/opc/signature/digest.d.ts.map +1 -0
- package/dist/opc/signature/index.d.ts +8 -0
- package/dist/opc/signature/index.d.ts.map +1 -0
- package/dist/opc/signature/inspection-status.d.ts +24 -0
- package/dist/opc/signature/inspection-status.d.ts.map +1 -0
- package/dist/opc/signature/reference-utils.d.ts +12 -0
- package/dist/opc/signature/reference-utils.d.ts.map +1 -0
- package/dist/opc/signature/types.d.ts +90 -0
- package/dist/opc/signature/types.d.ts.map +1 -0
- package/dist/opc/signature/xml-utils.d.ts +35 -0
- package/dist/opc/signature/xml-utils.d.ts.map +1 -0
- package/dist/pptx/chunks/{index-CojJtI77.d.ts → index-BWUBPGgv.d.ts} +9 -11
- package/dist/pptx/chunks/index-BWUBPGgv.d.ts.map +1 -0
- package/dist/pptx/chunks/{signature-inspection-status-Bh2oap7B.d.ts → inspection-status-B2E-jSpG.d.ts} +8 -8
- package/dist/pptx/chunks/inspection-status-B2E-jSpG.d.ts.map +1 -0
- package/dist/pptx/cli/index.cjs +1409 -895
- package/dist/pptx/cli/index.mjs +1409 -895
- package/dist/pptx/converter/index.d.ts +1 -1
- package/dist/pptx/index.cjs +1933 -1391
- package/dist/pptx/index.d.ts +20 -67
- package/dist/pptx/index.d.ts.map +1 -1
- package/dist/pptx/index.mjs +1933 -1391
- package/dist/pptx/signature-node/index.cjs +5 -5
- package/dist/pptx/signature-node/index.d.ts +1 -1
- package/dist/pptx/signature-node/index.mjs +5 -5
- package/dist/visio/edit-master-index.d.ts +10 -0
- package/dist/visio/edit-master-index.d.ts.map +1 -0
- package/dist/visio/edit-master-scope.d.ts +7 -0
- package/dist/visio/edit-master-scope.d.ts.map +1 -0
- package/dist/visio/edit-scope.d.ts.map +1 -1
- package/dist/visio/formula-arithmetic.d.ts +8 -0
- package/dist/visio/formula-arithmetic.d.ts.map +1 -0
- package/dist/visio/formula-evaluate.d.ts.map +1 -1
- package/dist/visio/formula-master.d.ts +13 -0
- package/dist/visio/formula-master.d.ts.map +1 -0
- package/dist/visio/formula-numeric-functions.d.ts +8 -0
- package/dist/visio/formula-numeric-functions.d.ts.map +1 -0
- package/dist/visio/formula.d.ts +1 -1
- package/dist/visio/formula.d.ts.map +1 -1
- package/dist/visio/index.cjs +540 -61
- package/dist/visio/index.mjs +540 -61
- package/dist/xlsx/edit/annotations.d.ts +5 -1
- package/dist/xlsx/edit/annotations.d.ts.map +1 -1
- package/dist/xlsx/edit/cell-values.d.ts +7 -2
- package/dist/xlsx/edit/cell-values.d.ts.map +1 -1
- package/dist/xlsx/edit/clipboard.d.ts.map +1 -1
- package/dist/xlsx/edit/doc-properties.d.ts +14 -0
- package/dist/xlsx/edit/doc-properties.d.ts.map +1 -0
- package/dist/xlsx/edit/fill-series.d.ts.map +1 -1
- package/dist/xlsx/edit/find.d.ts +2 -1
- package/dist/xlsx/edit/find.d.ts.map +1 -1
- package/dist/xlsx/edit/format-lines.d.ts +22 -0
- package/dist/xlsx/edit/format-lines.d.ts.map +1 -0
- package/dist/xlsx/edit/format.d.ts +2 -1
- package/dist/xlsx/edit/format.d.ts.map +1 -1
- package/dist/xlsx/edit/history-refs.d.ts +51 -0
- package/dist/xlsx/edit/history-refs.d.ts.map +1 -0
- package/dist/xlsx/edit/history.d.ts +40 -5
- package/dist/xlsx/edit/history.d.ts.map +1 -1
- package/dist/xlsx/edit/index.d.ts +3 -0
- package/dist/xlsx/edit/index.d.ts.map +1 -1
- package/dist/xlsx/edit/input-text.d.ts +13 -0
- package/dist/xlsx/edit/input-text.d.ts.map +1 -0
- package/dist/xlsx/edit/merge.d.ts +10 -2
- package/dist/xlsx/edit/merge.d.ts.map +1 -1
- package/dist/xlsx/edit/session.d.ts.map +1 -1
- package/dist/xlsx/edit/sheets.d.ts.map +1 -1
- package/dist/xlsx/edit/shift-formulas.d.ts +2 -1
- package/dist/xlsx/edit/shift-formulas.d.ts.map +1 -1
- package/dist/xlsx/edit/shift-preserved.d.ts +17 -0
- package/dist/xlsx/edit/shift-preserved.d.ts.map +1 -0
- package/dist/xlsx/edit/shift-sheet.d.ts +2 -2
- package/dist/xlsx/edit/shift-sheet.d.ts.map +1 -1
- package/dist/xlsx/edit/structure.d.ts.map +1 -1
- package/dist/xlsx/edit/types.d.ts +7 -0
- package/dist/xlsx/edit/types.d.ts.map +1 -1
- package/dist/xlsx/edit/validation-list.d.ts +24 -0
- package/dist/xlsx/edit/validation-list.d.ts.map +1 -0
- package/dist/xlsx/edit/validation.d.ts +2 -1
- package/dist/xlsx/edit/validation.d.ts.map +1 -1
- package/dist/xlsx/formula/area-index.d.ts +18 -0
- package/dist/xlsx/formula/area-index.d.ts.map +1 -0
- package/dist/xlsx/formula/array-context.d.ts.map +1 -1
- package/dist/xlsx/formula/ast.d.ts +5 -1
- package/dist/xlsx/formula/ast.d.ts.map +1 -1
- package/dist/xlsx/formula/call.d.ts.map +1 -1
- package/dist/xlsx/formula/coerce.d.ts.map +1 -1
- package/dist/xlsx/formula/context.d.ts +5 -0
- package/dist/xlsx/formula/context.d.ts.map +1 -1
- package/dist/xlsx/formula/date-serial.d.ts +11 -4
- package/dist/xlsx/formula/date-serial.d.ts.map +1 -1
- package/dist/xlsx/formula/engine-core.d.ts +6 -0
- package/dist/xlsx/formula/engine-core.d.ts.map +1 -1
- package/dist/xlsx/formula/engine-host.d.ts +35 -3
- package/dist/xlsx/formula/engine-host.d.ts.map +1 -1
- package/dist/xlsx/formula/engine-util.d.ts.map +1 -1
- package/dist/xlsx/formula/engine.d.ts.map +1 -1
- package/dist/xlsx/formula/evaluator.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/array-shape.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/array.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/criteria-index.d.ts +12 -0
- package/dist/xlsx/formula/functions/criteria-index.d.ts.map +1 -0
- package/dist/xlsx/formula/functions/criteria.d.ts +24 -16
- package/dist/xlsx/formula/functions/criteria.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/date-calc.d.ts +4 -0
- package/dist/xlsx/formula/functions/date-calc.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/depreciation.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/financial.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/helpers.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/logical.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/lookup-core.d.ts +14 -2
- package/dist/xlsx/formula/functions/lookup-core.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/lookup.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/math-mod.d.ts +8 -0
- package/dist/xlsx/formula/functions/math-mod.d.ts.map +1 -0
- package/dist/xlsx/formula/functions/math-sum.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/math.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/statistical-count.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/statistical.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/stats-core.d.ts +6 -0
- package/dist/xlsx/formula/functions/stats-core.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/text-case.d.ts +14 -0
- package/dist/xlsx/formula/functions/text-case.d.ts.map +1 -0
- package/dist/xlsx/formula/functions/text.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/workdays.d.ts.map +1 -1
- package/dist/xlsx/formula/graph-index.d.ts +15 -0
- package/dist/xlsx/formula/graph-index.d.ts.map +1 -0
- package/dist/xlsx/formula/graph.d.ts +13 -18
- package/dist/xlsx/formula/graph.d.ts.map +1 -1
- package/dist/xlsx/formula/operators.d.ts +9 -0
- package/dist/xlsx/formula/operators.d.ts.map +1 -1
- package/dist/xlsx/formula/parser.d.ts +2 -0
- package/dist/xlsx/formula/parser.d.ts.map +1 -1
- package/dist/xlsx/formula/references.d.ts +4 -1
- package/dist/xlsx/formula/references.d.ts.map +1 -1
- package/dist/xlsx/formula/text-number.d.ts.map +1 -1
- package/dist/xlsx/formula/transform.d.ts.map +1 -1
- package/dist/xlsx/formula/values.d.ts +44 -3
- package/dist/xlsx/formula/values.d.ts.map +1 -1
- package/dist/xlsx/index.cjs +4698 -1322
- package/dist/xlsx/index.mjs +4688 -1323
- package/dist/xlsx/layout/anchors.d.ts +47 -0
- package/dist/xlsx/layout/anchors.d.ts.map +1 -0
- package/dist/xlsx/layout/cf-evaluator.d.ts +1 -2
- package/dist/xlsx/layout/cf-evaluator.d.ts.map +1 -1
- package/dist/xlsx/layout/cf-helpers.d.ts +8 -1
- package/dist/xlsx/layout/cf-helpers.d.ts.map +1 -1
- package/dist/xlsx/layout/index.d.ts +1 -0
- package/dist/xlsx/layout/index.d.ts.map +1 -1
- package/dist/xlsx/load/csv.d.ts +24 -3
- package/dist/xlsx/load/csv.d.ts.map +1 -1
- package/dist/xlsx/load/detect.d.ts +39 -7
- package/dist/xlsx/load/detect.d.ts.map +1 -1
- package/dist/xlsx/load/errors.d.ts +10 -0
- package/dist/xlsx/load/errors.d.ts.map +1 -0
- package/dist/xlsx/load/index.cjs +16220 -12163
- package/dist/xlsx/load/index.d.ts +5 -2
- package/dist/xlsx/load/index.d.ts.map +1 -1
- package/dist/xlsx/load/index.mjs +16213 -12164
- package/dist/xlsx/load/text-decode.d.ts +7 -0
- package/dist/xlsx/load/text-decode.d.ts.map +1 -0
- package/dist/xlsx/model.d.ts +121 -17
- package/dist/xlsx/model.d.ts.map +1 -1
- package/dist/xlsx/numfmt/date.d.ts +7 -0
- package/dist/xlsx/numfmt/date.d.ts.map +1 -1
- package/dist/xlsx/numfmt/format.d.ts.map +1 -1
- package/dist/xlsx/numfmt/fraction.d.ts +5 -1
- package/dist/xlsx/numfmt/fraction.d.ts.map +1 -1
- package/dist/xlsx/numfmt/input-date.d.ts.map +1 -1
- package/dist/xlsx/numfmt/input.d.ts.map +1 -1
- package/dist/xlsx/numfmt/number.d.ts.map +1 -1
- package/dist/xlsx/read/conditional.d.ts.map +1 -1
- package/dist/xlsx/read/drawing.d.ts +2 -2
- package/dist/xlsx/read/drawing.d.ts.map +1 -1
- package/dist/xlsx/read/load.d.ts.map +1 -1
- package/dist/xlsx/read/package.d.ts +18 -2
- package/dist/xlsx/read/package.d.ts.map +1 -1
- package/dist/xlsx/read/sheet-data.d.ts.map +1 -1
- package/dist/xlsx/read/sheet-props.d.ts +15 -1
- package/dist/xlsx/read/sheet-props.d.ts.map +1 -1
- package/dist/xlsx/read/smart-art.d.ts +12 -0
- package/dist/xlsx/read/smart-art.d.ts.map +1 -0
- package/dist/xlsx/read/styles.d.ts.map +1 -1
- package/dist/xlsx/read/workbook-part.d.ts +5 -2
- package/dist/xlsx/read/workbook-part.d.ts.map +1 -1
- package/dist/xlsx/read/worksheet.d.ts.map +1 -1
- package/dist/xlsx/write/attr-merge.d.ts +10 -0
- package/dist/xlsx/write/attr-merge.d.ts.map +1 -0
- package/dist/xlsx/write/carried-refs.d.ts +61 -0
- package/dist/xlsx/write/carried-refs.d.ts.map +1 -0
- package/dist/xlsx/write/comments.d.ts +12 -2
- package/dist/xlsx/write/comments.d.ts.map +1 -1
- package/dist/xlsx/write/conditional.d.ts.map +1 -1
- package/dist/xlsx/write/doc-props.d.ts +30 -0
- package/dist/xlsx/write/doc-props.d.ts.map +1 -0
- package/dist/xlsx/write/drawing.d.ts +5 -0
- package/dist/xlsx/write/drawing.d.ts.map +1 -1
- package/dist/xlsx/write/metadata.d.ts +23 -0
- package/dist/xlsx/write/metadata.d.ts.map +1 -0
- package/dist/xlsx/write/package-writer.d.ts +6 -0
- package/dist/xlsx/write/package-writer.d.ts.map +1 -1
- package/dist/xlsx/write/page-setup.d.ts +8 -0
- package/dist/xlsx/write/page-setup.d.ts.map +1 -0
- package/dist/xlsx/write/save.d.ts.map +1 -1
- package/dist/xlsx/write/sheet-data.d.ts +8 -0
- package/dist/xlsx/write/sheet-data.d.ts.map +1 -1
- package/dist/xlsx/write/sheet-parts.d.ts +6 -0
- package/dist/xlsx/write/sheet-parts.d.ts.map +1 -1
- package/dist/xlsx/write/sheet-props.d.ts +0 -6
- package/dist/xlsx/write/sheet-props.d.ts.map +1 -1
- package/dist/xlsx/write/styles.d.ts.map +1 -1
- package/dist/xlsx/write/table-patch.d.ts +12 -0
- package/dist/xlsx/write/table-patch.d.ts.map +1 -0
- package/dist/xlsx/write/tables.d.ts +9 -0
- package/dist/xlsx/write/tables.d.ts.map +1 -1
- package/dist/xlsx/write/vml-ids.d.ts +29 -0
- package/dist/xlsx/write/vml-ids.d.ts.map +1 -0
- package/dist/xlsx/write/workbook-part.d.ts +1 -4
- package/dist/xlsx/write/workbook-part.d.ts.map +1 -1
- package/dist/xlsx/write/worksheet.d.ts.map +1 -1
- package/dist/xml/index.cjs +4 -0
- package/dist/xml/index.mjs +4 -0
- package/dist/xml/namespaces.d.ts +4 -0
- package/dist/xml/namespaces.d.ts.map +1 -1
- package/package.json +6 -1
- package/dist/pptx/chunks/index-CojJtI77.d.ts.map +0 -1
- package/dist/pptx/chunks/signature-inspection-status-Bh2oap7B.d.ts.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -700,7 +700,12 @@ function resolveDiagramLayoutCategory(uniqueId, categories) {
|
|
|
700
700
|
// src/opc/index.ts
|
|
701
701
|
var opc_exports = {};
|
|
702
702
|
__export(opc_exports, {
|
|
703
|
+
CORE_PROPERTY_FIELDS: () => CORE_PROPERTY_FIELDS,
|
|
704
|
+
CUSTOM_PROPERTIES_FMTID: () => CUSTOM_PROPERTIES_FMTID,
|
|
705
|
+
PROPERTY_CONTENT_TYPES: () => PROPERTY_CONTENT_TYPES,
|
|
706
|
+
PROPERTY_PART_NAMES: () => PROPERTY_PART_NAMES,
|
|
703
707
|
RELATIONSHIP_TYPES: () => RELATIONSHIP_TYPES,
|
|
708
|
+
allocateCustomPropertyIds: () => allocateCustomPropertyIds,
|
|
704
709
|
buildContentTypesXml: () => buildContentTypesXml,
|
|
705
710
|
buildRelationshipsXml: () => buildRelationshipsXml,
|
|
706
711
|
contentTypeForPart: () => contentTypeForPart,
|
|
@@ -709,12 +714,22 @@ __export(opc_exports, {
|
|
|
709
714
|
ensureRelationship: () => ensureRelationship,
|
|
710
715
|
findOfficeDocumentPart: () => findOfficeDocumentPart,
|
|
711
716
|
getRelationshipId: () => getRelationshipId,
|
|
717
|
+
hyperlinkPolicy: () => hyperlinkPolicy,
|
|
718
|
+
isOpenableHyperlinkHref: () => isOpenableHyperlinkHref,
|
|
712
719
|
isSafeHyperlinkHref: () => isSafeHyperlinkHref,
|
|
720
|
+
isStorableHyperlinkHref: () => isStorableHyperlinkHref,
|
|
713
721
|
nextRelationshipId: () => nextRelationshipId,
|
|
722
|
+
parseAppProperties: () => parseAppProperties,
|
|
714
723
|
parseContentTypes: () => parseContentTypes,
|
|
724
|
+
parseCoreProperties: () => parseCoreProperties,
|
|
725
|
+
parseCustomProperties: () => parseCustomProperties,
|
|
715
726
|
parseRelationships: () => parseRelationships,
|
|
716
727
|
relationshipsPartFor: () => relationshipsPartFor,
|
|
717
|
-
resolvePartPath: () => resolvePartPath
|
|
728
|
+
resolvePartPath: () => resolvePartPath,
|
|
729
|
+
signature: () => signature_exports,
|
|
730
|
+
writeAppProperties: () => writeAppProperties,
|
|
731
|
+
writeCoreProperties: () => writeCoreProperties,
|
|
732
|
+
writeCustomProperties: () => writeCustomProperties
|
|
718
733
|
});
|
|
719
734
|
|
|
720
735
|
// src/opc/relationship-types.ts
|
|
@@ -748,6 +763,7 @@ var RELATIONSHIP_TYPES = {
|
|
|
748
763
|
diagramDrawing: "http://schemas.microsoft.com/office/2007/relationships/diagramDrawing",
|
|
749
764
|
coreProperties: "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties",
|
|
750
765
|
extendedProperties: `${BASE}/extended-properties`,
|
|
766
|
+
customProperties: `${BASE}/custom-properties`,
|
|
751
767
|
customXml: `${BASE}/customXml`,
|
|
752
768
|
worksheet: `${BASE}/worksheet`,
|
|
753
769
|
chartsheet: `${BASE}/chartsheet`,
|
|
@@ -843,6 +859,10 @@ var NS = {
|
|
|
843
859
|
extendedProperties: "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties",
|
|
844
860
|
/** Dublin Core terms (`dcterms:created`). */
|
|
845
861
|
dcterms: "http://purl.org/dc/terms/",
|
|
862
|
+
/** Custom document properties (`docProps/custom.xml`). */
|
|
863
|
+
customProperties: "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties",
|
|
864
|
+
/** Document property variant types (`vt:lpwstr`, `vt:vector`). */
|
|
865
|
+
vt: "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes",
|
|
846
866
|
/** XML itself (`xml:space`). */
|
|
847
867
|
xml: "http://www.w3.org/XML/1998/namespace"
|
|
848
868
|
};
|
|
@@ -1021,6 +1041,716 @@ function isSafeHyperlinkHref(href) {
|
|
|
1021
1041
|
const scheme = /^([a-z][a-z0-9+.-]*:)/i.exec(href.trim())?.[1];
|
|
1022
1042
|
return scheme !== void 0 && SAFE_SCHEMES.has(scheme.toLowerCase());
|
|
1023
1043
|
}
|
|
1044
|
+
var OPEN_SCHEMES = /* @__PURE__ */ new Set(["http", "https", "mailto"]);
|
|
1045
|
+
var STORE_SCHEMES = /* @__PURE__ */ new Set([...OPEN_SCHEMES, "ftp", "file"]);
|
|
1046
|
+
var SCRIPT_SCHEMES = /* @__PURE__ */ new Set([
|
|
1047
|
+
"javascript",
|
|
1048
|
+
"vbscript",
|
|
1049
|
+
"livescript",
|
|
1050
|
+
"jscript",
|
|
1051
|
+
"mocha",
|
|
1052
|
+
"data",
|
|
1053
|
+
"mhtml",
|
|
1054
|
+
"ms-its",
|
|
1055
|
+
"mk",
|
|
1056
|
+
"x-javascript",
|
|
1057
|
+
"blob"
|
|
1058
|
+
]);
|
|
1059
|
+
var IGNORABLE = new RegExp(
|
|
1060
|
+
"[\\u0000-\\u0020\\u007f\\u00ad\\u200b-\\u200f\\u202a-\\u202e\\u2060-\\u2064\\ufeff]",
|
|
1061
|
+
"gu"
|
|
1062
|
+
);
|
|
1063
|
+
var CONTROL = new RegExp("[\\u0000-\\u001f\\u007f]", "u");
|
|
1064
|
+
var SCHEME = /^([a-z][a-z0-9+.-]*):/;
|
|
1065
|
+
var STORE_ONLY = { store: true, open: false, reason: "not-openable" };
|
|
1066
|
+
var reject = (reason) => ({
|
|
1067
|
+
store: false,
|
|
1068
|
+
open: false,
|
|
1069
|
+
reason
|
|
1070
|
+
});
|
|
1071
|
+
function hyperlinkPolicy(href) {
|
|
1072
|
+
if (typeof href !== "string") return reject("empty");
|
|
1073
|
+
const trimmed = href.trim();
|
|
1074
|
+
const normalized = trimmed.replace(IGNORABLE, "").toLowerCase();
|
|
1075
|
+
if (normalized.length === 0) return reject("empty");
|
|
1076
|
+
const scheme = SCHEME.exec(normalized)?.[1];
|
|
1077
|
+
if (scheme !== void 0 && SCRIPT_SCHEMES.has(scheme)) return reject("script-scheme");
|
|
1078
|
+
if (scheme !== void 0 && !trimmed.toLowerCase().startsWith(`${scheme}:`))
|
|
1079
|
+
return reject("obfuscated-scheme");
|
|
1080
|
+
if (CONTROL.test(trimmed)) return reject("control-characters");
|
|
1081
|
+
if (scheme === void 0 || scheme.length === 1) return STORE_ONLY;
|
|
1082
|
+
if (OPEN_SCHEMES.has(scheme)) return { store: true, open: true };
|
|
1083
|
+
if (STORE_SCHEMES.has(scheme)) return STORE_ONLY;
|
|
1084
|
+
return reject("unsupported-scheme");
|
|
1085
|
+
}
|
|
1086
|
+
function isStorableHyperlinkHref(href) {
|
|
1087
|
+
return hyperlinkPolicy(href).store;
|
|
1088
|
+
}
|
|
1089
|
+
function isOpenableHyperlinkHref(href) {
|
|
1090
|
+
return hyperlinkPolicy(href).open;
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
// src/opc/properties/types.ts
|
|
1094
|
+
var CUSTOM_PROPERTIES_FMTID = "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}";
|
|
1095
|
+
var PROPERTY_PART_NAMES = {
|
|
1096
|
+
core: "docProps/core.xml",
|
|
1097
|
+
app: "docProps/app.xml",
|
|
1098
|
+
custom: "docProps/custom.xml"
|
|
1099
|
+
};
|
|
1100
|
+
var PROPERTY_CONTENT_TYPES = {
|
|
1101
|
+
core: "application/vnd.openxmlformats-package.core-properties+xml",
|
|
1102
|
+
app: "application/vnd.openxmlformats-officedocument.extended-properties+xml",
|
|
1103
|
+
custom: "application/vnd.openxmlformats-officedocument.custom-properties+xml"
|
|
1104
|
+
};
|
|
1105
|
+
|
|
1106
|
+
// src/opc/properties/core.ts
|
|
1107
|
+
var XSI = "http://www.w3.org/2001/XMLSchema-instance";
|
|
1108
|
+
var FIELDS = [
|
|
1109
|
+
["title", "dc", false],
|
|
1110
|
+
["subject", "dc", false],
|
|
1111
|
+
["creator", "dc", false],
|
|
1112
|
+
["keywords", "cp", false],
|
|
1113
|
+
["description", "dc", false],
|
|
1114
|
+
["lastModifiedBy", "cp", false],
|
|
1115
|
+
["created", "dcterms", true],
|
|
1116
|
+
["modified", "dcterms", true],
|
|
1117
|
+
["category", "cp", false],
|
|
1118
|
+
["contentStatus", "cp", false],
|
|
1119
|
+
["revision", "cp", false],
|
|
1120
|
+
["language", "dc", false],
|
|
1121
|
+
["identifier", "dc", false],
|
|
1122
|
+
["lastPrinted", "cp", false],
|
|
1123
|
+
["version", "cp", false]
|
|
1124
|
+
];
|
|
1125
|
+
var CORE_PROPERTY_FIELDS = FIELDS.map(([field]) => field);
|
|
1126
|
+
var EMPTY_CORE = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
1127
|
+
<cp:coreProperties xmlns:cp="${NS.cp}" xmlns:dc="${NS.dc}" xmlns:dcterms="${NS.dcterms}" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="${XSI}"/>`;
|
|
1128
|
+
function parseCoreProperties(xml) {
|
|
1129
|
+
const out = {};
|
|
1130
|
+
if (!xml) return out;
|
|
1131
|
+
const root = parseXml(xml, { label: "core properties" }).documentElement;
|
|
1132
|
+
for (const [field, prefix] of FIELDS) {
|
|
1133
|
+
const text = first(root, field, NS[prefix])?.textContent ?? "";
|
|
1134
|
+
if (text !== "") out[field] = text;
|
|
1135
|
+
}
|
|
1136
|
+
return out;
|
|
1137
|
+
}
|
|
1138
|
+
function writeCoreProperties(props, sourceXml) {
|
|
1139
|
+
const doc = parseXml(sourceXml ?? EMPTY_CORE, { label: "core properties" });
|
|
1140
|
+
const root = doc.documentElement;
|
|
1141
|
+
for (const [field, prefix, isDate] of FIELDS) {
|
|
1142
|
+
const ns = NS[prefix];
|
|
1143
|
+
const value = props[field];
|
|
1144
|
+
let element = first(root, field, ns);
|
|
1145
|
+
if (value === void 0 || value === "") {
|
|
1146
|
+
if (element && (element.textContent ?? "") !== "") root.removeChild(element);
|
|
1147
|
+
continue;
|
|
1148
|
+
}
|
|
1149
|
+
if (!element) {
|
|
1150
|
+
element = doc.createElementNS(ns, `${prefix}:${field}`);
|
|
1151
|
+
if (isDate) element.setAttributeNS(XSI, "xsi:type", "dcterms:W3CDTF");
|
|
1152
|
+
root.appendChild(element);
|
|
1153
|
+
}
|
|
1154
|
+
if (element.textContent !== value) element.textContent = value;
|
|
1155
|
+
}
|
|
1156
|
+
const out = buildXml(doc);
|
|
1157
|
+
return out.startsWith("<?xml") ? out : `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
1158
|
+
${out}`;
|
|
1159
|
+
}
|
|
1160
|
+
|
|
1161
|
+
// src/opc/properties/app.ts
|
|
1162
|
+
var FIELDS2 = [
|
|
1163
|
+
["template", "Template", "text"],
|
|
1164
|
+
["totalTime", "TotalTime", "int"],
|
|
1165
|
+
["application", "Application", "text"],
|
|
1166
|
+
["docSecurity", "DocSecurity", "int"],
|
|
1167
|
+
["scaleCrop", "ScaleCrop", "bool"],
|
|
1168
|
+
["headingPairs", "HeadingPairs", "pairs"],
|
|
1169
|
+
["titlesOfParts", "TitlesOfParts", "titles"],
|
|
1170
|
+
["manager", "Manager", "text"],
|
|
1171
|
+
["company", "Company", "text"],
|
|
1172
|
+
["linksUpToDate", "LinksUpToDate", "bool"],
|
|
1173
|
+
["sharedDoc", "SharedDoc", "bool"],
|
|
1174
|
+
["hyperlinkBase", "HyperlinkBase", "text"],
|
|
1175
|
+
["hyperlinksChanged", "HyperlinksChanged", "bool"],
|
|
1176
|
+
["appVersion", "AppVersion", "text"]
|
|
1177
|
+
];
|
|
1178
|
+
var EMPTY_APP = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
1179
|
+
<Properties xmlns="${NS.extendedProperties}" xmlns:vt="${NS.vt}"/>`;
|
|
1180
|
+
function vectorItems(element) {
|
|
1181
|
+
const vector = first(element, "vector", NS.vt);
|
|
1182
|
+
return vector ? elements(vector) : [];
|
|
1183
|
+
}
|
|
1184
|
+
function readPairs(element) {
|
|
1185
|
+
const variants = vectorItems(element).map((variant) => elements(variant)[0]);
|
|
1186
|
+
const out = [];
|
|
1187
|
+
for (let i = 0; i + 1 < variants.length; i += 2) {
|
|
1188
|
+
const name = variants[i]?.textContent ?? "";
|
|
1189
|
+
const count = Number.parseInt(variants[i + 1]?.textContent ?? "", 10);
|
|
1190
|
+
out.push({ name, count: Number.isFinite(count) ? count : 0 });
|
|
1191
|
+
}
|
|
1192
|
+
return out;
|
|
1193
|
+
}
|
|
1194
|
+
function readField(element, kind) {
|
|
1195
|
+
const text = element.textContent ?? "";
|
|
1196
|
+
if (kind === "pairs") return readPairs(element);
|
|
1197
|
+
if (kind === "titles") return vectorItems(element).map((item) => item.textContent ?? "");
|
|
1198
|
+
if (kind === "bool") return text.trim() === "true" || text.trim() === "1";
|
|
1199
|
+
if (kind === "int") {
|
|
1200
|
+
const value = Number.parseInt(text, 10);
|
|
1201
|
+
return Number.isFinite(value) ? value : void 0;
|
|
1202
|
+
}
|
|
1203
|
+
return text === "" ? void 0 : text;
|
|
1204
|
+
}
|
|
1205
|
+
function parseAppProperties(xml) {
|
|
1206
|
+
const out = {};
|
|
1207
|
+
if (!xml) return out;
|
|
1208
|
+
const root = parseXml(xml, { label: "app properties" }).documentElement;
|
|
1209
|
+
for (const [field, local, kind] of FIELDS2) {
|
|
1210
|
+
const element = first(root, local, NS.extendedProperties);
|
|
1211
|
+
if (!element) continue;
|
|
1212
|
+
const value = readField(element, kind);
|
|
1213
|
+
if (value !== void 0) out[field] = value;
|
|
1214
|
+
}
|
|
1215
|
+
return out;
|
|
1216
|
+
}
|
|
1217
|
+
var same = (a, b) => JSON.stringify(a) === JSON.stringify(b);
|
|
1218
|
+
function fill(doc, element, kind, value) {
|
|
1219
|
+
while (element.firstChild) element.removeChild(element.firstChild);
|
|
1220
|
+
const vt = (local, text) => {
|
|
1221
|
+
const node = doc.createElementNS(NS.vt, `vt:${local}`);
|
|
1222
|
+
if (text !== void 0) node.textContent = text;
|
|
1223
|
+
return node;
|
|
1224
|
+
};
|
|
1225
|
+
if (kind === "pairs" || kind === "titles") {
|
|
1226
|
+
const items = kind === "pairs" ? value.flatMap((pair) => [
|
|
1227
|
+
vt("lpstr", pair.name),
|
|
1228
|
+
vt("i4", String(Math.trunc(pair.count)))
|
|
1229
|
+
]) : value.map((title) => vt("lpstr", title));
|
|
1230
|
+
const vector = vt("vector");
|
|
1231
|
+
vector.setAttribute("size", String(items.length));
|
|
1232
|
+
vector.setAttribute("baseType", kind === "pairs" ? "variant" : "lpstr");
|
|
1233
|
+
for (const item of items) {
|
|
1234
|
+
if (kind === "pairs") {
|
|
1235
|
+
const variant = vt("variant");
|
|
1236
|
+
variant.appendChild(item);
|
|
1237
|
+
vector.appendChild(variant);
|
|
1238
|
+
} else vector.appendChild(item);
|
|
1239
|
+
}
|
|
1240
|
+
element.appendChild(vector);
|
|
1241
|
+
return;
|
|
1242
|
+
}
|
|
1243
|
+
element.textContent = kind === "bool" ? value ? "true" : "false" : String(value);
|
|
1244
|
+
}
|
|
1245
|
+
function writeAppProperties(props, sourceXml) {
|
|
1246
|
+
const doc = parseXml(sourceXml ?? EMPTY_APP, { label: "app properties" });
|
|
1247
|
+
const root = doc.documentElement;
|
|
1248
|
+
const prior = parseAppProperties(sourceXml);
|
|
1249
|
+
FIELDS2.forEach(([field, local, kind], index) => {
|
|
1250
|
+
const value = props[field];
|
|
1251
|
+
const existing = first(root, local, NS.extendedProperties);
|
|
1252
|
+
if (value === void 0 || kind === "text" && value === "") {
|
|
1253
|
+
if (existing && (existing.textContent ?? "") !== "") root.removeChild(existing);
|
|
1254
|
+
return;
|
|
1255
|
+
}
|
|
1256
|
+
if (existing && same(prior[field], value)) return;
|
|
1257
|
+
let element = existing;
|
|
1258
|
+
if (!element) {
|
|
1259
|
+
element = doc.createElementNS(NS.extendedProperties, local);
|
|
1260
|
+
const next = FIELDS2.slice(index + 1).map(([, name]) => first(root, name, NS.extendedProperties)).find((node) => node !== void 0);
|
|
1261
|
+
root.insertBefore(element, next ?? null);
|
|
1262
|
+
}
|
|
1263
|
+
fill(doc, element, kind, value);
|
|
1264
|
+
});
|
|
1265
|
+
const out = buildXml(doc);
|
|
1266
|
+
return out.startsWith("<?xml") ? out : `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
1267
|
+
${out}`;
|
|
1268
|
+
}
|
|
1269
|
+
|
|
1270
|
+
// src/opc/properties/custom.ts
|
|
1271
|
+
var escape = (text, attribute = false) => {
|
|
1272
|
+
const out = text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
1273
|
+
return attribute ? out.replace(/"/g, """) : out;
|
|
1274
|
+
};
|
|
1275
|
+
var isVt = (element) => element.namespaceURI === NS.vt || element.prefix === "vt";
|
|
1276
|
+
function readValue(variant) {
|
|
1277
|
+
const text = variant.textContent ?? "";
|
|
1278
|
+
switch (isVt(variant) ? variant.localName : "") {
|
|
1279
|
+
case "lpwstr":
|
|
1280
|
+
return { name: "", type: "lpwstr", value: text };
|
|
1281
|
+
case "i4":
|
|
1282
|
+
case "int": {
|
|
1283
|
+
const value = Number.parseInt(text, 10);
|
|
1284
|
+
return Number.isFinite(value) ? { name: "", type: "i4", value } : void 0;
|
|
1285
|
+
}
|
|
1286
|
+
case "r8": {
|
|
1287
|
+
const value = Number(text);
|
|
1288
|
+
return text.trim() !== "" && Number.isFinite(value) ? { name: "", type: "r8", value } : void 0;
|
|
1289
|
+
}
|
|
1290
|
+
case "bool":
|
|
1291
|
+
return { name: "", type: "bool", value: text.trim() === "true" || text.trim() === "1" };
|
|
1292
|
+
case "filetime":
|
|
1293
|
+
return { name: "", type: "filetime", value: text };
|
|
1294
|
+
default:
|
|
1295
|
+
return void 0;
|
|
1296
|
+
}
|
|
1297
|
+
}
|
|
1298
|
+
function parseCustomProperties(xml) {
|
|
1299
|
+
if (!xml) return [];
|
|
1300
|
+
const root = parseXml(xml, { label: "custom properties" }).documentElement;
|
|
1301
|
+
const out = [];
|
|
1302
|
+
for (const property of children(root, "property", NS.customProperties)) {
|
|
1303
|
+
const name = property.getAttribute("name") ?? "";
|
|
1304
|
+
const variant = elements(property)[0];
|
|
1305
|
+
if (!name || !variant) continue;
|
|
1306
|
+
const value = readValue(variant) ?? {
|
|
1307
|
+
name,
|
|
1308
|
+
type: "raw",
|
|
1309
|
+
xml: buildXml(variant)
|
|
1310
|
+
};
|
|
1311
|
+
const pid = Number.parseInt(property.getAttribute("pid") ?? "", 10);
|
|
1312
|
+
const linkTarget = property.getAttribute("linkTarget");
|
|
1313
|
+
out.push({
|
|
1314
|
+
...value,
|
|
1315
|
+
name,
|
|
1316
|
+
...Number.isFinite(pid) ? { pid } : {},
|
|
1317
|
+
...linkTarget ? { linkTarget } : {}
|
|
1318
|
+
});
|
|
1319
|
+
}
|
|
1320
|
+
return out;
|
|
1321
|
+
}
|
|
1322
|
+
function allocateCustomPropertyIds(properties) {
|
|
1323
|
+
const used = /* @__PURE__ */ new Set();
|
|
1324
|
+
const kept = properties.map((property) => {
|
|
1325
|
+
const pid = property.pid;
|
|
1326
|
+
if (pid === void 0 || !Number.isInteger(pid) || pid < 2 || used.has(pid)) return void 0;
|
|
1327
|
+
used.add(pid);
|
|
1328
|
+
return pid;
|
|
1329
|
+
});
|
|
1330
|
+
let next = Math.max(1, ...used) + 1;
|
|
1331
|
+
return kept.map((pid) => pid ?? next++);
|
|
1332
|
+
}
|
|
1333
|
+
function variantXml(property) {
|
|
1334
|
+
switch (property.type) {
|
|
1335
|
+
case "raw":
|
|
1336
|
+
return property.xml;
|
|
1337
|
+
case "lpwstr":
|
|
1338
|
+
return `<vt:lpwstr>${escape(property.value)}</vt:lpwstr>`;
|
|
1339
|
+
case "i4":
|
|
1340
|
+
return `<vt:i4>${Math.trunc(property.value)}</vt:i4>`;
|
|
1341
|
+
case "r8":
|
|
1342
|
+
return `<vt:r8>${String(property.value)}</vt:r8>`;
|
|
1343
|
+
case "bool":
|
|
1344
|
+
return `<vt:bool>${property.value ? "true" : "false"}</vt:bool>`;
|
|
1345
|
+
case "filetime":
|
|
1346
|
+
return `<vt:filetime>${escape(property.value)}</vt:filetime>`;
|
|
1347
|
+
}
|
|
1348
|
+
}
|
|
1349
|
+
function writeCustomProperties(properties) {
|
|
1350
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1351
|
+
const unique = properties.filter((property) => {
|
|
1352
|
+
const key = property.name.toLowerCase();
|
|
1353
|
+
if (!property.name || seen.has(key)) return false;
|
|
1354
|
+
seen.add(key);
|
|
1355
|
+
return true;
|
|
1356
|
+
});
|
|
1357
|
+
if (!unique.length) return void 0;
|
|
1358
|
+
const pids = allocateCustomPropertyIds(unique);
|
|
1359
|
+
const body = unique.map((property, index) => {
|
|
1360
|
+
const link = property.linkTarget ? ` linkTarget="${escape(property.linkTarget, true)}"` : "";
|
|
1361
|
+
return `<property fmtid="${CUSTOM_PROPERTIES_FMTID}" pid="${pids[index] ?? index + 2}" name="${escape(property.name, true)}"${link}>${variantXml(property)}</property>`;
|
|
1362
|
+
}).join("");
|
|
1363
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
1364
|
+
<Properties xmlns="${NS.customProperties}" xmlns:vt="${NS.vt}">${body}</Properties>`;
|
|
1365
|
+
}
|
|
1366
|
+
|
|
1367
|
+
// src/opc/signature/index.ts
|
|
1368
|
+
var signature_exports = {};
|
|
1369
|
+
__export(signature_exports, {
|
|
1370
|
+
DIGEST_ALGORITHM_TO_HASH: () => DIGEST_ALGORITHM_TO_HASH,
|
|
1371
|
+
DIGEST_ALGORITHM_TO_WEB_CRYPTO: () => DIGEST_ALGORITHM_TO_WEB_CRYPTO,
|
|
1372
|
+
DIGITAL_SIGNATURE_ORIGIN_REL_TYPE: () => DIGITAL_SIGNATURE_ORIGIN_REL_TYPE,
|
|
1373
|
+
DIGITAL_SIGNATURE_REL_TYPE: () => DIGITAL_SIGNATURE_REL_TYPE,
|
|
1374
|
+
ENTERPRISE_FAIL_ON_REVOCATION_UNKNOWN_ENV: () => ENTERPRISE_FAIL_ON_REVOCATION_UNKNOWN_ENV,
|
|
1375
|
+
ENTERPRISE_REQUIRE_REVOCATION_ENV: () => ENTERPRISE_REQUIRE_REVOCATION_ENV,
|
|
1376
|
+
ENTERPRISE_REQUIRE_TIMESTAMP_ENV: () => ENTERPRISE_REQUIRE_TIMESTAMP_ENV,
|
|
1377
|
+
ENTERPRISE_TRUST_ROOTS_FILE_ENV: () => ENTERPRISE_TRUST_ROOTS_FILE_ENV,
|
|
1378
|
+
ENTERPRISE_TRUST_ROOTS_PEM_ENV: () => ENTERPRISE_TRUST_ROOTS_PEM_ENV,
|
|
1379
|
+
OPC_RELATIONSHIP_TRANSFORM: () => OPC_RELATIONSHIP_TRANSFORM,
|
|
1380
|
+
PPTX_VIEWER_MANIFEST_NS: () => PPTX_VIEWER_MANIFEST_NS,
|
|
1381
|
+
SIGNATURE_PART_PREFIX: () => SIGNATURE_PART_PREFIX,
|
|
1382
|
+
SUPPORTED_XML_CANON_TRANSFORMS: () => SUPPORTED_XML_CANON_TRANSFORMS,
|
|
1383
|
+
XMLDSIG_NS: () => XMLDSIG_NS,
|
|
1384
|
+
XML_TRANSFORM_ENVELOPED_SIGNATURE: () => XML_TRANSFORM_ENVELOPED_SIGNATURE,
|
|
1385
|
+
computeDetailStatus: () => computeDetailStatus,
|
|
1386
|
+
computeDigestBase64: () => computeDigestBase64,
|
|
1387
|
+
computeVerificationStatus: () => computeVerificationStatus,
|
|
1388
|
+
detectDigitalSignatures: () => detectDigitalSignatures,
|
|
1389
|
+
escapeXmlAttr: () => escapeXmlAttr,
|
|
1390
|
+
escapeXmlText: () => escapeXmlText,
|
|
1391
|
+
extractAllTagText: () => extractAllTagText,
|
|
1392
|
+
extractFirstTagText: () => extractFirstTagText,
|
|
1393
|
+
extractTagAttribute: () => extractTagAttribute,
|
|
1394
|
+
getSignaturePathsToStrip: () => getSignaturePathsToStrip,
|
|
1395
|
+
isSignaturePart: () => isSignaturePart,
|
|
1396
|
+
isValidBase64: () => isValidBase64,
|
|
1397
|
+
normalizePartPath: () => normalizePartPath,
|
|
1398
|
+
parseSignatureXml: () => parseSignatureXml,
|
|
1399
|
+
resolveReferenceUriToPart: () => resolveReferenceUriToPart,
|
|
1400
|
+
verifySignatureDigests: () => verifySignatureDigests
|
|
1401
|
+
});
|
|
1402
|
+
|
|
1403
|
+
// src/opc/signature/detection.ts
|
|
1404
|
+
var SIGNATURE_PART_PREFIX = "_xmlsignatures/";
|
|
1405
|
+
var SIGNATURE_PREFIX = SIGNATURE_PART_PREFIX;
|
|
1406
|
+
function isSignaturePart(path) {
|
|
1407
|
+
return path.replace(/^\//, "").toLowerCase().startsWith(SIGNATURE_PART_PREFIX);
|
|
1408
|
+
}
|
|
1409
|
+
function detectDigitalSignatures(zipEntryPaths) {
|
|
1410
|
+
const sigPaths = zipEntryPaths.filter(
|
|
1411
|
+
(p) => p.startsWith(SIGNATURE_PREFIX) && p.endsWith(".xml")
|
|
1412
|
+
);
|
|
1413
|
+
return {
|
|
1414
|
+
hasSignatures: sigPaths.length > 0,
|
|
1415
|
+
signatureCount: sigPaths.length,
|
|
1416
|
+
signaturePaths: sigPaths
|
|
1417
|
+
};
|
|
1418
|
+
}
|
|
1419
|
+
function getSignaturePathsToStrip(zipEntryPaths) {
|
|
1420
|
+
return zipEntryPaths.filter((p) => p.startsWith(SIGNATURE_PREFIX));
|
|
1421
|
+
}
|
|
1422
|
+
function findByLocalName(parent, localName) {
|
|
1423
|
+
if (!parent) {
|
|
1424
|
+
return void 0;
|
|
1425
|
+
}
|
|
1426
|
+
if (parent[localName] !== void 0 && typeof parent[localName] === "object") {
|
|
1427
|
+
return parent[localName];
|
|
1428
|
+
}
|
|
1429
|
+
for (const key of Object.keys(parent)) {
|
|
1430
|
+
const parts = key.split(":");
|
|
1431
|
+
if (parts[parts.length - 1] === localName && typeof parent[key] === "object") {
|
|
1432
|
+
return parent[key];
|
|
1433
|
+
}
|
|
1434
|
+
}
|
|
1435
|
+
return void 0;
|
|
1436
|
+
}
|
|
1437
|
+
function findScalarByLocalName(parent, localName) {
|
|
1438
|
+
if (!parent) {
|
|
1439
|
+
return void 0;
|
|
1440
|
+
}
|
|
1441
|
+
if (parent[localName] !== void 0) {
|
|
1442
|
+
const v = parent[localName];
|
|
1443
|
+
if (typeof v === "string") {
|
|
1444
|
+
return v;
|
|
1445
|
+
}
|
|
1446
|
+
if (typeof v === "number" || typeof v === "boolean") {
|
|
1447
|
+
return String(v);
|
|
1448
|
+
}
|
|
1449
|
+
if (typeof v === "object" && v !== null && "#text" in v) {
|
|
1450
|
+
return String(v["#text"]);
|
|
1451
|
+
}
|
|
1452
|
+
}
|
|
1453
|
+
for (const key of Object.keys(parent)) {
|
|
1454
|
+
const parts = key.split(":");
|
|
1455
|
+
if (parts[parts.length - 1] === localName) {
|
|
1456
|
+
const v = parent[key];
|
|
1457
|
+
if (typeof v === "string") {
|
|
1458
|
+
return v;
|
|
1459
|
+
}
|
|
1460
|
+
if (typeof v === "number" || typeof v === "boolean") {
|
|
1461
|
+
return String(v);
|
|
1462
|
+
}
|
|
1463
|
+
if (typeof v === "object" && v !== null && "#text" in v) {
|
|
1464
|
+
return String(v["#text"]);
|
|
1465
|
+
}
|
|
1466
|
+
}
|
|
1467
|
+
}
|
|
1468
|
+
return void 0;
|
|
1469
|
+
}
|
|
1470
|
+
function findAllByLocalName(parent, localName) {
|
|
1471
|
+
if (!parent) {
|
|
1472
|
+
return [];
|
|
1473
|
+
}
|
|
1474
|
+
for (const key of Object.keys(parent)) {
|
|
1475
|
+
const parts = key.split(":");
|
|
1476
|
+
if (parts[parts.length - 1] === localName) {
|
|
1477
|
+
const v = parent[key];
|
|
1478
|
+
if (Array.isArray(v)) {
|
|
1479
|
+
return v;
|
|
1480
|
+
}
|
|
1481
|
+
if (typeof v === "object" && v !== null) {
|
|
1482
|
+
return [v];
|
|
1483
|
+
}
|
|
1484
|
+
}
|
|
1485
|
+
}
|
|
1486
|
+
return [];
|
|
1487
|
+
}
|
|
1488
|
+
function parseSignatureXml(signatureXml, signaturePath) {
|
|
1489
|
+
const signature = findByLocalName(signatureXml, "Signature");
|
|
1490
|
+
const signedInfo = findByLocalName(signature, "SignedInfo");
|
|
1491
|
+
const sigMethodNode = findByLocalName(signedInfo, "SignatureMethod");
|
|
1492
|
+
const signatureMethod = sigMethodNode?.["@_Algorithm"];
|
|
1493
|
+
const signatureValue = findScalarByLocalName(signature, "SignatureValue")?.replace(/\s+/g, "");
|
|
1494
|
+
const references = [];
|
|
1495
|
+
const refNodes = findAllByLocalName(signedInfo, "Reference");
|
|
1496
|
+
for (const ref of refNodes) {
|
|
1497
|
+
const uri = String(ref["@_URI"] || "");
|
|
1498
|
+
const dmNode = findByLocalName(ref, "DigestMethod");
|
|
1499
|
+
const digestMethod2 = dmNode?.["@_Algorithm"];
|
|
1500
|
+
const digestValue = findScalarByLocalName(ref, "DigestValue")?.replace(/\s+/g, "");
|
|
1501
|
+
references.push({
|
|
1502
|
+
uri,
|
|
1503
|
+
...digestMethod2 === void 0 ? {} : { digestMethod: digestMethod2 },
|
|
1504
|
+
...digestValue === void 0 ? {} : { digestValue }
|
|
1505
|
+
});
|
|
1506
|
+
}
|
|
1507
|
+
const digestMethod = references[0]?.digestMethod;
|
|
1508
|
+
const keyInfo = findByLocalName(signature, "KeyInfo");
|
|
1509
|
+
const x509Data = findByLocalName(keyInfo, "X509Data");
|
|
1510
|
+
let certificate;
|
|
1511
|
+
if (x509Data) {
|
|
1512
|
+
const certBase64 = findScalarByLocalName(x509Data, "X509Certificate")?.replace(/\s+/g, "");
|
|
1513
|
+
if (certBase64) {
|
|
1514
|
+
const issuerSerial = findByLocalName(x509Data, "X509IssuerSerial");
|
|
1515
|
+
const issuer = findScalarByLocalName(issuerSerial, "X509IssuerName");
|
|
1516
|
+
const serialNumber = findScalarByLocalName(issuerSerial, "X509SerialNumber");
|
|
1517
|
+
const subject = findScalarByLocalName(x509Data, "X509SubjectName");
|
|
1518
|
+
certificate = {
|
|
1519
|
+
certificateBase64: certBase64,
|
|
1520
|
+
...issuer ? { issuer } : {},
|
|
1521
|
+
...subject ? { subject } : {},
|
|
1522
|
+
...serialNumber ? { serialNumber } : {}
|
|
1523
|
+
};
|
|
1524
|
+
}
|
|
1525
|
+
}
|
|
1526
|
+
let status = "unverified";
|
|
1527
|
+
if (certificate?.validTo) {
|
|
1528
|
+
const expiry = new Date(certificate.validTo);
|
|
1529
|
+
if (expiry < /* @__PURE__ */ new Date()) {
|
|
1530
|
+
status = "expired";
|
|
1531
|
+
}
|
|
1532
|
+
}
|
|
1533
|
+
return {
|
|
1534
|
+
signaturePath,
|
|
1535
|
+
...signatureMethod === void 0 ? {} : { signatureMethod },
|
|
1536
|
+
...digestMethod === void 0 ? {} : { digestMethod },
|
|
1537
|
+
...signatureValue === void 0 ? {} : { signatureValue },
|
|
1538
|
+
...certificate === void 0 ? {} : { certificate },
|
|
1539
|
+
status,
|
|
1540
|
+
references
|
|
1541
|
+
};
|
|
1542
|
+
}
|
|
1543
|
+
async function verifySignatureDigests(signature, getPartContent) {
|
|
1544
|
+
if (!signature.references.length) {
|
|
1545
|
+
return "unverified";
|
|
1546
|
+
}
|
|
1547
|
+
if (typeof globalThis.crypto?.subtle === "undefined") {
|
|
1548
|
+
return "unverified";
|
|
1549
|
+
}
|
|
1550
|
+
for (const ref of signature.references) {
|
|
1551
|
+
if (!ref.digestValue || !ref.uri) {
|
|
1552
|
+
continue;
|
|
1553
|
+
}
|
|
1554
|
+
const algo = ref.digestMethod?.toLowerCase() || "";
|
|
1555
|
+
let hashAlgo;
|
|
1556
|
+
if (algo.includes("sha256") || algo.includes("sha-256")) {
|
|
1557
|
+
hashAlgo = "SHA-256";
|
|
1558
|
+
} else if (algo.includes("sha512") || algo.includes("sha-512")) {
|
|
1559
|
+
hashAlgo = "SHA-512";
|
|
1560
|
+
} else if (algo.includes("sha1") || algo.includes("sha-1")) {
|
|
1561
|
+
hashAlgo = "SHA-1";
|
|
1562
|
+
} else {
|
|
1563
|
+
continue;
|
|
1564
|
+
}
|
|
1565
|
+
const content = await getPartContent(ref.uri);
|
|
1566
|
+
if (!content) {
|
|
1567
|
+
continue;
|
|
1568
|
+
}
|
|
1569
|
+
try {
|
|
1570
|
+
const digest = await crypto.subtle.digest(hashAlgo, content);
|
|
1571
|
+
const digestBase64 = arrayBufferToBase64(digest);
|
|
1572
|
+
if (digestBase64 !== ref.digestValue) {
|
|
1573
|
+
return "invalid";
|
|
1574
|
+
}
|
|
1575
|
+
} catch {
|
|
1576
|
+
return "unverified";
|
|
1577
|
+
}
|
|
1578
|
+
}
|
|
1579
|
+
return signature.certificate ? "valid" : "unknownCA";
|
|
1580
|
+
}
|
|
1581
|
+
function arrayBufferToBase64(buffer) {
|
|
1582
|
+
const bytes = new Uint8Array(buffer);
|
|
1583
|
+
let binary = "";
|
|
1584
|
+
for (let i = 0; i < bytes.byteLength; i++) {
|
|
1585
|
+
binary += String.fromCharCode(bytes[i]);
|
|
1586
|
+
}
|
|
1587
|
+
return btoa(binary);
|
|
1588
|
+
}
|
|
1589
|
+
|
|
1590
|
+
// src/opc/signature/constants.ts
|
|
1591
|
+
var DIGITAL_SIGNATURE_ORIGIN_REL_TYPE = "http://schemas.openxmlformats.org/package/2006/relationships/digital-signature/origin";
|
|
1592
|
+
var DIGITAL_SIGNATURE_REL_TYPE = "http://schemas.openxmlformats.org/package/2006/relationships/digital-signature/signature";
|
|
1593
|
+
var PPTX_VIEWER_MANIFEST_NS = "urn:pptx-viewer:ooxml-signature:v1";
|
|
1594
|
+
var XMLDSIG_NS = "http://www.w3.org/2000/09/xmldsig#";
|
|
1595
|
+
var OPC_RELATIONSHIP_TRANSFORM = "http://schemas.openxmlformats.org/package/2006/RelationshipTransform";
|
|
1596
|
+
var XML_TRANSFORM_ENVELOPED_SIGNATURE = "http://www.w3.org/2000/09/xmldsig#enveloped-signature";
|
|
1597
|
+
var SUPPORTED_XML_CANON_TRANSFORMS = /* @__PURE__ */ new Set([
|
|
1598
|
+
"http://www.w3.org/TR/2001/REC-xml-c14n-20010315",
|
|
1599
|
+
"http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments",
|
|
1600
|
+
"http://www.w3.org/2001/10/xml-exc-c14n#",
|
|
1601
|
+
"http://www.w3.org/2001/10/xml-exc-c14n#WithComments",
|
|
1602
|
+
XML_TRANSFORM_ENVELOPED_SIGNATURE
|
|
1603
|
+
]);
|
|
1604
|
+
var ENTERPRISE_TRUST_ROOTS_FILE_ENV = "PPTX_VIEWER_TRUST_ROOTS_FILE";
|
|
1605
|
+
var ENTERPRISE_TRUST_ROOTS_PEM_ENV = "PPTX_VIEWER_TRUST_ROOTS_PEM";
|
|
1606
|
+
var ENTERPRISE_REQUIRE_REVOCATION_ENV = "PPTX_VIEWER_REQUIRE_REVOCATION_CHECK";
|
|
1607
|
+
var ENTERPRISE_FAIL_ON_REVOCATION_UNKNOWN_ENV = "PPTX_VIEWER_FAIL_ON_REVOCATION_UNKNOWN";
|
|
1608
|
+
var ENTERPRISE_REQUIRE_TIMESTAMP_ENV = "PPTX_VIEWER_REQUIRE_TIMESTAMP";
|
|
1609
|
+
var DIGEST_ALGORITHM_TO_HASH = {
|
|
1610
|
+
"http://www.w3.org/2000/09/xmldsig#sha1": "sha1",
|
|
1611
|
+
"http://www.w3.org/2001/04/xmlenc#sha256": "sha256",
|
|
1612
|
+
"http://www.w3.org/2001/04/xmlenc#sha384": "sha384",
|
|
1613
|
+
"http://www.w3.org/2001/04/xmlenc#sha512": "sha512"
|
|
1614
|
+
};
|
|
1615
|
+
var DIGEST_ALGORITHM_TO_WEB_CRYPTO = {
|
|
1616
|
+
"http://www.w3.org/2000/09/xmldsig#sha1": "SHA-1",
|
|
1617
|
+
"http://www.w3.org/2001/04/xmlenc#sha256": "SHA-256",
|
|
1618
|
+
"http://www.w3.org/2001/04/xmlenc#sha384": "SHA-384",
|
|
1619
|
+
"http://www.w3.org/2001/04/xmlenc#sha512": "SHA-512"
|
|
1620
|
+
};
|
|
1621
|
+
|
|
1622
|
+
// src/opc/signature/xml-utils.ts
|
|
1623
|
+
function escapeXmlAttr(value) {
|
|
1624
|
+
return value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
1625
|
+
}
|
|
1626
|
+
function escapeXmlText(value) {
|
|
1627
|
+
return value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
1628
|
+
}
|
|
1629
|
+
function isValidBase64(value) {
|
|
1630
|
+
return typeof value === "string" && value.length > 0 && /^[A-Za-z0-9+/=\s]+$/.test(value);
|
|
1631
|
+
}
|
|
1632
|
+
function extractTagAttribute(xml, tagName, attributeName) {
|
|
1633
|
+
const pattern = new RegExp(
|
|
1634
|
+
`<${tagName}\\b[^>]*\\b${attributeName}="(?<attributeValue>[^"]+)"`,
|
|
1635
|
+
"i"
|
|
1636
|
+
);
|
|
1637
|
+
const match = xml.match(pattern);
|
|
1638
|
+
return match?.groups?.["attributeValue"]?.trim();
|
|
1639
|
+
}
|
|
1640
|
+
function extractFirstTagText(xml, localName) {
|
|
1641
|
+
const pattern = new RegExp(
|
|
1642
|
+
`<([\\w.-]+:)?${localName}\\b[^>]*>([\\s\\S]*?)<\\/([\\w.-]+:)?${localName}>`,
|
|
1643
|
+
"i"
|
|
1644
|
+
);
|
|
1645
|
+
const match = xml.match(pattern);
|
|
1646
|
+
return match?.[2]?.replace(/\s+/g, "").trim() || void 0;
|
|
1647
|
+
}
|
|
1648
|
+
function extractAllTagText(xml, localName) {
|
|
1649
|
+
const result = [];
|
|
1650
|
+
const regex = new RegExp(
|
|
1651
|
+
`<([\\w.-]+:)?${localName}\\b[^>]*>([\\s\\S]*?)<\\/([\\w.-]+:)?${localName}>`,
|
|
1652
|
+
"gi"
|
|
1653
|
+
);
|
|
1654
|
+
let match = regex.exec(xml);
|
|
1655
|
+
while (match) {
|
|
1656
|
+
const value = match[2]?.replace(/\s+/g, "").trim();
|
|
1657
|
+
if (value) {
|
|
1658
|
+
result.push(value);
|
|
1659
|
+
}
|
|
1660
|
+
match = regex.exec(xml);
|
|
1661
|
+
}
|
|
1662
|
+
return result;
|
|
1663
|
+
}
|
|
1664
|
+
|
|
1665
|
+
// src/opc/signature/reference-utils.ts
|
|
1666
|
+
function normalizePartPath(partPath) {
|
|
1667
|
+
return partPath.replace(/\\/g, "/").replace(/^\/+/, "");
|
|
1668
|
+
}
|
|
1669
|
+
function resolveReferenceUriToPart(uri) {
|
|
1670
|
+
const trimmed = uri.trim();
|
|
1671
|
+
if (trimmed.length === 0 || trimmed.startsWith("#")) {
|
|
1672
|
+
return void 0;
|
|
1673
|
+
}
|
|
1674
|
+
const decoded = decodeURIComponent(trimmed);
|
|
1675
|
+
return normalizePartPath(decoded.startsWith("/") ? decoded.slice(1) : decoded);
|
|
1676
|
+
}
|
|
1677
|
+
|
|
1678
|
+
// src/opc/signature/digest.ts
|
|
1679
|
+
async function computeDigestBase64(content, digestAlgorithmUri) {
|
|
1680
|
+
const webCryptoAlgo = DIGEST_ALGORITHM_TO_WEB_CRYPTO[digestAlgorithmUri];
|
|
1681
|
+
if (!webCryptoAlgo) {
|
|
1682
|
+
return void 0;
|
|
1683
|
+
}
|
|
1684
|
+
if (typeof globalThis.crypto?.subtle === "undefined") {
|
|
1685
|
+
return void 0;
|
|
1686
|
+
}
|
|
1687
|
+
const buf = new ArrayBuffer(content.byteLength);
|
|
1688
|
+
new Uint8Array(buf).set(content);
|
|
1689
|
+
const digest = await globalThis.crypto.subtle.digest(webCryptoAlgo, buf);
|
|
1690
|
+
return uint8ArrayToBase64(new Uint8Array(digest));
|
|
1691
|
+
}
|
|
1692
|
+
function uint8ArrayToBase64(bytes) {
|
|
1693
|
+
let binary = "";
|
|
1694
|
+
for (let i = 0; i < bytes.byteLength; i++) {
|
|
1695
|
+
binary += String.fromCharCode(bytes[i]);
|
|
1696
|
+
}
|
|
1697
|
+
return btoa(binary);
|
|
1698
|
+
}
|
|
1699
|
+
|
|
1700
|
+
// src/opc/signature/inspection-status.ts
|
|
1701
|
+
function computeDetailStatus(detail, policy) {
|
|
1702
|
+
const hasDigestMismatch = detail.referenceChecks.some(
|
|
1703
|
+
(check) => check.digestStatus === "mismatch"
|
|
1704
|
+
);
|
|
1705
|
+
const hasMissingPart = detail.missingPartReferences.length > 0;
|
|
1706
|
+
const hasVerifiedDigest = detail.referenceChecks.some(
|
|
1707
|
+
(check) => check.digestStatus === "verified"
|
|
1708
|
+
);
|
|
1709
|
+
const revocationUnknown = detail.certificateRevocationStatus === "unknown" || detail.certificateRevocationStatus === "not-checked" || detail.certificateRevocationStatus === "error";
|
|
1710
|
+
const timestampMissingOrUntrusted = detail.timestampAuthorityStatus === "not-present" || detail.timestampAuthorityStatus === "not-checked" || detail.timestampAuthorityStatus === "error" || detail.timestampAuthorityStatus === "untrusted";
|
|
1711
|
+
if (detail.signatureValueStatus === "invalid") {
|
|
1712
|
+
return "signature-invalid";
|
|
1713
|
+
}
|
|
1714
|
+
if (hasMissingPart) {
|
|
1715
|
+
return "reference-missing";
|
|
1716
|
+
}
|
|
1717
|
+
if (hasDigestMismatch) {
|
|
1718
|
+
return "digest-mismatch";
|
|
1719
|
+
}
|
|
1720
|
+
if (detail.certificateRevocationStatus === "revoked") {
|
|
1721
|
+
return "certificate-revoked";
|
|
1722
|
+
}
|
|
1723
|
+
if (policy.requireRevocationCheck && (policy.failOnRevocationUnknown ? revocationUnknown : detail.certificateRevocationStatus !== "good")) {
|
|
1724
|
+
return "certificate-untrusted";
|
|
1725
|
+
}
|
|
1726
|
+
if (detail.timestampAuthorityStatus === "invalid") {
|
|
1727
|
+
return "timestamp-invalid";
|
|
1728
|
+
}
|
|
1729
|
+
if (policy.requireTimestamp && timestampMissingOrUntrusted) {
|
|
1730
|
+
return "timestamp-untrusted";
|
|
1731
|
+
}
|
|
1732
|
+
if (detail.timestampAuthorityStatus === "untrusted") {
|
|
1733
|
+
return "timestamp-untrusted";
|
|
1734
|
+
}
|
|
1735
|
+
if (detail.certificateTrustStatus === "untrusted" && detail.signatureValueStatus === "verified") {
|
|
1736
|
+
return "certificate-untrusted";
|
|
1737
|
+
}
|
|
1738
|
+
if (hasVerifiedDigest && detail.signatureValueStatus === "verified") {
|
|
1739
|
+
return "verified";
|
|
1740
|
+
}
|
|
1741
|
+
return "structural-only";
|
|
1742
|
+
}
|
|
1743
|
+
function computeVerificationStatus(details) {
|
|
1744
|
+
const hasInvalidSignature = details.some((detail) => detail.status === "signature-invalid");
|
|
1745
|
+
const hasMissing = details.some((detail) => detail.status === "reference-missing");
|
|
1746
|
+
const hasMismatch = details.some((detail) => detail.status === "digest-mismatch");
|
|
1747
|
+
const hasUntrusted = details.some((detail) => detail.status === "certificate-untrusted");
|
|
1748
|
+
const hasRevoked = details.some((detail) => detail.status === "certificate-revoked");
|
|
1749
|
+
const hasTimestampInvalid = details.some((detail) => detail.status === "timestamp-invalid");
|
|
1750
|
+
const hasTimestampUntrusted = details.some((detail) => detail.status === "timestamp-untrusted");
|
|
1751
|
+
const allVerified = details.every((detail) => detail.status === "verified");
|
|
1752
|
+
return hasInvalidSignature ? "signature-invalid" : hasRevoked ? "certificate-revoked" : hasTimestampInvalid ? "timestamp-invalid" : hasTimestampUntrusted ? "timestamp-untrusted" : hasMissing ? "reference-missing" : hasMismatch ? "digest-mismatch" : allVerified ? "verified-trusted" : hasUntrusted ? "verified-untrusted" : "present-not-verified";
|
|
1753
|
+
}
|
|
1024
1754
|
|
|
1025
1755
|
// src/diagram/relationships.ts
|
|
1026
1756
|
function diagramRelationshipsPart(partPath) {
|
|
@@ -1428,11 +2158,11 @@ function styleRef(element) {
|
|
|
1428
2158
|
function parseStyleReferences(style) {
|
|
1429
2159
|
const refs = {};
|
|
1430
2160
|
const line2 = styleRef(first(style, "lnRef", NS.a));
|
|
1431
|
-
const
|
|
2161
|
+
const fill2 = styleRef(first(style, "fillRef", NS.a));
|
|
1432
2162
|
const effect = styleRef(first(style, "effectRef", NS.a));
|
|
1433
2163
|
const font = styleRef(first(style, "fontRef", NS.a));
|
|
1434
2164
|
if (line2) refs.line = line2;
|
|
1435
|
-
if (
|
|
2165
|
+
if (fill2) refs.fill = fill2;
|
|
1436
2166
|
if (effect) refs.effect = effect;
|
|
1437
2167
|
if (font) refs.font = font;
|
|
1438
2168
|
return refs;
|
|
@@ -1484,23 +2214,23 @@ function fillElementOf(properties) {
|
|
|
1484
2214
|
) : void 0;
|
|
1485
2215
|
}
|
|
1486
2216
|
function parseDrawingFill(properties) {
|
|
1487
|
-
const
|
|
1488
|
-
if (!
|
|
1489
|
-
switch (
|
|
2217
|
+
const fill2 = fillElementOf(properties);
|
|
2218
|
+
if (!fill2) return void 0;
|
|
2219
|
+
switch (fill2.localName) {
|
|
1490
2220
|
case "noFill":
|
|
1491
2221
|
return { kind: "none" };
|
|
1492
2222
|
case "solidFill": {
|
|
1493
|
-
const color = parseDrawingColorIn(
|
|
2223
|
+
const color = parseDrawingColorIn(fill2);
|
|
1494
2224
|
return color ? { kind: "solid", color } : { kind: "unsupported", element: "solidFill" };
|
|
1495
2225
|
}
|
|
1496
2226
|
case "gradFill": {
|
|
1497
|
-
const stops = children(first(
|
|
2227
|
+
const stops = children(first(fill2, "gsLst", NS.a) ?? fill2, "gs", NS.a).flatMap((stop) => {
|
|
1498
2228
|
const color = parseDrawingColorIn(stop);
|
|
1499
2229
|
const position = Number.parseInt(stop.getAttribute("pos") ?? "", 10);
|
|
1500
2230
|
return color && Number.isFinite(position) ? [{ position: position / 1e3, color }] : [];
|
|
1501
2231
|
});
|
|
1502
|
-
const angle = Number.parseInt(first(
|
|
1503
|
-
const path = first(
|
|
2232
|
+
const angle = Number.parseInt(first(fill2, "lin", NS.a)?.getAttribute("ang") ?? "", 10);
|
|
2233
|
+
const path = first(fill2, "path", NS.a)?.getAttribute("path");
|
|
1504
2234
|
return {
|
|
1505
2235
|
kind: "gradient",
|
|
1506
2236
|
stops,
|
|
@@ -1509,22 +2239,22 @@ function parseDrawingFill(properties) {
|
|
|
1509
2239
|
};
|
|
1510
2240
|
}
|
|
1511
2241
|
case "pattFill": {
|
|
1512
|
-
const foreground = parseDrawingColorIn(first(
|
|
1513
|
-
const background = parseDrawingColorIn(first(
|
|
2242
|
+
const foreground = parseDrawingColorIn(first(fill2, "fgClr", NS.a));
|
|
2243
|
+
const background = parseDrawingColorIn(first(fill2, "bgClr", NS.a));
|
|
1514
2244
|
return {
|
|
1515
2245
|
kind: "pattern",
|
|
1516
|
-
preset:
|
|
2246
|
+
preset: fill2.getAttribute("prst") ?? "",
|
|
1517
2247
|
...foreground ? { foreground } : {},
|
|
1518
2248
|
...background ? { background } : {}
|
|
1519
2249
|
};
|
|
1520
2250
|
}
|
|
1521
2251
|
case "blipFill": {
|
|
1522
|
-
const blip = first(
|
|
2252
|
+
const blip = first(fill2, "blip", NS.a);
|
|
1523
2253
|
const relId = blip?.getAttributeNS(NS.r, "embed") || blip?.getAttribute("r:embed") || void 0;
|
|
1524
2254
|
return { kind: "picture", ...relId ? { relId } : {} };
|
|
1525
2255
|
}
|
|
1526
2256
|
default:
|
|
1527
|
-
return { kind: "unsupported", element:
|
|
2257
|
+
return { kind: "unsupported", element: fill2.localName };
|
|
1528
2258
|
}
|
|
1529
2259
|
}
|
|
1530
2260
|
function parseDrawingLine(ln) {
|
|
@@ -1532,8 +2262,8 @@ function parseDrawingLine(ln) {
|
|
|
1532
2262
|
const line2 = {};
|
|
1533
2263
|
const width = Number.parseInt(ln.getAttribute("w") ?? "", 10);
|
|
1534
2264
|
if (Number.isFinite(width)) line2.widthEmu = width;
|
|
1535
|
-
const
|
|
1536
|
-
if (
|
|
2265
|
+
const fill2 = parseDrawingFill(ln);
|
|
2266
|
+
if (fill2) line2.fill = fill2;
|
|
1537
2267
|
const dash = first(ln, "prstDash", NS.a)?.getAttribute("val");
|
|
1538
2268
|
if (dash) line2.dash = dash;
|
|
1539
2269
|
const cap = ln.getAttribute("cap");
|
|
@@ -1753,8 +2483,8 @@ function parseShape(sp, index, group, issues) {
|
|
|
1753
2483
|
if (transform.flipVertical) shape.flipVertical = true;
|
|
1754
2484
|
if (adjustments) shape.adjustments = adjustments;
|
|
1755
2485
|
if (paths) shape.paths = paths;
|
|
1756
|
-
const
|
|
1757
|
-
if (
|
|
2486
|
+
const fill2 = parseDrawingFill(spPr);
|
|
2487
|
+
if (fill2) shape.fill = fill2;
|
|
1758
2488
|
const line2 = parseDrawingLine(first(spPr, "ln", NS.a));
|
|
1759
2489
|
if (line2) shape.line = line2;
|
|
1760
2490
|
const style = first(sp, "style", NS.dsp);
|