ooxml-core 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{PptxHandler-G63S6YZU.mjs → PptxHandler-75LOVF7I.mjs} +2 -2
- package/dist/automation/index.cjs +2559 -1169
- package/dist/automation/index.mjs +2559 -1169
- package/dist/chart/gradient-definition.d.ts +2 -2
- package/dist/chart/gradient-definition.d.ts.map +1 -1
- package/dist/chart/index.cjs +7 -7
- package/dist/chart/index.mjs +7 -7
- package/dist/{chunk-BICQYRPW.mjs → chunk-75LA7H3F.mjs} +1339 -1435
- package/dist/{chunk-CKJSWE7N.mjs → chunk-LA7D6ZYQ.mjs} +244 -115
- package/dist/{chunk-ROM5MZ7O.mjs → chunk-OMGH6IKY.mjs} +3 -3
- package/dist/{chunk-RWXFQJVF.mjs → chunk-Q27H4HFS.mjs} +1 -1
- package/dist/{chunk-DDG5HTGX.mjs → chunk-RFX7AJDZ.mjs} +1 -1
- package/dist/crypto/index.cjs +1406 -184
- package/dist/crypto/index.mjs +1406 -184
- package/dist/diagram/dom.d.ts +1 -14
- package/dist/diagram/dom.d.ts.map +1 -1
- package/dist/diagram/index.cjs +15 -15
- package/dist/diagram/index.d.ts +12 -12
- package/dist/diagram/index.d.ts.map +1 -1
- package/dist/diagram/index.mjs +15 -15
- package/dist/diagram/types.d.ts +12 -148
- package/dist/diagram/types.d.ts.map +1 -1
- package/dist/digest/algorithm-names.d.ts +2 -2
- package/dist/digest/algorithm-names.d.ts.map +1 -1
- package/dist/digest/bit-ops.d.ts +30 -0
- package/dist/digest/bit-ops.d.ts.map +1 -0
- package/dist/digest/digest.d.ts +2 -2
- package/dist/digest/digest.d.ts.map +1 -1
- package/dist/digest/index.cjs +1319 -90
- package/dist/digest/index.d.ts +7 -1
- package/dist/digest/index.d.ts.map +1 -1
- package/dist/digest/index.mjs +1313 -91
- package/dist/digest/md2.d.ts +22 -0
- package/dist/digest/md2.d.ts.map +1 -0
- package/dist/digest/md4.d.ts +3 -0
- package/dist/digest/md4.d.ts.map +1 -0
- package/dist/digest/md5.d.ts +3 -0
- package/dist/digest/md5.d.ts.map +1 -0
- package/dist/digest/password-hash.d.ts +7 -0
- package/dist/digest/password-hash.d.ts.map +1 -1
- package/dist/digest/ripemd-functions.d.ts +18 -0
- package/dist/digest/ripemd-functions.d.ts.map +1 -0
- package/dist/digest/ripemd128.d.ts +3 -0
- package/dist/digest/ripemd128.d.ts.map +1 -0
- package/dist/digest/ripemd160.d.ts +3 -0
- package/dist/digest/ripemd160.d.ts.map +1 -0
- package/dist/digest/whirlpool-sbox.d.ts +15 -0
- package/dist/digest/whirlpool-sbox.d.ts.map +1 -0
- package/dist/digest/whirlpool-table.d.ts +12 -0
- package/dist/digest/whirlpool-table.d.ts.map +1 -0
- package/dist/digest/whirlpool.d.ts +3 -0
- package/dist/digest/whirlpool.d.ts.map +1 -0
- package/dist/docx/block-parser.d.ts.map +1 -1
- package/dist/docx/diagram-theme.d.ts +3 -3
- package/dist/docx/diagram-theme.d.ts.map +1 -1
- package/dist/docx/embedded.cjs +470 -276
- package/dist/docx/embedded.mjs +470 -276
- package/dist/docx/field-flags.d.ts +8 -0
- package/dist/docx/field-flags.d.ts.map +1 -0
- package/dist/docx/field-lock.d.ts +6 -0
- package/dist/docx/field-lock.d.ts.map +1 -0
- package/dist/docx/field-runs.d.ts +4 -1
- package/dist/docx/field-runs.d.ts.map +1 -1
- package/dist/docx/index.cjs +1029 -850
- package/dist/docx/index.d.ts +2 -0
- package/dist/docx/index.d.ts.map +1 -1
- package/dist/docx/index.mjs +1027 -850
- package/dist/docx/layout/adapter.d.ts.map +1 -1
- package/dist/docx/layout/index.cjs +61 -47
- package/dist/docx/layout/index.mjs +61 -47
- package/dist/docx/layout/page-fields.d.ts.map +1 -1
- package/dist/docx/load/index.cjs +1883 -467
- package/dist/docx/load/index.mjs +1883 -467
- package/dist/docx/model-run.d.ts +5 -0
- package/dist/docx/model-run.d.ts.map +1 -1
- package/dist/docx/numbering-model.d.ts +1 -1
- package/dist/docx/numbering-model.d.ts.map +1 -1
- package/dist/docx/numbering-package.d.ts +4 -4
- package/dist/docx/numbering-package.d.ts.map +1 -1
- package/dist/docx/numbering-start-edit.d.ts +8 -0
- package/dist/docx/numbering-start-edit.d.ts.map +1 -0
- package/dist/docx/numbering-start-patch.d.ts +13 -0
- package/dist/docx/numbering-start-patch.d.ts.map +1 -0
- package/dist/docx/theme-color.d.ts.map +1 -1
- package/dist/docx/theme-model.d.ts +3 -2
- package/dist/docx/theme-model.d.ts.map +1 -1
- package/dist/docx/theme.d.ts +5 -1
- package/dist/docx/theme.d.ts.map +1 -1
- package/dist/docx/ui/field-guard.d.ts +2 -0
- package/dist/docx/ui/field-guard.d.ts.map +1 -1
- package/dist/docx/ui/field-results.d.ts.map +1 -1
- package/dist/docx/ui/index.cjs +547 -375
- package/dist/docx/ui/index.mjs +547 -376
- package/dist/docx/ui/review-commands.d.ts.map +1 -1
- package/dist/docx/ui/run-extra-mark.d.ts +1 -1
- package/dist/docx/ui/run-extra-mark.d.ts.map +1 -1
- package/dist/docx/ui/simple-field-input.d.ts +3 -0
- package/dist/docx/ui/simple-field-input.d.ts.map +1 -1
- package/dist/docx/ui/track-changes-mode.d.ts.map +1 -1
- package/dist/docx/ui/track-paragraph-boundaries.d.ts +5 -0
- package/dist/docx/ui/track-paragraph-boundaries.d.ts.map +1 -0
- package/dist/docx/write-inline.d.ts.map +1 -1
- package/dist/docx/write-run.d.ts.map +1 -1
- package/dist/drawingml/dom.d.ts +15 -0
- package/dist/drawingml/dom.d.ts.map +1 -0
- package/dist/drawingml/drawing-color-brightness.d.ts +6 -0
- package/dist/drawingml/drawing-color-brightness.d.ts.map +1 -0
- package/dist/drawingml/drawing-color-css.d.ts.map +1 -0
- package/dist/{diagram → drawingml}/drawing-color.d.ts +5 -5
- package/dist/drawingml/drawing-color.d.ts.map +1 -0
- package/dist/{diagram → drawingml}/drawing-fill.d.ts +3 -3
- package/dist/drawingml/drawing-fill.d.ts.map +1 -0
- package/dist/{diagram → drawingml}/drawing-geometry.d.ts +4 -4
- package/dist/drawingml/drawing-geometry.d.ts.map +1 -0
- package/dist/drawingml/drawing-shadow.d.ts.map +1 -0
- package/dist/{diagram → drawingml}/drawing-text.d.ts +2 -2
- package/dist/drawingml/drawing-text.d.ts.map +1 -0
- package/dist/{diagram → drawingml}/gradient-geometry.d.ts +2 -2
- package/dist/drawingml/gradient-geometry.d.ts.map +1 -0
- package/dist/drawingml/gradient-preset-data.d.ts.map +1 -0
- package/dist/{diagram → drawingml}/gradient-presets.d.ts +3 -3
- package/dist/drawingml/gradient-presets.d.ts.map +1 -0
- package/dist/drawingml/index.cjs +1545 -0
- package/dist/drawingml/index.d.ts +19 -0
- package/dist/drawingml/index.d.ts.map +1 -0
- package/dist/drawingml/index.mjs +1497 -0
- package/dist/{diagram → drawingml}/ordered-color-transforms.d.ts +2 -2
- package/dist/drawingml/ordered-color-transforms.d.ts.map +1 -0
- package/dist/drawingml/rect-path-gradient.d.ts.map +1 -0
- package/dist/drawingml/theme-color.d.ts +19 -0
- package/dist/drawingml/theme-color.d.ts.map +1 -0
- package/dist/drawingml/theme-model.d.ts +40 -0
- package/dist/drawingml/theme-model.d.ts.map +1 -0
- package/dist/drawingml/theme.d.ts +21 -0
- package/dist/drawingml/theme.d.ts.map +1 -0
- package/dist/drawingml/types.d.ts +152 -0
- package/dist/drawingml/types.d.ts.map +1 -0
- package/dist/drawingml/write-color.d.ts +4 -0
- package/dist/drawingml/write-color.d.ts.map +1 -0
- package/dist/{diagram → drawingml}/write-fill.d.ts +2 -2
- package/dist/drawingml/write-fill.d.ts.map +1 -0
- package/dist/geometry/connector-elbow-geometry.d.ts +14 -0
- package/dist/geometry/connector-elbow-geometry.d.ts.map +1 -1
- package/dist/geometry/index.cjs +43 -0
- package/dist/geometry/index.mjs +42 -1
- package/dist/i18n/dictionary.d.ts +13 -0
- package/dist/i18n/dictionary.d.ts.map +1 -0
- package/dist/i18n/index.cjs +68 -0
- package/dist/i18n/index.d.ts +4 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.mjs +60 -0
- package/dist/i18n/locale.d.ts +17 -0
- package/dist/i18n/locale.d.ts.map +1 -0
- package/dist/i18n/translator.d.ts +18 -0
- package/dist/i18n/translator.d.ts.map +1 -0
- package/dist/index.cjs +3712 -2178
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +3711 -2179
- package/dist/pptx/automation/index.cjs +2852 -1568
- package/dist/pptx/automation/index.d.ts +3 -3
- package/dist/pptx/automation/index.mjs +5 -5
- package/dist/pptx/chunks/{index-C4mfzVoY.d.ts → index-BHqL5KXH.d.ts} +2 -2
- package/dist/pptx/chunks/{index-C4mfzVoY.d.ts.map → index-BHqL5KXH.d.ts.map} +1 -1
- package/dist/pptx/chunks/{index-lk7dyOPS.d.ts → index-BYkdcS8J.d.ts} +12 -16
- package/dist/pptx/chunks/index-BYkdcS8J.d.ts.map +1 -0
- package/dist/pptx/chunks/smart-art-CO2jmJFf.d.ts.map +1 -1
- package/dist/pptx/chunks/{text-operations-CDLx4hD5.d.ts → text-operations-DEJ7alZR.d.ts} +2 -2
- package/dist/pptx/chunks/text-operations-DEJ7alZR.d.ts.map +1 -0
- package/dist/pptx/cli/index.cjs +2680 -1396
- package/dist/pptx/cli/index.d.ts +1 -1
- package/dist/pptx/cli/index.mjs +4 -4
- package/dist/pptx/converter/index.d.ts +1 -1
- package/dist/pptx/converter/index.mjs +2 -2
- package/dist/pptx/index.cjs +1771 -1756
- package/dist/pptx/index.d.ts +3 -3
- package/dist/pptx/index.mjs +5 -5
- package/dist/teams/index.cjs +144 -74
- package/dist/teams/index.mjs +144 -74
- package/dist/visio/ui/index.cjs +14 -3
- package/dist/visio/ui/index.mjs +14 -3
- package/dist/visio/ui/shape-rotation.d.ts +1 -1
- package/dist/visio/ui/shape-rotation.d.ts.map +1 -1
- package/dist/xlsx/edit/chart-series-gradient.d.ts +1 -1
- package/dist/xlsx/edit/chart-series-gradient.d.ts.map +1 -1
- package/dist/xlsx/edit/protection.d.ts +1 -1
- package/dist/xlsx/index.cjs +3222 -1886
- package/dist/xlsx/index.mjs +3222 -1886
- package/dist/xlsx/layout/chart-appearance.d.ts +1 -1
- package/dist/xlsx/layout/chart-appearance.d.ts.map +1 -1
- package/dist/xlsx/layout/chart-scale.d.ts +5 -1
- package/dist/xlsx/layout/chart-scale.d.ts.map +1 -1
- package/dist/xlsx/layout/chart-svg-legend.d.ts +13 -0
- package/dist/xlsx/layout/chart-svg-legend.d.ts.map +1 -0
- package/dist/xlsx/layout/chart-svg.d.ts.map +1 -1
- package/dist/xlsx/layout/chart-view.d.ts +3 -1
- package/dist/xlsx/layout/chart-view.d.ts.map +1 -1
- package/dist/xlsx/load/index.cjs +2110 -838
- package/dist/xlsx/load/index.mjs +2110 -838
- package/dist/xlsx/read/theme.d.ts +2 -4
- package/dist/xlsx/read/theme.d.ts.map +1 -1
- package/dist/xlsx/ui/index.cjs +2017 -771
- package/dist/xlsx/ui/index.mjs +2017 -771
- package/dist/xlsx/ui/locales/merge.d.ts +2 -1
- package/dist/xlsx/ui/locales/merge.d.ts.map +1 -1
- package/dist/xlsx/ui/localization.d.ts.map +1 -1
- package/dist/xlsx/write/theme.d.ts.map +1 -1
- package/package.json +11 -1
- package/dist/diagram/drawing-color-brightness.d.ts +0 -6
- package/dist/diagram/drawing-color-brightness.d.ts.map +0 -1
- package/dist/diagram/drawing-color-css.d.ts.map +0 -1
- package/dist/diagram/drawing-color.d.ts.map +0 -1
- package/dist/diagram/drawing-fill.d.ts.map +0 -1
- package/dist/diagram/drawing-geometry.d.ts.map +0 -1
- package/dist/diagram/drawing-shadow.d.ts.map +0 -1
- package/dist/diagram/drawing-text.d.ts.map +0 -1
- package/dist/diagram/gradient-geometry.d.ts.map +0 -1
- package/dist/diagram/gradient-preset-data.d.ts.map +0 -1
- package/dist/diagram/gradient-presets.d.ts.map +0 -1
- package/dist/diagram/ordered-color-transforms.d.ts.map +0 -1
- package/dist/diagram/rect-path-gradient.d.ts.map +0 -1
- package/dist/diagram/write-color.d.ts +0 -4
- package/dist/diagram/write-color.d.ts.map +0 -1
- package/dist/diagram/write-fill.d.ts.map +0 -1
- package/dist/pptx/chunks/index-lk7dyOPS.d.ts.map +0 -1
- package/dist/pptx/chunks/text-operations-CDLx4hD5.d.ts.map +0 -1
- /package/dist/{diagram → drawingml}/drawing-color-css.d.ts +0 -0
- /package/dist/{diagram → drawingml}/drawing-shadow.d.ts +0 -0
- /package/dist/{diagram → drawingml}/gradient-preset-data.d.ts +0 -0
- /package/dist/{diagram → drawingml}/rect-path-gradient.d.ts +0 -0
package/dist/docx/index.cjs
CHANGED
|
@@ -1454,265 +1454,641 @@ function resolveRunFormatting(run, context = {}) {
|
|
|
1454
1454
|
return result;
|
|
1455
1455
|
}
|
|
1456
1456
|
|
|
1457
|
-
//
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
"dk1",
|
|
1461
|
-
"lt1",
|
|
1462
|
-
"dk2",
|
|
1463
|
-
"lt2",
|
|
1464
|
-
"accent1",
|
|
1465
|
-
"accent2",
|
|
1466
|
-
"accent3",
|
|
1467
|
-
"accent4",
|
|
1468
|
-
"accent5",
|
|
1469
|
-
"accent6",
|
|
1470
|
-
"hlink",
|
|
1471
|
-
"folHlink"
|
|
1472
|
-
];
|
|
1473
|
-
function drawingChild(parent, local) {
|
|
1474
|
-
if (!parent) return void 0;
|
|
1475
|
-
for (const node of Array.from(parent.childNodes)) {
|
|
1476
|
-
const element = node;
|
|
1477
|
-
if (element.nodeType === 1 && element.localName === local && element.namespaceURI === DRAWING_NS)
|
|
1478
|
-
return element;
|
|
1479
|
-
}
|
|
1480
|
-
return void 0;
|
|
1481
|
-
}
|
|
1482
|
-
function colorOf(slot2) {
|
|
1483
|
-
const srgb = drawingChild(slot2, "srgbClr");
|
|
1484
|
-
if (srgb) return srgb.getAttribute("val")?.toUpperCase() || void 0;
|
|
1485
|
-
const sys = drawingChild(slot2, "sysClr");
|
|
1486
|
-
if (sys) return sys.getAttribute("lastClr")?.toUpperCase() || void 0;
|
|
1487
|
-
return void 0;
|
|
1457
|
+
// color/color-primitives.ts
|
|
1458
|
+
function clampUnitInterval(value) {
|
|
1459
|
+
return Math.min(1, Math.max(0, value));
|
|
1488
1460
|
}
|
|
1489
|
-
function
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1461
|
+
function hexToRgbChannels(color) {
|
|
1462
|
+
const normalized = color.replace("#", "");
|
|
1463
|
+
if (!/^[0-9a-fA-F]{6}$/.test(normalized)) {
|
|
1464
|
+
return null;
|
|
1465
|
+
}
|
|
1494
1466
|
return {
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1467
|
+
r: Number.parseInt(normalized.slice(0, 2), 16),
|
|
1468
|
+
g: Number.parseInt(normalized.slice(2, 4), 16),
|
|
1469
|
+
b: Number.parseInt(normalized.slice(4, 6), 16)
|
|
1498
1470
|
};
|
|
1499
1471
|
}
|
|
1500
|
-
function
|
|
1501
|
-
|
|
1502
|
-
const root = document.documentElement;
|
|
1503
|
-
const clrScheme = Array.from(root.getElementsByTagNameNS(DRAWING_NS, "clrScheme"))[0];
|
|
1504
|
-
const colors = {};
|
|
1505
|
-
for (const slotName of SCHEME_ORDER) {
|
|
1506
|
-
const slot2 = drawingChild(clrScheme, slotName);
|
|
1507
|
-
const value = colorOf(slot2);
|
|
1508
|
-
if (value) colors[slotName] = value;
|
|
1509
|
-
}
|
|
1510
|
-
const fontScheme = Array.from(root.getElementsByTagNameNS(DRAWING_NS, "fontScheme"))[0];
|
|
1511
|
-
const major = drawingChild(fontScheme, "majorFont");
|
|
1512
|
-
const minor = drawingChild(fontScheme, "minorFont");
|
|
1513
|
-
return { colors, colorMapping: {}, fonts: { major: fontSetOf(major), minor: fontSetOf(minor) } };
|
|
1472
|
+
function percentDivisorFor(text) {
|
|
1473
|
+
return text.endsWith("%") ? 100 : 1e5;
|
|
1514
1474
|
}
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
accent1: "accent1",
|
|
1522
|
-
accent2: "accent2",
|
|
1523
|
-
accent3: "accent3",
|
|
1524
|
-
accent4: "accent4",
|
|
1525
|
-
accent5: "accent5",
|
|
1526
|
-
accent6: "accent6",
|
|
1527
|
-
hyperlink: "hlink",
|
|
1528
|
-
followedHyperlink: "folHlink"
|
|
1529
|
-
};
|
|
1530
|
-
function parseColorSchemeMapping(xml) {
|
|
1531
|
-
const document = parseXml2(xml);
|
|
1532
|
-
const mapping = Array.from(document.getElementsByTagNameNS(WORD_NS, "clrSchemeMapping"))[0];
|
|
1533
|
-
const result = {};
|
|
1534
|
-
if (!mapping) return result;
|
|
1535
|
-
for (const key of MAPPING_KEYS) {
|
|
1536
|
-
const value = enumValue(
|
|
1537
|
-
isStWmlColorSchemeIndex,
|
|
1538
|
-
getW(mapping, key),
|
|
1539
|
-
`w:clrSchemeMapping/@w:${key}`
|
|
1540
|
-
);
|
|
1541
|
-
if (value) result[key] = TOKEN_TO_SLOT[value];
|
|
1475
|
+
function parseOoxmlPercent(value) {
|
|
1476
|
+
const text = String(value ?? "").trim();
|
|
1477
|
+
const divisor = percentDivisorFor(text);
|
|
1478
|
+
const magnitude = Number.parseFloat(divisor === 100 ? text.slice(0, -1) : text);
|
|
1479
|
+
if (!Number.isFinite(magnitude)) {
|
|
1480
|
+
return void 0;
|
|
1542
1481
|
}
|
|
1543
|
-
return
|
|
1482
|
+
return magnitude / divisor;
|
|
1544
1483
|
}
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
return isStThemeColor(value);
|
|
1484
|
+
function parseDrawingPercent(value) {
|
|
1485
|
+
const parsed = parseOoxmlPercent(value);
|
|
1486
|
+
return parsed === void 0 ? void 0 : clampUnitInterval(parsed);
|
|
1549
1487
|
}
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
};
|
|
1570
|
-
function resolveThemeColorToken(token, theme) {
|
|
1571
|
-
const logical = {
|
|
1572
|
-
background1: "bg1",
|
|
1573
|
-
text1: "tx1",
|
|
1574
|
-
background2: "bg2",
|
|
1575
|
-
text2: "tx2"
|
|
1576
|
-
};
|
|
1577
|
-
const logicalKey = logical[token];
|
|
1578
|
-
if (logicalKey) {
|
|
1579
|
-
const slot3 = theme.colorMapping[logicalKey] ?? DEFAULT_MAPPING[logicalKey];
|
|
1580
|
-
return theme.colors[slot3];
|
|
1488
|
+
function scrgbLinearToSrgb8(linear) {
|
|
1489
|
+
const l = Math.min(1, Math.max(0, linear));
|
|
1490
|
+
const companded = l <= 31308e-7 ? 12.92 * l : 1.055 * l ** (1 / 2.4) - 0.055;
|
|
1491
|
+
return Math.min(255, Math.max(0, Math.round(companded * 255)));
|
|
1492
|
+
}
|
|
1493
|
+
function toHex(value) {
|
|
1494
|
+
return Math.min(255, Math.max(0, Math.round(value))).toString(16).padStart(2, "0").toUpperCase();
|
|
1495
|
+
}
|
|
1496
|
+
function rgbToHsl(r, g, b) {
|
|
1497
|
+
const rN = r / 255;
|
|
1498
|
+
const gN = g / 255;
|
|
1499
|
+
const bN = b / 255;
|
|
1500
|
+
const cMax = Math.max(rN, gN, bN);
|
|
1501
|
+
const cMin = Math.min(rN, gN, bN);
|
|
1502
|
+
const delta = cMax - cMin;
|
|
1503
|
+
const l = (cMax + cMin) / 2;
|
|
1504
|
+
let s = 0;
|
|
1505
|
+
if (delta !== 0) {
|
|
1506
|
+
s = delta / (1 - Math.abs(2 * l - 1));
|
|
1581
1507
|
}
|
|
1582
|
-
|
|
1583
|
-
|
|
1508
|
+
let h = 0;
|
|
1509
|
+
if (delta !== 0) {
|
|
1510
|
+
if (cMax === rN) {
|
|
1511
|
+
h = 60 * ((gN - bN) / delta % 6);
|
|
1512
|
+
} else if (cMax === gN) {
|
|
1513
|
+
h = 60 * ((bN - rN) / delta + 2);
|
|
1514
|
+
} else {
|
|
1515
|
+
h = 60 * ((rN - gN) / delta + 4);
|
|
1516
|
+
}
|
|
1517
|
+
}
|
|
1518
|
+
if (h < 0) {
|
|
1519
|
+
h += 360;
|
|
1520
|
+
}
|
|
1521
|
+
return { h, s: clampUnitInterval(s), l: clampUnitInterval(l) };
|
|
1584
1522
|
}
|
|
1585
|
-
function
|
|
1586
|
-
const
|
|
1587
|
-
|
|
1523
|
+
function hslToRgb(h, s, l, roundChannel = Math.round, options) {
|
|
1524
|
+
const sC = clampUnitInterval(s);
|
|
1525
|
+
const lC = clampUnitInterval(l);
|
|
1526
|
+
const hN = (h % 360 + 360) % 360;
|
|
1527
|
+
const c = (1 - Math.abs(2 * lC - 1)) * sC;
|
|
1528
|
+
const x = c * (1 - Math.abs(hN / 60 % 2 - 1));
|
|
1529
|
+
const m = lC - c / 2;
|
|
1530
|
+
let rP = 0;
|
|
1531
|
+
let gP = 0;
|
|
1532
|
+
let bP = 0;
|
|
1533
|
+
if (hN < 60) {
|
|
1534
|
+
rP = c;
|
|
1535
|
+
gP = x;
|
|
1536
|
+
bP = 0;
|
|
1537
|
+
} else if (hN < 120) {
|
|
1538
|
+
rP = x;
|
|
1539
|
+
gP = c;
|
|
1540
|
+
bP = 0;
|
|
1541
|
+
} else if (hN < 180) {
|
|
1542
|
+
rP = 0;
|
|
1543
|
+
gP = c;
|
|
1544
|
+
bP = x;
|
|
1545
|
+
} else if (hN < 240) {
|
|
1546
|
+
rP = 0;
|
|
1547
|
+
gP = x;
|
|
1548
|
+
bP = c;
|
|
1549
|
+
} else if (hN < 300) {
|
|
1550
|
+
rP = x;
|
|
1551
|
+
gP = 0;
|
|
1552
|
+
bP = c;
|
|
1553
|
+
} else {
|
|
1554
|
+
rP = c;
|
|
1555
|
+
gP = 0;
|
|
1556
|
+
bP = x;
|
|
1557
|
+
}
|
|
1588
1558
|
return {
|
|
1589
|
-
r:
|
|
1590
|
-
g:
|
|
1591
|
-
b:
|
|
1559
|
+
r: roundChannel((rP + m) * 255),
|
|
1560
|
+
g: roundChannel((gP + m) * 255),
|
|
1561
|
+
b: roundChannel((bP + m) * 255)
|
|
1592
1562
|
};
|
|
1593
1563
|
}
|
|
1594
|
-
function
|
|
1595
|
-
return
|
|
1564
|
+
function parseDrawingFraction(value) {
|
|
1565
|
+
return parseOoxmlPercent(value);
|
|
1596
1566
|
}
|
|
1597
|
-
function
|
|
1598
|
-
const
|
|
1567
|
+
function parseDrawingHueDegrees(value) {
|
|
1568
|
+
const parsed = Number.parseFloat(String(value ?? "").trim());
|
|
1569
|
+
if (!Number.isFinite(parsed)) {
|
|
1570
|
+
return void 0;
|
|
1571
|
+
}
|
|
1572
|
+
return parsed / 6e4;
|
|
1573
|
+
}
|
|
1574
|
+
|
|
1575
|
+
// color/color-linear.ts
|
|
1576
|
+
function srgb255ToLinear(channel) {
|
|
1577
|
+
const c = clampUnitInterval(channel / 255);
|
|
1599
1578
|
return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
|
|
1600
1579
|
}
|
|
1601
|
-
function
|
|
1602
|
-
const c =
|
|
1580
|
+
function linearToSrgb255(linear) {
|
|
1581
|
+
const c = clampUnitInterval(linear);
|
|
1603
1582
|
return 255 * (c <= 31308e-7 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - 0.055);
|
|
1604
1583
|
}
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1584
|
+
|
|
1585
|
+
// drawingml/dom.ts
|
|
1586
|
+
function attributeReader(element) {
|
|
1587
|
+
return (name) => {
|
|
1588
|
+
if (!element) return void 0;
|
|
1589
|
+
const direct = element.getAttribute(name);
|
|
1590
|
+
if (direct !== null) return direct;
|
|
1591
|
+
const attributes = element.attributes;
|
|
1592
|
+
for (let index = 0; index < attributes.length; index++) {
|
|
1593
|
+
const candidate = attributes.item(index);
|
|
1594
|
+
if (candidate && candidate.localName === name) return candidate.value;
|
|
1595
|
+
}
|
|
1596
|
+
return void 0;
|
|
1597
|
+
};
|
|
1610
1598
|
}
|
|
1611
|
-
function
|
|
1612
|
-
const
|
|
1613
|
-
|
|
1614
|
-
const mix = (channel) => linearToSrgb(1 - (1 - srgbToLinear(channel)) * fraction);
|
|
1615
|
-
return `#${toHex(mix(rgb.r))}${toHex(mix(rgb.g))}${toHex(mix(rgb.b))}`;
|
|
1599
|
+
function stringAttribute(element, name) {
|
|
1600
|
+
const value = attributeReader(element)(name)?.trim();
|
|
1601
|
+
return value ? value : void 0;
|
|
1616
1602
|
}
|
|
1617
|
-
function
|
|
1618
|
-
|
|
1603
|
+
function integerAttribute(element, name) {
|
|
1604
|
+
const parsed = Number.parseInt(attributeReader(element)(name) ?? "", 10);
|
|
1605
|
+
return Number.isFinite(parsed) ? parsed : void 0;
|
|
1619
1606
|
}
|
|
1620
|
-
function
|
|
1621
|
-
const
|
|
1622
|
-
if (
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1607
|
+
function booleanAttribute(element, name) {
|
|
1608
|
+
const value = attributeReader(element)(name)?.trim().toLowerCase();
|
|
1609
|
+
if (value === "1" || value === "true") return true;
|
|
1610
|
+
if (value === "0" || value === "false") return false;
|
|
1611
|
+
return void 0;
|
|
1612
|
+
}
|
|
1613
|
+
function descendants(root, local) {
|
|
1614
|
+
const result = [];
|
|
1615
|
+
const visit = (node) => {
|
|
1616
|
+
for (const child3 of Array.from(node.childNodes)) {
|
|
1617
|
+
if (!isElement(child3)) continue;
|
|
1618
|
+
if (child3.localName === local) result.push(child3);
|
|
1619
|
+
visit(child3);
|
|
1620
|
+
}
|
|
1621
|
+
};
|
|
1622
|
+
visit(root);
|
|
1623
|
+
return result;
|
|
1627
1624
|
}
|
|
1628
1625
|
|
|
1629
|
-
//
|
|
1630
|
-
var
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
const
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
map.set(id, {
|
|
1651
|
-
id,
|
|
1652
|
-
type: node.getAttribute("Type") ?? "",
|
|
1653
|
-
target,
|
|
1654
|
-
mode: node.getAttribute("TargetMode") === "External" ? "External" : "Internal"
|
|
1655
|
-
});
|
|
1626
|
+
// drawingml/drawing-color.ts
|
|
1627
|
+
var COLOR_ELEMENTS = {
|
|
1628
|
+
srgbClr: "srgb",
|
|
1629
|
+
schemeClr: "scheme",
|
|
1630
|
+
sysClr: "system",
|
|
1631
|
+
prstClr: "preset",
|
|
1632
|
+
scrgbClr: "scrgb",
|
|
1633
|
+
hslClr: "hsl"
|
|
1634
|
+
};
|
|
1635
|
+
function colorValue(kind, element) {
|
|
1636
|
+
const attribute = (name) => element.getAttribute(name) ?? "";
|
|
1637
|
+
if (kind === "scrgb") return `${attribute("r")},${attribute("g")},${attribute("b")}`;
|
|
1638
|
+
if (kind === "hsl") return `${attribute("hue")},${attribute("sat")},${attribute("lum")}`;
|
|
1639
|
+
return attribute("val");
|
|
1640
|
+
}
|
|
1641
|
+
function parseDrawingColorIn(container) {
|
|
1642
|
+
if (!container) return void 0;
|
|
1643
|
+
for (const element of elements(container)) {
|
|
1644
|
+
const kind = COLOR_ELEMENTS[element.localName];
|
|
1645
|
+
if (!kind || element.namespaceURI && element.namespaceURI !== NS.a) continue;
|
|
1646
|
+
return parseDrawingColor(element);
|
|
1656
1647
|
}
|
|
1657
|
-
return
|
|
1648
|
+
return void 0;
|
|
1658
1649
|
}
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1650
|
+
function parseDrawingColor(element) {
|
|
1651
|
+
const kind = COLOR_ELEMENTS[element.localName];
|
|
1652
|
+
if (!kind) return void 0;
|
|
1653
|
+
const color = {
|
|
1654
|
+
kind,
|
|
1655
|
+
value: colorValue(kind, element),
|
|
1656
|
+
transforms: elements(element).map((child3) => ({
|
|
1657
|
+
name: child3.localName,
|
|
1658
|
+
value: child3.getAttribute("val") ?? ""
|
|
1659
|
+
}))
|
|
1660
|
+
};
|
|
1661
|
+
const fallback = kind === "system" ? element.getAttribute("lastClr") : null;
|
|
1662
|
+
if (fallback) color.fallback = fallback;
|
|
1663
|
+
return color;
|
|
1666
1664
|
}
|
|
1667
|
-
function
|
|
1668
|
-
if (
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1665
|
+
function parseDrawingColorList(container) {
|
|
1666
|
+
if (!container) return [];
|
|
1667
|
+
return elements(container).flatMap((element) => {
|
|
1668
|
+
const color = parseDrawingColor(element);
|
|
1669
|
+
return color ? [color] : [];
|
|
1670
|
+
});
|
|
1671
|
+
}
|
|
1672
|
+
var PRESET_COLORS = {
|
|
1673
|
+
black: "#000000",
|
|
1674
|
+
white: "#FFFFFF",
|
|
1675
|
+
red: "#FF0000",
|
|
1676
|
+
green: "#008000",
|
|
1677
|
+
blue: "#0000FF",
|
|
1678
|
+
yellow: "#FFFF00",
|
|
1679
|
+
gray: "#808080",
|
|
1680
|
+
grey: "#808080"
|
|
1681
|
+
};
|
|
1682
|
+
function baseHex(color, theme) {
|
|
1683
|
+
switch (color.kind) {
|
|
1684
|
+
case "srgb":
|
|
1685
|
+
return /^[0-9a-f]{6}$/i.test(color.value) ? `#${color.value.toUpperCase()}` : void 0;
|
|
1686
|
+
case "scheme":
|
|
1687
|
+
return theme?.scheme(color.value);
|
|
1688
|
+
case "system":
|
|
1689
|
+
return color.fallback && /^[0-9a-f]{6}$/i.test(color.fallback) ? `#${color.fallback.toUpperCase()}` : void 0;
|
|
1690
|
+
case "preset":
|
|
1691
|
+
return PRESET_COLORS[color.value];
|
|
1692
|
+
case "scrgb": {
|
|
1693
|
+
const [r, g, b] = color.value.split(",").map((part) => parseDrawingFraction(part));
|
|
1694
|
+
if (r === void 0 || g === void 0 || b === void 0) return void 0;
|
|
1695
|
+
return `#${toHex(scrgbLinearToSrgb8(r))}${toHex(scrgbLinearToSrgb8(g))}${toHex(scrgbLinearToSrgb8(b))}`;
|
|
1696
|
+
}
|
|
1697
|
+
case "hsl": {
|
|
1698
|
+
const [h, s, l] = color.value.split(",");
|
|
1699
|
+
const hue = parseDrawingHueDegrees(h);
|
|
1700
|
+
const sat = parseDrawingFraction(s);
|
|
1701
|
+
const lum = parseDrawingFraction(l);
|
|
1702
|
+
if (hue === void 0 || sat === void 0 || lum === void 0) return void 0;
|
|
1703
|
+
const { r, g, b } = hslToRgb(hue, sat, lum);
|
|
1704
|
+
return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
|
|
1705
|
+
}
|
|
1675
1706
|
}
|
|
1676
|
-
return resolved.join("/");
|
|
1677
1707
|
}
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1708
|
+
var APPLIED = /* @__PURE__ */ new Set([
|
|
1709
|
+
"alpha",
|
|
1710
|
+
"alphaMod",
|
|
1711
|
+
"alphaOff",
|
|
1712
|
+
"comp",
|
|
1713
|
+
"inv",
|
|
1714
|
+
"gray",
|
|
1715
|
+
"shade",
|
|
1716
|
+
"tint",
|
|
1717
|
+
"hue",
|
|
1718
|
+
"hueMod",
|
|
1719
|
+
"hueOff",
|
|
1720
|
+
"sat",
|
|
1721
|
+
"satMod",
|
|
1722
|
+
"satOff",
|
|
1723
|
+
"lum",
|
|
1724
|
+
"lumMod",
|
|
1725
|
+
"lumOff"
|
|
1726
|
+
]);
|
|
1727
|
+
function resolveDrawingColor(color, theme, options) {
|
|
1728
|
+
const base = baseHex(color, theme);
|
|
1729
|
+
const rgb = base ? hexToRgbChannels(base) : null;
|
|
1730
|
+
if (!rgb) return void 0;
|
|
1731
|
+
let { r, g, b } = rgb;
|
|
1732
|
+
const find = (name) => color.transforms.find((entry) => entry.name === name)?.value;
|
|
1733
|
+
const has = (name) => color.transforms.some((entry) => entry.name === name);
|
|
1734
|
+
if (has("comp")) {
|
|
1735
|
+
const hsl = rgbToHsl(r, g, b);
|
|
1736
|
+
({ r, g, b } = hslToRgb((hsl.h + 180) % 360, hsl.s, hsl.l));
|
|
1737
|
+
}
|
|
1738
|
+
if (has("inv")) [r, g, b] = [255 - r, 255 - g, 255 - b];
|
|
1739
|
+
if (has("gray")) r = g = b = Math.round(0.299 * r + 0.587 * g + 0.114 * b);
|
|
1740
|
+
const shade = parseDrawingPercent(find("shade"));
|
|
1741
|
+
if (shade !== void 0) {
|
|
1742
|
+
r = linearToSrgb255(srgb255ToLinear(r) * shade);
|
|
1743
|
+
g = linearToSrgb255(srgb255ToLinear(g) * shade);
|
|
1744
|
+
b = linearToSrgb255(srgb255ToLinear(b) * shade);
|
|
1745
|
+
}
|
|
1746
|
+
const tint = parseDrawingPercent(find("tint"));
|
|
1747
|
+
if (tint !== void 0) {
|
|
1748
|
+
r = linearToSrgb255(1 - (1 - srgb255ToLinear(r)) * tint);
|
|
1749
|
+
g = linearToSrgb255(1 - (1 - srgb255ToLinear(g)) * tint);
|
|
1750
|
+
b = linearToSrgb255(1 - (1 - srgb255ToLinear(b)) * tint);
|
|
1751
|
+
}
|
|
1752
|
+
if (["hue", "hueMod", "hueOff", "sat", "satMod", "satOff", "lum", "lumMod", "lumOff"].some(has)) {
|
|
1753
|
+
const hsl = rgbToHsl(r, g, b);
|
|
1754
|
+
const wrap = (degrees) => (degrees % 360 + 360) % 360;
|
|
1755
|
+
const hueAbs = parseDrawingHueDegrees(find("hue"));
|
|
1756
|
+
if (hueAbs !== void 0) hsl.h = wrap(hueAbs);
|
|
1757
|
+
const hueMod = parseDrawingFraction(find("hueMod"));
|
|
1758
|
+
if (hueMod !== void 0) hsl.h = wrap(hsl.h * hueMod);
|
|
1759
|
+
const hueOff = parseDrawingHueDegrees(find("hueOff"));
|
|
1760
|
+
if (hueOff !== void 0) hsl.h = wrap(hsl.h + hueOff);
|
|
1761
|
+
const satAbs = parseDrawingFraction(find("sat"));
|
|
1762
|
+
if (satAbs !== void 0) hsl.s = clampUnitInterval(satAbs);
|
|
1763
|
+
const satMod = parseDrawingFraction(find("satMod"));
|
|
1764
|
+
if (satMod !== void 0) hsl.s = clampUnitInterval(hsl.s * satMod);
|
|
1765
|
+
const satOff = parseDrawingFraction(find("satOff"));
|
|
1766
|
+
if (satOff !== void 0) hsl.s = clampUnitInterval(hsl.s + satOff);
|
|
1767
|
+
const lumAbs = parseDrawingFraction(find("lum"));
|
|
1768
|
+
if (lumAbs !== void 0) hsl.l = clampUnitInterval(lumAbs);
|
|
1769
|
+
const lumMod = parseDrawingFraction(find("lumMod"));
|
|
1770
|
+
if (lumMod !== void 0) hsl.l = clampUnitInterval(hsl.l * lumMod);
|
|
1771
|
+
const lumOff = parseDrawingFraction(find("lumOff"));
|
|
1772
|
+
if (lumOff !== void 0) hsl.l = clampUnitInterval(hsl.l + lumOff);
|
|
1773
|
+
const round = Math.round;
|
|
1774
|
+
({ r, g, b } = hslToRgb(hsl.h, hsl.s, hsl.l, round));
|
|
1775
|
+
}
|
|
1776
|
+
let alpha = parseDrawingPercent(find("alpha")) ?? 1;
|
|
1777
|
+
const alphaMod = parseDrawingFraction(find("alphaMod"));
|
|
1778
|
+
if (alphaMod !== void 0) alpha = clampUnitInterval(alpha * alphaMod);
|
|
1779
|
+
const alphaOff = parseDrawingFraction(find("alphaOff"));
|
|
1780
|
+
if (alphaOff !== void 0) alpha = clampUnitInterval(alpha + alphaOff);
|
|
1781
|
+
return {
|
|
1782
|
+
hex: `#${toHex(r)}${toHex(g)}${toHex(b)}`,
|
|
1783
|
+
alpha,
|
|
1784
|
+
unapplied: [...new Set(color.transforms.map((entry) => entry.name))].filter(
|
|
1785
|
+
(name) => !APPLIED.has(name)
|
|
1786
|
+
)
|
|
1787
|
+
};
|
|
1682
1788
|
}
|
|
1683
|
-
var getRelationshipId = (element) => relAttr(element, "id") || void 0;
|
|
1684
1789
|
|
|
1685
|
-
//
|
|
1686
|
-
var
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1790
|
+
// drawingml/theme-model.ts
|
|
1791
|
+
var THEME_COLOR_SLOTS = [
|
|
1792
|
+
"dk1",
|
|
1793
|
+
"lt1",
|
|
1794
|
+
"dk2",
|
|
1795
|
+
"lt2",
|
|
1796
|
+
"accent1",
|
|
1797
|
+
"accent2",
|
|
1798
|
+
"accent3",
|
|
1799
|
+
"accent4",
|
|
1800
|
+
"accent5",
|
|
1801
|
+
"accent6",
|
|
1802
|
+
"hlink",
|
|
1803
|
+
"folHlink"
|
|
1804
|
+
];
|
|
1805
|
+
var DEFAULT_THEME_COLOR_MAP = {
|
|
1806
|
+
bg1: "lt1",
|
|
1807
|
+
tx1: "dk1",
|
|
1808
|
+
bg2: "lt2",
|
|
1809
|
+
tx2: "dk2"
|
|
1810
|
+
};
|
|
1811
|
+
|
|
1812
|
+
// drawingml/theme.ts
|
|
1813
|
+
var SLOT_SET = new Set(THEME_COLOR_SLOTS);
|
|
1814
|
+
function isThemeColorSlot(value) {
|
|
1815
|
+
return SLOT_SET.has(value);
|
|
1816
|
+
}
|
|
1817
|
+
function nonEmpty(value) {
|
|
1818
|
+
return value ? value : void 0;
|
|
1819
|
+
}
|
|
1820
|
+
function parseThemeColorScheme(scheme) {
|
|
1821
|
+
const result = { colors: {} };
|
|
1822
|
+
if (!scheme) return result;
|
|
1823
|
+
const name = nonEmpty(scheme.getAttribute("name"));
|
|
1824
|
+
if (name) result.name = name;
|
|
1825
|
+
for (const slot2 of THEME_COLOR_SLOTS) {
|
|
1826
|
+
const color = parseDrawingColorIn(first(scheme, slot2, NS.a));
|
|
1827
|
+
if (color) result.colors[slot2] = color;
|
|
1701
1828
|
}
|
|
1702
|
-
return
|
|
1829
|
+
return result;
|
|
1703
1830
|
}
|
|
1704
|
-
function
|
|
1705
|
-
const
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
const
|
|
1709
|
-
|
|
1831
|
+
function parseFontCollection(collection) {
|
|
1832
|
+
const result = { scripts: {} };
|
|
1833
|
+
if (!collection) return result;
|
|
1834
|
+
const typeface = (local) => nonEmpty(first(collection, local, NS.a)?.getAttribute("typeface"));
|
|
1835
|
+
const latin = typeface("latin");
|
|
1836
|
+
const eastAsia = typeface("ea");
|
|
1837
|
+
const complexScript = typeface("cs");
|
|
1838
|
+
if (latin) result.latin = latin;
|
|
1839
|
+
if (eastAsia) result.eastAsia = eastAsia;
|
|
1840
|
+
if (complexScript) result.complexScript = complexScript;
|
|
1841
|
+
for (const font of elements(collection)) {
|
|
1842
|
+
if (font.localName !== "font") continue;
|
|
1843
|
+
const script = nonEmpty(font.getAttribute("script"));
|
|
1844
|
+
const face = nonEmpty(font.getAttribute("typeface"));
|
|
1845
|
+
if (script && face && !Object.hasOwn(result.scripts, script)) result.scripts[script] = face;
|
|
1846
|
+
}
|
|
1847
|
+
return result;
|
|
1710
1848
|
}
|
|
1711
|
-
function
|
|
1712
|
-
const
|
|
1713
|
-
(
|
|
1714
|
-
|
|
1715
|
-
|
|
1849
|
+
function parseThemeFontScheme(scheme) {
|
|
1850
|
+
const result = {
|
|
1851
|
+
major: parseFontCollection(first(scheme, "majorFont", NS.a)),
|
|
1852
|
+
minor: parseFontCollection(first(scheme, "minorFont", NS.a))
|
|
1853
|
+
};
|
|
1854
|
+
const name = nonEmpty(scheme?.getAttribute("name"));
|
|
1855
|
+
if (name) result.name = name;
|
|
1856
|
+
return result;
|
|
1857
|
+
}
|
|
1858
|
+
function rootOf(source) {
|
|
1859
|
+
return "documentElement" in source ? source.documentElement : source;
|
|
1860
|
+
}
|
|
1861
|
+
function parseTheme(source) {
|
|
1862
|
+
const root = rootOf(source);
|
|
1863
|
+
const holder = first(root, "themeElements", NS.a) ?? root;
|
|
1864
|
+
const theme = {
|
|
1865
|
+
colorScheme: parseThemeColorScheme(first(holder, "clrScheme", NS.a)),
|
|
1866
|
+
fontScheme: parseThemeFontScheme(first(holder, "fontScheme", NS.a))
|
|
1867
|
+
};
|
|
1868
|
+
const name = nonEmpty(root.getAttribute("name"));
|
|
1869
|
+
if (name) theme.name = name;
|
|
1870
|
+
return theme;
|
|
1871
|
+
}
|
|
1872
|
+
|
|
1873
|
+
// drawingml/theme-color.ts
|
|
1874
|
+
function isLogical(name) {
|
|
1875
|
+
return Object.hasOwn(DEFAULT_THEME_COLOR_MAP, name);
|
|
1876
|
+
}
|
|
1877
|
+
function themeColorSlotFor(name, colorMap = {}) {
|
|
1878
|
+
if (isLogical(name)) return colorMap[name] ?? DEFAULT_THEME_COLOR_MAP[name];
|
|
1879
|
+
if (!isThemeColorSlot(name)) return void 0;
|
|
1880
|
+
if (name === "dk1" || name === "lt1" || name === "dk2" || name === "lt2") return name;
|
|
1881
|
+
return colorMap[name] ?? name;
|
|
1882
|
+
}
|
|
1883
|
+
function themeSlotHex(color) {
|
|
1884
|
+
if (!color) return void 0;
|
|
1885
|
+
const value = color.kind === "srgb" ? color.value : color.kind === "system" ? color.fallback : void 0;
|
|
1886
|
+
return value ? value.toUpperCase() : void 0;
|
|
1887
|
+
}
|
|
1888
|
+
|
|
1889
|
+
// docx/theme.ts
|
|
1890
|
+
function fontSetOf(collection) {
|
|
1891
|
+
const { latin, eastAsia, complexScript } = collection;
|
|
1892
|
+
return {
|
|
1893
|
+
...latin ? { latin } : {},
|
|
1894
|
+
...eastAsia ? { eastAsia } : {},
|
|
1895
|
+
...complexScript ? { complexScript } : {}
|
|
1896
|
+
};
|
|
1897
|
+
}
|
|
1898
|
+
function parseTheme2(xml) {
|
|
1899
|
+
const theme = parseTheme(parseXml2(xml));
|
|
1900
|
+
const colors = {};
|
|
1901
|
+
for (const slot2 of THEME_COLOR_SLOTS) {
|
|
1902
|
+
const value = themeSlotHex(theme.colorScheme.colors[slot2]);
|
|
1903
|
+
if (value) colors[slot2] = value;
|
|
1904
|
+
}
|
|
1905
|
+
const { major, minor } = theme.fontScheme;
|
|
1906
|
+
return { colors, colorMapping: {}, fonts: { major: fontSetOf(major), minor: fontSetOf(minor) } };
|
|
1907
|
+
}
|
|
1908
|
+
var MAPPING_KEYS = ["bg1", "tx1", "bg2", "tx2"];
|
|
1909
|
+
var TOKEN_TO_SLOT = {
|
|
1910
|
+
dark1: "dk1",
|
|
1911
|
+
light1: "lt1",
|
|
1912
|
+
dark2: "dk2",
|
|
1913
|
+
light2: "lt2",
|
|
1914
|
+
accent1: "accent1",
|
|
1915
|
+
accent2: "accent2",
|
|
1916
|
+
accent3: "accent3",
|
|
1917
|
+
accent4: "accent4",
|
|
1918
|
+
accent5: "accent5",
|
|
1919
|
+
accent6: "accent6",
|
|
1920
|
+
hyperlink: "hlink",
|
|
1921
|
+
followedHyperlink: "folHlink"
|
|
1922
|
+
};
|
|
1923
|
+
function parseColorSchemeMapping(xml) {
|
|
1924
|
+
const document = parseXml2(xml);
|
|
1925
|
+
const mapping = Array.from(document.getElementsByTagNameNS(WORD_NS, "clrSchemeMapping"))[0];
|
|
1926
|
+
const result = {};
|
|
1927
|
+
if (!mapping) return result;
|
|
1928
|
+
for (const key of MAPPING_KEYS) {
|
|
1929
|
+
const value = enumValue(
|
|
1930
|
+
isStWmlColorSchemeIndex,
|
|
1931
|
+
getW(mapping, key),
|
|
1932
|
+
`w:clrSchemeMapping/@w:${key}`
|
|
1933
|
+
);
|
|
1934
|
+
if (value) result[key] = TOKEN_TO_SLOT[value];
|
|
1935
|
+
}
|
|
1936
|
+
return result;
|
|
1937
|
+
}
|
|
1938
|
+
|
|
1939
|
+
// docx/theme-color.ts
|
|
1940
|
+
function isThemeColorToken(value) {
|
|
1941
|
+
return isStThemeColor(value);
|
|
1942
|
+
}
|
|
1943
|
+
var TOKEN_TO_SLOT2 = {
|
|
1944
|
+
dark1: "dk1",
|
|
1945
|
+
light1: "lt1",
|
|
1946
|
+
dark2: "dk2",
|
|
1947
|
+
light2: "lt2",
|
|
1948
|
+
accent1: "accent1",
|
|
1949
|
+
accent2: "accent2",
|
|
1950
|
+
accent3: "accent3",
|
|
1951
|
+
accent4: "accent4",
|
|
1952
|
+
accent5: "accent5",
|
|
1953
|
+
accent6: "accent6",
|
|
1954
|
+
hyperlink: "hlink",
|
|
1955
|
+
followedHyperlink: "folHlink"
|
|
1956
|
+
};
|
|
1957
|
+
function resolveThemeColorToken(token, theme) {
|
|
1958
|
+
const logical = {
|
|
1959
|
+
background1: "bg1",
|
|
1960
|
+
text1: "tx1",
|
|
1961
|
+
background2: "bg2",
|
|
1962
|
+
text2: "tx2"
|
|
1963
|
+
};
|
|
1964
|
+
const logicalKey = logical[token];
|
|
1965
|
+
if (logicalKey) {
|
|
1966
|
+
const slot3 = theme.colorMapping[logicalKey] ?? DEFAULT_THEME_COLOR_MAP[logicalKey];
|
|
1967
|
+
return theme.colors[slot3];
|
|
1968
|
+
}
|
|
1969
|
+
const slot2 = TOKEN_TO_SLOT2[token];
|
|
1970
|
+
return slot2 ? theme.colors[slot2] : void 0;
|
|
1971
|
+
}
|
|
1972
|
+
function hexToRgb(hex) {
|
|
1973
|
+
const normalized = hex.replace(/^#/, "");
|
|
1974
|
+
if (!/^[0-9a-fA-F]{6}$/.test(normalized)) return null;
|
|
1975
|
+
return {
|
|
1976
|
+
r: Number.parseInt(normalized.slice(0, 2), 16),
|
|
1977
|
+
g: Number.parseInt(normalized.slice(2, 4), 16),
|
|
1978
|
+
b: Number.parseInt(normalized.slice(4, 6), 16)
|
|
1979
|
+
};
|
|
1980
|
+
}
|
|
1981
|
+
function applyThemeShade(hex, fraction) {
|
|
1982
|
+
const rgb = hexToRgb(hex);
|
|
1983
|
+
if (!rgb) return hex;
|
|
1984
|
+
const mix = (channel) => linearToSrgb255(srgb255ToLinear(channel) * fraction);
|
|
1985
|
+
return `#${toHex(mix(rgb.r))}${toHex(mix(rgb.g))}${toHex(mix(rgb.b))}`;
|
|
1986
|
+
}
|
|
1987
|
+
function applyThemeTint(hex, fraction) {
|
|
1988
|
+
const rgb = hexToRgb(hex);
|
|
1989
|
+
if (!rgb) return hex;
|
|
1990
|
+
const mix = (channel) => linearToSrgb255(1 - (1 - srgb255ToLinear(channel)) * fraction);
|
|
1991
|
+
return `#${toHex(mix(rgb.r))}${toHex(mix(rgb.g))}${toHex(mix(rgb.b))}`;
|
|
1992
|
+
}
|
|
1993
|
+
function fractionToThemeByte(fraction) {
|
|
1994
|
+
return toHex(Math.round(Math.min(1, Math.max(0, fraction)) * 255));
|
|
1995
|
+
}
|
|
1996
|
+
function resolveThemeColorReference(ref, theme) {
|
|
1997
|
+
const base = resolveThemeColorToken(ref.token, theme);
|
|
1998
|
+
if (!base) return void 0;
|
|
1999
|
+
let hex = `#${base.replace(/^#/, "")}`;
|
|
2000
|
+
if (ref.shade !== void 0) hex = applyThemeShade(hex, ref.shade);
|
|
2001
|
+
if (ref.tint !== void 0) hex = applyThemeTint(hex, ref.tint);
|
|
2002
|
+
return hex;
|
|
2003
|
+
}
|
|
2004
|
+
|
|
2005
|
+
// opc/relationship-types.ts
|
|
2006
|
+
var BASE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
|
|
2007
|
+
var RELATIONSHIP_TYPES = {
|
|
2008
|
+
image: `${BASE}/image`,
|
|
2009
|
+
hyperlink: `${BASE}/hyperlink`,
|
|
2010
|
+
diagramData: `${BASE}/diagramData`,
|
|
2011
|
+
diagramLayout: `${BASE}/diagramLayout`,
|
|
2012
|
+
diagramQuickStyle: `${BASE}/diagramQuickStyle`,
|
|
2013
|
+
diagramColors: `${BASE}/diagramColors`,
|
|
2014
|
+
diagramDrawing: "http://schemas.microsoft.com/office/2007/relationships/diagramDrawing"};
|
|
2015
|
+
|
|
2016
|
+
// opc/relationships.ts
|
|
2017
|
+
function parseRelationships(xml) {
|
|
2018
|
+
const map = /* @__PURE__ */ new Map();
|
|
2019
|
+
if (!xml) return map;
|
|
2020
|
+
const root = parseXml(xml).documentElement;
|
|
2021
|
+
for (const node of elements(root)) {
|
|
2022
|
+
if (node.localName !== "Relationship") continue;
|
|
2023
|
+
const id = node.getAttribute("Id");
|
|
2024
|
+
const target = node.getAttribute("Target");
|
|
2025
|
+
if (!id || target == null) continue;
|
|
2026
|
+
map.set(id, {
|
|
2027
|
+
id,
|
|
2028
|
+
type: node.getAttribute("Type") ?? "",
|
|
2029
|
+
target,
|
|
2030
|
+
mode: node.getAttribute("TargetMode") === "External" ? "External" : "Internal"
|
|
2031
|
+
});
|
|
2032
|
+
}
|
|
2033
|
+
return map;
|
|
2034
|
+
}
|
|
2035
|
+
var escapeAttr = (value) => value.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<");
|
|
2036
|
+
function buildRelationshipsXml(relationships) {
|
|
2037
|
+
const items = Array.from(relationships).map(([id, rel]) => {
|
|
2038
|
+
const mode = rel.mode === "External" ? ' TargetMode="External"' : "";
|
|
2039
|
+
return `<Relationship Id="${escapeAttr(id)}" Type="${escapeAttr(rel.type)}" Target="${escapeAttr(rel.target)}"${mode}/>`;
|
|
2040
|
+
}).join("");
|
|
2041
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="${NS.rels}">${items}</Relationships>`;
|
|
2042
|
+
}
|
|
2043
|
+
function resolvePartPath(basePart, target) {
|
|
2044
|
+
if (target.startsWith("/")) return target.slice(1);
|
|
2045
|
+
const baseDir = basePart.slice(0, basePart.lastIndexOf("/") + 1);
|
|
2046
|
+
const resolved = [];
|
|
2047
|
+
for (const segment of `${baseDir}${target}`.split("/")) {
|
|
2048
|
+
if (segment === "." || segment === "") continue;
|
|
2049
|
+
if (segment === "..") resolved.pop();
|
|
2050
|
+
else resolved.push(segment);
|
|
2051
|
+
}
|
|
2052
|
+
return resolved.join("/");
|
|
2053
|
+
}
|
|
2054
|
+
function nextRelationshipId(used) {
|
|
2055
|
+
let index = 1;
|
|
2056
|
+
while (used.has(`rId${index}`)) index++;
|
|
2057
|
+
return `rId${index}`;
|
|
2058
|
+
}
|
|
2059
|
+
var getRelationshipId = (element) => relAttr(element, "id") || void 0;
|
|
2060
|
+
|
|
2061
|
+
// opc/content-types.ts
|
|
2062
|
+
var escapeAttr2 = (value) => value.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<");
|
|
2063
|
+
function parseContentTypes(xml) {
|
|
2064
|
+
const defaults = /* @__PURE__ */ new Map();
|
|
2065
|
+
const overrides = /* @__PURE__ */ new Map();
|
|
2066
|
+
if (!xml) return { defaults, overrides };
|
|
2067
|
+
for (const node of elements(parseXml(xml).documentElement)) {
|
|
2068
|
+
const contentType = node.getAttribute("ContentType");
|
|
2069
|
+
if (!contentType) continue;
|
|
2070
|
+
if (node.localName === "Default") {
|
|
2071
|
+
const extension = node.getAttribute("Extension");
|
|
2072
|
+
if (extension) defaults.set(extension.toLowerCase(), contentType);
|
|
2073
|
+
} else if (node.localName === "Override") {
|
|
2074
|
+
const partName = node.getAttribute("PartName");
|
|
2075
|
+
if (partName) overrides.set(partName, contentType);
|
|
2076
|
+
}
|
|
2077
|
+
}
|
|
2078
|
+
return { defaults, overrides };
|
|
2079
|
+
}
|
|
2080
|
+
function contentTypeForPart(types, partName) {
|
|
2081
|
+
const overridePath = partName.startsWith("/") ? partName : `/${partName}`;
|
|
2082
|
+
const override = types.overrides.get(overridePath);
|
|
2083
|
+
if (override) return override;
|
|
2084
|
+
const extension = partName.split(".").pop()?.toLowerCase();
|
|
2085
|
+
return extension ? types.defaults.get(extension) : void 0;
|
|
2086
|
+
}
|
|
2087
|
+
function buildContentTypesXml(types) {
|
|
2088
|
+
const defaults = Array.from(types.defaults).map(
|
|
2089
|
+
([extension, type]) => `<Default Extension="${extension}" ContentType="${escapeAttr2(type)}"/>`
|
|
2090
|
+
).join("");
|
|
2091
|
+
const overrides = Array.from(types.overrides).map(
|
|
1716
2092
|
([part, type]) => `<Override PartName="${escapeAttr2(part)}" ContentType="${escapeAttr2(type)}"/>`
|
|
1717
2093
|
).join("");
|
|
1718
2094
|
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Types xmlns="${NS.contentTypes}">${defaults}${overrides}</Types>`;
|
|
@@ -3665,7 +4041,7 @@ var NAMED = {
|
|
|
3665
4041
|
var POINT_TO_PX = 96 / 72;
|
|
3666
4042
|
var WATERMARK_PREFIX = "PowerPlusWaterMarkObject";
|
|
3667
4043
|
var DEFAULT_WATERMARK_COLOR = "#c0c0c0";
|
|
3668
|
-
function
|
|
4044
|
+
function colorOf(value) {
|
|
3669
4045
|
const text = (value ?? "").trim().toLowerCase().split(/\s/)[0] ?? "";
|
|
3670
4046
|
if (NAMED[text]) return NAMED[text];
|
|
3671
4047
|
const hex = /^#?([0-9a-f]{6})$/.exec(text);
|
|
@@ -3686,7 +4062,7 @@ function parseWatermarkShape(shape) {
|
|
|
3686
4062
|
const rotation = /rotation:\s*(-?[\d.]+)/i.exec(style);
|
|
3687
4063
|
const spec = {
|
|
3688
4064
|
text: path.getAttribute("string") ?? "",
|
|
3689
|
-
color:
|
|
4065
|
+
color: colorOf(shape.getAttribute("fillcolor")),
|
|
3690
4066
|
semitransparent: opacity !== null && opacity !== "" && opacity !== "1",
|
|
3691
4067
|
layout: rotation && Math.abs(Number(rotation[1]) % 360) > 1 ? "diagonal" : "horizontal",
|
|
3692
4068
|
...family ? { fontFamily: family.trim() } : {}
|
|
@@ -3798,7 +4174,7 @@ var add = (parent, ...items) => {
|
|
|
3798
4174
|
return parent;
|
|
3799
4175
|
};
|
|
3800
4176
|
var emu2 = (px3) => String(Math.max(1, Math.round(px3 * EMU_PER_PIXEL)));
|
|
3801
|
-
var
|
|
4177
|
+
var descendants2 = (root, ns, local) => Array.from(root.getElementsByTagNameNS(ns, local));
|
|
3802
4178
|
function paragraphsFor(doc, lines) {
|
|
3803
4179
|
return (lines.length ? lines : [""]).map((line) => {
|
|
3804
4180
|
const paragraph = makeW(doc, "p");
|
|
@@ -3890,23 +4266,23 @@ function buildTextBoxDrawing(doc, image, docPrId) {
|
|
|
3890
4266
|
}
|
|
3891
4267
|
function isSimpleTextBox(graphicData, anchored) {
|
|
3892
4268
|
if (!graphicData || anchored) return false;
|
|
3893
|
-
const content =
|
|
4269
|
+
const content = descendants2(graphicData, W_NS, "txbxContent")[0];
|
|
3894
4270
|
if (!content) return false;
|
|
3895
4271
|
const plain = (node, allowed) => Array.from(node.childNodes).filter(isElement).every((child3) => child3.namespaceURI === W_NS && allowed.includes(child3.localName));
|
|
3896
|
-
return plain(content, ["p"]) &&
|
|
3897
|
-
(paragraph) => plain(paragraph, ["r"]) &&
|
|
4272
|
+
return plain(content, ["p"]) && descendants2(content, W_NS, "p").every(
|
|
4273
|
+
(paragraph) => plain(paragraph, ["r"]) && descendants2(paragraph, W_NS, "r").every((run) => plain(run, ["t"]))
|
|
3898
4274
|
);
|
|
3899
4275
|
}
|
|
3900
4276
|
function textBoxHasBorder(graphicData) {
|
|
3901
|
-
const spPr = graphicData &&
|
|
4277
|
+
const spPr = graphicData && descendants2(graphicData, WPS_NS, "spPr")[0];
|
|
3902
4278
|
const ln = spPr && Array.from(spPr.getElementsByTagNameNS(A_NS, "ln"))[0];
|
|
3903
4279
|
return Boolean(ln && !ln.getElementsByTagNameNS(A_NS, "noFill").length);
|
|
3904
4280
|
}
|
|
3905
4281
|
function patchTextBox(doc, drawing, image, base) {
|
|
3906
4282
|
if (image.widthPx !== base.widthPx || image.heightPx !== base.heightPx)
|
|
3907
4283
|
for (const node of [
|
|
3908
|
-
...
|
|
3909
|
-
...
|
|
4284
|
+
...descendants2(drawing, WP_NS, "extent"),
|
|
4285
|
+
...descendants2(drawing, A_NS, "ext").filter(
|
|
3910
4286
|
(ext) => ext.parentNode?.localName === "xfrm"
|
|
3911
4287
|
)
|
|
3912
4288
|
]) {
|
|
@@ -3914,14 +4290,14 @@ function patchTextBox(doc, drawing, image, base) {
|
|
|
3914
4290
|
node.setAttribute("cy", emu2(image.heightPx));
|
|
3915
4291
|
}
|
|
3916
4292
|
if (JSON.stringify(image.textBoxText) !== JSON.stringify(base.textBoxText)) {
|
|
3917
|
-
const content =
|
|
4293
|
+
const content = descendants2(drawing, W_NS, "txbxContent")[0];
|
|
3918
4294
|
if (content) {
|
|
3919
4295
|
for (const child3 of Array.from(content.childNodes)) content.removeChild(child3);
|
|
3920
4296
|
add(content, ...paragraphsFor(doc, image.textBoxText ?? []));
|
|
3921
4297
|
}
|
|
3922
4298
|
}
|
|
3923
4299
|
if (image.textBoxBorder !== false !== (base.textBoxBorder !== false)) {
|
|
3924
|
-
const spPr =
|
|
4300
|
+
const spPr = descendants2(drawing, WPS_NS, "spPr")[0];
|
|
3925
4301
|
if (spPr) {
|
|
3926
4302
|
for (const old of Array.from(spPr.childNodes).filter(
|
|
3927
4303
|
(node) => isElement(node) && node.localName === "ln"
|
|
@@ -4084,47 +4460,6 @@ var DIAGRAM_RELATIONSHIP_TYPES = {
|
|
|
4084
4460
|
drawing: RELATIONSHIP_TYPES.diagramDrawing
|
|
4085
4461
|
};
|
|
4086
4462
|
|
|
4087
|
-
// diagram/dom.ts
|
|
4088
|
-
function attributeReader(element) {
|
|
4089
|
-
return (name) => {
|
|
4090
|
-
if (!element) return void 0;
|
|
4091
|
-
const direct = element.getAttribute(name);
|
|
4092
|
-
if (direct !== null) return direct;
|
|
4093
|
-
const attributes = element.attributes;
|
|
4094
|
-
for (let index = 0; index < attributes.length; index++) {
|
|
4095
|
-
const candidate = attributes.item(index);
|
|
4096
|
-
if (candidate && candidate.localName === name) return candidate.value;
|
|
4097
|
-
}
|
|
4098
|
-
return void 0;
|
|
4099
|
-
};
|
|
4100
|
-
}
|
|
4101
|
-
function stringAttribute(element, name) {
|
|
4102
|
-
const value = attributeReader(element)(name)?.trim();
|
|
4103
|
-
return value ? value : void 0;
|
|
4104
|
-
}
|
|
4105
|
-
function integerAttribute(element, name) {
|
|
4106
|
-
const parsed = Number.parseInt(attributeReader(element)(name) ?? "", 10);
|
|
4107
|
-
return Number.isFinite(parsed) ? parsed : void 0;
|
|
4108
|
-
}
|
|
4109
|
-
function booleanAttribute(element, name) {
|
|
4110
|
-
const value = attributeReader(element)(name)?.trim().toLowerCase();
|
|
4111
|
-
if (value === "1" || value === "true") return true;
|
|
4112
|
-
if (value === "0" || value === "false") return false;
|
|
4113
|
-
return void 0;
|
|
4114
|
-
}
|
|
4115
|
-
function descendants2(root, local) {
|
|
4116
|
-
const result = [];
|
|
4117
|
-
const visit = (node) => {
|
|
4118
|
-
for (const child3 of Array.from(node.childNodes)) {
|
|
4119
|
-
if (!isElement(child3)) continue;
|
|
4120
|
-
if (child3.localName === local) result.push(child3);
|
|
4121
|
-
visit(child3);
|
|
4122
|
-
}
|
|
4123
|
-
};
|
|
4124
|
-
visit(root);
|
|
4125
|
-
return result;
|
|
4126
|
-
}
|
|
4127
|
-
|
|
4128
4463
|
// diagram/data-model.ts
|
|
4129
4464
|
var TRANSITION_TYPES = /* @__PURE__ */ new Set(["parTrans", "sibTrans"]);
|
|
4130
4465
|
var STRUCTURAL_TYPES = /* @__PURE__ */ new Set(["doc", "pres", "parTrans", "sibTrans"]);
|
|
@@ -4148,7 +4483,7 @@ function connectionLabel(connection, transitionText) {
|
|
|
4148
4483
|
function textBodyParagraphs(body) {
|
|
4149
4484
|
if (!body) return [];
|
|
4150
4485
|
return children(body, "p", NS.a).map(
|
|
4151
|
-
(paragraph) =>
|
|
4486
|
+
(paragraph) => descendants(paragraph, "t").map((run) => run.textContent ?? "").join("")
|
|
4152
4487
|
);
|
|
4153
4488
|
}
|
|
4154
4489
|
function parsePoint(element) {
|
|
@@ -4228,312 +4563,20 @@ function parseDiagramDataModel(source, part) {
|
|
|
4228
4563
|
if ((!connection.type || connection.type === "parOf") && !parentById.has(connection.destId))
|
|
4229
4564
|
parentById.set(connection.destId, connection.sourceId);
|
|
4230
4565
|
}
|
|
4231
|
-
const ext =
|
|
4566
|
+
const ext = descendants(root, "dataModelExt")[0];
|
|
4232
4567
|
const drawingRelId = stringAttribute(ext, "relId");
|
|
4233
4568
|
return {
|
|
4234
4569
|
points,
|
|
4235
4570
|
connections,
|
|
4236
4571
|
nodes: points.filter((point) => !STRUCTURAL_TYPES.has(point.type)),
|
|
4237
|
-
parentById,
|
|
4238
|
-
...drawingRelId ? { drawingRelId } : {},
|
|
4239
|
-
issues
|
|
4240
|
-
};
|
|
4241
|
-
}
|
|
4242
|
-
|
|
4243
|
-
// color/color-primitives.ts
|
|
4244
|
-
function clampUnitInterval(value) {
|
|
4245
|
-
return Math.min(1, Math.max(0, value));
|
|
4246
|
-
}
|
|
4247
|
-
function hexToRgbChannels(color) {
|
|
4248
|
-
const normalized = color.replace("#", "");
|
|
4249
|
-
if (!/^[0-9a-fA-F]{6}$/.test(normalized)) {
|
|
4250
|
-
return null;
|
|
4251
|
-
}
|
|
4252
|
-
return {
|
|
4253
|
-
r: Number.parseInt(normalized.slice(0, 2), 16),
|
|
4254
|
-
g: Number.parseInt(normalized.slice(2, 4), 16),
|
|
4255
|
-
b: Number.parseInt(normalized.slice(4, 6), 16)
|
|
4256
|
-
};
|
|
4257
|
-
}
|
|
4258
|
-
function percentDivisorFor(text) {
|
|
4259
|
-
return text.endsWith("%") ? 100 : 1e5;
|
|
4260
|
-
}
|
|
4261
|
-
function parseOoxmlPercent(value) {
|
|
4262
|
-
const text = String(value ?? "").trim();
|
|
4263
|
-
const divisor = percentDivisorFor(text);
|
|
4264
|
-
const magnitude = Number.parseFloat(divisor === 100 ? text.slice(0, -1) : text);
|
|
4265
|
-
if (!Number.isFinite(magnitude)) {
|
|
4266
|
-
return void 0;
|
|
4267
|
-
}
|
|
4268
|
-
return magnitude / divisor;
|
|
4269
|
-
}
|
|
4270
|
-
function parseDrawingPercent(value) {
|
|
4271
|
-
const parsed = parseOoxmlPercent(value);
|
|
4272
|
-
return parsed === void 0 ? void 0 : clampUnitInterval(parsed);
|
|
4273
|
-
}
|
|
4274
|
-
function scrgbLinearToSrgb8(linear) {
|
|
4275
|
-
const l = Math.min(1, Math.max(0, linear));
|
|
4276
|
-
const companded = l <= 31308e-7 ? 12.92 * l : 1.055 * l ** (1 / 2.4) - 0.055;
|
|
4277
|
-
return Math.min(255, Math.max(0, Math.round(companded * 255)));
|
|
4278
|
-
}
|
|
4279
|
-
function toHex2(value) {
|
|
4280
|
-
return Math.min(255, Math.max(0, Math.round(value))).toString(16).padStart(2, "0").toUpperCase();
|
|
4281
|
-
}
|
|
4282
|
-
function rgbToHsl(r, g, b) {
|
|
4283
|
-
const rN = r / 255;
|
|
4284
|
-
const gN = g / 255;
|
|
4285
|
-
const bN = b / 255;
|
|
4286
|
-
const cMax = Math.max(rN, gN, bN);
|
|
4287
|
-
const cMin = Math.min(rN, gN, bN);
|
|
4288
|
-
const delta = cMax - cMin;
|
|
4289
|
-
const l = (cMax + cMin) / 2;
|
|
4290
|
-
let s = 0;
|
|
4291
|
-
if (delta !== 0) {
|
|
4292
|
-
s = delta / (1 - Math.abs(2 * l - 1));
|
|
4293
|
-
}
|
|
4294
|
-
let h = 0;
|
|
4295
|
-
if (delta !== 0) {
|
|
4296
|
-
if (cMax === rN) {
|
|
4297
|
-
h = 60 * ((gN - bN) / delta % 6);
|
|
4298
|
-
} else if (cMax === gN) {
|
|
4299
|
-
h = 60 * ((bN - rN) / delta + 2);
|
|
4300
|
-
} else {
|
|
4301
|
-
h = 60 * ((rN - gN) / delta + 4);
|
|
4302
|
-
}
|
|
4303
|
-
}
|
|
4304
|
-
if (h < 0) {
|
|
4305
|
-
h += 360;
|
|
4306
|
-
}
|
|
4307
|
-
return { h, s: clampUnitInterval(s), l: clampUnitInterval(l) };
|
|
4308
|
-
}
|
|
4309
|
-
function hslToRgb(h, s, l, roundChannel = Math.round, options) {
|
|
4310
|
-
const sC = clampUnitInterval(s);
|
|
4311
|
-
const lC = clampUnitInterval(l);
|
|
4312
|
-
const hN = (h % 360 + 360) % 360;
|
|
4313
|
-
const c = (1 - Math.abs(2 * lC - 1)) * sC;
|
|
4314
|
-
const x = c * (1 - Math.abs(hN / 60 % 2 - 1));
|
|
4315
|
-
const m = lC - c / 2;
|
|
4316
|
-
let rP = 0;
|
|
4317
|
-
let gP = 0;
|
|
4318
|
-
let bP = 0;
|
|
4319
|
-
if (hN < 60) {
|
|
4320
|
-
rP = c;
|
|
4321
|
-
gP = x;
|
|
4322
|
-
bP = 0;
|
|
4323
|
-
} else if (hN < 120) {
|
|
4324
|
-
rP = x;
|
|
4325
|
-
gP = c;
|
|
4326
|
-
bP = 0;
|
|
4327
|
-
} else if (hN < 180) {
|
|
4328
|
-
rP = 0;
|
|
4329
|
-
gP = c;
|
|
4330
|
-
bP = x;
|
|
4331
|
-
} else if (hN < 240) {
|
|
4332
|
-
rP = 0;
|
|
4333
|
-
gP = x;
|
|
4334
|
-
bP = c;
|
|
4335
|
-
} else if (hN < 300) {
|
|
4336
|
-
rP = x;
|
|
4337
|
-
gP = 0;
|
|
4338
|
-
bP = c;
|
|
4339
|
-
} else {
|
|
4340
|
-
rP = c;
|
|
4341
|
-
gP = 0;
|
|
4342
|
-
bP = x;
|
|
4343
|
-
}
|
|
4344
|
-
return {
|
|
4345
|
-
r: roundChannel((rP + m) * 255),
|
|
4346
|
-
g: roundChannel((gP + m) * 255),
|
|
4347
|
-
b: roundChannel((bP + m) * 255)
|
|
4348
|
-
};
|
|
4349
|
-
}
|
|
4350
|
-
function parseDrawingFraction(value) {
|
|
4351
|
-
return parseOoxmlPercent(value);
|
|
4352
|
-
}
|
|
4353
|
-
function parseDrawingHueDegrees(value) {
|
|
4354
|
-
const parsed = Number.parseFloat(String(value ?? "").trim());
|
|
4355
|
-
if (!Number.isFinite(parsed)) {
|
|
4356
|
-
return void 0;
|
|
4357
|
-
}
|
|
4358
|
-
return parsed / 6e4;
|
|
4359
|
-
}
|
|
4360
|
-
|
|
4361
|
-
// color/color-linear.ts
|
|
4362
|
-
function srgb255ToLinear(channel) {
|
|
4363
|
-
const c = clampUnitInterval(channel / 255);
|
|
4364
|
-
return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
|
|
4365
|
-
}
|
|
4366
|
-
function linearToSrgb255(linear) {
|
|
4367
|
-
const c = clampUnitInterval(linear);
|
|
4368
|
-
return 255 * (c <= 31308e-7 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - 0.055);
|
|
4369
|
-
}
|
|
4370
|
-
|
|
4371
|
-
// diagram/drawing-color.ts
|
|
4372
|
-
var COLOR_ELEMENTS = {
|
|
4373
|
-
srgbClr: "srgb",
|
|
4374
|
-
schemeClr: "scheme",
|
|
4375
|
-
sysClr: "system",
|
|
4376
|
-
prstClr: "preset",
|
|
4377
|
-
scrgbClr: "scrgb",
|
|
4378
|
-
hslClr: "hsl"
|
|
4379
|
-
};
|
|
4380
|
-
function colorValue(kind, element) {
|
|
4381
|
-
const attribute = (name) => element.getAttribute(name) ?? "";
|
|
4382
|
-
if (kind === "scrgb") return `${attribute("r")},${attribute("g")},${attribute("b")}`;
|
|
4383
|
-
if (kind === "hsl") return `${attribute("hue")},${attribute("sat")},${attribute("lum")}`;
|
|
4384
|
-
return attribute("val");
|
|
4385
|
-
}
|
|
4386
|
-
function parseDrawingColorIn(container) {
|
|
4387
|
-
if (!container) return void 0;
|
|
4388
|
-
for (const element of elements(container)) {
|
|
4389
|
-
const kind = COLOR_ELEMENTS[element.localName];
|
|
4390
|
-
if (!kind || element.namespaceURI && element.namespaceURI !== NS.a) continue;
|
|
4391
|
-
return parseDrawingColor(element);
|
|
4392
|
-
}
|
|
4393
|
-
return void 0;
|
|
4394
|
-
}
|
|
4395
|
-
function parseDrawingColor(element) {
|
|
4396
|
-
const kind = COLOR_ELEMENTS[element.localName];
|
|
4397
|
-
if (!kind) return void 0;
|
|
4398
|
-
const color = {
|
|
4399
|
-
kind,
|
|
4400
|
-
value: colorValue(kind, element),
|
|
4401
|
-
transforms: elements(element).map((child3) => ({
|
|
4402
|
-
name: child3.localName,
|
|
4403
|
-
value: child3.getAttribute("val") ?? ""
|
|
4404
|
-
}))
|
|
4405
|
-
};
|
|
4406
|
-
const fallback = kind === "system" ? element.getAttribute("lastClr") : null;
|
|
4407
|
-
if (fallback) color.fallback = fallback;
|
|
4408
|
-
return color;
|
|
4409
|
-
}
|
|
4410
|
-
function parseDrawingColorList(container) {
|
|
4411
|
-
if (!container) return [];
|
|
4412
|
-
return elements(container).flatMap((element) => {
|
|
4413
|
-
const color = parseDrawingColor(element);
|
|
4414
|
-
return color ? [color] : [];
|
|
4415
|
-
});
|
|
4416
|
-
}
|
|
4417
|
-
var PRESET_COLORS = {
|
|
4418
|
-
black: "#000000",
|
|
4419
|
-
white: "#FFFFFF",
|
|
4420
|
-
red: "#FF0000",
|
|
4421
|
-
green: "#008000",
|
|
4422
|
-
blue: "#0000FF",
|
|
4423
|
-
yellow: "#FFFF00",
|
|
4424
|
-
gray: "#808080",
|
|
4425
|
-
grey: "#808080"
|
|
4426
|
-
};
|
|
4427
|
-
function baseHex(color, theme) {
|
|
4428
|
-
switch (color.kind) {
|
|
4429
|
-
case "srgb":
|
|
4430
|
-
return /^[0-9a-f]{6}$/i.test(color.value) ? `#${color.value.toUpperCase()}` : void 0;
|
|
4431
|
-
case "scheme":
|
|
4432
|
-
return theme?.scheme(color.value);
|
|
4433
|
-
case "system":
|
|
4434
|
-
return color.fallback && /^[0-9a-f]{6}$/i.test(color.fallback) ? `#${color.fallback.toUpperCase()}` : void 0;
|
|
4435
|
-
case "preset":
|
|
4436
|
-
return PRESET_COLORS[color.value];
|
|
4437
|
-
case "scrgb": {
|
|
4438
|
-
const [r, g, b] = color.value.split(",").map((part) => parseDrawingFraction(part));
|
|
4439
|
-
if (r === void 0 || g === void 0 || b === void 0) return void 0;
|
|
4440
|
-
return `#${toHex2(scrgbLinearToSrgb8(r))}${toHex2(scrgbLinearToSrgb8(g))}${toHex2(scrgbLinearToSrgb8(b))}`;
|
|
4441
|
-
}
|
|
4442
|
-
case "hsl": {
|
|
4443
|
-
const [h, s, l] = color.value.split(",");
|
|
4444
|
-
const hue = parseDrawingHueDegrees(h);
|
|
4445
|
-
const sat = parseDrawingFraction(s);
|
|
4446
|
-
const lum = parseDrawingFraction(l);
|
|
4447
|
-
if (hue === void 0 || sat === void 0 || lum === void 0) return void 0;
|
|
4448
|
-
const { r, g, b } = hslToRgb(hue, sat, lum);
|
|
4449
|
-
return `#${toHex2(r)}${toHex2(g)}${toHex2(b)}`;
|
|
4450
|
-
}
|
|
4451
|
-
}
|
|
4452
|
-
}
|
|
4453
|
-
var APPLIED = /* @__PURE__ */ new Set([
|
|
4454
|
-
"alpha",
|
|
4455
|
-
"alphaMod",
|
|
4456
|
-
"alphaOff",
|
|
4457
|
-
"comp",
|
|
4458
|
-
"inv",
|
|
4459
|
-
"gray",
|
|
4460
|
-
"shade",
|
|
4461
|
-
"tint",
|
|
4462
|
-
"hue",
|
|
4463
|
-
"hueMod",
|
|
4464
|
-
"hueOff",
|
|
4465
|
-
"sat",
|
|
4466
|
-
"satMod",
|
|
4467
|
-
"satOff",
|
|
4468
|
-
"lum",
|
|
4469
|
-
"lumMod",
|
|
4470
|
-
"lumOff"
|
|
4471
|
-
]);
|
|
4472
|
-
function resolveDrawingColor(color, theme, options) {
|
|
4473
|
-
const base = baseHex(color, theme);
|
|
4474
|
-
const rgb = base ? hexToRgbChannels(base) : null;
|
|
4475
|
-
if (!rgb) return void 0;
|
|
4476
|
-
let { r, g, b } = rgb;
|
|
4477
|
-
const find = (name) => color.transforms.find((entry) => entry.name === name)?.value;
|
|
4478
|
-
const has = (name) => color.transforms.some((entry) => entry.name === name);
|
|
4479
|
-
if (has("comp")) {
|
|
4480
|
-
const hsl = rgbToHsl(r, g, b);
|
|
4481
|
-
({ r, g, b } = hslToRgb((hsl.h + 180) % 360, hsl.s, hsl.l));
|
|
4482
|
-
}
|
|
4483
|
-
if (has("inv")) [r, g, b] = [255 - r, 255 - g, 255 - b];
|
|
4484
|
-
if (has("gray")) r = g = b = Math.round(0.299 * r + 0.587 * g + 0.114 * b);
|
|
4485
|
-
const shade = parseDrawingPercent(find("shade"));
|
|
4486
|
-
if (shade !== void 0) {
|
|
4487
|
-
r = linearToSrgb255(srgb255ToLinear(r) * shade);
|
|
4488
|
-
g = linearToSrgb255(srgb255ToLinear(g) * shade);
|
|
4489
|
-
b = linearToSrgb255(srgb255ToLinear(b) * shade);
|
|
4490
|
-
}
|
|
4491
|
-
const tint = parseDrawingPercent(find("tint"));
|
|
4492
|
-
if (tint !== void 0) {
|
|
4493
|
-
r = linearToSrgb255(1 - (1 - srgb255ToLinear(r)) * tint);
|
|
4494
|
-
g = linearToSrgb255(1 - (1 - srgb255ToLinear(g)) * tint);
|
|
4495
|
-
b = linearToSrgb255(1 - (1 - srgb255ToLinear(b)) * tint);
|
|
4496
|
-
}
|
|
4497
|
-
if (["hue", "hueMod", "hueOff", "sat", "satMod", "satOff", "lum", "lumMod", "lumOff"].some(has)) {
|
|
4498
|
-
const hsl = rgbToHsl(r, g, b);
|
|
4499
|
-
const wrap = (degrees) => (degrees % 360 + 360) % 360;
|
|
4500
|
-
const hueAbs = parseDrawingHueDegrees(find("hue"));
|
|
4501
|
-
if (hueAbs !== void 0) hsl.h = wrap(hueAbs);
|
|
4502
|
-
const hueMod = parseDrawingFraction(find("hueMod"));
|
|
4503
|
-
if (hueMod !== void 0) hsl.h = wrap(hsl.h * hueMod);
|
|
4504
|
-
const hueOff = parseDrawingHueDegrees(find("hueOff"));
|
|
4505
|
-
if (hueOff !== void 0) hsl.h = wrap(hsl.h + hueOff);
|
|
4506
|
-
const satAbs = parseDrawingFraction(find("sat"));
|
|
4507
|
-
if (satAbs !== void 0) hsl.s = clampUnitInterval(satAbs);
|
|
4508
|
-
const satMod = parseDrawingFraction(find("satMod"));
|
|
4509
|
-
if (satMod !== void 0) hsl.s = clampUnitInterval(hsl.s * satMod);
|
|
4510
|
-
const satOff = parseDrawingFraction(find("satOff"));
|
|
4511
|
-
if (satOff !== void 0) hsl.s = clampUnitInterval(hsl.s + satOff);
|
|
4512
|
-
const lumAbs = parseDrawingFraction(find("lum"));
|
|
4513
|
-
if (lumAbs !== void 0) hsl.l = clampUnitInterval(lumAbs);
|
|
4514
|
-
const lumMod = parseDrawingFraction(find("lumMod"));
|
|
4515
|
-
if (lumMod !== void 0) hsl.l = clampUnitInterval(hsl.l * lumMod);
|
|
4516
|
-
const lumOff = parseDrawingFraction(find("lumOff"));
|
|
4517
|
-
if (lumOff !== void 0) hsl.l = clampUnitInterval(hsl.l + lumOff);
|
|
4518
|
-
const round = Math.round;
|
|
4519
|
-
({ r, g, b } = hslToRgb(hsl.h, hsl.s, hsl.l, round));
|
|
4520
|
-
}
|
|
4521
|
-
let alpha = parseDrawingPercent(find("alpha")) ?? 1;
|
|
4522
|
-
const alphaMod = parseDrawingFraction(find("alphaMod"));
|
|
4523
|
-
if (alphaMod !== void 0) alpha = clampUnitInterval(alpha * alphaMod);
|
|
4524
|
-
const alphaOff = parseDrawingFraction(find("alphaOff"));
|
|
4525
|
-
if (alphaOff !== void 0) alpha = clampUnitInterval(alpha + alphaOff);
|
|
4526
|
-
return {
|
|
4527
|
-
hex: `#${toHex2(r)}${toHex2(g)}${toHex2(b)}`,
|
|
4528
|
-
alpha,
|
|
4529
|
-
unapplied: [...new Set(color.transforms.map((entry) => entry.name))].filter(
|
|
4530
|
-
(name) => !APPLIED.has(name)
|
|
4531
|
-
)
|
|
4572
|
+
parentById,
|
|
4573
|
+
...drawingRelId ? { drawingRelId } : {},
|
|
4574
|
+
issues
|
|
4532
4575
|
};
|
|
4533
4576
|
}
|
|
4534
4577
|
|
|
4535
4578
|
// diagram/definitions.ts
|
|
4536
|
-
var
|
|
4579
|
+
var rootOf2 = (source) => (typeof source === "string" ? parseXml(source, { label: "DiagramML" }) : source).documentElement;
|
|
4537
4580
|
function parseDefinitionHeader(root) {
|
|
4538
4581
|
const header = {
|
|
4539
4582
|
uniqueId: stringAttribute(root, "uniqueId") ?? "",
|
|
@@ -4554,7 +4597,7 @@ function colorList(container) {
|
|
|
4554
4597
|
return { ...method ? { method } : {}, colors: parseDrawingColorList(container) };
|
|
4555
4598
|
}
|
|
4556
4599
|
function parseDiagramColors(source) {
|
|
4557
|
-
const root =
|
|
4600
|
+
const root = rootOf2(source);
|
|
4558
4601
|
const labels = children(root, "styleLbl", NS.dgm).map((label) => ({
|
|
4559
4602
|
name: stringAttribute(label, "name") ?? "",
|
|
4560
4603
|
fill: colorList(first(label, "fillClrLst", NS.dgm)),
|
|
@@ -4594,7 +4637,7 @@ function parseStyleReferences(style) {
|
|
|
4594
4637
|
}
|
|
4595
4638
|
var hasContent = (element) => Boolean(element && (element.attributes.length > 0 || elements(element).length > 0));
|
|
4596
4639
|
function parseDiagramQuickStyle(source) {
|
|
4597
|
-
const root =
|
|
4640
|
+
const root = rootOf2(source);
|
|
4598
4641
|
const labels = children(root, "styleLbl", NS.dgm).map((label) => ({
|
|
4599
4642
|
name: stringAttribute(label, "name") ?? "",
|
|
4600
4643
|
...parseStyleReferences(first(label, "style", NS.dgm)),
|
|
@@ -4608,7 +4651,7 @@ function parseDiagramQuickStyle(source) {
|
|
|
4608
4651
|
};
|
|
4609
4652
|
}
|
|
4610
4653
|
function parseDiagramLayoutSummary(source) {
|
|
4611
|
-
const root =
|
|
4654
|
+
const root = rootOf2(source);
|
|
4612
4655
|
const header = parseDefinitionHeader(root);
|
|
4613
4656
|
const family = resolveDiagramLayoutCategory(
|
|
4614
4657
|
header.uniqueId,
|
|
@@ -4620,11 +4663,11 @@ function parseDiagramLayoutSummary(source) {
|
|
|
4620
4663
|
...header,
|
|
4621
4664
|
...family ? { family } : {},
|
|
4622
4665
|
...rootAlgorithm ? { rootAlgorithm } : {},
|
|
4623
|
-
layoutNodeCount:
|
|
4666
|
+
layoutNodeCount: descendants(root, "layoutNode").length
|
|
4624
4667
|
};
|
|
4625
4668
|
}
|
|
4626
4669
|
|
|
4627
|
-
//
|
|
4670
|
+
// drawingml/drawing-fill.ts
|
|
4628
4671
|
var FILL_ELEMENTS = /* @__PURE__ */ new Set([
|
|
4629
4672
|
"noFill",
|
|
4630
4673
|
"solidFill",
|
|
@@ -4716,7 +4759,7 @@ function parseDrawingLine(ln) {
|
|
|
4716
4759
|
return line;
|
|
4717
4760
|
}
|
|
4718
4761
|
|
|
4719
|
-
//
|
|
4762
|
+
// drawingml/drawing-text.ts
|
|
4720
4763
|
function parseSpacing(parent) {
|
|
4721
4764
|
for (const [name, unit, divisor] of [
|
|
4722
4765
|
["spcPts", "points", 100],
|
|
@@ -4795,7 +4838,7 @@ function parseDrawingTextBody(body) {
|
|
|
4795
4838
|
return result;
|
|
4796
4839
|
}
|
|
4797
4840
|
|
|
4798
|
-
//
|
|
4841
|
+
// drawingml/drawing-geometry.ts
|
|
4799
4842
|
var int = (element, name) => Number.parseInt(element?.getAttribute(name) ?? "", 10);
|
|
4800
4843
|
function parseFrame(container) {
|
|
4801
4844
|
const off = first(container, "off", NS.a);
|
|
@@ -5614,6 +5657,23 @@ function restoreRunFormatting(run) {
|
|
|
5614
5657
|
else delete run.revision;
|
|
5615
5658
|
}
|
|
5616
5659
|
|
|
5660
|
+
// docx/field-flags.ts
|
|
5661
|
+
function parseFieldFlags(element) {
|
|
5662
|
+
const locked = onOffAttribute(element, "fldLock");
|
|
5663
|
+
const dirty = onOffAttribute(element, "dirty");
|
|
5664
|
+
if (locked === void 0 && dirty === void 0) return void 0;
|
|
5665
|
+
return { ...locked !== void 0 && { locked }, ...dirty !== void 0 && { dirty } };
|
|
5666
|
+
}
|
|
5667
|
+
function writeFieldFlags(element, flags) {
|
|
5668
|
+
for (const [name, value] of [
|
|
5669
|
+
["fldLock", flags?.locked],
|
|
5670
|
+
["dirty", flags?.dirty]
|
|
5671
|
+
]) {
|
|
5672
|
+
if (value === void 0) element.removeAttributeNS(WORD_NS, name);
|
|
5673
|
+
else element.setAttributeNS(WORD_NS, `w:${name}`, value ? "true" : "false");
|
|
5674
|
+
}
|
|
5675
|
+
}
|
|
5676
|
+
|
|
5617
5677
|
// docx/write-run.ts
|
|
5618
5678
|
function setAttribute6(element, local, value) {
|
|
5619
5679
|
element.setAttributeNS(WORD_NS, `w:${local}`, value);
|
|
@@ -5799,6 +5859,7 @@ function createRun(doc, run, base, old, allocator) {
|
|
|
5799
5859
|
if (run.fieldChar) {
|
|
5800
5860
|
const marker = makeW(doc, "fldChar");
|
|
5801
5861
|
setAttribute6(marker, "fldCharType", run.fieldChar);
|
|
5862
|
+
writeFieldFlags(marker, run.fieldFlags);
|
|
5802
5863
|
node.appendChild(marker);
|
|
5803
5864
|
return node;
|
|
5804
5865
|
}
|
|
@@ -5879,6 +5940,14 @@ function takeSimpleFieldCommentEdges(doc, runs, start, end, opens, closes) {
|
|
|
5879
5940
|
after: take(closes, end - 1).reverse().flatMap((edge) => rangeEndNodes(doc, edge))
|
|
5880
5941
|
};
|
|
5881
5942
|
}
|
|
5943
|
+
|
|
5944
|
+
// docx/field-lock.ts
|
|
5945
|
+
function isFieldLocked(run) {
|
|
5946
|
+
return run?.fieldFlags?.locked === true;
|
|
5947
|
+
}
|
|
5948
|
+
function sameFieldFlags(a, b) {
|
|
5949
|
+
return a?.locked === b?.locked && a?.dirty === b?.dirty;
|
|
5950
|
+
}
|
|
5882
5951
|
var MATH_NAMESPACES = /* @__PURE__ */ new Set([
|
|
5883
5952
|
"http://schemas.openxmlformats.org/officeDocument/2006/math",
|
|
5884
5953
|
"http://purl.oclc.org/ooxml/officeDocument/math"
|
|
@@ -6203,6 +6272,7 @@ function buildInlineContent(doc, runs, base, slots, allocator, ranges) {
|
|
|
6203
6272
|
container = makeW(doc, "fldSimple");
|
|
6204
6273
|
setW6(container, "instr", ` ${group.instr} `);
|
|
6205
6274
|
}
|
|
6275
|
+
if (group.kind === "simpleField") writeFieldFlags(container, runAt(start).fieldFlags);
|
|
6206
6276
|
const edges = group.kind === "simpleField" ? takeSimpleFieldCommentEdges(doc, runs, start, index, opens, closes) : { before: [], after: [] };
|
|
6207
6277
|
for (let item = start; item < index; item++)
|
|
6208
6278
|
for (const node of nodesFor(item)) container.appendChild(node);
|
|
@@ -6213,13 +6283,18 @@ function buildInlineContent(doc, runs, base, slots, allocator, ranges) {
|
|
|
6213
6283
|
function containerGroup(run) {
|
|
6214
6284
|
if (run.link) return { kind: "link", link: run.link };
|
|
6215
6285
|
if (run.field?.simple)
|
|
6216
|
-
return {
|
|
6286
|
+
return {
|
|
6287
|
+
kind: "simpleField",
|
|
6288
|
+
instr: run.field.instr,
|
|
6289
|
+
instanceId: run.fieldInstanceId,
|
|
6290
|
+
fieldFlags: run.fieldFlags
|
|
6291
|
+
};
|
|
6217
6292
|
return void 0;
|
|
6218
6293
|
}
|
|
6219
6294
|
function sameGroup(a, b) {
|
|
6220
6295
|
if (!a || !b) return a === b;
|
|
6221
6296
|
if (a.kind === "link" && b.kind === "link") return sameLink(a.link, b.link);
|
|
6222
|
-
return a.kind === "simpleField" && b.kind === "simpleField" && a.instr === b.instr && a.instanceId === b.instanceId;
|
|
6297
|
+
return a.kind === "simpleField" && b.kind === "simpleField" && a.instr === b.instr && a.instanceId === b.instanceId && sameFieldFlags(a.fieldFlags, b.fieldFlags);
|
|
6223
6298
|
}
|
|
6224
6299
|
|
|
6225
6300
|
// docx/paragraph-properties.ts
|
|
@@ -7044,103 +7119,338 @@ function validateNumberingCatalog(c, catalog) {
|
|
|
7044
7119
|
}
|
|
7045
7120
|
}
|
|
7046
7121
|
|
|
7047
|
-
// docx/validate-model.ts
|
|
7048
|
-
function validateBlocks(c, blocks) {
|
|
7049
|
-
blocks?.forEach((block, index) => {
|
|
7050
|
-
const at = c.at(`[${index}]`);
|
|
7051
|
-
if (block.type === "paragraph") return validateParagraph(at, block);
|
|
7052
|
-
validateTable(at, block);
|
|
7053
|
-
block.rows.forEach(
|
|
7054
|
-
(row, r) => row.forEach(
|
|
7055
|
-
(cell, k) => cell.paragraphs.forEach(
|
|
7056
|
-
(paragraph, p) => validateParagraph(at.at(`.rows[${r}][${k}].paragraphs[${p}]`), paragraph)
|
|
7057
|
-
)
|
|
7058
|
-
)
|
|
7059
|
-
);
|
|
7060
|
-
});
|
|
7122
|
+
// docx/validate-model.ts
|
|
7123
|
+
function validateBlocks(c, blocks) {
|
|
7124
|
+
blocks?.forEach((block, index) => {
|
|
7125
|
+
const at = c.at(`[${index}]`);
|
|
7126
|
+
if (block.type === "paragraph") return validateParagraph(at, block);
|
|
7127
|
+
validateTable(at, block);
|
|
7128
|
+
block.rows.forEach(
|
|
7129
|
+
(row, r) => row.forEach(
|
|
7130
|
+
(cell, k) => cell.paragraphs.forEach(
|
|
7131
|
+
(paragraph, p) => validateParagraph(at.at(`.rows[${r}][${k}].paragraphs[${p}]`), paragraph)
|
|
7132
|
+
)
|
|
7133
|
+
)
|
|
7134
|
+
);
|
|
7135
|
+
});
|
|
7136
|
+
}
|
|
7137
|
+
function validateDocumentModel(model) {
|
|
7138
|
+
const issues = [];
|
|
7139
|
+
const path = (suffix) => new Checker(issues, suffix);
|
|
7140
|
+
const page = path("page");
|
|
7141
|
+
for (const key of ["width", "height"])
|
|
7142
|
+
page.check(
|
|
7143
|
+
key,
|
|
7144
|
+
model.page?.[key],
|
|
7145
|
+
(v) => typeof v === "number" && Number.isFinite(v) && Math.round(v * 15) > 0,
|
|
7146
|
+
"must be a finite, positive pixel size (converted to integer twips)"
|
|
7147
|
+
);
|
|
7148
|
+
for (const key of ["marginTop", "marginRight", "marginBottom", "marginLeft"])
|
|
7149
|
+
page.check(
|
|
7150
|
+
key,
|
|
7151
|
+
model.page?.[key],
|
|
7152
|
+
(v) => typeof v === "number" && Number.isFinite(v) && (key === "marginTop" || key === "marginBottom" || v >= 0),
|
|
7153
|
+
"must be a finite pixel size (converted to integer twips; left/right non-negative)"
|
|
7154
|
+
);
|
|
7155
|
+
validateBlocks(path("blocks"), model.blocks);
|
|
7156
|
+
model.sections?.forEach((section, index) => {
|
|
7157
|
+
const at = path(`sections[${index}]`);
|
|
7158
|
+
validateSection(at, section);
|
|
7159
|
+
for (const kind of ["headers", "footers"])
|
|
7160
|
+
for (const [slot2, content] of Object.entries(section[kind] ?? {}))
|
|
7161
|
+
validateBlocks(at.at(`.${kind}.${slot2}.blocks`), content?.blocks);
|
|
7162
|
+
});
|
|
7163
|
+
for (const kind of ["footnotes", "endnotes"])
|
|
7164
|
+
model[kind]?.forEach(
|
|
7165
|
+
(note, index) => validateBlocks(path(`${kind}[${index}].blocks`), note.blocks)
|
|
7166
|
+
);
|
|
7167
|
+
model.comments?.forEach(
|
|
7168
|
+
(comment, index) => path(`comments[${index}]`).dateTime("date", comment.date)
|
|
7169
|
+
);
|
|
7170
|
+
path("model").hex("pageColor", model.pageColor);
|
|
7171
|
+
path("model").enum("footnoteNumFmt", model.footnoteNumFmt, isStNumberFormat, "ST_NumberFormat");
|
|
7172
|
+
path("model").enum("endnoteNumFmt", model.endnoteNumFmt, isStNumberFormat, "ST_NumberFormat");
|
|
7173
|
+
if (model.numberingCatalog)
|
|
7174
|
+
validateNumberingCatalog(path("numberingCatalog"), model.numberingCatalog);
|
|
7175
|
+
return issues;
|
|
7176
|
+
}
|
|
7177
|
+
function assertValidDocumentModel(model) {
|
|
7178
|
+
const issues = validateDocumentModel(model);
|
|
7179
|
+
if (issues.length) throw new DocxModelValidationError(issues);
|
|
7180
|
+
}
|
|
7181
|
+
|
|
7182
|
+
// docx/numbering-parts.ts
|
|
7183
|
+
var CT_NS = "http://schemas.openxmlformats.org/package/2006/content-types";
|
|
7184
|
+
var REL_NS2 = "http://schemas.openxmlformats.org/package/2006/relationships";
|
|
7185
|
+
var NUMBERING_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering";
|
|
7186
|
+
var NUMBERING_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml";
|
|
7187
|
+
async function registerNumberingPart(zip) {
|
|
7188
|
+
const contentTypesPath = "[Content_Types].xml";
|
|
7189
|
+
const contentTypesFile = zip.file(contentTypesPath);
|
|
7190
|
+
const contentTypesXml = contentTypesFile ? await contentTypesFile.async("string") : `<?xml version="1.0"?><Types xmlns="${CT_NS}"/>`;
|
|
7191
|
+
const contentTypesDoc = parseXml2(contentTypesXml);
|
|
7192
|
+
const hasOverride = Array.from(contentTypesDoc.getElementsByTagNameNS(CT_NS, "Override")).some(
|
|
7193
|
+
(element) => element.getAttribute("PartName") === "/word/numbering.xml"
|
|
7194
|
+
);
|
|
7195
|
+
if (!hasOverride) {
|
|
7196
|
+
const override = contentTypesDoc.createElementNS(CT_NS, "Override");
|
|
7197
|
+
override.setAttribute("PartName", "/word/numbering.xml");
|
|
7198
|
+
override.setAttribute("ContentType", NUMBERING_CONTENT_TYPE);
|
|
7199
|
+
contentTypesDoc.documentElement.appendChild(override);
|
|
7200
|
+
zip.file(contentTypesPath, buildXml(contentTypesDoc));
|
|
7201
|
+
}
|
|
7202
|
+
const relsPath = "word/_rels/document.xml.rels";
|
|
7203
|
+
const relsFile = zip.file(relsPath);
|
|
7204
|
+
const relsXml = relsFile ? await relsFile.async("string") : `<?xml version="1.0"?><Relationships xmlns="${REL_NS2}"/>`;
|
|
7205
|
+
const relsDoc = parseXml2(relsXml);
|
|
7206
|
+
const existingIds = new Set(
|
|
7207
|
+
Array.from(relsDoc.getElementsByTagNameNS(REL_NS2, "Relationship")).map(
|
|
7208
|
+
(element) => element.getAttribute("Id") ?? ""
|
|
7209
|
+
)
|
|
7210
|
+
);
|
|
7211
|
+
let serial = 1;
|
|
7212
|
+
while (existingIds.has(`rId${serial}`)) serial++;
|
|
7213
|
+
const relationship = relsDoc.createElementNS(REL_NS2, "Relationship");
|
|
7214
|
+
relationship.setAttribute("Id", `rId${serial}`);
|
|
7215
|
+
relationship.setAttribute("Type", NUMBERING_RELATIONSHIP_TYPE);
|
|
7216
|
+
relationship.setAttribute("Target", "numbering.xml");
|
|
7217
|
+
relsDoc.documentElement.appendChild(relationship);
|
|
7218
|
+
zip.file(relsPath, buildXml(relsDoc));
|
|
7219
|
+
}
|
|
7220
|
+
|
|
7221
|
+
// docx/numbering-parse.ts
|
|
7222
|
+
var integer2 = (value, fallback) => parseInteger(value) ?? fallback;
|
|
7223
|
+
var flag = (element) => onOffElement(element) === true;
|
|
7224
|
+
function byName(root, local) {
|
|
7225
|
+
return Array.from(root.getElementsByTagName("*")).filter(
|
|
7226
|
+
(node) => node.nodeType === 1 && named2(node, local)
|
|
7227
|
+
);
|
|
7228
|
+
}
|
|
7229
|
+
function parseMarkerFormat(rPr) {
|
|
7230
|
+
if (!rPr) return void 0;
|
|
7231
|
+
const format = {};
|
|
7232
|
+
const family = getW(first2(rPr, "rFonts"), "ascii");
|
|
7233
|
+
if (family) format.fontFamily = family;
|
|
7234
|
+
const size = parseInteger(getW(first2(rPr, "sz"), "val"));
|
|
7235
|
+
if (size !== void 0 && size > 0) format.fontSizeHalfPoints = size;
|
|
7236
|
+
if (onOffElement(first2(rPr, "b")) === true) format.bold = true;
|
|
7237
|
+
if (onOffElement(first2(rPr, "i")) === true) format.italic = true;
|
|
7238
|
+
const color = getW(first2(rPr, "color"), "val");
|
|
7239
|
+
if (color && /^[0-9a-f]{6}$/i.test(color)) format.color = `#${color.toLowerCase()}`;
|
|
7240
|
+
return Object.keys(format).length ? format : void 0;
|
|
7241
|
+
}
|
|
7242
|
+
function parseNumberingLevel(lvl) {
|
|
7243
|
+
const level = integer2(getW(lvl, "ilvl"), 0);
|
|
7244
|
+
const start = integer2(getW(first2(lvl, "start"), "val"), 1);
|
|
7245
|
+
const numFmt = enumValue(isStNumberFormat, getW(first2(lvl, "numFmt"), "val"), "w:numFmt") ?? "decimal";
|
|
7246
|
+
const lvlText = getW(first2(lvl, "lvlText"), "val") ?? "";
|
|
7247
|
+
const jc = getW(first2(lvl, "lvlJc"), "val");
|
|
7248
|
+
const ind = first2(first2(lvl, "pPr"), "ind");
|
|
7249
|
+
const suffRaw = getW(first2(lvl, "suff"), "val");
|
|
7250
|
+
const result = { level, start, numFmt, lvlText };
|
|
7251
|
+
if (!first2(lvl, "start")) result.startWasOmitted = true;
|
|
7252
|
+
const paragraphStyleId = getW(first2(lvl, "pStyle"), "val");
|
|
7253
|
+
if (paragraphStyleId) result.paragraphStyleId = paragraphStyleId;
|
|
7254
|
+
if (jc === "left" || jc === "center" || jc === "right") result.lvlJc = jc;
|
|
7255
|
+
const left = getW(ind, "left") ?? getW(ind, "start");
|
|
7256
|
+
if (left !== void 0) result.indentLeftTwips = parseSignedTwips(left) ?? signedTwips(0);
|
|
7257
|
+
const hanging = getW(ind, "hanging");
|
|
7258
|
+
if (hanging !== void 0) result.hangingTwips = parseTwips(hanging) ?? twips(0);
|
|
7259
|
+
const firstLine = getW(ind, "firstLine");
|
|
7260
|
+
if (firstLine !== void 0) result.firstLineTwips = parseTwips(firstLine) ?? twips(0);
|
|
7261
|
+
const tabs = first2(first2(lvl, "pPr"), "tabs");
|
|
7262
|
+
const tab = tabs ? children2(tabs, "tab").find((stop) => getW(stop, "val") !== "clear") : void 0;
|
|
7263
|
+
const tabPos = tab ? parseTwips(getW(tab, "pos")) : void 0;
|
|
7264
|
+
if (tabPos !== void 0) result.tabStopTwips = tabPos;
|
|
7265
|
+
if (flag(first2(lvl, "isLgl"))) result.isLgl = true;
|
|
7266
|
+
const restart = getW(first2(lvl, "lvlRestart"), "val");
|
|
7267
|
+
if (restart !== void 0) result.lvlRestart = integer2(restart, 0);
|
|
7268
|
+
const marker = parseMarkerFormat(first2(lvl, "rPr"));
|
|
7269
|
+
if (marker) result.markerFormat = marker;
|
|
7270
|
+
result.suffix = suffRaw === "space" ? "space" : suffRaw === "nothing" ? "none" : "tab";
|
|
7271
|
+
return result;
|
|
7272
|
+
}
|
|
7273
|
+
function parseAbstractNum(element) {
|
|
7274
|
+
const id = getW(element, "abstractNumId");
|
|
7275
|
+
if (!id) return void 0;
|
|
7276
|
+
const levels = {};
|
|
7277
|
+
for (const lvl of children2(element, "lvl")) {
|
|
7278
|
+
const parsed = parseNumberingLevel(lvl);
|
|
7279
|
+
levels[parsed.level] = parsed;
|
|
7280
|
+
}
|
|
7281
|
+
return { id, levels };
|
|
7282
|
+
}
|
|
7283
|
+
function parseNum(element) {
|
|
7284
|
+
const id = getW(element, "numId");
|
|
7285
|
+
if (!id) return void 0;
|
|
7286
|
+
const abstractNumId = getW(first2(element, "abstractNumId"), "val") ?? "";
|
|
7287
|
+
const levelOverrides = {};
|
|
7288
|
+
for (const override of children2(element, "lvlOverride")) {
|
|
7289
|
+
const level = integer2(getW(override, "ilvl"), 0);
|
|
7290
|
+
const entry = {};
|
|
7291
|
+
const startOverride = getW(first2(override, "startOverride"), "val");
|
|
7292
|
+
if (startOverride !== void 0) entry.startOverride = integer2(startOverride, 1);
|
|
7293
|
+
const lvl = first2(override, "lvl");
|
|
7294
|
+
if (lvl) entry.lvl = parseNumberingLevel(lvl);
|
|
7295
|
+
if (Object.keys(entry).length) levelOverrides[level] = entry;
|
|
7296
|
+
}
|
|
7297
|
+
return {
|
|
7298
|
+
id,
|
|
7299
|
+
abstractNumId,
|
|
7300
|
+
...Object.keys(levelOverrides).length ? { levelOverrides } : {}
|
|
7301
|
+
};
|
|
7302
|
+
}
|
|
7303
|
+
function parseNumberingCatalog(xml) {
|
|
7304
|
+
const document = parseXml2(xml);
|
|
7305
|
+
const root = document.documentElement;
|
|
7306
|
+
const abstractNums = {};
|
|
7307
|
+
const warnings = [];
|
|
7308
|
+
for (const element of byName(root, "abstractNum")) {
|
|
7309
|
+
const parsed = parseAbstractNum(element);
|
|
7310
|
+
if (!parsed) continue;
|
|
7311
|
+
abstractNums[parsed.id] = parsed;
|
|
7312
|
+
const link = getW(first2(element, "numStyleLink"), "val");
|
|
7313
|
+
if (link)
|
|
7314
|
+
warnings.push(
|
|
7315
|
+
`Numbering definition abstractNum ${parsed.id} links to style "${link}"; style-linked numbering levels are not resolved.`
|
|
7316
|
+
);
|
|
7317
|
+
if (byName(element, "lvlPicBulletId").length)
|
|
7318
|
+
warnings.push(
|
|
7319
|
+
`Numbering definition abstractNum ${parsed.id} uses a picture bullet; picture bullets are not rendered.`
|
|
7320
|
+
);
|
|
7321
|
+
}
|
|
7322
|
+
const nums = {};
|
|
7323
|
+
for (const element of byName(root, "num")) {
|
|
7324
|
+
const parsed = parseNum(element);
|
|
7325
|
+
if (parsed) nums[parsed.id] = parsed;
|
|
7326
|
+
}
|
|
7327
|
+
return { abstractNums, nums, warnings: [...new Set(warnings)] };
|
|
7328
|
+
}
|
|
7329
|
+
function resolveNumberingLevel(catalog, numId, level) {
|
|
7330
|
+
const num = catalog.nums[numId];
|
|
7331
|
+
if (!num) return void 0;
|
|
7332
|
+
const override = num.levelOverrides?.[level];
|
|
7333
|
+
const sourceAbstract = catalog.abstractNums[num.abstractNumId]?.levels[level];
|
|
7334
|
+
const abstract = sourceAbstract?.startWasOmitted && sourceAbstract.start === 1 ? { ...sourceAbstract, start: 0 } : sourceAbstract;
|
|
7335
|
+
let base = override?.lvl ?? abstract;
|
|
7336
|
+
if (!base) return void 0;
|
|
7337
|
+
if (override?.lvl) {
|
|
7338
|
+
const { lvlRestart: _ignored, ...properties } = base;
|
|
7339
|
+
base = {
|
|
7340
|
+
...properties,
|
|
7341
|
+
...abstract?.lvlRestart !== void 0 ? { lvlRestart: abstract.lvlRestart } : {}
|
|
7342
|
+
};
|
|
7343
|
+
}
|
|
7344
|
+
let start = override?.startOverride ?? base.start;
|
|
7345
|
+
if (override?.lvl) {
|
|
7346
|
+
if (abstract?.lvlRestart === 0 && override.startOverride === void 0) start = abstract.start;
|
|
7347
|
+
else if (!override.lvl.startWasOmitted || override.lvl.start !== 1) start = override.lvl.start;
|
|
7348
|
+
else start = override.startOverride ?? 0;
|
|
7349
|
+
}
|
|
7350
|
+
return start !== base.start ? { ...base, start } : base;
|
|
7351
|
+
}
|
|
7352
|
+
|
|
7353
|
+
// docx/numbering-start-edit.ts
|
|
7354
|
+
function assertListStartValue(level, start) {
|
|
7355
|
+
if (!Number.isInteger(level) || level < 0 || level > 8)
|
|
7356
|
+
throw new Error("List level must be an integer from 0 through 8.");
|
|
7357
|
+
if (!Number.isInteger(start) || start < 0 || start > 2147483647)
|
|
7358
|
+
throw new Error("List start must be an integer from 0 through 2147483647.");
|
|
7359
|
+
}
|
|
7360
|
+
function setListStartOverride(catalog, numId, level, start) {
|
|
7361
|
+
assertListStartValue(level, start);
|
|
7362
|
+
if (!Number.isSafeInteger(numId) || numId <= 0) throw new Error("Invalid list instance id.");
|
|
7363
|
+
const id = String(numId);
|
|
7364
|
+
const num = catalog.nums[id];
|
|
7365
|
+
if (!num || !resolveNumberingLevel(catalog, id, level))
|
|
7366
|
+
throw new Error("List instance or level does not exist.");
|
|
7367
|
+
const override = num.levelOverrides?.[level];
|
|
7368
|
+
if (override?.lvl) throw new Error("Changing starts with a full level override is unsupported.");
|
|
7369
|
+
if (override?.startOverride === start) return catalog;
|
|
7370
|
+
return {
|
|
7371
|
+
...catalog,
|
|
7372
|
+
nums: {
|
|
7373
|
+
...catalog.nums,
|
|
7374
|
+
[id]: {
|
|
7375
|
+
...num,
|
|
7376
|
+
levelOverrides: {
|
|
7377
|
+
...num.levelOverrides,
|
|
7378
|
+
[level]: { ...override, startOverride: start }
|
|
7379
|
+
}
|
|
7380
|
+
}
|
|
7381
|
+
}
|
|
7382
|
+
};
|
|
7383
|
+
}
|
|
7384
|
+
|
|
7385
|
+
// docx/numbering-start-patch.ts
|
|
7386
|
+
function withoutStarts(num) {
|
|
7387
|
+
const { levelOverrides, ...properties } = num;
|
|
7388
|
+
const kept = {};
|
|
7389
|
+
for (const [level, override] of Object.entries(levelOverrides ?? {})) {
|
|
7390
|
+
const { startOverride: _start, ...rest } = override;
|
|
7391
|
+
if (Object.keys(rest).length) kept[level] = rest;
|
|
7392
|
+
}
|
|
7393
|
+
return { ...properties, ...Object.keys(kept).length ? { levelOverrides: kept } : {} };
|
|
7061
7394
|
}
|
|
7062
|
-
function
|
|
7063
|
-
const
|
|
7064
|
-
const
|
|
7065
|
-
|
|
7066
|
-
|
|
7067
|
-
|
|
7068
|
-
|
|
7069
|
-
|
|
7070
|
-
|
|
7071
|
-
|
|
7395
|
+
function numberingStartChanges(prior, next) {
|
|
7396
|
+
const changes = [];
|
|
7397
|
+
for (const [id, previous] of Object.entries(prior?.nums ?? {})) {
|
|
7398
|
+
const current = next.nums[id];
|
|
7399
|
+
if (!current || JSON.stringify(withoutStarts(current)) !== JSON.stringify(withoutStarts(previous)))
|
|
7400
|
+
throw new Error(
|
|
7401
|
+
`Cannot edit numbering definition num "${id}" except its supported start overrides.`
|
|
7402
|
+
);
|
|
7403
|
+
for (const key of /* @__PURE__ */ new Set([
|
|
7404
|
+
...Object.keys(previous.levelOverrides ?? {}),
|
|
7405
|
+
...Object.keys(current.levelOverrides ?? {})
|
|
7406
|
+
])) {
|
|
7407
|
+
const level = Number(key);
|
|
7408
|
+
const old = previous.levelOverrides?.[level];
|
|
7409
|
+
const value = current.levelOverrides?.[level];
|
|
7410
|
+
if (old?.startOverride === value?.startOverride) continue;
|
|
7411
|
+
if (value?.startOverride === void 0)
|
|
7412
|
+
throw new Error("Removing a list start override is unsupported.");
|
|
7413
|
+
assertListStartValue(level, value.startOverride);
|
|
7414
|
+
if (String(level) !== key || !prior || !resolveNumberingLevel(prior, id, level))
|
|
7415
|
+
throw new Error("List instance or level does not exist.");
|
|
7416
|
+
if (old?.lvl || value.lvl)
|
|
7417
|
+
throw new Error("Changing starts with a full level override is unsupported.");
|
|
7418
|
+
changes.push({ numId: id, level, start: value.startOverride });
|
|
7419
|
+
}
|
|
7420
|
+
}
|
|
7421
|
+
return changes;
|
|
7422
|
+
}
|
|
7423
|
+
function patchNumberingStarts(doc, changes) {
|
|
7424
|
+
const sameNumber = (source, expected) => source !== void 0 && /^[+-]?\d+$/.test(source) && Number(source) === Number(expected);
|
|
7425
|
+
const prepared = changes.map((change) => {
|
|
7426
|
+
const nums = children2(doc.documentElement, "num").filter(
|
|
7427
|
+
(num2) => sameNumber(getW(num2, "numId"), change.numId)
|
|
7072
7428
|
);
|
|
7073
|
-
|
|
7074
|
-
|
|
7075
|
-
|
|
7076
|
-
|
|
7077
|
-
(
|
|
7078
|
-
"must be a finite pixel size (converted to integer twips; left/right non-negative)"
|
|
7429
|
+
if (nums.length !== 1 || getW(nums[0], "numId") !== change.numId)
|
|
7430
|
+
throw new Error("Cannot patch an ambiguous or missing source list instance.");
|
|
7431
|
+
const num = nums[0];
|
|
7432
|
+
const overrides = children2(num, "lvlOverride").filter(
|
|
7433
|
+
(node) => sameNumber(getW(node, "ilvl"), String(change.level))
|
|
7079
7434
|
);
|
|
7080
|
-
|
|
7081
|
-
|
|
7082
|
-
|
|
7083
|
-
|
|
7084
|
-
|
|
7085
|
-
|
|
7086
|
-
|
|
7435
|
+
if (overrides.length > 1) throw new Error("Cannot patch duplicate source level overrides.");
|
|
7436
|
+
const override = overrides[0];
|
|
7437
|
+
if (override && getW(override, "ilvl") !== String(change.level))
|
|
7438
|
+
throw new Error("Cannot patch a noncanonical source level override.");
|
|
7439
|
+
if (override && (children2(override, "lvl").length || children2(override, "startOverride").length > 1))
|
|
7440
|
+
throw new Error("Cannot patch a full or ambiguous source level override.");
|
|
7441
|
+
return { change, num, override };
|
|
7087
7442
|
});
|
|
7088
|
-
for (const
|
|
7089
|
-
|
|
7090
|
-
|
|
7091
|
-
|
|
7092
|
-
|
|
7093
|
-
|
|
7094
|
-
|
|
7095
|
-
|
|
7096
|
-
|
|
7097
|
-
|
|
7098
|
-
if (model.numberingCatalog)
|
|
7099
|
-
validateNumberingCatalog(path("numberingCatalog"), model.numberingCatalog);
|
|
7100
|
-
return issues;
|
|
7101
|
-
}
|
|
7102
|
-
function assertValidDocumentModel(model) {
|
|
7103
|
-
const issues = validateDocumentModel(model);
|
|
7104
|
-
if (issues.length) throw new DocxModelValidationError(issues);
|
|
7105
|
-
}
|
|
7106
|
-
|
|
7107
|
-
// docx/numbering-parts.ts
|
|
7108
|
-
var CT_NS = "http://schemas.openxmlformats.org/package/2006/content-types";
|
|
7109
|
-
var REL_NS2 = "http://schemas.openxmlformats.org/package/2006/relationships";
|
|
7110
|
-
var NUMBERING_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering";
|
|
7111
|
-
var NUMBERING_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml";
|
|
7112
|
-
async function registerNumberingPart(zip) {
|
|
7113
|
-
const contentTypesPath = "[Content_Types].xml";
|
|
7114
|
-
const contentTypesFile = zip.file(contentTypesPath);
|
|
7115
|
-
const contentTypesXml = contentTypesFile ? await contentTypesFile.async("string") : `<?xml version="1.0"?><Types xmlns="${CT_NS}"/>`;
|
|
7116
|
-
const contentTypesDoc = parseXml2(contentTypesXml);
|
|
7117
|
-
const hasOverride = Array.from(contentTypesDoc.getElementsByTagNameNS(CT_NS, "Override")).some(
|
|
7118
|
-
(element) => element.getAttribute("PartName") === "/word/numbering.xml"
|
|
7119
|
-
);
|
|
7120
|
-
if (!hasOverride) {
|
|
7121
|
-
const override = contentTypesDoc.createElementNS(CT_NS, "Override");
|
|
7122
|
-
override.setAttribute("PartName", "/word/numbering.xml");
|
|
7123
|
-
override.setAttribute("ContentType", NUMBERING_CONTENT_TYPE);
|
|
7124
|
-
contentTypesDoc.documentElement.appendChild(override);
|
|
7125
|
-
zip.file(contentTypesPath, buildXml(contentTypesDoc));
|
|
7443
|
+
for (const { change, num, override: existing } of prepared) {
|
|
7444
|
+
const override = existing ?? makeW(doc, "lvlOverride");
|
|
7445
|
+
if (!existing) {
|
|
7446
|
+
override.setAttributeNS(WORD_NS, "w:ilvl", String(change.level));
|
|
7447
|
+
const after = children2(num, "lvlOverride").at(-1) ?? children2(num, "abstractNumId")[0];
|
|
7448
|
+
num.insertBefore(override, after?.nextSibling ?? null);
|
|
7449
|
+
}
|
|
7450
|
+
const start = children2(override, "startOverride")[0] ?? makeW(doc, "startOverride");
|
|
7451
|
+
start.setAttributeNS(WORD_NS, "w:val", String(change.start));
|
|
7452
|
+
if (!start.parentNode) override.insertBefore(start, override.firstChild);
|
|
7126
7453
|
}
|
|
7127
|
-
const relsPath = "word/_rels/document.xml.rels";
|
|
7128
|
-
const relsFile = zip.file(relsPath);
|
|
7129
|
-
const relsXml = relsFile ? await relsFile.async("string") : `<?xml version="1.0"?><Relationships xmlns="${REL_NS2}"/>`;
|
|
7130
|
-
const relsDoc = parseXml2(relsXml);
|
|
7131
|
-
const existingIds = new Set(
|
|
7132
|
-
Array.from(relsDoc.getElementsByTagNameNS(REL_NS2, "Relationship")).map(
|
|
7133
|
-
(element) => element.getAttribute("Id") ?? ""
|
|
7134
|
-
)
|
|
7135
|
-
);
|
|
7136
|
-
let serial = 1;
|
|
7137
|
-
while (existingIds.has(`rId${serial}`)) serial++;
|
|
7138
|
-
const relationship = relsDoc.createElementNS(REL_NS2, "Relationship");
|
|
7139
|
-
relationship.setAttribute("Id", `rId${serial}`);
|
|
7140
|
-
relationship.setAttribute("Type", NUMBERING_RELATIONSHIP_TYPE);
|
|
7141
|
-
relationship.setAttribute("Target", "numbering.xml");
|
|
7142
|
-
relsDoc.documentElement.appendChild(relationship);
|
|
7143
|
-
zip.file(relsPath, buildXml(relsDoc));
|
|
7144
7454
|
}
|
|
7145
7455
|
|
|
7146
7456
|
// docx/numbering-package.ts
|
|
@@ -7247,17 +7557,14 @@ async function applyNumberingCatalog(zip, model, binding) {
|
|
|
7247
7557
|
throw new Error(
|
|
7248
7558
|
`Cannot edit numbering definition abstractNum "${id}"; the original numbering.xml is preserved unchanged.`
|
|
7249
7559
|
);
|
|
7250
|
-
|
|
7251
|
-
if (JSON.stringify(next.nums[id]) !== JSON.stringify(prior?.nums[id]))
|
|
7252
|
-
throw new Error(
|
|
7253
|
-
`Cannot edit numbering definition num "${id}"; the original numbering.xml is preserved unchanged.`
|
|
7254
|
-
);
|
|
7560
|
+
const startChanges = numberingStartChanges(prior, next);
|
|
7255
7561
|
const newAbstractIds = Object.keys(next.abstractNums).filter((id) => !prior?.abstractNums[id]);
|
|
7256
7562
|
const newNumIds = Object.keys(next.nums).filter((id) => !prior?.nums[id]);
|
|
7257
|
-
if (!newAbstractIds.length && !newNumIds.length) return;
|
|
7563
|
+
if (!newAbstractIds.length && !newNumIds.length && !startChanges.length) return;
|
|
7258
7564
|
const existingFile = zip.file("word/numbering.xml");
|
|
7259
7565
|
const doc = existingFile ? parseXml2(await existingFile.async("string")) : parseXml2(`<w:numbering xmlns:w="${WORD_NS}"/>`);
|
|
7260
7566
|
const root = doc.documentElement;
|
|
7567
|
+
patchNumberingStarts(doc, startChanges);
|
|
7261
7568
|
const cleanup = children2(root, "numIdMacAtCleanup")[0] ?? null;
|
|
7262
7569
|
const firstNum = children2(root, "num")[0] ?? cleanup;
|
|
7263
7570
|
for (const id of newAbstractIds) {
|
|
@@ -8126,23 +8433,31 @@ function createFieldTracker() {
|
|
|
8126
8433
|
const stack = [];
|
|
8127
8434
|
return (element, run) => {
|
|
8128
8435
|
let resultInstr;
|
|
8436
|
+
let resultLocked;
|
|
8129
8437
|
for (const child3 of Array.from(element.childNodes)) {
|
|
8130
8438
|
if (!isElement(child3)) continue;
|
|
8131
8439
|
if (named2(child3, "fldChar")) {
|
|
8132
8440
|
const type = getW(child3, "fldCharType");
|
|
8133
|
-
if (type === "begin")
|
|
8134
|
-
|
|
8441
|
+
if (type === "begin") {
|
|
8442
|
+
const locked = parseFieldFlags(child3)?.locked;
|
|
8443
|
+
stack.push({ instr: "", inResult: false, ...locked !== void 0 && { locked } });
|
|
8444
|
+
} else if (type === "separate") {
|
|
8135
8445
|
const top = stack.at(-1);
|
|
8136
8446
|
if (top) top.inResult = true;
|
|
8137
8447
|
} else if (type === "end") stack.pop();
|
|
8138
8448
|
} else {
|
|
8139
8449
|
const top = stack.at(-1);
|
|
8140
8450
|
if (named2(child3, "instrText") && top && !top.inResult) top.instr += textContent(child3);
|
|
8141
|
-
else if ((named2(child3, "t") || named2(child3, "delText")) && top?.inResult)
|
|
8451
|
+
else if ((named2(child3, "t") || named2(child3, "delText")) && top?.inResult) {
|
|
8142
8452
|
resultInstr = top.instr.trim();
|
|
8453
|
+
resultLocked = top.locked;
|
|
8454
|
+
}
|
|
8143
8455
|
}
|
|
8144
8456
|
}
|
|
8145
|
-
if (resultInstr)
|
|
8457
|
+
if (resultInstr) {
|
|
8458
|
+
run.field = { instr: resultInstr };
|
|
8459
|
+
if (resultLocked !== void 0) run.fieldFlags = { locked: resultLocked };
|
|
8460
|
+
}
|
|
8146
8461
|
return run;
|
|
8147
8462
|
};
|
|
8148
8463
|
}
|
|
@@ -8153,7 +8468,11 @@ function storyFieldResults(container) {
|
|
|
8153
8468
|
if (named2(element, "fldSimple") || named2(element, "txbxContent")) return;
|
|
8154
8469
|
if (named2(element, "r")) {
|
|
8155
8470
|
const run = trackField(element, { text: "" });
|
|
8156
|
-
if (run.field)
|
|
8471
|
+
if (run.field)
|
|
8472
|
+
metadata.set(element, {
|
|
8473
|
+
field: run.field,
|
|
8474
|
+
...run.fieldFlags && { fieldFlags: run.fieldFlags }
|
|
8475
|
+
});
|
|
8157
8476
|
return;
|
|
8158
8477
|
}
|
|
8159
8478
|
for (const child3 of Array.from(element.childNodes)) if (isElement(child3)) visit(child3);
|
|
@@ -8245,7 +8564,11 @@ function parseRun2(node, revision) {
|
|
|
8245
8564
|
if (breakKind) run.break = breakKind;
|
|
8246
8565
|
if (noteReference) run.noteReference = noteReference;
|
|
8247
8566
|
if (noteMark) run.noteMark = noteMark;
|
|
8248
|
-
if (fieldChar)
|
|
8567
|
+
if (fieldChar) {
|
|
8568
|
+
run.fieldChar = fieldChar;
|
|
8569
|
+
const flags = parseFieldFlags(only);
|
|
8570
|
+
if (flags) run.fieldFlags = flags;
|
|
8571
|
+
}
|
|
8249
8572
|
if (fieldCode !== void 0) run.fieldCode = fieldCode;
|
|
8250
8573
|
const runRevision = revision ?? runFormatRevision(props);
|
|
8251
8574
|
if (runRevision) run.revision = runRevision;
|
|
@@ -8264,8 +8587,11 @@ function parseParagraph2(node, id, fields) {
|
|
|
8264
8587
|
(element, revision) => {
|
|
8265
8588
|
const run = parseRun2(element, revision);
|
|
8266
8589
|
if (!fields) return trackField(element, run);
|
|
8267
|
-
const
|
|
8268
|
-
if (
|
|
8590
|
+
const metadata = fields.get(element);
|
|
8591
|
+
if (metadata) {
|
|
8592
|
+
run.field = { ...metadata.field };
|
|
8593
|
+
if (metadata.fieldFlags) run.fieldFlags = { ...metadata.fieldFlags };
|
|
8594
|
+
}
|
|
8269
8595
|
return run;
|
|
8270
8596
|
},
|
|
8271
8597
|
(item) => {
|
|
@@ -8287,20 +8613,23 @@ function parseParagraph2(node, id, fields) {
|
|
|
8287
8613
|
);
|
|
8288
8614
|
if (link) return results.map((run) => ({ ...run, link }));
|
|
8289
8615
|
const field = { instr: instr.trim(), simple: true };
|
|
8616
|
+
const flags = parseFieldFlags(item);
|
|
8617
|
+
const fieldState = flags ? { fieldFlags: flags } : {};
|
|
8290
8618
|
const fieldInstanceId = `${id}:simple-field-${simpleFieldIndex++}`;
|
|
8291
|
-
if (!results.length)
|
|
8619
|
+
if (!results.length)
|
|
8620
|
+
return [{ text: fieldPlaceholderText(instr), field, fieldInstanceId, ...fieldState }];
|
|
8292
8621
|
if (results.every(
|
|
8293
8622
|
(run) => !run.text && !run.equation && !run.image && !run.break && !run.noteReference && !run.noteMark && !run.fieldChar && run.fieldCode === void 0
|
|
8294
8623
|
)) {
|
|
8295
8624
|
return [
|
|
8296
|
-
{ text: "", fieldChar: "begin" },
|
|
8625
|
+
{ text: "", fieldChar: "begin", ...fieldState },
|
|
8297
8626
|
{ text: "", fieldCode: instr },
|
|
8298
8627
|
{ text: "", fieldChar: "separate" },
|
|
8299
8628
|
...results,
|
|
8300
8629
|
{ text: "", fieldChar: "end" }
|
|
8301
8630
|
];
|
|
8302
8631
|
}
|
|
8303
|
-
return results.map((run) => ({ ...run, field, fieldInstanceId }));
|
|
8632
|
+
return results.map((run) => ({ ...run, field, fieldInstanceId, ...fieldState }));
|
|
8304
8633
|
},
|
|
8305
8634
|
(hyperlink) => {
|
|
8306
8635
|
if (!activeContext) return void 0;
|
|
@@ -8673,138 +9002,6 @@ async function parseDocumentParts(zip, body, blocks, drawings) {
|
|
|
8673
9002
|
};
|
|
8674
9003
|
}
|
|
8675
9004
|
|
|
8676
|
-
// docx/numbering-parse.ts
|
|
8677
|
-
var integer2 = (value, fallback) => parseInteger(value) ?? fallback;
|
|
8678
|
-
var flag = (element) => onOffElement(element) === true;
|
|
8679
|
-
function byName(root, local) {
|
|
8680
|
-
return Array.from(root.getElementsByTagName("*")).filter(
|
|
8681
|
-
(node) => node.nodeType === 1 && named2(node, local)
|
|
8682
|
-
);
|
|
8683
|
-
}
|
|
8684
|
-
function parseMarkerFormat(rPr) {
|
|
8685
|
-
if (!rPr) return void 0;
|
|
8686
|
-
const format = {};
|
|
8687
|
-
const family = getW(first2(rPr, "rFonts"), "ascii");
|
|
8688
|
-
if (family) format.fontFamily = family;
|
|
8689
|
-
const size = parseInteger(getW(first2(rPr, "sz"), "val"));
|
|
8690
|
-
if (size !== void 0 && size > 0) format.fontSizeHalfPoints = size;
|
|
8691
|
-
if (onOffElement(first2(rPr, "b")) === true) format.bold = true;
|
|
8692
|
-
if (onOffElement(first2(rPr, "i")) === true) format.italic = true;
|
|
8693
|
-
const color = getW(first2(rPr, "color"), "val");
|
|
8694
|
-
if (color && /^[0-9a-f]{6}$/i.test(color)) format.color = `#${color.toLowerCase()}`;
|
|
8695
|
-
return Object.keys(format).length ? format : void 0;
|
|
8696
|
-
}
|
|
8697
|
-
function parseNumberingLevel(lvl) {
|
|
8698
|
-
const level = integer2(getW(lvl, "ilvl"), 0);
|
|
8699
|
-
const start = integer2(getW(first2(lvl, "start"), "val"), 1);
|
|
8700
|
-
const numFmt = enumValue(isStNumberFormat, getW(first2(lvl, "numFmt"), "val"), "w:numFmt") ?? "decimal";
|
|
8701
|
-
const lvlText = getW(first2(lvl, "lvlText"), "val") ?? "";
|
|
8702
|
-
const jc = getW(first2(lvl, "lvlJc"), "val");
|
|
8703
|
-
const ind = first2(first2(lvl, "pPr"), "ind");
|
|
8704
|
-
const suffRaw = getW(first2(lvl, "suff"), "val");
|
|
8705
|
-
const result = { level, start, numFmt, lvlText };
|
|
8706
|
-
if (!first2(lvl, "start")) result.startWasOmitted = true;
|
|
8707
|
-
const paragraphStyleId = getW(first2(lvl, "pStyle"), "val");
|
|
8708
|
-
if (paragraphStyleId) result.paragraphStyleId = paragraphStyleId;
|
|
8709
|
-
if (jc === "left" || jc === "center" || jc === "right") result.lvlJc = jc;
|
|
8710
|
-
const left = getW(ind, "left") ?? getW(ind, "start");
|
|
8711
|
-
if (left !== void 0) result.indentLeftTwips = parseSignedTwips(left) ?? signedTwips(0);
|
|
8712
|
-
const hanging = getW(ind, "hanging");
|
|
8713
|
-
if (hanging !== void 0) result.hangingTwips = parseTwips(hanging) ?? twips(0);
|
|
8714
|
-
const firstLine = getW(ind, "firstLine");
|
|
8715
|
-
if (firstLine !== void 0) result.firstLineTwips = parseTwips(firstLine) ?? twips(0);
|
|
8716
|
-
const tabs = first2(first2(lvl, "pPr"), "tabs");
|
|
8717
|
-
const tab = tabs ? children2(tabs, "tab").find((stop) => getW(stop, "val") !== "clear") : void 0;
|
|
8718
|
-
const tabPos = tab ? parseTwips(getW(tab, "pos")) : void 0;
|
|
8719
|
-
if (tabPos !== void 0) result.tabStopTwips = tabPos;
|
|
8720
|
-
if (flag(first2(lvl, "isLgl"))) result.isLgl = true;
|
|
8721
|
-
const restart = getW(first2(lvl, "lvlRestart"), "val");
|
|
8722
|
-
if (restart !== void 0) result.lvlRestart = integer2(restart, 0);
|
|
8723
|
-
const marker = parseMarkerFormat(first2(lvl, "rPr"));
|
|
8724
|
-
if (marker) result.markerFormat = marker;
|
|
8725
|
-
result.suffix = suffRaw === "space" ? "space" : suffRaw === "nothing" ? "none" : "tab";
|
|
8726
|
-
return result;
|
|
8727
|
-
}
|
|
8728
|
-
function parseAbstractNum(element) {
|
|
8729
|
-
const id = getW(element, "abstractNumId");
|
|
8730
|
-
if (!id) return void 0;
|
|
8731
|
-
const levels = {};
|
|
8732
|
-
for (const lvl of children2(element, "lvl")) {
|
|
8733
|
-
const parsed = parseNumberingLevel(lvl);
|
|
8734
|
-
levels[parsed.level] = parsed;
|
|
8735
|
-
}
|
|
8736
|
-
return { id, levels };
|
|
8737
|
-
}
|
|
8738
|
-
function parseNum(element) {
|
|
8739
|
-
const id = getW(element, "numId");
|
|
8740
|
-
if (!id) return void 0;
|
|
8741
|
-
const abstractNumId = getW(first2(element, "abstractNumId"), "val") ?? "";
|
|
8742
|
-
const levelOverrides = {};
|
|
8743
|
-
for (const override of children2(element, "lvlOverride")) {
|
|
8744
|
-
const level = integer2(getW(override, "ilvl"), 0);
|
|
8745
|
-
const entry = {};
|
|
8746
|
-
const startOverride = getW(first2(override, "startOverride"), "val");
|
|
8747
|
-
if (startOverride !== void 0) entry.startOverride = integer2(startOverride, 1);
|
|
8748
|
-
const lvl = first2(override, "lvl");
|
|
8749
|
-
if (lvl) entry.lvl = parseNumberingLevel(lvl);
|
|
8750
|
-
if (Object.keys(entry).length) levelOverrides[level] = entry;
|
|
8751
|
-
}
|
|
8752
|
-
return {
|
|
8753
|
-
id,
|
|
8754
|
-
abstractNumId,
|
|
8755
|
-
...Object.keys(levelOverrides).length ? { levelOverrides } : {}
|
|
8756
|
-
};
|
|
8757
|
-
}
|
|
8758
|
-
function parseNumberingCatalog(xml) {
|
|
8759
|
-
const document = parseXml2(xml);
|
|
8760
|
-
const root = document.documentElement;
|
|
8761
|
-
const abstractNums = {};
|
|
8762
|
-
const warnings = [];
|
|
8763
|
-
for (const element of byName(root, "abstractNum")) {
|
|
8764
|
-
const parsed = parseAbstractNum(element);
|
|
8765
|
-
if (!parsed) continue;
|
|
8766
|
-
abstractNums[parsed.id] = parsed;
|
|
8767
|
-
const link = getW(first2(element, "numStyleLink"), "val");
|
|
8768
|
-
if (link)
|
|
8769
|
-
warnings.push(
|
|
8770
|
-
`Numbering definition abstractNum ${parsed.id} links to style "${link}"; style-linked numbering levels are not resolved.`
|
|
8771
|
-
);
|
|
8772
|
-
if (byName(element, "lvlPicBulletId").length)
|
|
8773
|
-
warnings.push(
|
|
8774
|
-
`Numbering definition abstractNum ${parsed.id} uses a picture bullet; picture bullets are not rendered.`
|
|
8775
|
-
);
|
|
8776
|
-
}
|
|
8777
|
-
const nums = {};
|
|
8778
|
-
for (const element of byName(root, "num")) {
|
|
8779
|
-
const parsed = parseNum(element);
|
|
8780
|
-
if (parsed) nums[parsed.id] = parsed;
|
|
8781
|
-
}
|
|
8782
|
-
return { abstractNums, nums, warnings: [...new Set(warnings)] };
|
|
8783
|
-
}
|
|
8784
|
-
function resolveNumberingLevel(catalog, numId, level) {
|
|
8785
|
-
const num = catalog.nums[numId];
|
|
8786
|
-
if (!num) return void 0;
|
|
8787
|
-
const override = num.levelOverrides?.[level];
|
|
8788
|
-
const sourceAbstract = catalog.abstractNums[num.abstractNumId]?.levels[level];
|
|
8789
|
-
const abstract = sourceAbstract?.startWasOmitted && sourceAbstract.start === 1 ? { ...sourceAbstract, start: 0 } : sourceAbstract;
|
|
8790
|
-
let base = override?.lvl ?? abstract;
|
|
8791
|
-
if (!base) return void 0;
|
|
8792
|
-
if (override?.lvl) {
|
|
8793
|
-
const { lvlRestart: _ignored, ...properties } = base;
|
|
8794
|
-
base = {
|
|
8795
|
-
...properties,
|
|
8796
|
-
...abstract?.lvlRestart !== void 0 ? { lvlRestart: abstract.lvlRestart } : {}
|
|
8797
|
-
};
|
|
8798
|
-
}
|
|
8799
|
-
let start = override?.startOverride ?? base.start;
|
|
8800
|
-
if (override?.lvl) {
|
|
8801
|
-
if (abstract?.lvlRestart === 0 && override.startOverride === void 0) start = abstract.start;
|
|
8802
|
-
else if (!override.lvl.startWasOmitted || override.lvl.start !== 1) start = override.lvl.start;
|
|
8803
|
-
else start = override.startOverride ?? 0;
|
|
8804
|
-
}
|
|
8805
|
-
return start !== base.start ? { ...base, start } : base;
|
|
8806
|
-
}
|
|
8807
|
-
|
|
8808
9005
|
// docx/comments.ts
|
|
8809
9006
|
var W14_NS2 = "http://schemas.microsoft.com/office/word/2010/wordml";
|
|
8810
9007
|
var W15_NS2 = "http://schemas.microsoft.com/office/word/2012/wordml";
|
|
@@ -9039,7 +9236,7 @@ async function readPackage(input) {
|
|
|
9039
9236
|
const themeFile = zip.file("word/theme/theme1.xml");
|
|
9040
9237
|
const settingsFile = zip.file("word/settings.xml");
|
|
9041
9238
|
if (themeFile) {
|
|
9042
|
-
model.theme =
|
|
9239
|
+
model.theme = parseTheme2(await themeFile.async("string"));
|
|
9043
9240
|
if (settingsFile) {
|
|
9044
9241
|
const settingsXml = await settingsFile.async("string");
|
|
9045
9242
|
model.theme.colorMapping = withParseWarnings(
|
|
@@ -9157,32 +9354,12 @@ async function loadDocx(input) {
|
|
|
9157
9354
|
}
|
|
9158
9355
|
|
|
9159
9356
|
// docx/diagram-theme.ts
|
|
9160
|
-
var DEFAULT_MAPPING2 = {
|
|
9161
|
-
bg1: "lt1",
|
|
9162
|
-
tx1: "dk1",
|
|
9163
|
-
bg2: "lt2",
|
|
9164
|
-
tx2: "dk2"
|
|
9165
|
-
};
|
|
9166
|
-
var SLOTS = /* @__PURE__ */ new Set([
|
|
9167
|
-
"dk1",
|
|
9168
|
-
"lt1",
|
|
9169
|
-
"dk2",
|
|
9170
|
-
"lt2",
|
|
9171
|
-
"accent1",
|
|
9172
|
-
"accent2",
|
|
9173
|
-
"accent3",
|
|
9174
|
-
"accent4",
|
|
9175
|
-
"accent5",
|
|
9176
|
-
"accent6",
|
|
9177
|
-
"hlink",
|
|
9178
|
-
"folHlink"
|
|
9179
|
-
]);
|
|
9180
9357
|
function diagramColorTheme(theme) {
|
|
9181
9358
|
return {
|
|
9182
9359
|
scheme(name) {
|
|
9183
9360
|
if (!theme) return void 0;
|
|
9184
|
-
const
|
|
9185
|
-
const hex =
|
|
9361
|
+
const slot2 = themeColorSlotFor(name, theme.colorMapping);
|
|
9362
|
+
const hex = slot2 ? theme.colors[slot2] : void 0;
|
|
9186
9363
|
return hex ? `#${hex.replace(/^#/, "").toUpperCase()}` : void 0;
|
|
9187
9364
|
}
|
|
9188
9365
|
};
|
|
@@ -10797,6 +10974,7 @@ exports.halfPointsToPoints = halfPointsToPoints;
|
|
|
10797
10974
|
exports.headingLevel = headingLevel;
|
|
10798
10975
|
exports.headingListLevels = headingListLevels;
|
|
10799
10976
|
exports.isCaptionOf = isCaptionOf;
|
|
10977
|
+
exports.isFieldLocked = isFieldLocked;
|
|
10800
10978
|
exports.isHeadingListKind = isHeadingListKind;
|
|
10801
10979
|
exports.isLigatures = isLigatures;
|
|
10802
10980
|
exports.isRunHiddenForReview = isRunHiddenForReview;
|
|
@@ -10930,7 +11108,7 @@ exports.parseSignedHalfPoints = parseSignedHalfPoints;
|
|
|
10930
11108
|
exports.parseSignedTwips = parseSignedTwips;
|
|
10931
11109
|
exports.parseTableStyleCatalog = parseTableStyleCatalog;
|
|
10932
11110
|
exports.parseTextScale = parseTextScale;
|
|
10933
|
-
exports.parseTheme =
|
|
11111
|
+
exports.parseTheme = parseTheme2;
|
|
10934
11112
|
exports.parseTintShade = parseTintShade;
|
|
10935
11113
|
exports.parseTwips = parseTwips;
|
|
10936
11114
|
exports.parseUnsignedInteger = parseUnsignedInteger;
|
|
@@ -10966,6 +11144,7 @@ exports.sectionsFromLayout = sectionsFromLayout;
|
|
|
10966
11144
|
exports.sectionsOf = sectionsOf;
|
|
10967
11145
|
exports.setColumns = setColumns;
|
|
10968
11146
|
exports.setLineNumbering = setLineNumbering;
|
|
11147
|
+
exports.setListStartOverride = setListStartOverride;
|
|
10969
11148
|
exports.setMargins = setMargins;
|
|
10970
11149
|
exports.setOrientation = setOrientation;
|
|
10971
11150
|
exports.setPageNumbering = setPageNumbering;
|