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/visio/index.mjs
CHANGED
|
@@ -4350,6 +4350,8 @@ function isSafeHyperlinkHref(href) {
|
|
|
4350
4350
|
const scheme = /^([a-z][a-z0-9+.-]*:)/i.exec(href.trim())?.[1];
|
|
4351
4351
|
return scheme !== void 0 && SAFE_SCHEMES.has(scheme.toLowerCase());
|
|
4352
4352
|
}
|
|
4353
|
+
var OPEN_SCHEMES = /* @__PURE__ */ new Set(["http", "https", "mailto"]);
|
|
4354
|
+
/* @__PURE__ */ new Set([...OPEN_SCHEMES, "ftp", "file"]);
|
|
4353
4355
|
|
|
4354
4356
|
// src/visio/shape-metadata.ts
|
|
4355
4357
|
function createMetadataBudget(options = {}) {
|
|
@@ -4965,16 +4967,16 @@ async function parseVsdx(input, options = {}) {
|
|
|
4965
4967
|
const id = metadata(attribute2(master, "ID") ?? "", 256, "Master ID");
|
|
4966
4968
|
if (!id || masters.has(id))
|
|
4967
4969
|
throw new VisioPackageError("INVALID_MASTER_ID", "Master IDs must be present and unique.");
|
|
4968
|
-
const
|
|
4970
|
+
const masterShapes2 = readShapes(await visioXml(pkg, part, "MasterContents"));
|
|
4969
4971
|
await prepareImages(
|
|
4970
|
-
|
|
4972
|
+
masterShapes2,
|
|
4971
4973
|
pkg,
|
|
4972
4974
|
part,
|
|
4973
4975
|
report,
|
|
4974
4976
|
options.images,
|
|
4975
4977
|
options.metafileConverter
|
|
4976
4978
|
);
|
|
4977
|
-
masters.set(id,
|
|
4979
|
+
masters.set(id, masterShapes2);
|
|
4978
4980
|
}
|
|
4979
4981
|
}
|
|
4980
4982
|
let geometryCount = 0, textCount = 0, expansionCount = 0, textRuns = 0, paragraphCount = 0;
|
|
@@ -5490,6 +5492,105 @@ var themeInputs = [
|
|
|
5490
5492
|
"QuickStyleVariation"
|
|
5491
5493
|
];
|
|
5492
5494
|
|
|
5495
|
+
// src/visio/formula-arithmetic.ts
|
|
5496
|
+
function finiteFormulaValue(value) {
|
|
5497
|
+
if (!Number.isFinite(value.value)) return formulaFailure("value", "Formula result is not finite");
|
|
5498
|
+
if (!["scalar", "length", "area", "angle", "time"].includes(value.unit))
|
|
5499
|
+
return formulaFailure("unit", "Unknown resolved unit");
|
|
5500
|
+
return value;
|
|
5501
|
+
}
|
|
5502
|
+
function compatibleFormulaUnits(a, b) {
|
|
5503
|
+
if (a.unit === b.unit) return a.unit;
|
|
5504
|
+
if (a.unit === "scalar" && a.value === 0) return b.unit;
|
|
5505
|
+
if (b.unit === "scalar" && b.value === 0) return a.unit;
|
|
5506
|
+
return formulaFailure("unit", `Incompatible units ${a.unit} and ${b.unit}`);
|
|
5507
|
+
}
|
|
5508
|
+
var lengthPower = (unit) => unit === "scalar" ? 0 : unit === "length" ? 1 : unit === "area" ? 2 : void 0;
|
|
5509
|
+
function fromPower(power) {
|
|
5510
|
+
if (power === 0) return "scalar";
|
|
5511
|
+
if (power === 1) return "length";
|
|
5512
|
+
if (power === 2) return "area";
|
|
5513
|
+
return formulaFailure("unit", "Unsupported dimensional power");
|
|
5514
|
+
}
|
|
5515
|
+
function formulaProductUnit(a, b) {
|
|
5516
|
+
if (a === "scalar") return b;
|
|
5517
|
+
if (b === "scalar") return a;
|
|
5518
|
+
const left = lengthPower(a), right = lengthPower(b);
|
|
5519
|
+
if (left === void 0 || right === void 0)
|
|
5520
|
+
return formulaFailure("unit", "Mixed dimensions are unsupported");
|
|
5521
|
+
return fromPower(left + right);
|
|
5522
|
+
}
|
|
5523
|
+
function formulaQuotientUnit(a, b) {
|
|
5524
|
+
if (b === "scalar") return a;
|
|
5525
|
+
if (a === b) return "scalar";
|
|
5526
|
+
const left = lengthPower(a), right = lengthPower(b);
|
|
5527
|
+
if (left === void 0 || right === void 0)
|
|
5528
|
+
return formulaFailure("unit", "Mixed dimensions are unsupported");
|
|
5529
|
+
return fromPower(left - right);
|
|
5530
|
+
}
|
|
5531
|
+
function formulaExponentUnit(a, exponent) {
|
|
5532
|
+
if (exponent.unit !== "scalar") return formulaFailure("unit", "Exponents must be scalar");
|
|
5533
|
+
if (a === "scalar") return "scalar";
|
|
5534
|
+
if (exponent.value === 0) return "scalar";
|
|
5535
|
+
if (exponent.value === 1) return a;
|
|
5536
|
+
const power = lengthPower(a);
|
|
5537
|
+
if (power === void 0) return formulaFailure("unit", "Unsupported dimensional power");
|
|
5538
|
+
return fromPower(power * exponent.value);
|
|
5539
|
+
}
|
|
5540
|
+
function formulaSquareRootUnit(unit) {
|
|
5541
|
+
if (unit === "scalar") return "scalar";
|
|
5542
|
+
if (unit === "area") return "length";
|
|
5543
|
+
return formulaFailure("unit", "Square root requires scalar or square inches");
|
|
5544
|
+
}
|
|
5545
|
+
|
|
5546
|
+
// src/visio/formula-numeric-functions.ts
|
|
5547
|
+
var numericFormulaFunctions = /* @__PURE__ */ new Set([
|
|
5548
|
+
"AND",
|
|
5549
|
+
"OR",
|
|
5550
|
+
"NOT",
|
|
5551
|
+
"BITAND",
|
|
5552
|
+
"BITOR",
|
|
5553
|
+
"BITXOR",
|
|
5554
|
+
"MODULUS"
|
|
5555
|
+
]);
|
|
5556
|
+
function evaluateNumericFormulaFunction(name, args) {
|
|
5557
|
+
const arity = (min, max = min) => {
|
|
5558
|
+
if (args.length < min || args.length > max)
|
|
5559
|
+
return formulaFailure("arity", `Invalid ${name} argument count`);
|
|
5560
|
+
};
|
|
5561
|
+
const scalar2 = (value) => ({ value, unit: "scalar" });
|
|
5562
|
+
if (name === "AND" || name === "OR" || name === "NOT") {
|
|
5563
|
+
arity(1, name === "NOT" ? 1 : 1024);
|
|
5564
|
+
const values = args.map((arg) => finiteFormulaValue(arg).value !== 0);
|
|
5565
|
+
return scalar2(
|
|
5566
|
+
Number(
|
|
5567
|
+
name === "AND" ? values.every(Boolean) : name === "OR" ? values.some(Boolean) : !values[0]
|
|
5568
|
+
)
|
|
5569
|
+
);
|
|
5570
|
+
}
|
|
5571
|
+
if (["BITAND", "BITOR", "BITXOR"].includes(name)) {
|
|
5572
|
+
arity(2);
|
|
5573
|
+
const values = args.map((arg) => {
|
|
5574
|
+
if (arg.unit !== "scalar") return formulaFailure("unit", `${name} requires scalar bitmasks`);
|
|
5575
|
+
if (!Number.isInteger(arg.value) || arg.value < 0 || arg.value > 65535)
|
|
5576
|
+
return formulaFailure("value", `${name} requires an integer from 0 to 65535`);
|
|
5577
|
+
return arg.value;
|
|
5578
|
+
});
|
|
5579
|
+
return scalar2(
|
|
5580
|
+
name === "BITAND" ? values[0] & values[1] : name === "BITOR" ? values[0] | values[1] : values[0] ^ values[1]
|
|
5581
|
+
);
|
|
5582
|
+
}
|
|
5583
|
+
if (name === "MODULUS") {
|
|
5584
|
+
arity(2);
|
|
5585
|
+
const dividend = finiteFormulaValue(args[0]), divisor = finiteFormulaValue(args[1]);
|
|
5586
|
+
const unit = compatibleFormulaUnits(dividend, divisor);
|
|
5587
|
+
if (divisor.value === 0) return formulaFailure("value", "MODULUS division by zero");
|
|
5588
|
+
const remainder = dividend.value - Math.floor(dividend.value / divisor.value) * divisor.value;
|
|
5589
|
+
return finiteFormulaValue({ value: remainder === 0 ? 0 : remainder, unit });
|
|
5590
|
+
}
|
|
5591
|
+
return formulaFailure("unsupported", `Unsupported numeric function ${name}`);
|
|
5592
|
+
}
|
|
5593
|
+
|
|
5493
5594
|
// src/visio/formula-evaluate.ts
|
|
5494
5595
|
var supported = /* @__PURE__ */ new Set([
|
|
5495
5596
|
"GUARD",
|
|
@@ -5503,7 +5604,8 @@ var supported = /* @__PURE__ */ new Set([
|
|
|
5503
5604
|
"TAN",
|
|
5504
5605
|
"ATAN2",
|
|
5505
5606
|
"SIGN",
|
|
5506
|
-
"PI"
|
|
5607
|
+
"PI",
|
|
5608
|
+
...numericFormulaFunctions
|
|
5507
5609
|
]);
|
|
5508
5610
|
var staticUnsupported = /* @__PURE__ */ new Set([
|
|
5509
5611
|
"ROUND",
|
|
@@ -5535,7 +5637,9 @@ var staticUnsupported = /* @__PURE__ */ new Set([
|
|
|
5535
5637
|
"BITXOR",
|
|
5536
5638
|
"TINT",
|
|
5537
5639
|
"MSOTINT",
|
|
5538
|
-
"SHADE"
|
|
5640
|
+
"SHADE",
|
|
5641
|
+
"LUMDIFF",
|
|
5642
|
+
"MODULUS"
|
|
5539
5643
|
]);
|
|
5540
5644
|
var dynamic = /* @__PURE__ */ new Set([
|
|
5541
5645
|
"INDIRECT",
|
|
@@ -5594,41 +5698,23 @@ function analyzeVisioFormula(source, limits = {}) {
|
|
|
5594
5698
|
guarded
|
|
5595
5699
|
};
|
|
5596
5700
|
}
|
|
5597
|
-
function finite2(value) {
|
|
5598
|
-
if (!Number.isFinite(value.value)) return formulaFailure("value", "Formula result is not finite");
|
|
5599
|
-
if (!["scalar", "length", "angle", "time"].includes(value.unit))
|
|
5600
|
-
return formulaFailure("unit", "Unknown resolved unit");
|
|
5601
|
-
return value;
|
|
5602
|
-
}
|
|
5603
|
-
function compatible(a, b) {
|
|
5604
|
-
if (a.unit === b.unit) return a.unit;
|
|
5605
|
-
if (a.unit === "scalar" && a.value === 0) return b.unit;
|
|
5606
|
-
if (b.unit === "scalar" && b.value === 0) return a.unit;
|
|
5607
|
-
return formulaFailure("unit", `Incompatible units ${a.unit} and ${b.unit}`);
|
|
5608
|
-
}
|
|
5609
5701
|
function binary(operator, a, b) {
|
|
5610
5702
|
let unit;
|
|
5611
5703
|
if (operator === "+" || operator === "-") {
|
|
5612
|
-
unit =
|
|
5613
|
-
return
|
|
5704
|
+
unit = compatibleFormulaUnits(a, b);
|
|
5705
|
+
return finiteFormulaValue({ value: operator === "+" ? a.value + b.value : a.value - b.value, unit });
|
|
5614
5706
|
}
|
|
5615
5707
|
if (operator === "*") {
|
|
5616
|
-
|
|
5617
|
-
return formulaFailure("unit", "Compound dimensions are unsupported");
|
|
5618
|
-
return finite2({ value: a.value * b.value, unit: a.unit === "scalar" ? b.unit : a.unit });
|
|
5708
|
+
return finiteFormulaValue({ value: a.value * b.value, unit: formulaProductUnit(a.unit, b.unit) });
|
|
5619
5709
|
}
|
|
5620
5710
|
if (operator === "/") {
|
|
5621
5711
|
if (b.value === 0) return formulaFailure("value", "Division by zero");
|
|
5622
|
-
|
|
5623
|
-
return formulaFailure("unit", "Inverse dimensions are unsupported");
|
|
5624
|
-
return finite2({ value: a.value / b.value, unit: a.unit === b.unit ? "scalar" : a.unit });
|
|
5712
|
+
return finiteFormulaValue({ value: a.value / b.value, unit: formulaQuotientUnit(a.unit, b.unit) });
|
|
5625
5713
|
}
|
|
5626
5714
|
if (operator === "^") {
|
|
5627
|
-
|
|
5628
|
-
return formulaFailure("unit", "Dimensional powers are unsupported");
|
|
5629
|
-
return finite2({ value: a.value ** b.value, unit: b.value === 0 ? "scalar" : a.unit });
|
|
5715
|
+
return finiteFormulaValue({ value: a.value ** b.value, unit: formulaExponentUnit(a.unit, b) });
|
|
5630
5716
|
}
|
|
5631
|
-
|
|
5717
|
+
compatibleFormulaUnits(a, b);
|
|
5632
5718
|
const comparisons = {
|
|
5633
5719
|
"=": a.value === b.value,
|
|
5634
5720
|
"<>": a.value !== b.value,
|
|
@@ -5652,13 +5738,13 @@ function evaluateVisioFormula(source, resolve, limits = {}) {
|
|
|
5652
5738
|
if (++steps > maxSteps || depth > maxDepth)
|
|
5653
5739
|
return formulaFailure("limit", "Formula evaluation limit");
|
|
5654
5740
|
limits.onStep?.();
|
|
5655
|
-
if (node.kind === "number") return
|
|
5741
|
+
if (node.kind === "number") return finiteFormulaValue({ value: node.value, unit: node.unit });
|
|
5656
5742
|
if (node.kind === "string")
|
|
5657
5743
|
return formulaFailure("value", "String results are outside the numeric formula subset");
|
|
5658
|
-
if (node.kind === "reference") return
|
|
5744
|
+
if (node.kind === "reference") return finiteFormulaValue(resolve(node.reference));
|
|
5659
5745
|
if (node.kind === "unary") {
|
|
5660
5746
|
const result = evaluate(node.operand, depth + 1);
|
|
5661
|
-
return
|
|
5747
|
+
return finiteFormulaValue({
|
|
5662
5748
|
value: node.operator === "-" ? -result.value : result.value,
|
|
5663
5749
|
unit: result.unit
|
|
5664
5750
|
});
|
|
@@ -5672,6 +5758,11 @@ function evaluateVisioFormula(source, resolve, limits = {}) {
|
|
|
5672
5758
|
return formulaFailure("arity", `Invalid ${name} argument count`);
|
|
5673
5759
|
};
|
|
5674
5760
|
const arg = (index) => evaluate(node.args[index], depth + 1);
|
|
5761
|
+
if (numericFormulaFunctions.has(name))
|
|
5762
|
+
return evaluateNumericFormulaFunction(
|
|
5763
|
+
name,
|
|
5764
|
+
node.args.map((_, index) => arg(index))
|
|
5765
|
+
);
|
|
5675
5766
|
if (name === "PI") {
|
|
5676
5767
|
arity(0);
|
|
5677
5768
|
return { value: Math.PI, unit: "scalar" };
|
|
@@ -5691,18 +5782,18 @@ function evaluateVisioFormula(source, resolve, limits = {}) {
|
|
|
5691
5782
|
const args = node.args.map((_, i) => arg(i));
|
|
5692
5783
|
let result = args[0];
|
|
5693
5784
|
for (const item of args.slice(1)) {
|
|
5694
|
-
const unit =
|
|
5785
|
+
const unit = compatibleFormulaUnits(result, item);
|
|
5695
5786
|
result = {
|
|
5696
5787
|
value: name === "MIN" ? Math.min(result.value, item.value) : Math.max(result.value, item.value),
|
|
5697
5788
|
unit
|
|
5698
5789
|
};
|
|
5699
5790
|
}
|
|
5700
|
-
return
|
|
5791
|
+
return finiteFormulaValue(result);
|
|
5701
5792
|
}
|
|
5702
5793
|
if (name === "ATAN2") {
|
|
5703
5794
|
arity(2);
|
|
5704
5795
|
const y = arg(0), x = arg(1);
|
|
5705
|
-
|
|
5796
|
+
compatibleFormulaUnits(y, x);
|
|
5706
5797
|
return { value: Math.atan2(y.value, x.value), unit: "angle" };
|
|
5707
5798
|
}
|
|
5708
5799
|
if (name === "SIGN") {
|
|
@@ -5720,12 +5811,11 @@ function evaluateVisioFormula(source, resolve, limits = {}) {
|
|
|
5720
5811
|
const value = arg(0);
|
|
5721
5812
|
if (name === "ABS") return { value: Math.abs(value.value), unit: value.unit };
|
|
5722
5813
|
if (name === "SQRT") {
|
|
5723
|
-
|
|
5724
|
-
return finite2({ value: Math.sqrt(value.value), unit: "scalar" });
|
|
5814
|
+
return finiteFormulaValue({ value: Math.sqrt(value.value), unit: formulaSquareRootUnit(value.unit) });
|
|
5725
5815
|
}
|
|
5726
5816
|
if (value.unit !== "angle" && value.unit !== "scalar")
|
|
5727
5817
|
return formulaFailure("unit", `${name} requires radians`);
|
|
5728
|
-
return
|
|
5818
|
+
return finiteFormulaValue({
|
|
5729
5819
|
value: name === "SIN" ? Math.sin(value.value) : name === "COS" ? Math.cos(value.value) : Math.tan(value.value),
|
|
5730
5820
|
unit: "scalar"
|
|
5731
5821
|
});
|
|
@@ -6557,6 +6647,404 @@ function applyGeometryEdit(roots, document, edit, check) {
|
|
|
6557
6647
|
return [.../* @__PURE__ */ new Set([edit.pageId, ...affectedPages])];
|
|
6558
6648
|
}
|
|
6559
6649
|
|
|
6650
|
+
// src/visio/formula-master.ts
|
|
6651
|
+
function analyzeVisioMasterFormula(source, options) {
|
|
6652
|
+
const ast = parseVisioFormula(source);
|
|
6653
|
+
const analysis = analyzeVisioFormula(ast);
|
|
6654
|
+
const references = /* @__PURE__ */ new Map();
|
|
6655
|
+
for (const ref of analysis.references)
|
|
6656
|
+
references.set(`${ref.shapeId ?? ""}!${ref.cell.toLowerCase()}`, ref);
|
|
6657
|
+
let dynamic2 = false, readsText = false, readsTheme = false;
|
|
6658
|
+
const queue = [ast];
|
|
6659
|
+
while (queue.length) {
|
|
6660
|
+
const node = queue.pop();
|
|
6661
|
+
if (node.kind === "unary") queue.push(node.operand);
|
|
6662
|
+
if (node.kind === "binary") queue.push(node.left, node.right);
|
|
6663
|
+
if (node.kind !== "call") continue;
|
|
6664
|
+
queue.push(...node.args);
|
|
6665
|
+
if (["THEME", "THEMEVAL", "ISTHEMED"].includes(node.name)) readsTheme = true;
|
|
6666
|
+
let local = !analyzeVisioFormula({ kind: "call", name: node.name, args: [] }).dynamic;
|
|
6667
|
+
if (node.name === "SETATREF")
|
|
6668
|
+
local = node.args.length === 1 && node.args[0].kind === "reference";
|
|
6669
|
+
if (["TEXTWIDTH", "TEXTHEIGHT", "SHAPETEXT"].includes(node.name)) {
|
|
6670
|
+
const text = node.args[0];
|
|
6671
|
+
const count = node.name === "TEXTHEIGHT" ? node.args.length === 2 : node.args.length === 1;
|
|
6672
|
+
local = options.textFieldFree && count && text?.kind === "reference" && text.reference.shapeId === void 0 && text.reference.cell.toLowerCase() === "thetext";
|
|
6673
|
+
readsText = true;
|
|
6674
|
+
}
|
|
6675
|
+
if (["LUM", "HUE", "SAT"].includes(node.name)) {
|
|
6676
|
+
local = node.args.length === 1;
|
|
6677
|
+
const arg = node.args[0];
|
|
6678
|
+
if (arg?.kind === "string") {
|
|
6679
|
+
local = /^[A-Za-z_][A-Za-z0-9_.]*$/.test(arg.value);
|
|
6680
|
+
if (local) references.set(`!${arg.value.toLowerCase()}`, { cell: arg.value });
|
|
6681
|
+
}
|
|
6682
|
+
}
|
|
6683
|
+
if (node.name === "STRSAME") local = node.args.length === 2;
|
|
6684
|
+
if (!local) dynamic2 = true;
|
|
6685
|
+
}
|
|
6686
|
+
return { ...analysis, references: [...references.values()], dynamic: dynamic2, readsText, readsTheme };
|
|
6687
|
+
}
|
|
6688
|
+
|
|
6689
|
+
// src/visio/edit-master-index.ts
|
|
6690
|
+
function masterCells(sheet, charge = () => {
|
|
6691
|
+
}) {
|
|
6692
|
+
const result = /* @__PURE__ */ new Map();
|
|
6693
|
+
if (!sheet) return result;
|
|
6694
|
+
const add = (name, node) => {
|
|
6695
|
+
charge();
|
|
6696
|
+
const id = name.toLowerCase();
|
|
6697
|
+
if (result.has(id) && result.get(id) !== node)
|
|
6698
|
+
fail("EDIT_UNSUPPORTED_PACKAGE_DEPENDENCY", "Ambiguous effective master cells.");
|
|
6699
|
+
result.set(id, node);
|
|
6700
|
+
};
|
|
6701
|
+
for (const node of children(sheet, "Cell")) add(attribute2(node, "N") ?? "", node);
|
|
6702
|
+
for (const section of children(sheet, "Section")) {
|
|
6703
|
+
const name = attribute2(section, "N") ?? "";
|
|
6704
|
+
const prefix = name === "Geometry" ? `Geometry${Number(attribute2(section, "IX") ?? "0") + 1}` : name === "Control" ? "Controls" : name;
|
|
6705
|
+
for (const node of children(section, "Cell"))
|
|
6706
|
+
add(`${prefix}.${attribute2(node, "N") ?? ""}`, node);
|
|
6707
|
+
for (const row of children(section, "Row"))
|
|
6708
|
+
for (const node of children(row, "Cell")) {
|
|
6709
|
+
const n = attribute2(node, "N") ?? "";
|
|
6710
|
+
const rowName = attribute2(row, "N");
|
|
6711
|
+
const index = attribute2(row, "IX") ?? (prefix === "Controls" && /^Row_\d+$/.test(rowName ?? "") ? String(Number(rowName.slice(4)) - 1) : void 0);
|
|
6712
|
+
const ix = index ?? "0", r = rowName ?? (prefix === "Controls" ? `Row_${Number(ix) + 1}` : ix);
|
|
6713
|
+
add(
|
|
6714
|
+
name === "Geometry" || ["Controls", "Scratch", "Connection"].includes(prefix) ? `${prefix}.${n}${ix}` : n === "Value" && ["User", "Prop"].includes(name) ? `${prefix}.${r}` : `${prefix}.${r}.${n}`,
|
|
6715
|
+
node
|
|
6716
|
+
);
|
|
6717
|
+
if (name !== "Geometry") add(`${prefix}.${r}.${n}`, node);
|
|
6718
|
+
if (prefix === "Controls" && n === "X") add(`${prefix}.${r}`, node);
|
|
6719
|
+
if (name !== "Geometry" && index !== void 0) add(`${prefix}.$row${ix}.${n}`, node);
|
|
6720
|
+
}
|
|
6721
|
+
}
|
|
6722
|
+
return result;
|
|
6723
|
+
}
|
|
6724
|
+
function masterShapes(root) {
|
|
6725
|
+
const result = [], pending = [root];
|
|
6726
|
+
while (pending.length) {
|
|
6727
|
+
const parent = pending.pop();
|
|
6728
|
+
for (const container of children(parent, "Shapes"))
|
|
6729
|
+
for (const shape of children(container, "Shape")) {
|
|
6730
|
+
result.push(shape);
|
|
6731
|
+
pending.push(shape);
|
|
6732
|
+
}
|
|
6733
|
+
}
|
|
6734
|
+
return result;
|
|
6735
|
+
}
|
|
6736
|
+
function assertMasterMarkup(root, known, check) {
|
|
6737
|
+
for (const node of [root, ...Array.from(root.getElementsByTagName("*"))]) {
|
|
6738
|
+
check();
|
|
6739
|
+
if (node.namespaceURI === root.namespaceURI && node.hasAttribute("F") && !known.has(node))
|
|
6740
|
+
fail(
|
|
6741
|
+
"EDIT_UNSUPPORTED_PACKAGE_DEPENDENCY",
|
|
6742
|
+
"Master formula outside admitted sheet cells has unknown scope."
|
|
6743
|
+
);
|
|
6744
|
+
}
|
|
6745
|
+
}
|
|
6746
|
+
function masterStyleCells(document, template, instance, check, charge = () => {
|
|
6747
|
+
}) {
|
|
6748
|
+
const styles = /* @__PURE__ */ new Map();
|
|
6749
|
+
for (const container of children(document, "StyleSheets"))
|
|
6750
|
+
for (const style of children(container, "StyleSheet")) {
|
|
6751
|
+
charge();
|
|
6752
|
+
const id = attribute2(style, "ID");
|
|
6753
|
+
if (!id || styles.has(id))
|
|
6754
|
+
fail("EDIT_UNSUPPORTED_PACKAGE_DEPENDENCY", "Ambiguous master style IDs.");
|
|
6755
|
+
styles.set(id, style);
|
|
6756
|
+
}
|
|
6757
|
+
const defaults = children(document, "DocumentSheet")[0];
|
|
6758
|
+
const collect = (id, category, seen = /* @__PURE__ */ new Set()) => {
|
|
6759
|
+
check();
|
|
6760
|
+
if (seen.has(id) || seen.size >= 64)
|
|
6761
|
+
fail("EDIT_UNSUPPORTED_PACKAGE_DEPENDENCY", "Invalid inherited master style ancestry.");
|
|
6762
|
+
seen.add(id);
|
|
6763
|
+
const style = styles.get(id);
|
|
6764
|
+
if (!style) fail("EDIT_UNSUPPORTED_PACKAGE_DEPENDENCY", "Missing inherited master style.");
|
|
6765
|
+
const own = masterCells(style, charge);
|
|
6766
|
+
assertMasterMarkup(style, new Set(own.values()), check);
|
|
6767
|
+
const parent = attribute2(style, category);
|
|
6768
|
+
const result2 = parent !== void 0 && parent !== id ? collect(parent, category, seen) : /* @__PURE__ */ new Map();
|
|
6769
|
+
for (const [name, node] of own) {
|
|
6770
|
+
charge();
|
|
6771
|
+
if (attribute2(node, "F") !== "Inh") result2.set(name, node);
|
|
6772
|
+
}
|
|
6773
|
+
return result2;
|
|
6774
|
+
};
|
|
6775
|
+
const result = /* @__PURE__ */ new Map();
|
|
6776
|
+
for (const category of ["LineStyle", "FillStyle", "TextStyle"]) {
|
|
6777
|
+
const id = attribute2(instance, category) ?? attribute2(template, category) ?? attribute2(defaults, category) ?? (styles.has("0") ? "0" : void 0);
|
|
6778
|
+
if (id !== void 0)
|
|
6779
|
+
for (const [name, node] of collect(id, category)) {
|
|
6780
|
+
charge();
|
|
6781
|
+
if (result.has(name) && result.get(name) !== node)
|
|
6782
|
+
fail(
|
|
6783
|
+
"EDIT_UNSUPPORTED_PACKAGE_DEPENDENCY",
|
|
6784
|
+
"Master style categories have ambiguous overlapping inputs."
|
|
6785
|
+
);
|
|
6786
|
+
result.set(name, node);
|
|
6787
|
+
}
|
|
6788
|
+
}
|
|
6789
|
+
return result;
|
|
6790
|
+
}
|
|
6791
|
+
function overlay(cells3, additions, kind, charge) {
|
|
6792
|
+
const aliases = /* @__PURE__ */ new Map(), inherited = /* @__PURE__ */ new Map();
|
|
6793
|
+
for (const [name, source] of cells3) {
|
|
6794
|
+
charge();
|
|
6795
|
+
const names = aliases.get(source.node) ?? /* @__PURE__ */ new Set();
|
|
6796
|
+
names.add(name);
|
|
6797
|
+
aliases.set(source.node, names);
|
|
6798
|
+
}
|
|
6799
|
+
for (const [name, node] of additions) {
|
|
6800
|
+
charge();
|
|
6801
|
+
const source = cells3.get(name);
|
|
6802
|
+
if (source) inherited.set(node, source);
|
|
6803
|
+
}
|
|
6804
|
+
for (const [name, node] of additions) {
|
|
6805
|
+
charge();
|
|
6806
|
+
if (attribute2(node, "F") === "Inh") {
|
|
6807
|
+
const source = cells3.get(name) ?? inherited.get(node);
|
|
6808
|
+
if (!source)
|
|
6809
|
+
fail(
|
|
6810
|
+
"EDIT_UNSUPPORTED_PACKAGE_DEPENDENCY",
|
|
6811
|
+
"Inherited master cell has no effective source."
|
|
6812
|
+
);
|
|
6813
|
+
cells3.set(name, source);
|
|
6814
|
+
const names2 = aliases.get(source.node) ?? /* @__PURE__ */ new Set();
|
|
6815
|
+
names2.add(name);
|
|
6816
|
+
aliases.set(source.node, names2);
|
|
6817
|
+
continue;
|
|
6818
|
+
}
|
|
6819
|
+
const previous = cells3.get(name), names = aliases.get(node) ?? /* @__PURE__ */ new Set();
|
|
6820
|
+
if (previous && previous.node !== node) {
|
|
6821
|
+
for (const alias of aliases.get(previous.node) ?? []) {
|
|
6822
|
+
charge();
|
|
6823
|
+
cells3.set(alias, { node, kind });
|
|
6824
|
+
names.add(alias);
|
|
6825
|
+
}
|
|
6826
|
+
aliases.delete(previous.node);
|
|
6827
|
+
}
|
|
6828
|
+
cells3.set(name, { node, kind });
|
|
6829
|
+
names.add(name);
|
|
6830
|
+
aliases.set(node, names);
|
|
6831
|
+
}
|
|
6832
|
+
}
|
|
6833
|
+
|
|
6834
|
+
// src/visio/edit-master-scope.ts
|
|
6835
|
+
function problem(message) {
|
|
6836
|
+
return fail("EDIT_UNSUPPORTED_PACKAGE_DEPENDENCY", message);
|
|
6837
|
+
}
|
|
6838
|
+
var themeCell = /^(ColorSchemeIndex|EffectSchemeIndex|FontSchemeIndex|ThemeIndex|QuickStyle.*)$/i;
|
|
6839
|
+
async function assertVisioMasterIndependence(pkg, roots, commands, check) {
|
|
6840
|
+
const instances = [...roots].flatMap(
|
|
6841
|
+
([pageId, root]) => masterShapes(root).filter((shape) => shape.hasAttribute("Master")).map((instance) => ({ pageId, instance }))
|
|
6842
|
+
);
|
|
6843
|
+
if (!instances.length) return;
|
|
6844
|
+
const documentPart = await related(pkg, "", "document");
|
|
6845
|
+
if (!documentPart) problem("Missing master document relationship.");
|
|
6846
|
+
const document = await visioXml(pkg, documentPart, "VisioDocument");
|
|
6847
|
+
const mastersPart = await related(pkg, documentPart, "masters", false);
|
|
6848
|
+
if (!mastersPart) problem("Active master definitions are missing.");
|
|
6849
|
+
const definitions = /* @__PURE__ */ new Map();
|
|
6850
|
+
for (const node of children(await visioXml(pkg, mastersPart, "Masters"), "Master")) {
|
|
6851
|
+
const id = attribute2(node, "ID");
|
|
6852
|
+
if (!id || definitions.has(id)) problem("Master IDs are ambiguous.");
|
|
6853
|
+
definitions.set(id, node);
|
|
6854
|
+
}
|
|
6855
|
+
const loaded = /* @__PURE__ */ new Map();
|
|
6856
|
+
const bindings = [];
|
|
6857
|
+
let buildWork = 1e5;
|
|
6858
|
+
const charge = () => {
|
|
6859
|
+
check();
|
|
6860
|
+
if (--buildWork < 0) problem("Master effective-cell construction budget exceeded.");
|
|
6861
|
+
};
|
|
6862
|
+
const pageBindings = /* @__PURE__ */ new Map();
|
|
6863
|
+
const pageShapes = /* @__PURE__ */ new Map();
|
|
6864
|
+
for (const [pageId, root] of roots)
|
|
6865
|
+
for (const shape of masterShapes(root)) {
|
|
6866
|
+
const id = attribute2(shape, "ID");
|
|
6867
|
+
if (!id) problem("Page shape ID is missing.");
|
|
6868
|
+
const key2 = JSON.stringify([pageId, id]);
|
|
6869
|
+
if (pageShapes.has(key2)) problem("Page sheet IDs have ambiguous group scopes.");
|
|
6870
|
+
pageShapes.set(key2, shape);
|
|
6871
|
+
}
|
|
6872
|
+
for (const { pageId, instance } of instances) {
|
|
6873
|
+
check();
|
|
6874
|
+
const masterId = attribute2(instance, "Master"), definition = definitions.get(masterId);
|
|
6875
|
+
if (!definition) problem("Active master ID cannot be resolved.");
|
|
6876
|
+
let root = loaded.get(masterId);
|
|
6877
|
+
if (!root) {
|
|
6878
|
+
root = await visioXml(
|
|
6879
|
+
pkg,
|
|
6880
|
+
await indexedPart(pkg, mastersPart, definition, "master"),
|
|
6881
|
+
"MasterContents"
|
|
6882
|
+
);
|
|
6883
|
+
loaded.set(masterId, root);
|
|
6884
|
+
}
|
|
6885
|
+
const tops = children(children(root, "Shapes")[0], "Shape");
|
|
6886
|
+
if (tops.length !== 1) problem("Only a uniquely rooted master can prove independence.");
|
|
6887
|
+
const templates = masterShapes(root), context = /* @__PURE__ */ new Map();
|
|
6888
|
+
assertMasterMarkup(
|
|
6889
|
+
root,
|
|
6890
|
+
new Set(
|
|
6891
|
+
templates.flatMap((shape) => {
|
|
6892
|
+
charge();
|
|
6893
|
+
return [...masterCells(shape, charge).values()];
|
|
6894
|
+
})
|
|
6895
|
+
),
|
|
6896
|
+
check
|
|
6897
|
+
);
|
|
6898
|
+
const locals = [instance, ...masterShapes(instance)];
|
|
6899
|
+
const byTemplate = /* @__PURE__ */ new Map();
|
|
6900
|
+
const rootId = attribute2(tops[0], "ID");
|
|
6901
|
+
if (!rootId) problem("Master root shape ID is missing.");
|
|
6902
|
+
const explicitRoot = attribute2(instance, "MasterShape");
|
|
6903
|
+
if (explicitRoot !== void 0 && explicitRoot !== rootId)
|
|
6904
|
+
problem("Master root mapping is ambiguous.");
|
|
6905
|
+
byTemplate.set(rootId, instance);
|
|
6906
|
+
for (const local of locals.slice(1)) {
|
|
6907
|
+
if (local.hasAttribute("Master")) problem("Nested master inheritance is unsupported.");
|
|
6908
|
+
const id = attribute2(local, "MasterShape");
|
|
6909
|
+
if (id === void 0) continue;
|
|
6910
|
+
if (byTemplate.has(id)) problem("MasterShape mappings are ambiguous.");
|
|
6911
|
+
byTemplate.set(id, local);
|
|
6912
|
+
}
|
|
6913
|
+
for (const template of templates) {
|
|
6914
|
+
charge();
|
|
6915
|
+
if (bindings.length >= 1e4) problem("Master effective binding limit exceeded.");
|
|
6916
|
+
check();
|
|
6917
|
+
if (template.hasAttribute("Master") || template.hasAttribute("MasterShape"))
|
|
6918
|
+
problem("Chained master definitions are unsupported.");
|
|
6919
|
+
const templateId = attribute2(template, "ID");
|
|
6920
|
+
if (!templateId || context.has(templateId)) problem("Master-local sheet IDs are ambiguous.");
|
|
6921
|
+
const local = byTemplate.get(templateId), cells3 = /* @__PURE__ */ new Map();
|
|
6922
|
+
for (const [name, node] of masterStyleCells(document, template, local, check, charge))
|
|
6923
|
+
cells3.set(name, { node, kind: "style" });
|
|
6924
|
+
overlay(cells3, masterCells(template, charge), "template", charge);
|
|
6925
|
+
overlay(cells3, masterCells(local, charge), "instance", charge);
|
|
6926
|
+
const binding = {
|
|
6927
|
+
id: `${pageId}:${attribute2(instance, "ID")}:${templateId}`,
|
|
6928
|
+
pageId,
|
|
6929
|
+
template,
|
|
6930
|
+
cells: cells3,
|
|
6931
|
+
context,
|
|
6932
|
+
...local ? { instance: local } : {}
|
|
6933
|
+
};
|
|
6934
|
+
context.set(templateId, binding);
|
|
6935
|
+
bindings.push(binding);
|
|
6936
|
+
if (local) pageBindings.set(JSON.stringify([pageId, attribute2(local, "ID")]), binding);
|
|
6937
|
+
}
|
|
6938
|
+
for (const id of byTemplate.keys())
|
|
6939
|
+
if (!context.has(id)) problem("MasterShape refers to a missing template.");
|
|
6940
|
+
}
|
|
6941
|
+
const changed = commands.flatMap(
|
|
6942
|
+
(command2) => command2.type === "delete-shape" ? [] : (command2.type === "move-shape" ? ["PinX", "PinY"] : command2.type === "resize-shape" ? ["Width", "Height"] : ["Width", "Height", "PinX", "PinY"]).map((cell) => ({ pageId: command2.pageId, shapeId: command2.shapeId, cell }))
|
|
6943
|
+
);
|
|
6944
|
+
const query = createVisioDependencyQuery(roots, { check });
|
|
6945
|
+
const directAffected = (pageId, shapeId, cell) => commands.some(
|
|
6946
|
+
(command2) => command2.pageId === pageId && command2.shapeId === shapeId && (command2.type === "delete-shape" || changed.some(
|
|
6947
|
+
(target) => target.pageId === pageId && target.shapeId === shapeId && target.cell.toLowerCase() === cell.toLowerCase()
|
|
6948
|
+
))
|
|
6949
|
+
);
|
|
6950
|
+
const active = /* @__PURE__ */ new Set(), done = /* @__PURE__ */ new Set();
|
|
6951
|
+
const pageInputs = /* @__PURE__ */ new Map();
|
|
6952
|
+
const pageInput = (pageId, shapeId) => {
|
|
6953
|
+
const id = JSON.stringify([pageId, shapeId]);
|
|
6954
|
+
const bound2 = pageBindings.get(id) ?? pageInputs.get(id);
|
|
6955
|
+
if (bound2) return bound2;
|
|
6956
|
+
const shape = pageShapes.get(id);
|
|
6957
|
+
if (!shape) problem("Local master override has a missing page reference.");
|
|
6958
|
+
const cells3 = /* @__PURE__ */ new Map();
|
|
6959
|
+
for (const [name, node] of masterStyleCells(document, shape, shape, check, charge))
|
|
6960
|
+
cells3.set(name, { node, kind: "style" });
|
|
6961
|
+
overlay(cells3, masterCells(shape, charge), "instance", charge);
|
|
6962
|
+
const result = {
|
|
6963
|
+
id: `page:${id}`,
|
|
6964
|
+
pageId,
|
|
6965
|
+
template: shape,
|
|
6966
|
+
instance: shape,
|
|
6967
|
+
cells: cells3,
|
|
6968
|
+
context: /* @__PURE__ */ new Map()
|
|
6969
|
+
};
|
|
6970
|
+
pageInputs.set(id, result);
|
|
6971
|
+
return result;
|
|
6972
|
+
};
|
|
6973
|
+
let steps = 1e5;
|
|
6974
|
+
const inspect2 = (binding, name) => {
|
|
6975
|
+
check();
|
|
6976
|
+
if (--steps < 0) problem("Master dependency proof exceeded its cell budget.");
|
|
6977
|
+
name = name.toLowerCase();
|
|
6978
|
+
const pageShapeId = attribute2(binding.instance, "ID");
|
|
6979
|
+
if (pageShapeId !== void 0 && directAffected(binding.pageId, pageShapeId, name))
|
|
6980
|
+
problem("Effective master cache depends on an edited page cell.");
|
|
6981
|
+
const id = JSON.stringify([binding.id, name]);
|
|
6982
|
+
if (done.has(id)) return;
|
|
6983
|
+
if (active.has(id) || active.size >= 64)
|
|
6984
|
+
problem("Master dependency proof is cyclic or too deep.");
|
|
6985
|
+
active.add(id);
|
|
6986
|
+
const source = binding.cells.get(name);
|
|
6987
|
+
if (!source) {
|
|
6988
|
+
const defaults = {
|
|
6989
|
+
locpinx: "width",
|
|
6990
|
+
locpiny: "height",
|
|
6991
|
+
txtwidth: "width",
|
|
6992
|
+
txtheight: "height",
|
|
6993
|
+
txtpinx: "width",
|
|
6994
|
+
txtpiny: "height",
|
|
6995
|
+
txtlocpinx: "txtwidth",
|
|
6996
|
+
txtlocpiny: "txtheight"
|
|
6997
|
+
};
|
|
6998
|
+
const dimension = defaults[name];
|
|
6999
|
+
if (dimension) inspect2(binding, dimension);
|
|
7000
|
+
else if (!themeCell.test(name)) problem(`Missing effective master reference ${name}.`);
|
|
7001
|
+
} else {
|
|
7002
|
+
const formula = executableCellFormula(attribute2(source.node, "F"));
|
|
7003
|
+
if (formula && !inertDoubleClickFormula(attribute2(source.node, "N") ?? "", formula)) {
|
|
7004
|
+
const text = children(binding.instance, "Text")[0] ?? children(binding.template, "Text")[0];
|
|
7005
|
+
const textFieldFree = ![...binding.cells.keys()].some((key2) => /^fields?\./i.test(key2)) && (!text || !Array.from(text.getElementsByTagName("*")).some(
|
|
7006
|
+
(node) => node.localName.toLowerCase() === "fld"
|
|
7007
|
+
));
|
|
7008
|
+
let analysis;
|
|
7009
|
+
try {
|
|
7010
|
+
analysis = analyzeVisioMasterFormula(formula, { textFieldFree });
|
|
7011
|
+
} catch (error) {
|
|
7012
|
+
problem(
|
|
7013
|
+
`Cannot analyze effective master formula: ${error instanceof Error ? error.message : "invalid formula"}`
|
|
7014
|
+
);
|
|
7015
|
+
}
|
|
7016
|
+
if (analysis.dynamic) problem("Effective master formula has unknown dynamic dependencies.");
|
|
7017
|
+
for (const ref of analysis.references) {
|
|
7018
|
+
if (analysis.readsText && ref.shapeId === void 0 && ref.cell.toLowerCase() === "thetext")
|
|
7019
|
+
continue;
|
|
7020
|
+
if (ref.shapeId === void 0) inspect2(binding, ref.cell);
|
|
7021
|
+
else if (source.kind === "template") {
|
|
7022
|
+
const target = binding.context.get(ref.shapeId);
|
|
7023
|
+
if (!target) problem("Missing master-local Sheet reference.");
|
|
7024
|
+
inspect2(target, ref.cell);
|
|
7025
|
+
} else {
|
|
7026
|
+
if (source.kind === "style")
|
|
7027
|
+
problem("Explicit sheet references in inherited master styles are ambiguous.");
|
|
7028
|
+
if (directAffected(binding.pageId, ref.shapeId, ref.cell) || query({ pageId: binding.pageId, shapeId: ref.shapeId, cell: ref.cell }, changed))
|
|
7029
|
+
problem("Effective master cache depends on an edited page shape.");
|
|
7030
|
+
inspect2(pageInput(binding.pageId, ref.shapeId), ref.cell);
|
|
7031
|
+
}
|
|
7032
|
+
}
|
|
7033
|
+
if (analysis.readsText) {
|
|
7034
|
+
for (const cell of binding.cells.keys())
|
|
7035
|
+
if (/^(character\.|paragraph\.|tabs\.|leftmargin$|rightmargin$|topmargin$|bottommargin$)/i.test(
|
|
7036
|
+
cell
|
|
7037
|
+
))
|
|
7038
|
+
inspect2(binding, cell);
|
|
7039
|
+
}
|
|
7040
|
+
}
|
|
7041
|
+
}
|
|
7042
|
+
active.delete(id);
|
|
7043
|
+
done.add(id);
|
|
7044
|
+
};
|
|
7045
|
+
for (const binding of bindings) for (const name of binding.cells.keys()) inspect2(binding, name);
|
|
7046
|
+
}
|
|
7047
|
+
|
|
6560
7048
|
// src/visio/edit-scope.ts
|
|
6561
7049
|
var admitted2 = (node) => node.namespaceURI === VISIO_NS || node.namespaceURI === VISIO_LEGACY_NS;
|
|
6562
7050
|
function cells2(sheet) {
|
|
@@ -6639,31 +7127,10 @@ async function assertGeometryPackageScope(pkg, pagePaths, commands, check, roots
|
|
|
6639
7127
|
let documentRoot;
|
|
6640
7128
|
for (const path of pkg.paths()) {
|
|
6641
7129
|
if (!/^visio\/.*\.xml$/i.test(path) || pagePaths.has(path)) continue;
|
|
6642
|
-
if (/^visio\/masters\//i.test(path)
|
|
7130
|
+
if (/^visio\/masters\//i.test(path)) continue;
|
|
6643
7131
|
const root = await pkg.readXml(path);
|
|
6644
7132
|
const masterScope = /^visio\/masters\//i.test(path) || admitted2(root) && ["MasterContents", "Masters"].includes(root.localName);
|
|
6645
|
-
if (masterScope)
|
|
6646
|
-
if (hasMasterInstances)
|
|
6647
|
-
for (const node of [root, ...Array.from(root.getElementsByTagName("*"))]) {
|
|
6648
|
-
check();
|
|
6649
|
-
if (!admitted2(node)) continue;
|
|
6650
|
-
const source = executableCellFormula(attribute2(node, "F"));
|
|
6651
|
-
if (!source || inertDoubleClickFormula(attribute2(node, "N") ?? "", source)) continue;
|
|
6652
|
-
try {
|
|
6653
|
-
if (analyzeVisioFormula(source).dynamic)
|
|
6654
|
-
fail(
|
|
6655
|
-
"EDIT_UNSUPPORTED_PACKAGE_DEPENDENCY",
|
|
6656
|
-
"Used master formulas have unknown dynamic dependencies."
|
|
6657
|
-
);
|
|
6658
|
-
} catch (error) {
|
|
6659
|
-
fail(
|
|
6660
|
-
"EDIT_UNSUPPORTED_PACKAGE_DEPENDENCY",
|
|
6661
|
-
`Cannot prove used master formula independence: ${error instanceof Error ? error.message : "invalid formula"}`
|
|
6662
|
-
);
|
|
6663
|
-
}
|
|
6664
|
-
}
|
|
6665
|
-
continue;
|
|
6666
|
-
}
|
|
7133
|
+
if (masterScope) continue;
|
|
6667
7134
|
if (admitted2(root) && root.localName === "VisioDocument") {
|
|
6668
7135
|
if (documentRoot)
|
|
6669
7136
|
fail("EDIT_UNSUPPORTED_PACKAGE_DEPENDENCY", "Multiple document scopes are ambiguous.");
|
|
@@ -6695,6 +7162,18 @@ async function assertGeometryPackageScope(pkg, pagePaths, commands, check, roots
|
|
|
6695
7162
|
});
|
|
6696
7163
|
}
|
|
6697
7164
|
}
|
|
7165
|
+
if (hasMasterInstances) {
|
|
7166
|
+
for (const command2 of commands) {
|
|
7167
|
+
const root = roots.get(command2.pageId);
|
|
7168
|
+
if (!root) continue;
|
|
7169
|
+
const target = Array.from(root.getElementsByTagNameNS(root.namespaceURI, "Shape")).find(
|
|
7170
|
+
(shape) => attribute2(shape, "ID") === command2.shapeId
|
|
7171
|
+
);
|
|
7172
|
+
if (target?.hasAttribute("Master") || target?.hasAttribute("MasterShape"))
|
|
7173
|
+
fail("UNSUPPORTED_GEOMETRY_EDIT", "Editing master-linked shapes is unsupported.");
|
|
7174
|
+
}
|
|
7175
|
+
await assertVisioMasterIndependence(pkg, roots, commands, check);
|
|
7176
|
+
}
|
|
6698
7177
|
if (!documentRoot) return;
|
|
6699
7178
|
const styles = /* @__PURE__ */ new Map();
|
|
6700
7179
|
for (const container of children(documentRoot, "StyleSheets"))
|