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.mjs
CHANGED
|
@@ -1448,265 +1448,641 @@ function resolveRunFormatting(run, context = {}) {
|
|
|
1448
1448
|
return result;
|
|
1449
1449
|
}
|
|
1450
1450
|
|
|
1451
|
-
//
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
"dk1",
|
|
1455
|
-
"lt1",
|
|
1456
|
-
"dk2",
|
|
1457
|
-
"lt2",
|
|
1458
|
-
"accent1",
|
|
1459
|
-
"accent2",
|
|
1460
|
-
"accent3",
|
|
1461
|
-
"accent4",
|
|
1462
|
-
"accent5",
|
|
1463
|
-
"accent6",
|
|
1464
|
-
"hlink",
|
|
1465
|
-
"folHlink"
|
|
1466
|
-
];
|
|
1467
|
-
function drawingChild(parent, local) {
|
|
1468
|
-
if (!parent) return void 0;
|
|
1469
|
-
for (const node of Array.from(parent.childNodes)) {
|
|
1470
|
-
const element = node;
|
|
1471
|
-
if (element.nodeType === 1 && element.localName === local && element.namespaceURI === DRAWING_NS)
|
|
1472
|
-
return element;
|
|
1473
|
-
}
|
|
1474
|
-
return void 0;
|
|
1475
|
-
}
|
|
1476
|
-
function colorOf(slot2) {
|
|
1477
|
-
const srgb = drawingChild(slot2, "srgbClr");
|
|
1478
|
-
if (srgb) return srgb.getAttribute("val")?.toUpperCase() || void 0;
|
|
1479
|
-
const sys = drawingChild(slot2, "sysClr");
|
|
1480
|
-
if (sys) return sys.getAttribute("lastClr")?.toUpperCase() || void 0;
|
|
1481
|
-
return void 0;
|
|
1451
|
+
// color/color-primitives.ts
|
|
1452
|
+
function clampUnitInterval(value) {
|
|
1453
|
+
return Math.min(1, Math.max(0, value));
|
|
1482
1454
|
}
|
|
1483
|
-
function
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1455
|
+
function hexToRgbChannels(color) {
|
|
1456
|
+
const normalized = color.replace("#", "");
|
|
1457
|
+
if (!/^[0-9a-fA-F]{6}$/.test(normalized)) {
|
|
1458
|
+
return null;
|
|
1459
|
+
}
|
|
1488
1460
|
return {
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1461
|
+
r: Number.parseInt(normalized.slice(0, 2), 16),
|
|
1462
|
+
g: Number.parseInt(normalized.slice(2, 4), 16),
|
|
1463
|
+
b: Number.parseInt(normalized.slice(4, 6), 16)
|
|
1492
1464
|
};
|
|
1493
1465
|
}
|
|
1494
|
-
function
|
|
1495
|
-
|
|
1496
|
-
const root = document.documentElement;
|
|
1497
|
-
const clrScheme = Array.from(root.getElementsByTagNameNS(DRAWING_NS, "clrScheme"))[0];
|
|
1498
|
-
const colors = {};
|
|
1499
|
-
for (const slotName of SCHEME_ORDER) {
|
|
1500
|
-
const slot2 = drawingChild(clrScheme, slotName);
|
|
1501
|
-
const value = colorOf(slot2);
|
|
1502
|
-
if (value) colors[slotName] = value;
|
|
1503
|
-
}
|
|
1504
|
-
const fontScheme = Array.from(root.getElementsByTagNameNS(DRAWING_NS, "fontScheme"))[0];
|
|
1505
|
-
const major = drawingChild(fontScheme, "majorFont");
|
|
1506
|
-
const minor = drawingChild(fontScheme, "minorFont");
|
|
1507
|
-
return { colors, colorMapping: {}, fonts: { major: fontSetOf(major), minor: fontSetOf(minor) } };
|
|
1466
|
+
function percentDivisorFor(text) {
|
|
1467
|
+
return text.endsWith("%") ? 100 : 1e5;
|
|
1508
1468
|
}
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
accent1: "accent1",
|
|
1516
|
-
accent2: "accent2",
|
|
1517
|
-
accent3: "accent3",
|
|
1518
|
-
accent4: "accent4",
|
|
1519
|
-
accent5: "accent5",
|
|
1520
|
-
accent6: "accent6",
|
|
1521
|
-
hyperlink: "hlink",
|
|
1522
|
-
followedHyperlink: "folHlink"
|
|
1523
|
-
};
|
|
1524
|
-
function parseColorSchemeMapping(xml) {
|
|
1525
|
-
const document = parseXml2(xml);
|
|
1526
|
-
const mapping = Array.from(document.getElementsByTagNameNS(WORD_NS, "clrSchemeMapping"))[0];
|
|
1527
|
-
const result = {};
|
|
1528
|
-
if (!mapping) return result;
|
|
1529
|
-
for (const key of MAPPING_KEYS) {
|
|
1530
|
-
const value = enumValue(
|
|
1531
|
-
isStWmlColorSchemeIndex,
|
|
1532
|
-
getW(mapping, key),
|
|
1533
|
-
`w:clrSchemeMapping/@w:${key}`
|
|
1534
|
-
);
|
|
1535
|
-
if (value) result[key] = TOKEN_TO_SLOT[value];
|
|
1469
|
+
function parseOoxmlPercent(value) {
|
|
1470
|
+
const text = String(value ?? "").trim();
|
|
1471
|
+
const divisor = percentDivisorFor(text);
|
|
1472
|
+
const magnitude = Number.parseFloat(divisor === 100 ? text.slice(0, -1) : text);
|
|
1473
|
+
if (!Number.isFinite(magnitude)) {
|
|
1474
|
+
return void 0;
|
|
1536
1475
|
}
|
|
1537
|
-
return
|
|
1476
|
+
return magnitude / divisor;
|
|
1538
1477
|
}
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
return isStThemeColor(value);
|
|
1478
|
+
function parseDrawingPercent(value) {
|
|
1479
|
+
const parsed = parseOoxmlPercent(value);
|
|
1480
|
+
return parsed === void 0 ? void 0 : clampUnitInterval(parsed);
|
|
1543
1481
|
}
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
};
|
|
1564
|
-
function resolveThemeColorToken(token, theme) {
|
|
1565
|
-
const logical = {
|
|
1566
|
-
background1: "bg1",
|
|
1567
|
-
text1: "tx1",
|
|
1568
|
-
background2: "bg2",
|
|
1569
|
-
text2: "tx2"
|
|
1570
|
-
};
|
|
1571
|
-
const logicalKey = logical[token];
|
|
1572
|
-
if (logicalKey) {
|
|
1573
|
-
const slot3 = theme.colorMapping[logicalKey] ?? DEFAULT_MAPPING[logicalKey];
|
|
1574
|
-
return theme.colors[slot3];
|
|
1482
|
+
function scrgbLinearToSrgb8(linear) {
|
|
1483
|
+
const l = Math.min(1, Math.max(0, linear));
|
|
1484
|
+
const companded = l <= 31308e-7 ? 12.92 * l : 1.055 * l ** (1 / 2.4) - 0.055;
|
|
1485
|
+
return Math.min(255, Math.max(0, Math.round(companded * 255)));
|
|
1486
|
+
}
|
|
1487
|
+
function toHex(value) {
|
|
1488
|
+
return Math.min(255, Math.max(0, Math.round(value))).toString(16).padStart(2, "0").toUpperCase();
|
|
1489
|
+
}
|
|
1490
|
+
function rgbToHsl(r, g, b) {
|
|
1491
|
+
const rN = r / 255;
|
|
1492
|
+
const gN = g / 255;
|
|
1493
|
+
const bN = b / 255;
|
|
1494
|
+
const cMax = Math.max(rN, gN, bN);
|
|
1495
|
+
const cMin = Math.min(rN, gN, bN);
|
|
1496
|
+
const delta = cMax - cMin;
|
|
1497
|
+
const l = (cMax + cMin) / 2;
|
|
1498
|
+
let s = 0;
|
|
1499
|
+
if (delta !== 0) {
|
|
1500
|
+
s = delta / (1 - Math.abs(2 * l - 1));
|
|
1575
1501
|
}
|
|
1576
|
-
|
|
1577
|
-
|
|
1502
|
+
let h = 0;
|
|
1503
|
+
if (delta !== 0) {
|
|
1504
|
+
if (cMax === rN) {
|
|
1505
|
+
h = 60 * ((gN - bN) / delta % 6);
|
|
1506
|
+
} else if (cMax === gN) {
|
|
1507
|
+
h = 60 * ((bN - rN) / delta + 2);
|
|
1508
|
+
} else {
|
|
1509
|
+
h = 60 * ((rN - gN) / delta + 4);
|
|
1510
|
+
}
|
|
1511
|
+
}
|
|
1512
|
+
if (h < 0) {
|
|
1513
|
+
h += 360;
|
|
1514
|
+
}
|
|
1515
|
+
return { h, s: clampUnitInterval(s), l: clampUnitInterval(l) };
|
|
1578
1516
|
}
|
|
1579
|
-
function
|
|
1580
|
-
const
|
|
1581
|
-
|
|
1517
|
+
function hslToRgb(h, s, l, roundChannel = Math.round, options) {
|
|
1518
|
+
const sC = clampUnitInterval(s);
|
|
1519
|
+
const lC = clampUnitInterval(l);
|
|
1520
|
+
const hN = (h % 360 + 360) % 360;
|
|
1521
|
+
const c = (1 - Math.abs(2 * lC - 1)) * sC;
|
|
1522
|
+
const x = c * (1 - Math.abs(hN / 60 % 2 - 1));
|
|
1523
|
+
const m = lC - c / 2;
|
|
1524
|
+
let rP = 0;
|
|
1525
|
+
let gP = 0;
|
|
1526
|
+
let bP = 0;
|
|
1527
|
+
if (hN < 60) {
|
|
1528
|
+
rP = c;
|
|
1529
|
+
gP = x;
|
|
1530
|
+
bP = 0;
|
|
1531
|
+
} else if (hN < 120) {
|
|
1532
|
+
rP = x;
|
|
1533
|
+
gP = c;
|
|
1534
|
+
bP = 0;
|
|
1535
|
+
} else if (hN < 180) {
|
|
1536
|
+
rP = 0;
|
|
1537
|
+
gP = c;
|
|
1538
|
+
bP = x;
|
|
1539
|
+
} else if (hN < 240) {
|
|
1540
|
+
rP = 0;
|
|
1541
|
+
gP = x;
|
|
1542
|
+
bP = c;
|
|
1543
|
+
} else if (hN < 300) {
|
|
1544
|
+
rP = x;
|
|
1545
|
+
gP = 0;
|
|
1546
|
+
bP = c;
|
|
1547
|
+
} else {
|
|
1548
|
+
rP = c;
|
|
1549
|
+
gP = 0;
|
|
1550
|
+
bP = x;
|
|
1551
|
+
}
|
|
1582
1552
|
return {
|
|
1583
|
-
r:
|
|
1584
|
-
g:
|
|
1585
|
-
b:
|
|
1553
|
+
r: roundChannel((rP + m) * 255),
|
|
1554
|
+
g: roundChannel((gP + m) * 255),
|
|
1555
|
+
b: roundChannel((bP + m) * 255)
|
|
1586
1556
|
};
|
|
1587
1557
|
}
|
|
1588
|
-
function
|
|
1589
|
-
return
|
|
1558
|
+
function parseDrawingFraction(value) {
|
|
1559
|
+
return parseOoxmlPercent(value);
|
|
1590
1560
|
}
|
|
1591
|
-
function
|
|
1592
|
-
const
|
|
1561
|
+
function parseDrawingHueDegrees(value) {
|
|
1562
|
+
const parsed = Number.parseFloat(String(value ?? "").trim());
|
|
1563
|
+
if (!Number.isFinite(parsed)) {
|
|
1564
|
+
return void 0;
|
|
1565
|
+
}
|
|
1566
|
+
return parsed / 6e4;
|
|
1567
|
+
}
|
|
1568
|
+
|
|
1569
|
+
// color/color-linear.ts
|
|
1570
|
+
function srgb255ToLinear(channel) {
|
|
1571
|
+
const c = clampUnitInterval(channel / 255);
|
|
1593
1572
|
return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
|
|
1594
1573
|
}
|
|
1595
|
-
function
|
|
1596
|
-
const c =
|
|
1574
|
+
function linearToSrgb255(linear) {
|
|
1575
|
+
const c = clampUnitInterval(linear);
|
|
1597
1576
|
return 255 * (c <= 31308e-7 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - 0.055);
|
|
1598
1577
|
}
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1578
|
+
|
|
1579
|
+
// drawingml/dom.ts
|
|
1580
|
+
function attributeReader(element) {
|
|
1581
|
+
return (name) => {
|
|
1582
|
+
if (!element) return void 0;
|
|
1583
|
+
const direct = element.getAttribute(name);
|
|
1584
|
+
if (direct !== null) return direct;
|
|
1585
|
+
const attributes = element.attributes;
|
|
1586
|
+
for (let index = 0; index < attributes.length; index++) {
|
|
1587
|
+
const candidate = attributes.item(index);
|
|
1588
|
+
if (candidate && candidate.localName === name) return candidate.value;
|
|
1589
|
+
}
|
|
1590
|
+
return void 0;
|
|
1591
|
+
};
|
|
1604
1592
|
}
|
|
1605
|
-
function
|
|
1606
|
-
const
|
|
1607
|
-
|
|
1608
|
-
const mix = (channel) => linearToSrgb(1 - (1 - srgbToLinear(channel)) * fraction);
|
|
1609
|
-
return `#${toHex(mix(rgb.r))}${toHex(mix(rgb.g))}${toHex(mix(rgb.b))}`;
|
|
1593
|
+
function stringAttribute(element, name) {
|
|
1594
|
+
const value = attributeReader(element)(name)?.trim();
|
|
1595
|
+
return value ? value : void 0;
|
|
1610
1596
|
}
|
|
1611
|
-
function
|
|
1612
|
-
|
|
1597
|
+
function integerAttribute(element, name) {
|
|
1598
|
+
const parsed = Number.parseInt(attributeReader(element)(name) ?? "", 10);
|
|
1599
|
+
return Number.isFinite(parsed) ? parsed : void 0;
|
|
1613
1600
|
}
|
|
1614
|
-
function
|
|
1615
|
-
const
|
|
1616
|
-
if (
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1601
|
+
function booleanAttribute(element, name) {
|
|
1602
|
+
const value = attributeReader(element)(name)?.trim().toLowerCase();
|
|
1603
|
+
if (value === "1" || value === "true") return true;
|
|
1604
|
+
if (value === "0" || value === "false") return false;
|
|
1605
|
+
return void 0;
|
|
1606
|
+
}
|
|
1607
|
+
function descendants(root, local) {
|
|
1608
|
+
const result = [];
|
|
1609
|
+
const visit = (node) => {
|
|
1610
|
+
for (const child3 of Array.from(node.childNodes)) {
|
|
1611
|
+
if (!isElement(child3)) continue;
|
|
1612
|
+
if (child3.localName === local) result.push(child3);
|
|
1613
|
+
visit(child3);
|
|
1614
|
+
}
|
|
1615
|
+
};
|
|
1616
|
+
visit(root);
|
|
1617
|
+
return result;
|
|
1621
1618
|
}
|
|
1622
1619
|
|
|
1623
|
-
//
|
|
1624
|
-
var
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
const
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
map.set(id, {
|
|
1645
|
-
id,
|
|
1646
|
-
type: node.getAttribute("Type") ?? "",
|
|
1647
|
-
target,
|
|
1648
|
-
mode: node.getAttribute("TargetMode") === "External" ? "External" : "Internal"
|
|
1649
|
-
});
|
|
1620
|
+
// drawingml/drawing-color.ts
|
|
1621
|
+
var COLOR_ELEMENTS = {
|
|
1622
|
+
srgbClr: "srgb",
|
|
1623
|
+
schemeClr: "scheme",
|
|
1624
|
+
sysClr: "system",
|
|
1625
|
+
prstClr: "preset",
|
|
1626
|
+
scrgbClr: "scrgb",
|
|
1627
|
+
hslClr: "hsl"
|
|
1628
|
+
};
|
|
1629
|
+
function colorValue(kind, element) {
|
|
1630
|
+
const attribute = (name) => element.getAttribute(name) ?? "";
|
|
1631
|
+
if (kind === "scrgb") return `${attribute("r")},${attribute("g")},${attribute("b")}`;
|
|
1632
|
+
if (kind === "hsl") return `${attribute("hue")},${attribute("sat")},${attribute("lum")}`;
|
|
1633
|
+
return attribute("val");
|
|
1634
|
+
}
|
|
1635
|
+
function parseDrawingColorIn(container) {
|
|
1636
|
+
if (!container) return void 0;
|
|
1637
|
+
for (const element of elements(container)) {
|
|
1638
|
+
const kind = COLOR_ELEMENTS[element.localName];
|
|
1639
|
+
if (!kind || element.namespaceURI && element.namespaceURI !== NS.a) continue;
|
|
1640
|
+
return parseDrawingColor(element);
|
|
1650
1641
|
}
|
|
1651
|
-
return
|
|
1642
|
+
return void 0;
|
|
1652
1643
|
}
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1644
|
+
function parseDrawingColor(element) {
|
|
1645
|
+
const kind = COLOR_ELEMENTS[element.localName];
|
|
1646
|
+
if (!kind) return void 0;
|
|
1647
|
+
const color = {
|
|
1648
|
+
kind,
|
|
1649
|
+
value: colorValue(kind, element),
|
|
1650
|
+
transforms: elements(element).map((child3) => ({
|
|
1651
|
+
name: child3.localName,
|
|
1652
|
+
value: child3.getAttribute("val") ?? ""
|
|
1653
|
+
}))
|
|
1654
|
+
};
|
|
1655
|
+
const fallback = kind === "system" ? element.getAttribute("lastClr") : null;
|
|
1656
|
+
if (fallback) color.fallback = fallback;
|
|
1657
|
+
return color;
|
|
1660
1658
|
}
|
|
1661
|
-
function
|
|
1662
|
-
if (
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1659
|
+
function parseDrawingColorList(container) {
|
|
1660
|
+
if (!container) return [];
|
|
1661
|
+
return elements(container).flatMap((element) => {
|
|
1662
|
+
const color = parseDrawingColor(element);
|
|
1663
|
+
return color ? [color] : [];
|
|
1664
|
+
});
|
|
1665
|
+
}
|
|
1666
|
+
var PRESET_COLORS = {
|
|
1667
|
+
black: "#000000",
|
|
1668
|
+
white: "#FFFFFF",
|
|
1669
|
+
red: "#FF0000",
|
|
1670
|
+
green: "#008000",
|
|
1671
|
+
blue: "#0000FF",
|
|
1672
|
+
yellow: "#FFFF00",
|
|
1673
|
+
gray: "#808080",
|
|
1674
|
+
grey: "#808080"
|
|
1675
|
+
};
|
|
1676
|
+
function baseHex(color, theme) {
|
|
1677
|
+
switch (color.kind) {
|
|
1678
|
+
case "srgb":
|
|
1679
|
+
return /^[0-9a-f]{6}$/i.test(color.value) ? `#${color.value.toUpperCase()}` : void 0;
|
|
1680
|
+
case "scheme":
|
|
1681
|
+
return theme?.scheme(color.value);
|
|
1682
|
+
case "system":
|
|
1683
|
+
return color.fallback && /^[0-9a-f]{6}$/i.test(color.fallback) ? `#${color.fallback.toUpperCase()}` : void 0;
|
|
1684
|
+
case "preset":
|
|
1685
|
+
return PRESET_COLORS[color.value];
|
|
1686
|
+
case "scrgb": {
|
|
1687
|
+
const [r, g, b] = color.value.split(",").map((part) => parseDrawingFraction(part));
|
|
1688
|
+
if (r === void 0 || g === void 0 || b === void 0) return void 0;
|
|
1689
|
+
return `#${toHex(scrgbLinearToSrgb8(r))}${toHex(scrgbLinearToSrgb8(g))}${toHex(scrgbLinearToSrgb8(b))}`;
|
|
1690
|
+
}
|
|
1691
|
+
case "hsl": {
|
|
1692
|
+
const [h, s, l] = color.value.split(",");
|
|
1693
|
+
const hue = parseDrawingHueDegrees(h);
|
|
1694
|
+
const sat = parseDrawingFraction(s);
|
|
1695
|
+
const lum = parseDrawingFraction(l);
|
|
1696
|
+
if (hue === void 0 || sat === void 0 || lum === void 0) return void 0;
|
|
1697
|
+
const { r, g, b } = hslToRgb(hue, sat, lum);
|
|
1698
|
+
return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
|
|
1699
|
+
}
|
|
1669
1700
|
}
|
|
1670
|
-
return resolved.join("/");
|
|
1671
1701
|
}
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1702
|
+
var APPLIED = /* @__PURE__ */ new Set([
|
|
1703
|
+
"alpha",
|
|
1704
|
+
"alphaMod",
|
|
1705
|
+
"alphaOff",
|
|
1706
|
+
"comp",
|
|
1707
|
+
"inv",
|
|
1708
|
+
"gray",
|
|
1709
|
+
"shade",
|
|
1710
|
+
"tint",
|
|
1711
|
+
"hue",
|
|
1712
|
+
"hueMod",
|
|
1713
|
+
"hueOff",
|
|
1714
|
+
"sat",
|
|
1715
|
+
"satMod",
|
|
1716
|
+
"satOff",
|
|
1717
|
+
"lum",
|
|
1718
|
+
"lumMod",
|
|
1719
|
+
"lumOff"
|
|
1720
|
+
]);
|
|
1721
|
+
function resolveDrawingColor(color, theme, options) {
|
|
1722
|
+
const base = baseHex(color, theme);
|
|
1723
|
+
const rgb = base ? hexToRgbChannels(base) : null;
|
|
1724
|
+
if (!rgb) return void 0;
|
|
1725
|
+
let { r, g, b } = rgb;
|
|
1726
|
+
const find = (name) => color.transforms.find((entry) => entry.name === name)?.value;
|
|
1727
|
+
const has = (name) => color.transforms.some((entry) => entry.name === name);
|
|
1728
|
+
if (has("comp")) {
|
|
1729
|
+
const hsl = rgbToHsl(r, g, b);
|
|
1730
|
+
({ r, g, b } = hslToRgb((hsl.h + 180) % 360, hsl.s, hsl.l));
|
|
1731
|
+
}
|
|
1732
|
+
if (has("inv")) [r, g, b] = [255 - r, 255 - g, 255 - b];
|
|
1733
|
+
if (has("gray")) r = g = b = Math.round(0.299 * r + 0.587 * g + 0.114 * b);
|
|
1734
|
+
const shade = parseDrawingPercent(find("shade"));
|
|
1735
|
+
if (shade !== void 0) {
|
|
1736
|
+
r = linearToSrgb255(srgb255ToLinear(r) * shade);
|
|
1737
|
+
g = linearToSrgb255(srgb255ToLinear(g) * shade);
|
|
1738
|
+
b = linearToSrgb255(srgb255ToLinear(b) * shade);
|
|
1739
|
+
}
|
|
1740
|
+
const tint = parseDrawingPercent(find("tint"));
|
|
1741
|
+
if (tint !== void 0) {
|
|
1742
|
+
r = linearToSrgb255(1 - (1 - srgb255ToLinear(r)) * tint);
|
|
1743
|
+
g = linearToSrgb255(1 - (1 - srgb255ToLinear(g)) * tint);
|
|
1744
|
+
b = linearToSrgb255(1 - (1 - srgb255ToLinear(b)) * tint);
|
|
1745
|
+
}
|
|
1746
|
+
if (["hue", "hueMod", "hueOff", "sat", "satMod", "satOff", "lum", "lumMod", "lumOff"].some(has)) {
|
|
1747
|
+
const hsl = rgbToHsl(r, g, b);
|
|
1748
|
+
const wrap = (degrees) => (degrees % 360 + 360) % 360;
|
|
1749
|
+
const hueAbs = parseDrawingHueDegrees(find("hue"));
|
|
1750
|
+
if (hueAbs !== void 0) hsl.h = wrap(hueAbs);
|
|
1751
|
+
const hueMod = parseDrawingFraction(find("hueMod"));
|
|
1752
|
+
if (hueMod !== void 0) hsl.h = wrap(hsl.h * hueMod);
|
|
1753
|
+
const hueOff = parseDrawingHueDegrees(find("hueOff"));
|
|
1754
|
+
if (hueOff !== void 0) hsl.h = wrap(hsl.h + hueOff);
|
|
1755
|
+
const satAbs = parseDrawingFraction(find("sat"));
|
|
1756
|
+
if (satAbs !== void 0) hsl.s = clampUnitInterval(satAbs);
|
|
1757
|
+
const satMod = parseDrawingFraction(find("satMod"));
|
|
1758
|
+
if (satMod !== void 0) hsl.s = clampUnitInterval(hsl.s * satMod);
|
|
1759
|
+
const satOff = parseDrawingFraction(find("satOff"));
|
|
1760
|
+
if (satOff !== void 0) hsl.s = clampUnitInterval(hsl.s + satOff);
|
|
1761
|
+
const lumAbs = parseDrawingFraction(find("lum"));
|
|
1762
|
+
if (lumAbs !== void 0) hsl.l = clampUnitInterval(lumAbs);
|
|
1763
|
+
const lumMod = parseDrawingFraction(find("lumMod"));
|
|
1764
|
+
if (lumMod !== void 0) hsl.l = clampUnitInterval(hsl.l * lumMod);
|
|
1765
|
+
const lumOff = parseDrawingFraction(find("lumOff"));
|
|
1766
|
+
if (lumOff !== void 0) hsl.l = clampUnitInterval(hsl.l + lumOff);
|
|
1767
|
+
const round = Math.round;
|
|
1768
|
+
({ r, g, b } = hslToRgb(hsl.h, hsl.s, hsl.l, round));
|
|
1769
|
+
}
|
|
1770
|
+
let alpha = parseDrawingPercent(find("alpha")) ?? 1;
|
|
1771
|
+
const alphaMod = parseDrawingFraction(find("alphaMod"));
|
|
1772
|
+
if (alphaMod !== void 0) alpha = clampUnitInterval(alpha * alphaMod);
|
|
1773
|
+
const alphaOff = parseDrawingFraction(find("alphaOff"));
|
|
1774
|
+
if (alphaOff !== void 0) alpha = clampUnitInterval(alpha + alphaOff);
|
|
1775
|
+
return {
|
|
1776
|
+
hex: `#${toHex(r)}${toHex(g)}${toHex(b)}`,
|
|
1777
|
+
alpha,
|
|
1778
|
+
unapplied: [...new Set(color.transforms.map((entry) => entry.name))].filter(
|
|
1779
|
+
(name) => !APPLIED.has(name)
|
|
1780
|
+
)
|
|
1781
|
+
};
|
|
1676
1782
|
}
|
|
1677
|
-
var getRelationshipId = (element) => relAttr(element, "id") || void 0;
|
|
1678
1783
|
|
|
1679
|
-
//
|
|
1680
|
-
var
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1784
|
+
// drawingml/theme-model.ts
|
|
1785
|
+
var THEME_COLOR_SLOTS = [
|
|
1786
|
+
"dk1",
|
|
1787
|
+
"lt1",
|
|
1788
|
+
"dk2",
|
|
1789
|
+
"lt2",
|
|
1790
|
+
"accent1",
|
|
1791
|
+
"accent2",
|
|
1792
|
+
"accent3",
|
|
1793
|
+
"accent4",
|
|
1794
|
+
"accent5",
|
|
1795
|
+
"accent6",
|
|
1796
|
+
"hlink",
|
|
1797
|
+
"folHlink"
|
|
1798
|
+
];
|
|
1799
|
+
var DEFAULT_THEME_COLOR_MAP = {
|
|
1800
|
+
bg1: "lt1",
|
|
1801
|
+
tx1: "dk1",
|
|
1802
|
+
bg2: "lt2",
|
|
1803
|
+
tx2: "dk2"
|
|
1804
|
+
};
|
|
1805
|
+
|
|
1806
|
+
// drawingml/theme.ts
|
|
1807
|
+
var SLOT_SET = new Set(THEME_COLOR_SLOTS);
|
|
1808
|
+
function isThemeColorSlot(value) {
|
|
1809
|
+
return SLOT_SET.has(value);
|
|
1810
|
+
}
|
|
1811
|
+
function nonEmpty(value) {
|
|
1812
|
+
return value ? value : void 0;
|
|
1813
|
+
}
|
|
1814
|
+
function parseThemeColorScheme(scheme) {
|
|
1815
|
+
const result = { colors: {} };
|
|
1816
|
+
if (!scheme) return result;
|
|
1817
|
+
const name = nonEmpty(scheme.getAttribute("name"));
|
|
1818
|
+
if (name) result.name = name;
|
|
1819
|
+
for (const slot2 of THEME_COLOR_SLOTS) {
|
|
1820
|
+
const color = parseDrawingColorIn(first(scheme, slot2, NS.a));
|
|
1821
|
+
if (color) result.colors[slot2] = color;
|
|
1695
1822
|
}
|
|
1696
|
-
return
|
|
1823
|
+
return result;
|
|
1697
1824
|
}
|
|
1698
|
-
function
|
|
1699
|
-
const
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
const
|
|
1703
|
-
|
|
1825
|
+
function parseFontCollection(collection) {
|
|
1826
|
+
const result = { scripts: {} };
|
|
1827
|
+
if (!collection) return result;
|
|
1828
|
+
const typeface = (local) => nonEmpty(first(collection, local, NS.a)?.getAttribute("typeface"));
|
|
1829
|
+
const latin = typeface("latin");
|
|
1830
|
+
const eastAsia = typeface("ea");
|
|
1831
|
+
const complexScript = typeface("cs");
|
|
1832
|
+
if (latin) result.latin = latin;
|
|
1833
|
+
if (eastAsia) result.eastAsia = eastAsia;
|
|
1834
|
+
if (complexScript) result.complexScript = complexScript;
|
|
1835
|
+
for (const font of elements(collection)) {
|
|
1836
|
+
if (font.localName !== "font") continue;
|
|
1837
|
+
const script = nonEmpty(font.getAttribute("script"));
|
|
1838
|
+
const face = nonEmpty(font.getAttribute("typeface"));
|
|
1839
|
+
if (script && face && !Object.hasOwn(result.scripts, script)) result.scripts[script] = face;
|
|
1840
|
+
}
|
|
1841
|
+
return result;
|
|
1704
1842
|
}
|
|
1705
|
-
function
|
|
1706
|
-
const
|
|
1707
|
-
(
|
|
1708
|
-
|
|
1709
|
-
|
|
1843
|
+
function parseThemeFontScheme(scheme) {
|
|
1844
|
+
const result = {
|
|
1845
|
+
major: parseFontCollection(first(scheme, "majorFont", NS.a)),
|
|
1846
|
+
minor: parseFontCollection(first(scheme, "minorFont", NS.a))
|
|
1847
|
+
};
|
|
1848
|
+
const name = nonEmpty(scheme?.getAttribute("name"));
|
|
1849
|
+
if (name) result.name = name;
|
|
1850
|
+
return result;
|
|
1851
|
+
}
|
|
1852
|
+
function rootOf(source) {
|
|
1853
|
+
return "documentElement" in source ? source.documentElement : source;
|
|
1854
|
+
}
|
|
1855
|
+
function parseTheme(source) {
|
|
1856
|
+
const root = rootOf(source);
|
|
1857
|
+
const holder = first(root, "themeElements", NS.a) ?? root;
|
|
1858
|
+
const theme = {
|
|
1859
|
+
colorScheme: parseThemeColorScheme(first(holder, "clrScheme", NS.a)),
|
|
1860
|
+
fontScheme: parseThemeFontScheme(first(holder, "fontScheme", NS.a))
|
|
1861
|
+
};
|
|
1862
|
+
const name = nonEmpty(root.getAttribute("name"));
|
|
1863
|
+
if (name) theme.name = name;
|
|
1864
|
+
return theme;
|
|
1865
|
+
}
|
|
1866
|
+
|
|
1867
|
+
// drawingml/theme-color.ts
|
|
1868
|
+
function isLogical(name) {
|
|
1869
|
+
return Object.hasOwn(DEFAULT_THEME_COLOR_MAP, name);
|
|
1870
|
+
}
|
|
1871
|
+
function themeColorSlotFor(name, colorMap = {}) {
|
|
1872
|
+
if (isLogical(name)) return colorMap[name] ?? DEFAULT_THEME_COLOR_MAP[name];
|
|
1873
|
+
if (!isThemeColorSlot(name)) return void 0;
|
|
1874
|
+
if (name === "dk1" || name === "lt1" || name === "dk2" || name === "lt2") return name;
|
|
1875
|
+
return colorMap[name] ?? name;
|
|
1876
|
+
}
|
|
1877
|
+
function themeSlotHex(color) {
|
|
1878
|
+
if (!color) return void 0;
|
|
1879
|
+
const value = color.kind === "srgb" ? color.value : color.kind === "system" ? color.fallback : void 0;
|
|
1880
|
+
return value ? value.toUpperCase() : void 0;
|
|
1881
|
+
}
|
|
1882
|
+
|
|
1883
|
+
// docx/theme.ts
|
|
1884
|
+
function fontSetOf(collection) {
|
|
1885
|
+
const { latin, eastAsia, complexScript } = collection;
|
|
1886
|
+
return {
|
|
1887
|
+
...latin ? { latin } : {},
|
|
1888
|
+
...eastAsia ? { eastAsia } : {},
|
|
1889
|
+
...complexScript ? { complexScript } : {}
|
|
1890
|
+
};
|
|
1891
|
+
}
|
|
1892
|
+
function parseTheme2(xml) {
|
|
1893
|
+
const theme = parseTheme(parseXml2(xml));
|
|
1894
|
+
const colors = {};
|
|
1895
|
+
for (const slot2 of THEME_COLOR_SLOTS) {
|
|
1896
|
+
const value = themeSlotHex(theme.colorScheme.colors[slot2]);
|
|
1897
|
+
if (value) colors[slot2] = value;
|
|
1898
|
+
}
|
|
1899
|
+
const { major, minor } = theme.fontScheme;
|
|
1900
|
+
return { colors, colorMapping: {}, fonts: { major: fontSetOf(major), minor: fontSetOf(minor) } };
|
|
1901
|
+
}
|
|
1902
|
+
var MAPPING_KEYS = ["bg1", "tx1", "bg2", "tx2"];
|
|
1903
|
+
var TOKEN_TO_SLOT = {
|
|
1904
|
+
dark1: "dk1",
|
|
1905
|
+
light1: "lt1",
|
|
1906
|
+
dark2: "dk2",
|
|
1907
|
+
light2: "lt2",
|
|
1908
|
+
accent1: "accent1",
|
|
1909
|
+
accent2: "accent2",
|
|
1910
|
+
accent3: "accent3",
|
|
1911
|
+
accent4: "accent4",
|
|
1912
|
+
accent5: "accent5",
|
|
1913
|
+
accent6: "accent6",
|
|
1914
|
+
hyperlink: "hlink",
|
|
1915
|
+
followedHyperlink: "folHlink"
|
|
1916
|
+
};
|
|
1917
|
+
function parseColorSchemeMapping(xml) {
|
|
1918
|
+
const document = parseXml2(xml);
|
|
1919
|
+
const mapping = Array.from(document.getElementsByTagNameNS(WORD_NS, "clrSchemeMapping"))[0];
|
|
1920
|
+
const result = {};
|
|
1921
|
+
if (!mapping) return result;
|
|
1922
|
+
for (const key of MAPPING_KEYS) {
|
|
1923
|
+
const value = enumValue(
|
|
1924
|
+
isStWmlColorSchemeIndex,
|
|
1925
|
+
getW(mapping, key),
|
|
1926
|
+
`w:clrSchemeMapping/@w:${key}`
|
|
1927
|
+
);
|
|
1928
|
+
if (value) result[key] = TOKEN_TO_SLOT[value];
|
|
1929
|
+
}
|
|
1930
|
+
return result;
|
|
1931
|
+
}
|
|
1932
|
+
|
|
1933
|
+
// docx/theme-color.ts
|
|
1934
|
+
function isThemeColorToken(value) {
|
|
1935
|
+
return isStThemeColor(value);
|
|
1936
|
+
}
|
|
1937
|
+
var TOKEN_TO_SLOT2 = {
|
|
1938
|
+
dark1: "dk1",
|
|
1939
|
+
light1: "lt1",
|
|
1940
|
+
dark2: "dk2",
|
|
1941
|
+
light2: "lt2",
|
|
1942
|
+
accent1: "accent1",
|
|
1943
|
+
accent2: "accent2",
|
|
1944
|
+
accent3: "accent3",
|
|
1945
|
+
accent4: "accent4",
|
|
1946
|
+
accent5: "accent5",
|
|
1947
|
+
accent6: "accent6",
|
|
1948
|
+
hyperlink: "hlink",
|
|
1949
|
+
followedHyperlink: "folHlink"
|
|
1950
|
+
};
|
|
1951
|
+
function resolveThemeColorToken(token, theme) {
|
|
1952
|
+
const logical = {
|
|
1953
|
+
background1: "bg1",
|
|
1954
|
+
text1: "tx1",
|
|
1955
|
+
background2: "bg2",
|
|
1956
|
+
text2: "tx2"
|
|
1957
|
+
};
|
|
1958
|
+
const logicalKey = logical[token];
|
|
1959
|
+
if (logicalKey) {
|
|
1960
|
+
const slot3 = theme.colorMapping[logicalKey] ?? DEFAULT_THEME_COLOR_MAP[logicalKey];
|
|
1961
|
+
return theme.colors[slot3];
|
|
1962
|
+
}
|
|
1963
|
+
const slot2 = TOKEN_TO_SLOT2[token];
|
|
1964
|
+
return slot2 ? theme.colors[slot2] : void 0;
|
|
1965
|
+
}
|
|
1966
|
+
function hexToRgb(hex) {
|
|
1967
|
+
const normalized = hex.replace(/^#/, "");
|
|
1968
|
+
if (!/^[0-9a-fA-F]{6}$/.test(normalized)) return null;
|
|
1969
|
+
return {
|
|
1970
|
+
r: Number.parseInt(normalized.slice(0, 2), 16),
|
|
1971
|
+
g: Number.parseInt(normalized.slice(2, 4), 16),
|
|
1972
|
+
b: Number.parseInt(normalized.slice(4, 6), 16)
|
|
1973
|
+
};
|
|
1974
|
+
}
|
|
1975
|
+
function applyThemeShade(hex, fraction) {
|
|
1976
|
+
const rgb = hexToRgb(hex);
|
|
1977
|
+
if (!rgb) return hex;
|
|
1978
|
+
const mix = (channel) => linearToSrgb255(srgb255ToLinear(channel) * fraction);
|
|
1979
|
+
return `#${toHex(mix(rgb.r))}${toHex(mix(rgb.g))}${toHex(mix(rgb.b))}`;
|
|
1980
|
+
}
|
|
1981
|
+
function applyThemeTint(hex, fraction) {
|
|
1982
|
+
const rgb = hexToRgb(hex);
|
|
1983
|
+
if (!rgb) return hex;
|
|
1984
|
+
const mix = (channel) => linearToSrgb255(1 - (1 - srgb255ToLinear(channel)) * fraction);
|
|
1985
|
+
return `#${toHex(mix(rgb.r))}${toHex(mix(rgb.g))}${toHex(mix(rgb.b))}`;
|
|
1986
|
+
}
|
|
1987
|
+
function fractionToThemeByte(fraction) {
|
|
1988
|
+
return toHex(Math.round(Math.min(1, Math.max(0, fraction)) * 255));
|
|
1989
|
+
}
|
|
1990
|
+
function resolveThemeColorReference(ref, theme) {
|
|
1991
|
+
const base = resolveThemeColorToken(ref.token, theme);
|
|
1992
|
+
if (!base) return void 0;
|
|
1993
|
+
let hex = `#${base.replace(/^#/, "")}`;
|
|
1994
|
+
if (ref.shade !== void 0) hex = applyThemeShade(hex, ref.shade);
|
|
1995
|
+
if (ref.tint !== void 0) hex = applyThemeTint(hex, ref.tint);
|
|
1996
|
+
return hex;
|
|
1997
|
+
}
|
|
1998
|
+
|
|
1999
|
+
// opc/relationship-types.ts
|
|
2000
|
+
var BASE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
|
|
2001
|
+
var RELATIONSHIP_TYPES = {
|
|
2002
|
+
image: `${BASE}/image`,
|
|
2003
|
+
hyperlink: `${BASE}/hyperlink`,
|
|
2004
|
+
diagramData: `${BASE}/diagramData`,
|
|
2005
|
+
diagramLayout: `${BASE}/diagramLayout`,
|
|
2006
|
+
diagramQuickStyle: `${BASE}/diagramQuickStyle`,
|
|
2007
|
+
diagramColors: `${BASE}/diagramColors`,
|
|
2008
|
+
diagramDrawing: "http://schemas.microsoft.com/office/2007/relationships/diagramDrawing"};
|
|
2009
|
+
|
|
2010
|
+
// opc/relationships.ts
|
|
2011
|
+
function parseRelationships(xml) {
|
|
2012
|
+
const map = /* @__PURE__ */ new Map();
|
|
2013
|
+
if (!xml) return map;
|
|
2014
|
+
const root = parseXml(xml).documentElement;
|
|
2015
|
+
for (const node of elements(root)) {
|
|
2016
|
+
if (node.localName !== "Relationship") continue;
|
|
2017
|
+
const id = node.getAttribute("Id");
|
|
2018
|
+
const target = node.getAttribute("Target");
|
|
2019
|
+
if (!id || target == null) continue;
|
|
2020
|
+
map.set(id, {
|
|
2021
|
+
id,
|
|
2022
|
+
type: node.getAttribute("Type") ?? "",
|
|
2023
|
+
target,
|
|
2024
|
+
mode: node.getAttribute("TargetMode") === "External" ? "External" : "Internal"
|
|
2025
|
+
});
|
|
2026
|
+
}
|
|
2027
|
+
return map;
|
|
2028
|
+
}
|
|
2029
|
+
var escapeAttr = (value) => value.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<");
|
|
2030
|
+
function buildRelationshipsXml(relationships) {
|
|
2031
|
+
const items = Array.from(relationships).map(([id, rel]) => {
|
|
2032
|
+
const mode = rel.mode === "External" ? ' TargetMode="External"' : "";
|
|
2033
|
+
return `<Relationship Id="${escapeAttr(id)}" Type="${escapeAttr(rel.type)}" Target="${escapeAttr(rel.target)}"${mode}/>`;
|
|
2034
|
+
}).join("");
|
|
2035
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="${NS.rels}">${items}</Relationships>`;
|
|
2036
|
+
}
|
|
2037
|
+
function resolvePartPath(basePart, target) {
|
|
2038
|
+
if (target.startsWith("/")) return target.slice(1);
|
|
2039
|
+
const baseDir = basePart.slice(0, basePart.lastIndexOf("/") + 1);
|
|
2040
|
+
const resolved = [];
|
|
2041
|
+
for (const segment of `${baseDir}${target}`.split("/")) {
|
|
2042
|
+
if (segment === "." || segment === "") continue;
|
|
2043
|
+
if (segment === "..") resolved.pop();
|
|
2044
|
+
else resolved.push(segment);
|
|
2045
|
+
}
|
|
2046
|
+
return resolved.join("/");
|
|
2047
|
+
}
|
|
2048
|
+
function nextRelationshipId(used) {
|
|
2049
|
+
let index = 1;
|
|
2050
|
+
while (used.has(`rId${index}`)) index++;
|
|
2051
|
+
return `rId${index}`;
|
|
2052
|
+
}
|
|
2053
|
+
var getRelationshipId = (element) => relAttr(element, "id") || void 0;
|
|
2054
|
+
|
|
2055
|
+
// opc/content-types.ts
|
|
2056
|
+
var escapeAttr2 = (value) => value.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<");
|
|
2057
|
+
function parseContentTypes(xml) {
|
|
2058
|
+
const defaults = /* @__PURE__ */ new Map();
|
|
2059
|
+
const overrides = /* @__PURE__ */ new Map();
|
|
2060
|
+
if (!xml) return { defaults, overrides };
|
|
2061
|
+
for (const node of elements(parseXml(xml).documentElement)) {
|
|
2062
|
+
const contentType = node.getAttribute("ContentType");
|
|
2063
|
+
if (!contentType) continue;
|
|
2064
|
+
if (node.localName === "Default") {
|
|
2065
|
+
const extension = node.getAttribute("Extension");
|
|
2066
|
+
if (extension) defaults.set(extension.toLowerCase(), contentType);
|
|
2067
|
+
} else if (node.localName === "Override") {
|
|
2068
|
+
const partName = node.getAttribute("PartName");
|
|
2069
|
+
if (partName) overrides.set(partName, contentType);
|
|
2070
|
+
}
|
|
2071
|
+
}
|
|
2072
|
+
return { defaults, overrides };
|
|
2073
|
+
}
|
|
2074
|
+
function contentTypeForPart(types, partName) {
|
|
2075
|
+
const overridePath = partName.startsWith("/") ? partName : `/${partName}`;
|
|
2076
|
+
const override = types.overrides.get(overridePath);
|
|
2077
|
+
if (override) return override;
|
|
2078
|
+
const extension = partName.split(".").pop()?.toLowerCase();
|
|
2079
|
+
return extension ? types.defaults.get(extension) : void 0;
|
|
2080
|
+
}
|
|
2081
|
+
function buildContentTypesXml(types) {
|
|
2082
|
+
const defaults = Array.from(types.defaults).map(
|
|
2083
|
+
([extension, type]) => `<Default Extension="${extension}" ContentType="${escapeAttr2(type)}"/>`
|
|
2084
|
+
).join("");
|
|
2085
|
+
const overrides = Array.from(types.overrides).map(
|
|
1710
2086
|
([part, type]) => `<Override PartName="${escapeAttr2(part)}" ContentType="${escapeAttr2(type)}"/>`
|
|
1711
2087
|
).join("");
|
|
1712
2088
|
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Types xmlns="${NS.contentTypes}">${defaults}${overrides}</Types>`;
|
|
@@ -3659,7 +4035,7 @@ var NAMED = {
|
|
|
3659
4035
|
var POINT_TO_PX = 96 / 72;
|
|
3660
4036
|
var WATERMARK_PREFIX = "PowerPlusWaterMarkObject";
|
|
3661
4037
|
var DEFAULT_WATERMARK_COLOR = "#c0c0c0";
|
|
3662
|
-
function
|
|
4038
|
+
function colorOf(value) {
|
|
3663
4039
|
const text = (value ?? "").trim().toLowerCase().split(/\s/)[0] ?? "";
|
|
3664
4040
|
if (NAMED[text]) return NAMED[text];
|
|
3665
4041
|
const hex = /^#?([0-9a-f]{6})$/.exec(text);
|
|
@@ -3680,7 +4056,7 @@ function parseWatermarkShape(shape) {
|
|
|
3680
4056
|
const rotation = /rotation:\s*(-?[\d.]+)/i.exec(style);
|
|
3681
4057
|
const spec = {
|
|
3682
4058
|
text: path.getAttribute("string") ?? "",
|
|
3683
|
-
color:
|
|
4059
|
+
color: colorOf(shape.getAttribute("fillcolor")),
|
|
3684
4060
|
semitransparent: opacity !== null && opacity !== "" && opacity !== "1",
|
|
3685
4061
|
layout: rotation && Math.abs(Number(rotation[1]) % 360) > 1 ? "diagonal" : "horizontal",
|
|
3686
4062
|
...family ? { fontFamily: family.trim() } : {}
|
|
@@ -3792,7 +4168,7 @@ var add = (parent, ...items) => {
|
|
|
3792
4168
|
return parent;
|
|
3793
4169
|
};
|
|
3794
4170
|
var emu2 = (px3) => String(Math.max(1, Math.round(px3 * EMU_PER_PIXEL)));
|
|
3795
|
-
var
|
|
4171
|
+
var descendants2 = (root, ns, local) => Array.from(root.getElementsByTagNameNS(ns, local));
|
|
3796
4172
|
function paragraphsFor(doc, lines) {
|
|
3797
4173
|
return (lines.length ? lines : [""]).map((line) => {
|
|
3798
4174
|
const paragraph = makeW(doc, "p");
|
|
@@ -3884,23 +4260,23 @@ function buildTextBoxDrawing(doc, image, docPrId) {
|
|
|
3884
4260
|
}
|
|
3885
4261
|
function isSimpleTextBox(graphicData, anchored) {
|
|
3886
4262
|
if (!graphicData || anchored) return false;
|
|
3887
|
-
const content =
|
|
4263
|
+
const content = descendants2(graphicData, W_NS, "txbxContent")[0];
|
|
3888
4264
|
if (!content) return false;
|
|
3889
4265
|
const plain = (node, allowed) => Array.from(node.childNodes).filter(isElement).every((child3) => child3.namespaceURI === W_NS && allowed.includes(child3.localName));
|
|
3890
|
-
return plain(content, ["p"]) &&
|
|
3891
|
-
(paragraph) => plain(paragraph, ["r"]) &&
|
|
4266
|
+
return plain(content, ["p"]) && descendants2(content, W_NS, "p").every(
|
|
4267
|
+
(paragraph) => plain(paragraph, ["r"]) && descendants2(paragraph, W_NS, "r").every((run) => plain(run, ["t"]))
|
|
3892
4268
|
);
|
|
3893
4269
|
}
|
|
3894
4270
|
function textBoxHasBorder(graphicData) {
|
|
3895
|
-
const spPr = graphicData &&
|
|
4271
|
+
const spPr = graphicData && descendants2(graphicData, WPS_NS, "spPr")[0];
|
|
3896
4272
|
const ln = spPr && Array.from(spPr.getElementsByTagNameNS(A_NS, "ln"))[0];
|
|
3897
4273
|
return Boolean(ln && !ln.getElementsByTagNameNS(A_NS, "noFill").length);
|
|
3898
4274
|
}
|
|
3899
4275
|
function patchTextBox(doc, drawing, image, base) {
|
|
3900
4276
|
if (image.widthPx !== base.widthPx || image.heightPx !== base.heightPx)
|
|
3901
4277
|
for (const node of [
|
|
3902
|
-
...
|
|
3903
|
-
...
|
|
4278
|
+
...descendants2(drawing, WP_NS, "extent"),
|
|
4279
|
+
...descendants2(drawing, A_NS, "ext").filter(
|
|
3904
4280
|
(ext) => ext.parentNode?.localName === "xfrm"
|
|
3905
4281
|
)
|
|
3906
4282
|
]) {
|
|
@@ -3908,14 +4284,14 @@ function patchTextBox(doc, drawing, image, base) {
|
|
|
3908
4284
|
node.setAttribute("cy", emu2(image.heightPx));
|
|
3909
4285
|
}
|
|
3910
4286
|
if (JSON.stringify(image.textBoxText) !== JSON.stringify(base.textBoxText)) {
|
|
3911
|
-
const content =
|
|
4287
|
+
const content = descendants2(drawing, W_NS, "txbxContent")[0];
|
|
3912
4288
|
if (content) {
|
|
3913
4289
|
for (const child3 of Array.from(content.childNodes)) content.removeChild(child3);
|
|
3914
4290
|
add(content, ...paragraphsFor(doc, image.textBoxText ?? []));
|
|
3915
4291
|
}
|
|
3916
4292
|
}
|
|
3917
4293
|
if (image.textBoxBorder !== false !== (base.textBoxBorder !== false)) {
|
|
3918
|
-
const spPr =
|
|
4294
|
+
const spPr = descendants2(drawing, WPS_NS, "spPr")[0];
|
|
3919
4295
|
if (spPr) {
|
|
3920
4296
|
for (const old of Array.from(spPr.childNodes).filter(
|
|
3921
4297
|
(node) => isElement(node) && node.localName === "ln"
|
|
@@ -4078,47 +4454,6 @@ var DIAGRAM_RELATIONSHIP_TYPES = {
|
|
|
4078
4454
|
drawing: RELATIONSHIP_TYPES.diagramDrawing
|
|
4079
4455
|
};
|
|
4080
4456
|
|
|
4081
|
-
// diagram/dom.ts
|
|
4082
|
-
function attributeReader(element) {
|
|
4083
|
-
return (name) => {
|
|
4084
|
-
if (!element) return void 0;
|
|
4085
|
-
const direct = element.getAttribute(name);
|
|
4086
|
-
if (direct !== null) return direct;
|
|
4087
|
-
const attributes = element.attributes;
|
|
4088
|
-
for (let index = 0; index < attributes.length; index++) {
|
|
4089
|
-
const candidate = attributes.item(index);
|
|
4090
|
-
if (candidate && candidate.localName === name) return candidate.value;
|
|
4091
|
-
}
|
|
4092
|
-
return void 0;
|
|
4093
|
-
};
|
|
4094
|
-
}
|
|
4095
|
-
function stringAttribute(element, name) {
|
|
4096
|
-
const value = attributeReader(element)(name)?.trim();
|
|
4097
|
-
return value ? value : void 0;
|
|
4098
|
-
}
|
|
4099
|
-
function integerAttribute(element, name) {
|
|
4100
|
-
const parsed = Number.parseInt(attributeReader(element)(name) ?? "", 10);
|
|
4101
|
-
return Number.isFinite(parsed) ? parsed : void 0;
|
|
4102
|
-
}
|
|
4103
|
-
function booleanAttribute(element, name) {
|
|
4104
|
-
const value = attributeReader(element)(name)?.trim().toLowerCase();
|
|
4105
|
-
if (value === "1" || value === "true") return true;
|
|
4106
|
-
if (value === "0" || value === "false") return false;
|
|
4107
|
-
return void 0;
|
|
4108
|
-
}
|
|
4109
|
-
function descendants2(root, local) {
|
|
4110
|
-
const result = [];
|
|
4111
|
-
const visit = (node) => {
|
|
4112
|
-
for (const child3 of Array.from(node.childNodes)) {
|
|
4113
|
-
if (!isElement(child3)) continue;
|
|
4114
|
-
if (child3.localName === local) result.push(child3);
|
|
4115
|
-
visit(child3);
|
|
4116
|
-
}
|
|
4117
|
-
};
|
|
4118
|
-
visit(root);
|
|
4119
|
-
return result;
|
|
4120
|
-
}
|
|
4121
|
-
|
|
4122
4457
|
// diagram/data-model.ts
|
|
4123
4458
|
var TRANSITION_TYPES = /* @__PURE__ */ new Set(["parTrans", "sibTrans"]);
|
|
4124
4459
|
var STRUCTURAL_TYPES = /* @__PURE__ */ new Set(["doc", "pres", "parTrans", "sibTrans"]);
|
|
@@ -4142,7 +4477,7 @@ function connectionLabel(connection, transitionText) {
|
|
|
4142
4477
|
function textBodyParagraphs(body) {
|
|
4143
4478
|
if (!body) return [];
|
|
4144
4479
|
return children(body, "p", NS.a).map(
|
|
4145
|
-
(paragraph) =>
|
|
4480
|
+
(paragraph) => descendants(paragraph, "t").map((run) => run.textContent ?? "").join("")
|
|
4146
4481
|
);
|
|
4147
4482
|
}
|
|
4148
4483
|
function parsePoint(element) {
|
|
@@ -4222,312 +4557,20 @@ function parseDiagramDataModel(source, part) {
|
|
|
4222
4557
|
if ((!connection.type || connection.type === "parOf") && !parentById.has(connection.destId))
|
|
4223
4558
|
parentById.set(connection.destId, connection.sourceId);
|
|
4224
4559
|
}
|
|
4225
|
-
const ext =
|
|
4560
|
+
const ext = descendants(root, "dataModelExt")[0];
|
|
4226
4561
|
const drawingRelId = stringAttribute(ext, "relId");
|
|
4227
4562
|
return {
|
|
4228
4563
|
points,
|
|
4229
4564
|
connections,
|
|
4230
4565
|
nodes: points.filter((point) => !STRUCTURAL_TYPES.has(point.type)),
|
|
4231
|
-
parentById,
|
|
4232
|
-
...drawingRelId ? { drawingRelId } : {},
|
|
4233
|
-
issues
|
|
4234
|
-
};
|
|
4235
|
-
}
|
|
4236
|
-
|
|
4237
|
-
// color/color-primitives.ts
|
|
4238
|
-
function clampUnitInterval(value) {
|
|
4239
|
-
return Math.min(1, Math.max(0, value));
|
|
4240
|
-
}
|
|
4241
|
-
function hexToRgbChannels(color) {
|
|
4242
|
-
const normalized = color.replace("#", "");
|
|
4243
|
-
if (!/^[0-9a-fA-F]{6}$/.test(normalized)) {
|
|
4244
|
-
return null;
|
|
4245
|
-
}
|
|
4246
|
-
return {
|
|
4247
|
-
r: Number.parseInt(normalized.slice(0, 2), 16),
|
|
4248
|
-
g: Number.parseInt(normalized.slice(2, 4), 16),
|
|
4249
|
-
b: Number.parseInt(normalized.slice(4, 6), 16)
|
|
4250
|
-
};
|
|
4251
|
-
}
|
|
4252
|
-
function percentDivisorFor(text) {
|
|
4253
|
-
return text.endsWith("%") ? 100 : 1e5;
|
|
4254
|
-
}
|
|
4255
|
-
function parseOoxmlPercent(value) {
|
|
4256
|
-
const text = String(value ?? "").trim();
|
|
4257
|
-
const divisor = percentDivisorFor(text);
|
|
4258
|
-
const magnitude = Number.parseFloat(divisor === 100 ? text.slice(0, -1) : text);
|
|
4259
|
-
if (!Number.isFinite(magnitude)) {
|
|
4260
|
-
return void 0;
|
|
4261
|
-
}
|
|
4262
|
-
return magnitude / divisor;
|
|
4263
|
-
}
|
|
4264
|
-
function parseDrawingPercent(value) {
|
|
4265
|
-
const parsed = parseOoxmlPercent(value);
|
|
4266
|
-
return parsed === void 0 ? void 0 : clampUnitInterval(parsed);
|
|
4267
|
-
}
|
|
4268
|
-
function scrgbLinearToSrgb8(linear) {
|
|
4269
|
-
const l = Math.min(1, Math.max(0, linear));
|
|
4270
|
-
const companded = l <= 31308e-7 ? 12.92 * l : 1.055 * l ** (1 / 2.4) - 0.055;
|
|
4271
|
-
return Math.min(255, Math.max(0, Math.round(companded * 255)));
|
|
4272
|
-
}
|
|
4273
|
-
function toHex2(value) {
|
|
4274
|
-
return Math.min(255, Math.max(0, Math.round(value))).toString(16).padStart(2, "0").toUpperCase();
|
|
4275
|
-
}
|
|
4276
|
-
function rgbToHsl(r, g, b) {
|
|
4277
|
-
const rN = r / 255;
|
|
4278
|
-
const gN = g / 255;
|
|
4279
|
-
const bN = b / 255;
|
|
4280
|
-
const cMax = Math.max(rN, gN, bN);
|
|
4281
|
-
const cMin = Math.min(rN, gN, bN);
|
|
4282
|
-
const delta = cMax - cMin;
|
|
4283
|
-
const l = (cMax + cMin) / 2;
|
|
4284
|
-
let s = 0;
|
|
4285
|
-
if (delta !== 0) {
|
|
4286
|
-
s = delta / (1 - Math.abs(2 * l - 1));
|
|
4287
|
-
}
|
|
4288
|
-
let h = 0;
|
|
4289
|
-
if (delta !== 0) {
|
|
4290
|
-
if (cMax === rN) {
|
|
4291
|
-
h = 60 * ((gN - bN) / delta % 6);
|
|
4292
|
-
} else if (cMax === gN) {
|
|
4293
|
-
h = 60 * ((bN - rN) / delta + 2);
|
|
4294
|
-
} else {
|
|
4295
|
-
h = 60 * ((rN - gN) / delta + 4);
|
|
4296
|
-
}
|
|
4297
|
-
}
|
|
4298
|
-
if (h < 0) {
|
|
4299
|
-
h += 360;
|
|
4300
|
-
}
|
|
4301
|
-
return { h, s: clampUnitInterval(s), l: clampUnitInterval(l) };
|
|
4302
|
-
}
|
|
4303
|
-
function hslToRgb(h, s, l, roundChannel = Math.round, options) {
|
|
4304
|
-
const sC = clampUnitInterval(s);
|
|
4305
|
-
const lC = clampUnitInterval(l);
|
|
4306
|
-
const hN = (h % 360 + 360) % 360;
|
|
4307
|
-
const c = (1 - Math.abs(2 * lC - 1)) * sC;
|
|
4308
|
-
const x = c * (1 - Math.abs(hN / 60 % 2 - 1));
|
|
4309
|
-
const m = lC - c / 2;
|
|
4310
|
-
let rP = 0;
|
|
4311
|
-
let gP = 0;
|
|
4312
|
-
let bP = 0;
|
|
4313
|
-
if (hN < 60) {
|
|
4314
|
-
rP = c;
|
|
4315
|
-
gP = x;
|
|
4316
|
-
bP = 0;
|
|
4317
|
-
} else if (hN < 120) {
|
|
4318
|
-
rP = x;
|
|
4319
|
-
gP = c;
|
|
4320
|
-
bP = 0;
|
|
4321
|
-
} else if (hN < 180) {
|
|
4322
|
-
rP = 0;
|
|
4323
|
-
gP = c;
|
|
4324
|
-
bP = x;
|
|
4325
|
-
} else if (hN < 240) {
|
|
4326
|
-
rP = 0;
|
|
4327
|
-
gP = x;
|
|
4328
|
-
bP = c;
|
|
4329
|
-
} else if (hN < 300) {
|
|
4330
|
-
rP = x;
|
|
4331
|
-
gP = 0;
|
|
4332
|
-
bP = c;
|
|
4333
|
-
} else {
|
|
4334
|
-
rP = c;
|
|
4335
|
-
gP = 0;
|
|
4336
|
-
bP = x;
|
|
4337
|
-
}
|
|
4338
|
-
return {
|
|
4339
|
-
r: roundChannel((rP + m) * 255),
|
|
4340
|
-
g: roundChannel((gP + m) * 255),
|
|
4341
|
-
b: roundChannel((bP + m) * 255)
|
|
4342
|
-
};
|
|
4343
|
-
}
|
|
4344
|
-
function parseDrawingFraction(value) {
|
|
4345
|
-
return parseOoxmlPercent(value);
|
|
4346
|
-
}
|
|
4347
|
-
function parseDrawingHueDegrees(value) {
|
|
4348
|
-
const parsed = Number.parseFloat(String(value ?? "").trim());
|
|
4349
|
-
if (!Number.isFinite(parsed)) {
|
|
4350
|
-
return void 0;
|
|
4351
|
-
}
|
|
4352
|
-
return parsed / 6e4;
|
|
4353
|
-
}
|
|
4354
|
-
|
|
4355
|
-
// color/color-linear.ts
|
|
4356
|
-
function srgb255ToLinear(channel) {
|
|
4357
|
-
const c = clampUnitInterval(channel / 255);
|
|
4358
|
-
return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
|
|
4359
|
-
}
|
|
4360
|
-
function linearToSrgb255(linear) {
|
|
4361
|
-
const c = clampUnitInterval(linear);
|
|
4362
|
-
return 255 * (c <= 31308e-7 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - 0.055);
|
|
4363
|
-
}
|
|
4364
|
-
|
|
4365
|
-
// diagram/drawing-color.ts
|
|
4366
|
-
var COLOR_ELEMENTS = {
|
|
4367
|
-
srgbClr: "srgb",
|
|
4368
|
-
schemeClr: "scheme",
|
|
4369
|
-
sysClr: "system",
|
|
4370
|
-
prstClr: "preset",
|
|
4371
|
-
scrgbClr: "scrgb",
|
|
4372
|
-
hslClr: "hsl"
|
|
4373
|
-
};
|
|
4374
|
-
function colorValue(kind, element) {
|
|
4375
|
-
const attribute = (name) => element.getAttribute(name) ?? "";
|
|
4376
|
-
if (kind === "scrgb") return `${attribute("r")},${attribute("g")},${attribute("b")}`;
|
|
4377
|
-
if (kind === "hsl") return `${attribute("hue")},${attribute("sat")},${attribute("lum")}`;
|
|
4378
|
-
return attribute("val");
|
|
4379
|
-
}
|
|
4380
|
-
function parseDrawingColorIn(container) {
|
|
4381
|
-
if (!container) return void 0;
|
|
4382
|
-
for (const element of elements(container)) {
|
|
4383
|
-
const kind = COLOR_ELEMENTS[element.localName];
|
|
4384
|
-
if (!kind || element.namespaceURI && element.namespaceURI !== NS.a) continue;
|
|
4385
|
-
return parseDrawingColor(element);
|
|
4386
|
-
}
|
|
4387
|
-
return void 0;
|
|
4388
|
-
}
|
|
4389
|
-
function parseDrawingColor(element) {
|
|
4390
|
-
const kind = COLOR_ELEMENTS[element.localName];
|
|
4391
|
-
if (!kind) return void 0;
|
|
4392
|
-
const color = {
|
|
4393
|
-
kind,
|
|
4394
|
-
value: colorValue(kind, element),
|
|
4395
|
-
transforms: elements(element).map((child3) => ({
|
|
4396
|
-
name: child3.localName,
|
|
4397
|
-
value: child3.getAttribute("val") ?? ""
|
|
4398
|
-
}))
|
|
4399
|
-
};
|
|
4400
|
-
const fallback = kind === "system" ? element.getAttribute("lastClr") : null;
|
|
4401
|
-
if (fallback) color.fallback = fallback;
|
|
4402
|
-
return color;
|
|
4403
|
-
}
|
|
4404
|
-
function parseDrawingColorList(container) {
|
|
4405
|
-
if (!container) return [];
|
|
4406
|
-
return elements(container).flatMap((element) => {
|
|
4407
|
-
const color = parseDrawingColor(element);
|
|
4408
|
-
return color ? [color] : [];
|
|
4409
|
-
});
|
|
4410
|
-
}
|
|
4411
|
-
var PRESET_COLORS = {
|
|
4412
|
-
black: "#000000",
|
|
4413
|
-
white: "#FFFFFF",
|
|
4414
|
-
red: "#FF0000",
|
|
4415
|
-
green: "#008000",
|
|
4416
|
-
blue: "#0000FF",
|
|
4417
|
-
yellow: "#FFFF00",
|
|
4418
|
-
gray: "#808080",
|
|
4419
|
-
grey: "#808080"
|
|
4420
|
-
};
|
|
4421
|
-
function baseHex(color, theme) {
|
|
4422
|
-
switch (color.kind) {
|
|
4423
|
-
case "srgb":
|
|
4424
|
-
return /^[0-9a-f]{6}$/i.test(color.value) ? `#${color.value.toUpperCase()}` : void 0;
|
|
4425
|
-
case "scheme":
|
|
4426
|
-
return theme?.scheme(color.value);
|
|
4427
|
-
case "system":
|
|
4428
|
-
return color.fallback && /^[0-9a-f]{6}$/i.test(color.fallback) ? `#${color.fallback.toUpperCase()}` : void 0;
|
|
4429
|
-
case "preset":
|
|
4430
|
-
return PRESET_COLORS[color.value];
|
|
4431
|
-
case "scrgb": {
|
|
4432
|
-
const [r, g, b] = color.value.split(",").map((part) => parseDrawingFraction(part));
|
|
4433
|
-
if (r === void 0 || g === void 0 || b === void 0) return void 0;
|
|
4434
|
-
return `#${toHex2(scrgbLinearToSrgb8(r))}${toHex2(scrgbLinearToSrgb8(g))}${toHex2(scrgbLinearToSrgb8(b))}`;
|
|
4435
|
-
}
|
|
4436
|
-
case "hsl": {
|
|
4437
|
-
const [h, s, l] = color.value.split(",");
|
|
4438
|
-
const hue = parseDrawingHueDegrees(h);
|
|
4439
|
-
const sat = parseDrawingFraction(s);
|
|
4440
|
-
const lum = parseDrawingFraction(l);
|
|
4441
|
-
if (hue === void 0 || sat === void 0 || lum === void 0) return void 0;
|
|
4442
|
-
const { r, g, b } = hslToRgb(hue, sat, lum);
|
|
4443
|
-
return `#${toHex2(r)}${toHex2(g)}${toHex2(b)}`;
|
|
4444
|
-
}
|
|
4445
|
-
}
|
|
4446
|
-
}
|
|
4447
|
-
var APPLIED = /* @__PURE__ */ new Set([
|
|
4448
|
-
"alpha",
|
|
4449
|
-
"alphaMod",
|
|
4450
|
-
"alphaOff",
|
|
4451
|
-
"comp",
|
|
4452
|
-
"inv",
|
|
4453
|
-
"gray",
|
|
4454
|
-
"shade",
|
|
4455
|
-
"tint",
|
|
4456
|
-
"hue",
|
|
4457
|
-
"hueMod",
|
|
4458
|
-
"hueOff",
|
|
4459
|
-
"sat",
|
|
4460
|
-
"satMod",
|
|
4461
|
-
"satOff",
|
|
4462
|
-
"lum",
|
|
4463
|
-
"lumMod",
|
|
4464
|
-
"lumOff"
|
|
4465
|
-
]);
|
|
4466
|
-
function resolveDrawingColor(color, theme, options) {
|
|
4467
|
-
const base = baseHex(color, theme);
|
|
4468
|
-
const rgb = base ? hexToRgbChannels(base) : null;
|
|
4469
|
-
if (!rgb) return void 0;
|
|
4470
|
-
let { r, g, b } = rgb;
|
|
4471
|
-
const find = (name) => color.transforms.find((entry) => entry.name === name)?.value;
|
|
4472
|
-
const has = (name) => color.transforms.some((entry) => entry.name === name);
|
|
4473
|
-
if (has("comp")) {
|
|
4474
|
-
const hsl = rgbToHsl(r, g, b);
|
|
4475
|
-
({ r, g, b } = hslToRgb((hsl.h + 180) % 360, hsl.s, hsl.l));
|
|
4476
|
-
}
|
|
4477
|
-
if (has("inv")) [r, g, b] = [255 - r, 255 - g, 255 - b];
|
|
4478
|
-
if (has("gray")) r = g = b = Math.round(0.299 * r + 0.587 * g + 0.114 * b);
|
|
4479
|
-
const shade = parseDrawingPercent(find("shade"));
|
|
4480
|
-
if (shade !== void 0) {
|
|
4481
|
-
r = linearToSrgb255(srgb255ToLinear(r) * shade);
|
|
4482
|
-
g = linearToSrgb255(srgb255ToLinear(g) * shade);
|
|
4483
|
-
b = linearToSrgb255(srgb255ToLinear(b) * shade);
|
|
4484
|
-
}
|
|
4485
|
-
const tint = parseDrawingPercent(find("tint"));
|
|
4486
|
-
if (tint !== void 0) {
|
|
4487
|
-
r = linearToSrgb255(1 - (1 - srgb255ToLinear(r)) * tint);
|
|
4488
|
-
g = linearToSrgb255(1 - (1 - srgb255ToLinear(g)) * tint);
|
|
4489
|
-
b = linearToSrgb255(1 - (1 - srgb255ToLinear(b)) * tint);
|
|
4490
|
-
}
|
|
4491
|
-
if (["hue", "hueMod", "hueOff", "sat", "satMod", "satOff", "lum", "lumMod", "lumOff"].some(has)) {
|
|
4492
|
-
const hsl = rgbToHsl(r, g, b);
|
|
4493
|
-
const wrap = (degrees) => (degrees % 360 + 360) % 360;
|
|
4494
|
-
const hueAbs = parseDrawingHueDegrees(find("hue"));
|
|
4495
|
-
if (hueAbs !== void 0) hsl.h = wrap(hueAbs);
|
|
4496
|
-
const hueMod = parseDrawingFraction(find("hueMod"));
|
|
4497
|
-
if (hueMod !== void 0) hsl.h = wrap(hsl.h * hueMod);
|
|
4498
|
-
const hueOff = parseDrawingHueDegrees(find("hueOff"));
|
|
4499
|
-
if (hueOff !== void 0) hsl.h = wrap(hsl.h + hueOff);
|
|
4500
|
-
const satAbs = parseDrawingFraction(find("sat"));
|
|
4501
|
-
if (satAbs !== void 0) hsl.s = clampUnitInterval(satAbs);
|
|
4502
|
-
const satMod = parseDrawingFraction(find("satMod"));
|
|
4503
|
-
if (satMod !== void 0) hsl.s = clampUnitInterval(hsl.s * satMod);
|
|
4504
|
-
const satOff = parseDrawingFraction(find("satOff"));
|
|
4505
|
-
if (satOff !== void 0) hsl.s = clampUnitInterval(hsl.s + satOff);
|
|
4506
|
-
const lumAbs = parseDrawingFraction(find("lum"));
|
|
4507
|
-
if (lumAbs !== void 0) hsl.l = clampUnitInterval(lumAbs);
|
|
4508
|
-
const lumMod = parseDrawingFraction(find("lumMod"));
|
|
4509
|
-
if (lumMod !== void 0) hsl.l = clampUnitInterval(hsl.l * lumMod);
|
|
4510
|
-
const lumOff = parseDrawingFraction(find("lumOff"));
|
|
4511
|
-
if (lumOff !== void 0) hsl.l = clampUnitInterval(hsl.l + lumOff);
|
|
4512
|
-
const round = Math.round;
|
|
4513
|
-
({ r, g, b } = hslToRgb(hsl.h, hsl.s, hsl.l, round));
|
|
4514
|
-
}
|
|
4515
|
-
let alpha = parseDrawingPercent(find("alpha")) ?? 1;
|
|
4516
|
-
const alphaMod = parseDrawingFraction(find("alphaMod"));
|
|
4517
|
-
if (alphaMod !== void 0) alpha = clampUnitInterval(alpha * alphaMod);
|
|
4518
|
-
const alphaOff = parseDrawingFraction(find("alphaOff"));
|
|
4519
|
-
if (alphaOff !== void 0) alpha = clampUnitInterval(alpha + alphaOff);
|
|
4520
|
-
return {
|
|
4521
|
-
hex: `#${toHex2(r)}${toHex2(g)}${toHex2(b)}`,
|
|
4522
|
-
alpha,
|
|
4523
|
-
unapplied: [...new Set(color.transforms.map((entry) => entry.name))].filter(
|
|
4524
|
-
(name) => !APPLIED.has(name)
|
|
4525
|
-
)
|
|
4566
|
+
parentById,
|
|
4567
|
+
...drawingRelId ? { drawingRelId } : {},
|
|
4568
|
+
issues
|
|
4526
4569
|
};
|
|
4527
4570
|
}
|
|
4528
4571
|
|
|
4529
4572
|
// diagram/definitions.ts
|
|
4530
|
-
var
|
|
4573
|
+
var rootOf2 = (source) => (typeof source === "string" ? parseXml(source, { label: "DiagramML" }) : source).documentElement;
|
|
4531
4574
|
function parseDefinitionHeader(root) {
|
|
4532
4575
|
const header = {
|
|
4533
4576
|
uniqueId: stringAttribute(root, "uniqueId") ?? "",
|
|
@@ -4548,7 +4591,7 @@ function colorList(container) {
|
|
|
4548
4591
|
return { ...method ? { method } : {}, colors: parseDrawingColorList(container) };
|
|
4549
4592
|
}
|
|
4550
4593
|
function parseDiagramColors(source) {
|
|
4551
|
-
const root =
|
|
4594
|
+
const root = rootOf2(source);
|
|
4552
4595
|
const labels = children(root, "styleLbl", NS.dgm).map((label) => ({
|
|
4553
4596
|
name: stringAttribute(label, "name") ?? "",
|
|
4554
4597
|
fill: colorList(first(label, "fillClrLst", NS.dgm)),
|
|
@@ -4588,7 +4631,7 @@ function parseStyleReferences(style) {
|
|
|
4588
4631
|
}
|
|
4589
4632
|
var hasContent = (element) => Boolean(element && (element.attributes.length > 0 || elements(element).length > 0));
|
|
4590
4633
|
function parseDiagramQuickStyle(source) {
|
|
4591
|
-
const root =
|
|
4634
|
+
const root = rootOf2(source);
|
|
4592
4635
|
const labels = children(root, "styleLbl", NS.dgm).map((label) => ({
|
|
4593
4636
|
name: stringAttribute(label, "name") ?? "",
|
|
4594
4637
|
...parseStyleReferences(first(label, "style", NS.dgm)),
|
|
@@ -4602,7 +4645,7 @@ function parseDiagramQuickStyle(source) {
|
|
|
4602
4645
|
};
|
|
4603
4646
|
}
|
|
4604
4647
|
function parseDiagramLayoutSummary(source) {
|
|
4605
|
-
const root =
|
|
4648
|
+
const root = rootOf2(source);
|
|
4606
4649
|
const header = parseDefinitionHeader(root);
|
|
4607
4650
|
const family = resolveDiagramLayoutCategory(
|
|
4608
4651
|
header.uniqueId,
|
|
@@ -4614,11 +4657,11 @@ function parseDiagramLayoutSummary(source) {
|
|
|
4614
4657
|
...header,
|
|
4615
4658
|
...family ? { family } : {},
|
|
4616
4659
|
...rootAlgorithm ? { rootAlgorithm } : {},
|
|
4617
|
-
layoutNodeCount:
|
|
4660
|
+
layoutNodeCount: descendants(root, "layoutNode").length
|
|
4618
4661
|
};
|
|
4619
4662
|
}
|
|
4620
4663
|
|
|
4621
|
-
//
|
|
4664
|
+
// drawingml/drawing-fill.ts
|
|
4622
4665
|
var FILL_ELEMENTS = /* @__PURE__ */ new Set([
|
|
4623
4666
|
"noFill",
|
|
4624
4667
|
"solidFill",
|
|
@@ -4710,7 +4753,7 @@ function parseDrawingLine(ln) {
|
|
|
4710
4753
|
return line;
|
|
4711
4754
|
}
|
|
4712
4755
|
|
|
4713
|
-
//
|
|
4756
|
+
// drawingml/drawing-text.ts
|
|
4714
4757
|
function parseSpacing(parent) {
|
|
4715
4758
|
for (const [name, unit, divisor] of [
|
|
4716
4759
|
["spcPts", "points", 100],
|
|
@@ -4789,7 +4832,7 @@ function parseDrawingTextBody(body) {
|
|
|
4789
4832
|
return result;
|
|
4790
4833
|
}
|
|
4791
4834
|
|
|
4792
|
-
//
|
|
4835
|
+
// drawingml/drawing-geometry.ts
|
|
4793
4836
|
var int = (element, name) => Number.parseInt(element?.getAttribute(name) ?? "", 10);
|
|
4794
4837
|
function parseFrame(container) {
|
|
4795
4838
|
const off = first(container, "off", NS.a);
|
|
@@ -5608,6 +5651,23 @@ function restoreRunFormatting(run) {
|
|
|
5608
5651
|
else delete run.revision;
|
|
5609
5652
|
}
|
|
5610
5653
|
|
|
5654
|
+
// docx/field-flags.ts
|
|
5655
|
+
function parseFieldFlags(element) {
|
|
5656
|
+
const locked = onOffAttribute(element, "fldLock");
|
|
5657
|
+
const dirty = onOffAttribute(element, "dirty");
|
|
5658
|
+
if (locked === void 0 && dirty === void 0) return void 0;
|
|
5659
|
+
return { ...locked !== void 0 && { locked }, ...dirty !== void 0 && { dirty } };
|
|
5660
|
+
}
|
|
5661
|
+
function writeFieldFlags(element, flags) {
|
|
5662
|
+
for (const [name, value] of [
|
|
5663
|
+
["fldLock", flags?.locked],
|
|
5664
|
+
["dirty", flags?.dirty]
|
|
5665
|
+
]) {
|
|
5666
|
+
if (value === void 0) element.removeAttributeNS(WORD_NS, name);
|
|
5667
|
+
else element.setAttributeNS(WORD_NS, `w:${name}`, value ? "true" : "false");
|
|
5668
|
+
}
|
|
5669
|
+
}
|
|
5670
|
+
|
|
5611
5671
|
// docx/write-run.ts
|
|
5612
5672
|
function setAttribute6(element, local, value) {
|
|
5613
5673
|
element.setAttributeNS(WORD_NS, `w:${local}`, value);
|
|
@@ -5793,6 +5853,7 @@ function createRun(doc, run, base, old, allocator) {
|
|
|
5793
5853
|
if (run.fieldChar) {
|
|
5794
5854
|
const marker = makeW(doc, "fldChar");
|
|
5795
5855
|
setAttribute6(marker, "fldCharType", run.fieldChar);
|
|
5856
|
+
writeFieldFlags(marker, run.fieldFlags);
|
|
5796
5857
|
node.appendChild(marker);
|
|
5797
5858
|
return node;
|
|
5798
5859
|
}
|
|
@@ -5873,6 +5934,14 @@ function takeSimpleFieldCommentEdges(doc, runs, start, end, opens, closes) {
|
|
|
5873
5934
|
after: take(closes, end - 1).reverse().flatMap((edge) => rangeEndNodes(doc, edge))
|
|
5874
5935
|
};
|
|
5875
5936
|
}
|
|
5937
|
+
|
|
5938
|
+
// docx/field-lock.ts
|
|
5939
|
+
function isFieldLocked(run) {
|
|
5940
|
+
return run?.fieldFlags?.locked === true;
|
|
5941
|
+
}
|
|
5942
|
+
function sameFieldFlags(a, b) {
|
|
5943
|
+
return a?.locked === b?.locked && a?.dirty === b?.dirty;
|
|
5944
|
+
}
|
|
5876
5945
|
var MATH_NAMESPACES = /* @__PURE__ */ new Set([
|
|
5877
5946
|
"http://schemas.openxmlformats.org/officeDocument/2006/math",
|
|
5878
5947
|
"http://purl.oclc.org/ooxml/officeDocument/math"
|
|
@@ -6197,6 +6266,7 @@ function buildInlineContent(doc, runs, base, slots, allocator, ranges) {
|
|
|
6197
6266
|
container = makeW(doc, "fldSimple");
|
|
6198
6267
|
setW6(container, "instr", ` ${group.instr} `);
|
|
6199
6268
|
}
|
|
6269
|
+
if (group.kind === "simpleField") writeFieldFlags(container, runAt(start).fieldFlags);
|
|
6200
6270
|
const edges = group.kind === "simpleField" ? takeSimpleFieldCommentEdges(doc, runs, start, index, opens, closes) : { before: [], after: [] };
|
|
6201
6271
|
for (let item = start; item < index; item++)
|
|
6202
6272
|
for (const node of nodesFor(item)) container.appendChild(node);
|
|
@@ -6207,13 +6277,18 @@ function buildInlineContent(doc, runs, base, slots, allocator, ranges) {
|
|
|
6207
6277
|
function containerGroup(run) {
|
|
6208
6278
|
if (run.link) return { kind: "link", link: run.link };
|
|
6209
6279
|
if (run.field?.simple)
|
|
6210
|
-
return {
|
|
6280
|
+
return {
|
|
6281
|
+
kind: "simpleField",
|
|
6282
|
+
instr: run.field.instr,
|
|
6283
|
+
instanceId: run.fieldInstanceId,
|
|
6284
|
+
fieldFlags: run.fieldFlags
|
|
6285
|
+
};
|
|
6211
6286
|
return void 0;
|
|
6212
6287
|
}
|
|
6213
6288
|
function sameGroup(a, b) {
|
|
6214
6289
|
if (!a || !b) return a === b;
|
|
6215
6290
|
if (a.kind === "link" && b.kind === "link") return sameLink(a.link, b.link);
|
|
6216
|
-
return a.kind === "simpleField" && b.kind === "simpleField" && a.instr === b.instr && a.instanceId === b.instanceId;
|
|
6291
|
+
return a.kind === "simpleField" && b.kind === "simpleField" && a.instr === b.instr && a.instanceId === b.instanceId && sameFieldFlags(a.fieldFlags, b.fieldFlags);
|
|
6217
6292
|
}
|
|
6218
6293
|
|
|
6219
6294
|
// docx/paragraph-properties.ts
|
|
@@ -7038,103 +7113,338 @@ function validateNumberingCatalog(c, catalog) {
|
|
|
7038
7113
|
}
|
|
7039
7114
|
}
|
|
7040
7115
|
|
|
7041
|
-
// docx/validate-model.ts
|
|
7042
|
-
function validateBlocks(c, blocks) {
|
|
7043
|
-
blocks?.forEach((block, index) => {
|
|
7044
|
-
const at = c.at(`[${index}]`);
|
|
7045
|
-
if (block.type === "paragraph") return validateParagraph(at, block);
|
|
7046
|
-
validateTable(at, block);
|
|
7047
|
-
block.rows.forEach(
|
|
7048
|
-
(row, r) => row.forEach(
|
|
7049
|
-
(cell, k) => cell.paragraphs.forEach(
|
|
7050
|
-
(paragraph, p) => validateParagraph(at.at(`.rows[${r}][${k}].paragraphs[${p}]`), paragraph)
|
|
7051
|
-
)
|
|
7052
|
-
)
|
|
7053
|
-
);
|
|
7054
|
-
});
|
|
7116
|
+
// docx/validate-model.ts
|
|
7117
|
+
function validateBlocks(c, blocks) {
|
|
7118
|
+
blocks?.forEach((block, index) => {
|
|
7119
|
+
const at = c.at(`[${index}]`);
|
|
7120
|
+
if (block.type === "paragraph") return validateParagraph(at, block);
|
|
7121
|
+
validateTable(at, block);
|
|
7122
|
+
block.rows.forEach(
|
|
7123
|
+
(row, r) => row.forEach(
|
|
7124
|
+
(cell, k) => cell.paragraphs.forEach(
|
|
7125
|
+
(paragraph, p) => validateParagraph(at.at(`.rows[${r}][${k}].paragraphs[${p}]`), paragraph)
|
|
7126
|
+
)
|
|
7127
|
+
)
|
|
7128
|
+
);
|
|
7129
|
+
});
|
|
7130
|
+
}
|
|
7131
|
+
function validateDocumentModel(model) {
|
|
7132
|
+
const issues = [];
|
|
7133
|
+
const path = (suffix) => new Checker(issues, suffix);
|
|
7134
|
+
const page = path("page");
|
|
7135
|
+
for (const key of ["width", "height"])
|
|
7136
|
+
page.check(
|
|
7137
|
+
key,
|
|
7138
|
+
model.page?.[key],
|
|
7139
|
+
(v) => typeof v === "number" && Number.isFinite(v) && Math.round(v * 15) > 0,
|
|
7140
|
+
"must be a finite, positive pixel size (converted to integer twips)"
|
|
7141
|
+
);
|
|
7142
|
+
for (const key of ["marginTop", "marginRight", "marginBottom", "marginLeft"])
|
|
7143
|
+
page.check(
|
|
7144
|
+
key,
|
|
7145
|
+
model.page?.[key],
|
|
7146
|
+
(v) => typeof v === "number" && Number.isFinite(v) && (key === "marginTop" || key === "marginBottom" || v >= 0),
|
|
7147
|
+
"must be a finite pixel size (converted to integer twips; left/right non-negative)"
|
|
7148
|
+
);
|
|
7149
|
+
validateBlocks(path("blocks"), model.blocks);
|
|
7150
|
+
model.sections?.forEach((section, index) => {
|
|
7151
|
+
const at = path(`sections[${index}]`);
|
|
7152
|
+
validateSection(at, section);
|
|
7153
|
+
for (const kind of ["headers", "footers"])
|
|
7154
|
+
for (const [slot2, content] of Object.entries(section[kind] ?? {}))
|
|
7155
|
+
validateBlocks(at.at(`.${kind}.${slot2}.blocks`), content?.blocks);
|
|
7156
|
+
});
|
|
7157
|
+
for (const kind of ["footnotes", "endnotes"])
|
|
7158
|
+
model[kind]?.forEach(
|
|
7159
|
+
(note, index) => validateBlocks(path(`${kind}[${index}].blocks`), note.blocks)
|
|
7160
|
+
);
|
|
7161
|
+
model.comments?.forEach(
|
|
7162
|
+
(comment, index) => path(`comments[${index}]`).dateTime("date", comment.date)
|
|
7163
|
+
);
|
|
7164
|
+
path("model").hex("pageColor", model.pageColor);
|
|
7165
|
+
path("model").enum("footnoteNumFmt", model.footnoteNumFmt, isStNumberFormat, "ST_NumberFormat");
|
|
7166
|
+
path("model").enum("endnoteNumFmt", model.endnoteNumFmt, isStNumberFormat, "ST_NumberFormat");
|
|
7167
|
+
if (model.numberingCatalog)
|
|
7168
|
+
validateNumberingCatalog(path("numberingCatalog"), model.numberingCatalog);
|
|
7169
|
+
return issues;
|
|
7170
|
+
}
|
|
7171
|
+
function assertValidDocumentModel(model) {
|
|
7172
|
+
const issues = validateDocumentModel(model);
|
|
7173
|
+
if (issues.length) throw new DocxModelValidationError(issues);
|
|
7174
|
+
}
|
|
7175
|
+
|
|
7176
|
+
// docx/numbering-parts.ts
|
|
7177
|
+
var CT_NS = "http://schemas.openxmlformats.org/package/2006/content-types";
|
|
7178
|
+
var REL_NS2 = "http://schemas.openxmlformats.org/package/2006/relationships";
|
|
7179
|
+
var NUMBERING_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering";
|
|
7180
|
+
var NUMBERING_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml";
|
|
7181
|
+
async function registerNumberingPart(zip) {
|
|
7182
|
+
const contentTypesPath = "[Content_Types].xml";
|
|
7183
|
+
const contentTypesFile = zip.file(contentTypesPath);
|
|
7184
|
+
const contentTypesXml = contentTypesFile ? await contentTypesFile.async("string") : `<?xml version="1.0"?><Types xmlns="${CT_NS}"/>`;
|
|
7185
|
+
const contentTypesDoc = parseXml2(contentTypesXml);
|
|
7186
|
+
const hasOverride = Array.from(contentTypesDoc.getElementsByTagNameNS(CT_NS, "Override")).some(
|
|
7187
|
+
(element) => element.getAttribute("PartName") === "/word/numbering.xml"
|
|
7188
|
+
);
|
|
7189
|
+
if (!hasOverride) {
|
|
7190
|
+
const override = contentTypesDoc.createElementNS(CT_NS, "Override");
|
|
7191
|
+
override.setAttribute("PartName", "/word/numbering.xml");
|
|
7192
|
+
override.setAttribute("ContentType", NUMBERING_CONTENT_TYPE);
|
|
7193
|
+
contentTypesDoc.documentElement.appendChild(override);
|
|
7194
|
+
zip.file(contentTypesPath, buildXml(contentTypesDoc));
|
|
7195
|
+
}
|
|
7196
|
+
const relsPath = "word/_rels/document.xml.rels";
|
|
7197
|
+
const relsFile = zip.file(relsPath);
|
|
7198
|
+
const relsXml = relsFile ? await relsFile.async("string") : `<?xml version="1.0"?><Relationships xmlns="${REL_NS2}"/>`;
|
|
7199
|
+
const relsDoc = parseXml2(relsXml);
|
|
7200
|
+
const existingIds = new Set(
|
|
7201
|
+
Array.from(relsDoc.getElementsByTagNameNS(REL_NS2, "Relationship")).map(
|
|
7202
|
+
(element) => element.getAttribute("Id") ?? ""
|
|
7203
|
+
)
|
|
7204
|
+
);
|
|
7205
|
+
let serial = 1;
|
|
7206
|
+
while (existingIds.has(`rId${serial}`)) serial++;
|
|
7207
|
+
const relationship = relsDoc.createElementNS(REL_NS2, "Relationship");
|
|
7208
|
+
relationship.setAttribute("Id", `rId${serial}`);
|
|
7209
|
+
relationship.setAttribute("Type", NUMBERING_RELATIONSHIP_TYPE);
|
|
7210
|
+
relationship.setAttribute("Target", "numbering.xml");
|
|
7211
|
+
relsDoc.documentElement.appendChild(relationship);
|
|
7212
|
+
zip.file(relsPath, buildXml(relsDoc));
|
|
7213
|
+
}
|
|
7214
|
+
|
|
7215
|
+
// docx/numbering-parse.ts
|
|
7216
|
+
var integer2 = (value, fallback) => parseInteger(value) ?? fallback;
|
|
7217
|
+
var flag = (element) => onOffElement(element) === true;
|
|
7218
|
+
function byName(root, local) {
|
|
7219
|
+
return Array.from(root.getElementsByTagName("*")).filter(
|
|
7220
|
+
(node) => node.nodeType === 1 && named2(node, local)
|
|
7221
|
+
);
|
|
7222
|
+
}
|
|
7223
|
+
function parseMarkerFormat(rPr) {
|
|
7224
|
+
if (!rPr) return void 0;
|
|
7225
|
+
const format = {};
|
|
7226
|
+
const family = getW(first2(rPr, "rFonts"), "ascii");
|
|
7227
|
+
if (family) format.fontFamily = family;
|
|
7228
|
+
const size = parseInteger(getW(first2(rPr, "sz"), "val"));
|
|
7229
|
+
if (size !== void 0 && size > 0) format.fontSizeHalfPoints = size;
|
|
7230
|
+
if (onOffElement(first2(rPr, "b")) === true) format.bold = true;
|
|
7231
|
+
if (onOffElement(first2(rPr, "i")) === true) format.italic = true;
|
|
7232
|
+
const color = getW(first2(rPr, "color"), "val");
|
|
7233
|
+
if (color && /^[0-9a-f]{6}$/i.test(color)) format.color = `#${color.toLowerCase()}`;
|
|
7234
|
+
return Object.keys(format).length ? format : void 0;
|
|
7235
|
+
}
|
|
7236
|
+
function parseNumberingLevel(lvl) {
|
|
7237
|
+
const level = integer2(getW(lvl, "ilvl"), 0);
|
|
7238
|
+
const start = integer2(getW(first2(lvl, "start"), "val"), 1);
|
|
7239
|
+
const numFmt = enumValue(isStNumberFormat, getW(first2(lvl, "numFmt"), "val"), "w:numFmt") ?? "decimal";
|
|
7240
|
+
const lvlText = getW(first2(lvl, "lvlText"), "val") ?? "";
|
|
7241
|
+
const jc = getW(first2(lvl, "lvlJc"), "val");
|
|
7242
|
+
const ind = first2(first2(lvl, "pPr"), "ind");
|
|
7243
|
+
const suffRaw = getW(first2(lvl, "suff"), "val");
|
|
7244
|
+
const result = { level, start, numFmt, lvlText };
|
|
7245
|
+
if (!first2(lvl, "start")) result.startWasOmitted = true;
|
|
7246
|
+
const paragraphStyleId = getW(first2(lvl, "pStyle"), "val");
|
|
7247
|
+
if (paragraphStyleId) result.paragraphStyleId = paragraphStyleId;
|
|
7248
|
+
if (jc === "left" || jc === "center" || jc === "right") result.lvlJc = jc;
|
|
7249
|
+
const left = getW(ind, "left") ?? getW(ind, "start");
|
|
7250
|
+
if (left !== void 0) result.indentLeftTwips = parseSignedTwips(left) ?? signedTwips(0);
|
|
7251
|
+
const hanging = getW(ind, "hanging");
|
|
7252
|
+
if (hanging !== void 0) result.hangingTwips = parseTwips(hanging) ?? twips(0);
|
|
7253
|
+
const firstLine = getW(ind, "firstLine");
|
|
7254
|
+
if (firstLine !== void 0) result.firstLineTwips = parseTwips(firstLine) ?? twips(0);
|
|
7255
|
+
const tabs = first2(first2(lvl, "pPr"), "tabs");
|
|
7256
|
+
const tab = tabs ? children2(tabs, "tab").find((stop) => getW(stop, "val") !== "clear") : void 0;
|
|
7257
|
+
const tabPos = tab ? parseTwips(getW(tab, "pos")) : void 0;
|
|
7258
|
+
if (tabPos !== void 0) result.tabStopTwips = tabPos;
|
|
7259
|
+
if (flag(first2(lvl, "isLgl"))) result.isLgl = true;
|
|
7260
|
+
const restart = getW(first2(lvl, "lvlRestart"), "val");
|
|
7261
|
+
if (restart !== void 0) result.lvlRestart = integer2(restart, 0);
|
|
7262
|
+
const marker = parseMarkerFormat(first2(lvl, "rPr"));
|
|
7263
|
+
if (marker) result.markerFormat = marker;
|
|
7264
|
+
result.suffix = suffRaw === "space" ? "space" : suffRaw === "nothing" ? "none" : "tab";
|
|
7265
|
+
return result;
|
|
7266
|
+
}
|
|
7267
|
+
function parseAbstractNum(element) {
|
|
7268
|
+
const id = getW(element, "abstractNumId");
|
|
7269
|
+
if (!id) return void 0;
|
|
7270
|
+
const levels = {};
|
|
7271
|
+
for (const lvl of children2(element, "lvl")) {
|
|
7272
|
+
const parsed = parseNumberingLevel(lvl);
|
|
7273
|
+
levels[parsed.level] = parsed;
|
|
7274
|
+
}
|
|
7275
|
+
return { id, levels };
|
|
7276
|
+
}
|
|
7277
|
+
function parseNum(element) {
|
|
7278
|
+
const id = getW(element, "numId");
|
|
7279
|
+
if (!id) return void 0;
|
|
7280
|
+
const abstractNumId = getW(first2(element, "abstractNumId"), "val") ?? "";
|
|
7281
|
+
const levelOverrides = {};
|
|
7282
|
+
for (const override of children2(element, "lvlOverride")) {
|
|
7283
|
+
const level = integer2(getW(override, "ilvl"), 0);
|
|
7284
|
+
const entry = {};
|
|
7285
|
+
const startOverride = getW(first2(override, "startOverride"), "val");
|
|
7286
|
+
if (startOverride !== void 0) entry.startOverride = integer2(startOverride, 1);
|
|
7287
|
+
const lvl = first2(override, "lvl");
|
|
7288
|
+
if (lvl) entry.lvl = parseNumberingLevel(lvl);
|
|
7289
|
+
if (Object.keys(entry).length) levelOverrides[level] = entry;
|
|
7290
|
+
}
|
|
7291
|
+
return {
|
|
7292
|
+
id,
|
|
7293
|
+
abstractNumId,
|
|
7294
|
+
...Object.keys(levelOverrides).length ? { levelOverrides } : {}
|
|
7295
|
+
};
|
|
7296
|
+
}
|
|
7297
|
+
function parseNumberingCatalog(xml) {
|
|
7298
|
+
const document = parseXml2(xml);
|
|
7299
|
+
const root = document.documentElement;
|
|
7300
|
+
const abstractNums = {};
|
|
7301
|
+
const warnings = [];
|
|
7302
|
+
for (const element of byName(root, "abstractNum")) {
|
|
7303
|
+
const parsed = parseAbstractNum(element);
|
|
7304
|
+
if (!parsed) continue;
|
|
7305
|
+
abstractNums[parsed.id] = parsed;
|
|
7306
|
+
const link = getW(first2(element, "numStyleLink"), "val");
|
|
7307
|
+
if (link)
|
|
7308
|
+
warnings.push(
|
|
7309
|
+
`Numbering definition abstractNum ${parsed.id} links to style "${link}"; style-linked numbering levels are not resolved.`
|
|
7310
|
+
);
|
|
7311
|
+
if (byName(element, "lvlPicBulletId").length)
|
|
7312
|
+
warnings.push(
|
|
7313
|
+
`Numbering definition abstractNum ${parsed.id} uses a picture bullet; picture bullets are not rendered.`
|
|
7314
|
+
);
|
|
7315
|
+
}
|
|
7316
|
+
const nums = {};
|
|
7317
|
+
for (const element of byName(root, "num")) {
|
|
7318
|
+
const parsed = parseNum(element);
|
|
7319
|
+
if (parsed) nums[parsed.id] = parsed;
|
|
7320
|
+
}
|
|
7321
|
+
return { abstractNums, nums, warnings: [...new Set(warnings)] };
|
|
7322
|
+
}
|
|
7323
|
+
function resolveNumberingLevel(catalog, numId, level) {
|
|
7324
|
+
const num = catalog.nums[numId];
|
|
7325
|
+
if (!num) return void 0;
|
|
7326
|
+
const override = num.levelOverrides?.[level];
|
|
7327
|
+
const sourceAbstract = catalog.abstractNums[num.abstractNumId]?.levels[level];
|
|
7328
|
+
const abstract = sourceAbstract?.startWasOmitted && sourceAbstract.start === 1 ? { ...sourceAbstract, start: 0 } : sourceAbstract;
|
|
7329
|
+
let base = override?.lvl ?? abstract;
|
|
7330
|
+
if (!base) return void 0;
|
|
7331
|
+
if (override?.lvl) {
|
|
7332
|
+
const { lvlRestart: _ignored, ...properties } = base;
|
|
7333
|
+
base = {
|
|
7334
|
+
...properties,
|
|
7335
|
+
...abstract?.lvlRestart !== void 0 ? { lvlRestart: abstract.lvlRestart } : {}
|
|
7336
|
+
};
|
|
7337
|
+
}
|
|
7338
|
+
let start = override?.startOverride ?? base.start;
|
|
7339
|
+
if (override?.lvl) {
|
|
7340
|
+
if (abstract?.lvlRestart === 0 && override.startOverride === void 0) start = abstract.start;
|
|
7341
|
+
else if (!override.lvl.startWasOmitted || override.lvl.start !== 1) start = override.lvl.start;
|
|
7342
|
+
else start = override.startOverride ?? 0;
|
|
7343
|
+
}
|
|
7344
|
+
return start !== base.start ? { ...base, start } : base;
|
|
7345
|
+
}
|
|
7346
|
+
|
|
7347
|
+
// docx/numbering-start-edit.ts
|
|
7348
|
+
function assertListStartValue(level, start) {
|
|
7349
|
+
if (!Number.isInteger(level) || level < 0 || level > 8)
|
|
7350
|
+
throw new Error("List level must be an integer from 0 through 8.");
|
|
7351
|
+
if (!Number.isInteger(start) || start < 0 || start > 2147483647)
|
|
7352
|
+
throw new Error("List start must be an integer from 0 through 2147483647.");
|
|
7353
|
+
}
|
|
7354
|
+
function setListStartOverride(catalog, numId, level, start) {
|
|
7355
|
+
assertListStartValue(level, start);
|
|
7356
|
+
if (!Number.isSafeInteger(numId) || numId <= 0) throw new Error("Invalid list instance id.");
|
|
7357
|
+
const id = String(numId);
|
|
7358
|
+
const num = catalog.nums[id];
|
|
7359
|
+
if (!num || !resolveNumberingLevel(catalog, id, level))
|
|
7360
|
+
throw new Error("List instance or level does not exist.");
|
|
7361
|
+
const override = num.levelOverrides?.[level];
|
|
7362
|
+
if (override?.lvl) throw new Error("Changing starts with a full level override is unsupported.");
|
|
7363
|
+
if (override?.startOverride === start) return catalog;
|
|
7364
|
+
return {
|
|
7365
|
+
...catalog,
|
|
7366
|
+
nums: {
|
|
7367
|
+
...catalog.nums,
|
|
7368
|
+
[id]: {
|
|
7369
|
+
...num,
|
|
7370
|
+
levelOverrides: {
|
|
7371
|
+
...num.levelOverrides,
|
|
7372
|
+
[level]: { ...override, startOverride: start }
|
|
7373
|
+
}
|
|
7374
|
+
}
|
|
7375
|
+
}
|
|
7376
|
+
};
|
|
7377
|
+
}
|
|
7378
|
+
|
|
7379
|
+
// docx/numbering-start-patch.ts
|
|
7380
|
+
function withoutStarts(num) {
|
|
7381
|
+
const { levelOverrides, ...properties } = num;
|
|
7382
|
+
const kept = {};
|
|
7383
|
+
for (const [level, override] of Object.entries(levelOverrides ?? {})) {
|
|
7384
|
+
const { startOverride: _start, ...rest } = override;
|
|
7385
|
+
if (Object.keys(rest).length) kept[level] = rest;
|
|
7386
|
+
}
|
|
7387
|
+
return { ...properties, ...Object.keys(kept).length ? { levelOverrides: kept } : {} };
|
|
7055
7388
|
}
|
|
7056
|
-
function
|
|
7057
|
-
const
|
|
7058
|
-
const
|
|
7059
|
-
|
|
7060
|
-
|
|
7061
|
-
|
|
7062
|
-
|
|
7063
|
-
|
|
7064
|
-
|
|
7065
|
-
|
|
7389
|
+
function numberingStartChanges(prior, next) {
|
|
7390
|
+
const changes = [];
|
|
7391
|
+
for (const [id, previous] of Object.entries(prior?.nums ?? {})) {
|
|
7392
|
+
const current = next.nums[id];
|
|
7393
|
+
if (!current || JSON.stringify(withoutStarts(current)) !== JSON.stringify(withoutStarts(previous)))
|
|
7394
|
+
throw new Error(
|
|
7395
|
+
`Cannot edit numbering definition num "${id}" except its supported start overrides.`
|
|
7396
|
+
);
|
|
7397
|
+
for (const key of /* @__PURE__ */ new Set([
|
|
7398
|
+
...Object.keys(previous.levelOverrides ?? {}),
|
|
7399
|
+
...Object.keys(current.levelOverrides ?? {})
|
|
7400
|
+
])) {
|
|
7401
|
+
const level = Number(key);
|
|
7402
|
+
const old = previous.levelOverrides?.[level];
|
|
7403
|
+
const value = current.levelOverrides?.[level];
|
|
7404
|
+
if (old?.startOverride === value?.startOverride) continue;
|
|
7405
|
+
if (value?.startOverride === void 0)
|
|
7406
|
+
throw new Error("Removing a list start override is unsupported.");
|
|
7407
|
+
assertListStartValue(level, value.startOverride);
|
|
7408
|
+
if (String(level) !== key || !prior || !resolveNumberingLevel(prior, id, level))
|
|
7409
|
+
throw new Error("List instance or level does not exist.");
|
|
7410
|
+
if (old?.lvl || value.lvl)
|
|
7411
|
+
throw new Error("Changing starts with a full level override is unsupported.");
|
|
7412
|
+
changes.push({ numId: id, level, start: value.startOverride });
|
|
7413
|
+
}
|
|
7414
|
+
}
|
|
7415
|
+
return changes;
|
|
7416
|
+
}
|
|
7417
|
+
function patchNumberingStarts(doc, changes) {
|
|
7418
|
+
const sameNumber = (source, expected) => source !== void 0 && /^[+-]?\d+$/.test(source) && Number(source) === Number(expected);
|
|
7419
|
+
const prepared = changes.map((change) => {
|
|
7420
|
+
const nums = children2(doc.documentElement, "num").filter(
|
|
7421
|
+
(num2) => sameNumber(getW(num2, "numId"), change.numId)
|
|
7066
7422
|
);
|
|
7067
|
-
|
|
7068
|
-
|
|
7069
|
-
|
|
7070
|
-
|
|
7071
|
-
(
|
|
7072
|
-
"must be a finite pixel size (converted to integer twips; left/right non-negative)"
|
|
7423
|
+
if (nums.length !== 1 || getW(nums[0], "numId") !== change.numId)
|
|
7424
|
+
throw new Error("Cannot patch an ambiguous or missing source list instance.");
|
|
7425
|
+
const num = nums[0];
|
|
7426
|
+
const overrides = children2(num, "lvlOverride").filter(
|
|
7427
|
+
(node) => sameNumber(getW(node, "ilvl"), String(change.level))
|
|
7073
7428
|
);
|
|
7074
|
-
|
|
7075
|
-
|
|
7076
|
-
|
|
7077
|
-
|
|
7078
|
-
|
|
7079
|
-
|
|
7080
|
-
|
|
7429
|
+
if (overrides.length > 1) throw new Error("Cannot patch duplicate source level overrides.");
|
|
7430
|
+
const override = overrides[0];
|
|
7431
|
+
if (override && getW(override, "ilvl") !== String(change.level))
|
|
7432
|
+
throw new Error("Cannot patch a noncanonical source level override.");
|
|
7433
|
+
if (override && (children2(override, "lvl").length || children2(override, "startOverride").length > 1))
|
|
7434
|
+
throw new Error("Cannot patch a full or ambiguous source level override.");
|
|
7435
|
+
return { change, num, override };
|
|
7081
7436
|
});
|
|
7082
|
-
for (const
|
|
7083
|
-
|
|
7084
|
-
|
|
7085
|
-
|
|
7086
|
-
|
|
7087
|
-
|
|
7088
|
-
|
|
7089
|
-
|
|
7090
|
-
|
|
7091
|
-
|
|
7092
|
-
if (model.numberingCatalog)
|
|
7093
|
-
validateNumberingCatalog(path("numberingCatalog"), model.numberingCatalog);
|
|
7094
|
-
return issues;
|
|
7095
|
-
}
|
|
7096
|
-
function assertValidDocumentModel(model) {
|
|
7097
|
-
const issues = validateDocumentModel(model);
|
|
7098
|
-
if (issues.length) throw new DocxModelValidationError(issues);
|
|
7099
|
-
}
|
|
7100
|
-
|
|
7101
|
-
// docx/numbering-parts.ts
|
|
7102
|
-
var CT_NS = "http://schemas.openxmlformats.org/package/2006/content-types";
|
|
7103
|
-
var REL_NS2 = "http://schemas.openxmlformats.org/package/2006/relationships";
|
|
7104
|
-
var NUMBERING_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering";
|
|
7105
|
-
var NUMBERING_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml";
|
|
7106
|
-
async function registerNumberingPart(zip) {
|
|
7107
|
-
const contentTypesPath = "[Content_Types].xml";
|
|
7108
|
-
const contentTypesFile = zip.file(contentTypesPath);
|
|
7109
|
-
const contentTypesXml = contentTypesFile ? await contentTypesFile.async("string") : `<?xml version="1.0"?><Types xmlns="${CT_NS}"/>`;
|
|
7110
|
-
const contentTypesDoc = parseXml2(contentTypesXml);
|
|
7111
|
-
const hasOverride = Array.from(contentTypesDoc.getElementsByTagNameNS(CT_NS, "Override")).some(
|
|
7112
|
-
(element) => element.getAttribute("PartName") === "/word/numbering.xml"
|
|
7113
|
-
);
|
|
7114
|
-
if (!hasOverride) {
|
|
7115
|
-
const override = contentTypesDoc.createElementNS(CT_NS, "Override");
|
|
7116
|
-
override.setAttribute("PartName", "/word/numbering.xml");
|
|
7117
|
-
override.setAttribute("ContentType", NUMBERING_CONTENT_TYPE);
|
|
7118
|
-
contentTypesDoc.documentElement.appendChild(override);
|
|
7119
|
-
zip.file(contentTypesPath, buildXml(contentTypesDoc));
|
|
7437
|
+
for (const { change, num, override: existing } of prepared) {
|
|
7438
|
+
const override = existing ?? makeW(doc, "lvlOverride");
|
|
7439
|
+
if (!existing) {
|
|
7440
|
+
override.setAttributeNS(WORD_NS, "w:ilvl", String(change.level));
|
|
7441
|
+
const after = children2(num, "lvlOverride").at(-1) ?? children2(num, "abstractNumId")[0];
|
|
7442
|
+
num.insertBefore(override, after?.nextSibling ?? null);
|
|
7443
|
+
}
|
|
7444
|
+
const start = children2(override, "startOverride")[0] ?? makeW(doc, "startOverride");
|
|
7445
|
+
start.setAttributeNS(WORD_NS, "w:val", String(change.start));
|
|
7446
|
+
if (!start.parentNode) override.insertBefore(start, override.firstChild);
|
|
7120
7447
|
}
|
|
7121
|
-
const relsPath = "word/_rels/document.xml.rels";
|
|
7122
|
-
const relsFile = zip.file(relsPath);
|
|
7123
|
-
const relsXml = relsFile ? await relsFile.async("string") : `<?xml version="1.0"?><Relationships xmlns="${REL_NS2}"/>`;
|
|
7124
|
-
const relsDoc = parseXml2(relsXml);
|
|
7125
|
-
const existingIds = new Set(
|
|
7126
|
-
Array.from(relsDoc.getElementsByTagNameNS(REL_NS2, "Relationship")).map(
|
|
7127
|
-
(element) => element.getAttribute("Id") ?? ""
|
|
7128
|
-
)
|
|
7129
|
-
);
|
|
7130
|
-
let serial = 1;
|
|
7131
|
-
while (existingIds.has(`rId${serial}`)) serial++;
|
|
7132
|
-
const relationship = relsDoc.createElementNS(REL_NS2, "Relationship");
|
|
7133
|
-
relationship.setAttribute("Id", `rId${serial}`);
|
|
7134
|
-
relationship.setAttribute("Type", NUMBERING_RELATIONSHIP_TYPE);
|
|
7135
|
-
relationship.setAttribute("Target", "numbering.xml");
|
|
7136
|
-
relsDoc.documentElement.appendChild(relationship);
|
|
7137
|
-
zip.file(relsPath, buildXml(relsDoc));
|
|
7138
7448
|
}
|
|
7139
7449
|
|
|
7140
7450
|
// docx/numbering-package.ts
|
|
@@ -7241,17 +7551,14 @@ async function applyNumberingCatalog(zip, model, binding) {
|
|
|
7241
7551
|
throw new Error(
|
|
7242
7552
|
`Cannot edit numbering definition abstractNum "${id}"; the original numbering.xml is preserved unchanged.`
|
|
7243
7553
|
);
|
|
7244
|
-
|
|
7245
|
-
if (JSON.stringify(next.nums[id]) !== JSON.stringify(prior?.nums[id]))
|
|
7246
|
-
throw new Error(
|
|
7247
|
-
`Cannot edit numbering definition num "${id}"; the original numbering.xml is preserved unchanged.`
|
|
7248
|
-
);
|
|
7554
|
+
const startChanges = numberingStartChanges(prior, next);
|
|
7249
7555
|
const newAbstractIds = Object.keys(next.abstractNums).filter((id) => !prior?.abstractNums[id]);
|
|
7250
7556
|
const newNumIds = Object.keys(next.nums).filter((id) => !prior?.nums[id]);
|
|
7251
|
-
if (!newAbstractIds.length && !newNumIds.length) return;
|
|
7557
|
+
if (!newAbstractIds.length && !newNumIds.length && !startChanges.length) return;
|
|
7252
7558
|
const existingFile = zip.file("word/numbering.xml");
|
|
7253
7559
|
const doc = existingFile ? parseXml2(await existingFile.async("string")) : parseXml2(`<w:numbering xmlns:w="${WORD_NS}"/>`);
|
|
7254
7560
|
const root = doc.documentElement;
|
|
7561
|
+
patchNumberingStarts(doc, startChanges);
|
|
7255
7562
|
const cleanup = children2(root, "numIdMacAtCleanup")[0] ?? null;
|
|
7256
7563
|
const firstNum = children2(root, "num")[0] ?? cleanup;
|
|
7257
7564
|
for (const id of newAbstractIds) {
|
|
@@ -8120,23 +8427,31 @@ function createFieldTracker() {
|
|
|
8120
8427
|
const stack = [];
|
|
8121
8428
|
return (element, run) => {
|
|
8122
8429
|
let resultInstr;
|
|
8430
|
+
let resultLocked;
|
|
8123
8431
|
for (const child3 of Array.from(element.childNodes)) {
|
|
8124
8432
|
if (!isElement(child3)) continue;
|
|
8125
8433
|
if (named2(child3, "fldChar")) {
|
|
8126
8434
|
const type = getW(child3, "fldCharType");
|
|
8127
|
-
if (type === "begin")
|
|
8128
|
-
|
|
8435
|
+
if (type === "begin") {
|
|
8436
|
+
const locked = parseFieldFlags(child3)?.locked;
|
|
8437
|
+
stack.push({ instr: "", inResult: false, ...locked !== void 0 && { locked } });
|
|
8438
|
+
} else if (type === "separate") {
|
|
8129
8439
|
const top = stack.at(-1);
|
|
8130
8440
|
if (top) top.inResult = true;
|
|
8131
8441
|
} else if (type === "end") stack.pop();
|
|
8132
8442
|
} else {
|
|
8133
8443
|
const top = stack.at(-1);
|
|
8134
8444
|
if (named2(child3, "instrText") && top && !top.inResult) top.instr += textContent(child3);
|
|
8135
|
-
else if ((named2(child3, "t") || named2(child3, "delText")) && top?.inResult)
|
|
8445
|
+
else if ((named2(child3, "t") || named2(child3, "delText")) && top?.inResult) {
|
|
8136
8446
|
resultInstr = top.instr.trim();
|
|
8447
|
+
resultLocked = top.locked;
|
|
8448
|
+
}
|
|
8137
8449
|
}
|
|
8138
8450
|
}
|
|
8139
|
-
if (resultInstr)
|
|
8451
|
+
if (resultInstr) {
|
|
8452
|
+
run.field = { instr: resultInstr };
|
|
8453
|
+
if (resultLocked !== void 0) run.fieldFlags = { locked: resultLocked };
|
|
8454
|
+
}
|
|
8140
8455
|
return run;
|
|
8141
8456
|
};
|
|
8142
8457
|
}
|
|
@@ -8147,7 +8462,11 @@ function storyFieldResults(container) {
|
|
|
8147
8462
|
if (named2(element, "fldSimple") || named2(element, "txbxContent")) return;
|
|
8148
8463
|
if (named2(element, "r")) {
|
|
8149
8464
|
const run = trackField(element, { text: "" });
|
|
8150
|
-
if (run.field)
|
|
8465
|
+
if (run.field)
|
|
8466
|
+
metadata.set(element, {
|
|
8467
|
+
field: run.field,
|
|
8468
|
+
...run.fieldFlags && { fieldFlags: run.fieldFlags }
|
|
8469
|
+
});
|
|
8151
8470
|
return;
|
|
8152
8471
|
}
|
|
8153
8472
|
for (const child3 of Array.from(element.childNodes)) if (isElement(child3)) visit(child3);
|
|
@@ -8239,7 +8558,11 @@ function parseRun2(node, revision) {
|
|
|
8239
8558
|
if (breakKind) run.break = breakKind;
|
|
8240
8559
|
if (noteReference) run.noteReference = noteReference;
|
|
8241
8560
|
if (noteMark) run.noteMark = noteMark;
|
|
8242
|
-
if (fieldChar)
|
|
8561
|
+
if (fieldChar) {
|
|
8562
|
+
run.fieldChar = fieldChar;
|
|
8563
|
+
const flags = parseFieldFlags(only);
|
|
8564
|
+
if (flags) run.fieldFlags = flags;
|
|
8565
|
+
}
|
|
8243
8566
|
if (fieldCode !== void 0) run.fieldCode = fieldCode;
|
|
8244
8567
|
const runRevision = revision ?? runFormatRevision(props);
|
|
8245
8568
|
if (runRevision) run.revision = runRevision;
|
|
@@ -8258,8 +8581,11 @@ function parseParagraph2(node, id, fields) {
|
|
|
8258
8581
|
(element, revision) => {
|
|
8259
8582
|
const run = parseRun2(element, revision);
|
|
8260
8583
|
if (!fields) return trackField(element, run);
|
|
8261
|
-
const
|
|
8262
|
-
if (
|
|
8584
|
+
const metadata = fields.get(element);
|
|
8585
|
+
if (metadata) {
|
|
8586
|
+
run.field = { ...metadata.field };
|
|
8587
|
+
if (metadata.fieldFlags) run.fieldFlags = { ...metadata.fieldFlags };
|
|
8588
|
+
}
|
|
8263
8589
|
return run;
|
|
8264
8590
|
},
|
|
8265
8591
|
(item) => {
|
|
@@ -8281,20 +8607,23 @@ function parseParagraph2(node, id, fields) {
|
|
|
8281
8607
|
);
|
|
8282
8608
|
if (link) return results.map((run) => ({ ...run, link }));
|
|
8283
8609
|
const field = { instr: instr.trim(), simple: true };
|
|
8610
|
+
const flags = parseFieldFlags(item);
|
|
8611
|
+
const fieldState = flags ? { fieldFlags: flags } : {};
|
|
8284
8612
|
const fieldInstanceId = `${id}:simple-field-${simpleFieldIndex++}`;
|
|
8285
|
-
if (!results.length)
|
|
8613
|
+
if (!results.length)
|
|
8614
|
+
return [{ text: fieldPlaceholderText(instr), field, fieldInstanceId, ...fieldState }];
|
|
8286
8615
|
if (results.every(
|
|
8287
8616
|
(run) => !run.text && !run.equation && !run.image && !run.break && !run.noteReference && !run.noteMark && !run.fieldChar && run.fieldCode === void 0
|
|
8288
8617
|
)) {
|
|
8289
8618
|
return [
|
|
8290
|
-
{ text: "", fieldChar: "begin" },
|
|
8619
|
+
{ text: "", fieldChar: "begin", ...fieldState },
|
|
8291
8620
|
{ text: "", fieldCode: instr },
|
|
8292
8621
|
{ text: "", fieldChar: "separate" },
|
|
8293
8622
|
...results,
|
|
8294
8623
|
{ text: "", fieldChar: "end" }
|
|
8295
8624
|
];
|
|
8296
8625
|
}
|
|
8297
|
-
return results.map((run) => ({ ...run, field, fieldInstanceId }));
|
|
8626
|
+
return results.map((run) => ({ ...run, field, fieldInstanceId, ...fieldState }));
|
|
8298
8627
|
},
|
|
8299
8628
|
(hyperlink) => {
|
|
8300
8629
|
if (!activeContext) return void 0;
|
|
@@ -8667,138 +8996,6 @@ async function parseDocumentParts(zip, body, blocks, drawings) {
|
|
|
8667
8996
|
};
|
|
8668
8997
|
}
|
|
8669
8998
|
|
|
8670
|
-
// docx/numbering-parse.ts
|
|
8671
|
-
var integer2 = (value, fallback) => parseInteger(value) ?? fallback;
|
|
8672
|
-
var flag = (element) => onOffElement(element) === true;
|
|
8673
|
-
function byName(root, local) {
|
|
8674
|
-
return Array.from(root.getElementsByTagName("*")).filter(
|
|
8675
|
-
(node) => node.nodeType === 1 && named2(node, local)
|
|
8676
|
-
);
|
|
8677
|
-
}
|
|
8678
|
-
function parseMarkerFormat(rPr) {
|
|
8679
|
-
if (!rPr) return void 0;
|
|
8680
|
-
const format = {};
|
|
8681
|
-
const family = getW(first2(rPr, "rFonts"), "ascii");
|
|
8682
|
-
if (family) format.fontFamily = family;
|
|
8683
|
-
const size = parseInteger(getW(first2(rPr, "sz"), "val"));
|
|
8684
|
-
if (size !== void 0 && size > 0) format.fontSizeHalfPoints = size;
|
|
8685
|
-
if (onOffElement(first2(rPr, "b")) === true) format.bold = true;
|
|
8686
|
-
if (onOffElement(first2(rPr, "i")) === true) format.italic = true;
|
|
8687
|
-
const color = getW(first2(rPr, "color"), "val");
|
|
8688
|
-
if (color && /^[0-9a-f]{6}$/i.test(color)) format.color = `#${color.toLowerCase()}`;
|
|
8689
|
-
return Object.keys(format).length ? format : void 0;
|
|
8690
|
-
}
|
|
8691
|
-
function parseNumberingLevel(lvl) {
|
|
8692
|
-
const level = integer2(getW(lvl, "ilvl"), 0);
|
|
8693
|
-
const start = integer2(getW(first2(lvl, "start"), "val"), 1);
|
|
8694
|
-
const numFmt = enumValue(isStNumberFormat, getW(first2(lvl, "numFmt"), "val"), "w:numFmt") ?? "decimal";
|
|
8695
|
-
const lvlText = getW(first2(lvl, "lvlText"), "val") ?? "";
|
|
8696
|
-
const jc = getW(first2(lvl, "lvlJc"), "val");
|
|
8697
|
-
const ind = first2(first2(lvl, "pPr"), "ind");
|
|
8698
|
-
const suffRaw = getW(first2(lvl, "suff"), "val");
|
|
8699
|
-
const result = { level, start, numFmt, lvlText };
|
|
8700
|
-
if (!first2(lvl, "start")) result.startWasOmitted = true;
|
|
8701
|
-
const paragraphStyleId = getW(first2(lvl, "pStyle"), "val");
|
|
8702
|
-
if (paragraphStyleId) result.paragraphStyleId = paragraphStyleId;
|
|
8703
|
-
if (jc === "left" || jc === "center" || jc === "right") result.lvlJc = jc;
|
|
8704
|
-
const left = getW(ind, "left") ?? getW(ind, "start");
|
|
8705
|
-
if (left !== void 0) result.indentLeftTwips = parseSignedTwips(left) ?? signedTwips(0);
|
|
8706
|
-
const hanging = getW(ind, "hanging");
|
|
8707
|
-
if (hanging !== void 0) result.hangingTwips = parseTwips(hanging) ?? twips(0);
|
|
8708
|
-
const firstLine = getW(ind, "firstLine");
|
|
8709
|
-
if (firstLine !== void 0) result.firstLineTwips = parseTwips(firstLine) ?? twips(0);
|
|
8710
|
-
const tabs = first2(first2(lvl, "pPr"), "tabs");
|
|
8711
|
-
const tab = tabs ? children2(tabs, "tab").find((stop) => getW(stop, "val") !== "clear") : void 0;
|
|
8712
|
-
const tabPos = tab ? parseTwips(getW(tab, "pos")) : void 0;
|
|
8713
|
-
if (tabPos !== void 0) result.tabStopTwips = tabPos;
|
|
8714
|
-
if (flag(first2(lvl, "isLgl"))) result.isLgl = true;
|
|
8715
|
-
const restart = getW(first2(lvl, "lvlRestart"), "val");
|
|
8716
|
-
if (restart !== void 0) result.lvlRestart = integer2(restart, 0);
|
|
8717
|
-
const marker = parseMarkerFormat(first2(lvl, "rPr"));
|
|
8718
|
-
if (marker) result.markerFormat = marker;
|
|
8719
|
-
result.suffix = suffRaw === "space" ? "space" : suffRaw === "nothing" ? "none" : "tab";
|
|
8720
|
-
return result;
|
|
8721
|
-
}
|
|
8722
|
-
function parseAbstractNum(element) {
|
|
8723
|
-
const id = getW(element, "abstractNumId");
|
|
8724
|
-
if (!id) return void 0;
|
|
8725
|
-
const levels = {};
|
|
8726
|
-
for (const lvl of children2(element, "lvl")) {
|
|
8727
|
-
const parsed = parseNumberingLevel(lvl);
|
|
8728
|
-
levels[parsed.level] = parsed;
|
|
8729
|
-
}
|
|
8730
|
-
return { id, levels };
|
|
8731
|
-
}
|
|
8732
|
-
function parseNum(element) {
|
|
8733
|
-
const id = getW(element, "numId");
|
|
8734
|
-
if (!id) return void 0;
|
|
8735
|
-
const abstractNumId = getW(first2(element, "abstractNumId"), "val") ?? "";
|
|
8736
|
-
const levelOverrides = {};
|
|
8737
|
-
for (const override of children2(element, "lvlOverride")) {
|
|
8738
|
-
const level = integer2(getW(override, "ilvl"), 0);
|
|
8739
|
-
const entry = {};
|
|
8740
|
-
const startOverride = getW(first2(override, "startOverride"), "val");
|
|
8741
|
-
if (startOverride !== void 0) entry.startOverride = integer2(startOverride, 1);
|
|
8742
|
-
const lvl = first2(override, "lvl");
|
|
8743
|
-
if (lvl) entry.lvl = parseNumberingLevel(lvl);
|
|
8744
|
-
if (Object.keys(entry).length) levelOverrides[level] = entry;
|
|
8745
|
-
}
|
|
8746
|
-
return {
|
|
8747
|
-
id,
|
|
8748
|
-
abstractNumId,
|
|
8749
|
-
...Object.keys(levelOverrides).length ? { levelOverrides } : {}
|
|
8750
|
-
};
|
|
8751
|
-
}
|
|
8752
|
-
function parseNumberingCatalog(xml) {
|
|
8753
|
-
const document = parseXml2(xml);
|
|
8754
|
-
const root = document.documentElement;
|
|
8755
|
-
const abstractNums = {};
|
|
8756
|
-
const warnings = [];
|
|
8757
|
-
for (const element of byName(root, "abstractNum")) {
|
|
8758
|
-
const parsed = parseAbstractNum(element);
|
|
8759
|
-
if (!parsed) continue;
|
|
8760
|
-
abstractNums[parsed.id] = parsed;
|
|
8761
|
-
const link = getW(first2(element, "numStyleLink"), "val");
|
|
8762
|
-
if (link)
|
|
8763
|
-
warnings.push(
|
|
8764
|
-
`Numbering definition abstractNum ${parsed.id} links to style "${link}"; style-linked numbering levels are not resolved.`
|
|
8765
|
-
);
|
|
8766
|
-
if (byName(element, "lvlPicBulletId").length)
|
|
8767
|
-
warnings.push(
|
|
8768
|
-
`Numbering definition abstractNum ${parsed.id} uses a picture bullet; picture bullets are not rendered.`
|
|
8769
|
-
);
|
|
8770
|
-
}
|
|
8771
|
-
const nums = {};
|
|
8772
|
-
for (const element of byName(root, "num")) {
|
|
8773
|
-
const parsed = parseNum(element);
|
|
8774
|
-
if (parsed) nums[parsed.id] = parsed;
|
|
8775
|
-
}
|
|
8776
|
-
return { abstractNums, nums, warnings: [...new Set(warnings)] };
|
|
8777
|
-
}
|
|
8778
|
-
function resolveNumberingLevel(catalog, numId, level) {
|
|
8779
|
-
const num = catalog.nums[numId];
|
|
8780
|
-
if (!num) return void 0;
|
|
8781
|
-
const override = num.levelOverrides?.[level];
|
|
8782
|
-
const sourceAbstract = catalog.abstractNums[num.abstractNumId]?.levels[level];
|
|
8783
|
-
const abstract = sourceAbstract?.startWasOmitted && sourceAbstract.start === 1 ? { ...sourceAbstract, start: 0 } : sourceAbstract;
|
|
8784
|
-
let base = override?.lvl ?? abstract;
|
|
8785
|
-
if (!base) return void 0;
|
|
8786
|
-
if (override?.lvl) {
|
|
8787
|
-
const { lvlRestart: _ignored, ...properties } = base;
|
|
8788
|
-
base = {
|
|
8789
|
-
...properties,
|
|
8790
|
-
...abstract?.lvlRestart !== void 0 ? { lvlRestart: abstract.lvlRestart } : {}
|
|
8791
|
-
};
|
|
8792
|
-
}
|
|
8793
|
-
let start = override?.startOverride ?? base.start;
|
|
8794
|
-
if (override?.lvl) {
|
|
8795
|
-
if (abstract?.lvlRestart === 0 && override.startOverride === void 0) start = abstract.start;
|
|
8796
|
-
else if (!override.lvl.startWasOmitted || override.lvl.start !== 1) start = override.lvl.start;
|
|
8797
|
-
else start = override.startOverride ?? 0;
|
|
8798
|
-
}
|
|
8799
|
-
return start !== base.start ? { ...base, start } : base;
|
|
8800
|
-
}
|
|
8801
|
-
|
|
8802
8999
|
// docx/comments.ts
|
|
8803
9000
|
var W14_NS2 = "http://schemas.microsoft.com/office/word/2010/wordml";
|
|
8804
9001
|
var W15_NS2 = "http://schemas.microsoft.com/office/word/2012/wordml";
|
|
@@ -9033,7 +9230,7 @@ async function readPackage(input) {
|
|
|
9033
9230
|
const themeFile = zip.file("word/theme/theme1.xml");
|
|
9034
9231
|
const settingsFile = zip.file("word/settings.xml");
|
|
9035
9232
|
if (themeFile) {
|
|
9036
|
-
model.theme =
|
|
9233
|
+
model.theme = parseTheme2(await themeFile.async("string"));
|
|
9037
9234
|
if (settingsFile) {
|
|
9038
9235
|
const settingsXml = await settingsFile.async("string");
|
|
9039
9236
|
model.theme.colorMapping = withParseWarnings(
|
|
@@ -9151,32 +9348,12 @@ async function loadDocx(input) {
|
|
|
9151
9348
|
}
|
|
9152
9349
|
|
|
9153
9350
|
// docx/diagram-theme.ts
|
|
9154
|
-
var DEFAULT_MAPPING2 = {
|
|
9155
|
-
bg1: "lt1",
|
|
9156
|
-
tx1: "dk1",
|
|
9157
|
-
bg2: "lt2",
|
|
9158
|
-
tx2: "dk2"
|
|
9159
|
-
};
|
|
9160
|
-
var SLOTS = /* @__PURE__ */ new Set([
|
|
9161
|
-
"dk1",
|
|
9162
|
-
"lt1",
|
|
9163
|
-
"dk2",
|
|
9164
|
-
"lt2",
|
|
9165
|
-
"accent1",
|
|
9166
|
-
"accent2",
|
|
9167
|
-
"accent3",
|
|
9168
|
-
"accent4",
|
|
9169
|
-
"accent5",
|
|
9170
|
-
"accent6",
|
|
9171
|
-
"hlink",
|
|
9172
|
-
"folHlink"
|
|
9173
|
-
]);
|
|
9174
9351
|
function diagramColorTheme(theme) {
|
|
9175
9352
|
return {
|
|
9176
9353
|
scheme(name) {
|
|
9177
9354
|
if (!theme) return void 0;
|
|
9178
|
-
const
|
|
9179
|
-
const hex =
|
|
9355
|
+
const slot2 = themeColorSlotFor(name, theme.colorMapping);
|
|
9356
|
+
const hex = slot2 ? theme.colors[slot2] : void 0;
|
|
9180
9357
|
return hex ? `#${hex.replace(/^#/, "").toUpperCase()}` : void 0;
|
|
9181
9358
|
}
|
|
9182
9359
|
};
|
|
@@ -10628,4 +10805,4 @@ function presetOf(values) {
|
|
|
10628
10805
|
});
|
|
10629
10806
|
}
|
|
10630
10807
|
|
|
10631
|
-
export { DEFAULT_STYLES_XML, DEFAULT_TABLE_BORDERS, DEFAULT_TOC_INSTRUCTION, DIAGRAM_GRAPHIC_URI, DocxModelValidationError, EMPTY_FIGURES_TEXT, EMPTY_TOC_TEXT, EMU_PER_INCH, EMU_PER_PIXEL, EMU_PER_POINT, LIGATURE_VALUES, PAGE_SIZES, PAGE_SIZE_OPTIONS, PIXELS_PER_INCH, PROPERTY_FIELDS, ST_AlgClass, ST_AlgType, ST_AnnotationVMerge, ST_Border, ST_BrClear, ST_BrType, ST_CalendarType, ST_CaptionPos, ST_ChapterSep, ST_CharacterSpacing, ST_CombineBrackets, ST_ConformanceClass, ST_CryptProv, ST_Direction, ST_DisplacedByCustomXml, ST_DocGrid, ST_DocPartBehavior, ST_DocPartGallery, ST_DocPartType, ST_DocProtect, ST_DropCap, ST_EdGrp, ST_EdnPos, ST_Em, ST_FFTextType, ST_FldCharType, ST_FontFamily, ST_FrameLayout, ST_FrameScrollbar, ST_FtnEdn, ST_FtnPos, ST_HAnchor, ST_HdrFtr, ST_HeightRule, ST_HexColorAuto, ST_HighlightColor, ST_Hint, ST_InfoTextType, ST_Jc, ST_JcTable, ST_LevelSuffix, ST_LineNumberRestart, ST_LineSpacingRule, ST_Lock, ST_MailMergeDest, ST_MailMergeDocType, ST_MailMergeOdsoFMDFieldType, ST_MailMergeSourceType, ST_Merge, ST_MultiLevelType, ST_NumberFormat, ST_ObjectDrawAspect, ST_ObjectUpdateMode, ST_OnOff1, ST_PTabAlignment, ST_PTabLeader, ST_PTabRelativeTo, ST_PageBorderDisplay, ST_PageBorderOffset, ST_PageBorderZOrder, ST_PageOrientation, ST_Pitch, ST_Proof, ST_ProofErr, ST_RelFromH, ST_RelFromV, ST_RestartNumber, ST_RubyAlign, ST_SchemeColorVal, ST_SdtDateMappingType, ST_SectionMark, ST_Shd, ST_StyleSort, ST_StyleType, ST_TabJc, ST_TabTlc, ST_TargetScreenSz, ST_TblLayoutType, ST_TblOverlap, ST_TblStyleOverrideType, ST_TblWidth, ST_TextAlignment, ST_TextDirection, ST_TextEffect, ST_TextboxTightWrap, ST_Theme, ST_ThemeColor, ST_TrueFalse, ST_TrueFalseBlank, ST_Underline, ST_VAnchor, ST_VerticalAlignRun, ST_VerticalJc, ST_View, ST_WmlColorSchemeIndex, ST_Wrap, ST_XAlign, ST_YAlign, ST_Zoom, TWIPS_PER_INCH, TWIPS_PER_POINT, WORD, WORD_HIGHLIGHT_TOKENS, WORD_UNDERLINE_TOKENS, acceptAllRevisions, acceptRevision, alignFromJustification, applyPageSetup, applyThemeShade, applyThemeTint, assertValidDocumentModel, buildTableOfContents, captionParagraphs, changeColumnGap, changeColumnWidth, columnPreset, columnTextWidth, computeListLabels, createDocument, createListDefinition, dateFieldResult, datePicture, defaultStyleCatalogs, diagramColorTheme, diagramsIn, displayListLabel, documentStats, eighthPoints, eighthPointsFromPoints, eighthPointsToPoints, emu, emuFromPixels, emuToPixels, ensureListDefinition, enumValue, equalColumnDraft, fieldName, findRevision, findTableOfContents, formatListNumber, formatNoteNumber, formatWordDate, halfPoints, halfPointsFromPoints, halfPointsToPoints, headingLevel, headingListLevels, isCaptionOf, isHeadingListKind, isLigatures, isRunHiddenForReview, isStAlgClass, isStAlgType, isStAnnotationVMerge, isStBorder, isStBrClear, isStBrType, isStCalendarType, isStCaptionPos, isStChapterSep, isStCharacterSpacing, isStCombineBrackets, isStConformanceClass, isStCryptProv, isStDirection, isStDisplacedByCustomXml, isStDocGrid, isStDocPartBehavior, isStDocPartGallery, isStDocPartType, isStDocProtect, isStDropCap, isStEdGrp, isStEdnPos, isStEm, isStFFTextType, isStFldCharType, isStFontFamily, isStFrameLayout, isStFrameScrollbar, isStFtnEdn, isStFtnPos, isStHAnchor, isStHdrFtr, isStHeightRule, isStHexColorAuto, isStHighlightColor, isStHint, isStInfoTextType, isStJc, isStJcTable, isStLevelSuffix, isStLineNumberRestart, isStLineSpacingRule, isStLock, isStMailMergeDest, isStMailMergeDocType, isStMailMergeOdsoFMDFieldType, isStMailMergeSourceType, isStMerge, isStMultiLevelType, isStNumberFormat, isStObjectDrawAspect, isStObjectUpdateMode, isStOnOff1, isStPTabAlignment, isStPTabLeader, isStPTabRelativeTo, isStPageBorderDisplay, isStPageBorderOffset, isStPageBorderZOrder, isStPageOrientation, isStPitch, isStProof, isStProofErr, isStRelFromH, isStRelFromV, isStRestartNumber, isStRubyAlign, isStSchemeColorVal, isStSdtDateMappingType, isStSectionMark, isStShd, isStStyleSort, isStStyleType, isStTabJc, isStTabTlc, isStTargetScreenSz, isStTblLayoutType, isStTblOverlap, isStTblStyleOverrideType, isStTblWidth, isStTextAlignment, isStTextDirection, isStTextEffect, isStTextboxTightWrap, isStTheme, isStThemeColor, isStTrueFalse, isStTrueFalseBlank, isStUnderline, isStVAnchor, isStVerticalAlignRun, isStVerticalJc, isStView, isStWmlColorSchemeIndex, isStWrap, isStXAlign, isStYAlign, isStZoom, isThemeColorToken, isValidLanguageTag, isWordHighlightToken, isWordUnderlineStyle, lineSpacingLabel, lineSpacingOptions, lineSpacingValue, linkStylesToList, listRevisions, loadDocx, numberNotesInOrder, onOffAttribute, onOffElement, pageSizeOf, paragraphTwipsFromAttrs, parseColorSchemeMapping, parseEighthPoints, parseHalfPoints, parseHexColor, parseInteger, parseJustification, parseLineSpacingValue, parseNumberingCatalog, parseOnOff, parseParagraphStyleCatalog, parseRgbColor, parseRunStyleCatalog, parseSignedHalfPoints, parseSignedTwips, parseTableStyleCatalog, parseTextScale, parseTheme, parseTintShade, parseTwips, parseUnsignedInteger, plainText2 as plainText, presetOf, readColumnDraft, readPageSetup, rejectAllRevisions, rejectRevision, reportParseWarning, resolveCellVisuals, resolveDiagramColor, resolveNumberingLevel, resolveParagraphFormatting, resolveParagraphNumbering, resolveRunFormatting, resolveStyleNumbering, resolveTableStyleFormatting, resolveThemeColorReference, resolveThemeColorToken, reviewDocumentFormatting, reviewFormattingWarnings, reviewParagraphFormatting, reviewRunFormatting, roundEighthPoints, roundEmu, roundHalfPoints, roundSignedTwips, roundTwips, saveDocx, sectionLayoutJson, sectionsFromLayout, sectionsOf, setColumns, setLineNumbering, setMargins, setOrientation, setPageNumbering, setPageSize, setTitlePage, setVerticalAlign, signedTwips, signedTwipsAttr, signedTwipsFromPixels, signedTwipsFromPoints, tableOfFiguresInstruction, tocBookmarks, tocCaptionLabel, tocEntries, tocHyperlinks, tocLevels, transformCase, twips, twipsAttr, twipsFromInches, twipsFromPixels, twipsFromPoints, twipsToInches, twipsToPixels, twipsToPoints, unequalColumnPreset, universalMeasureToTwips, updateTableOfContents, validColumnDraft, validateDocumentModel, validatePageSetup, withParseWarnings, withSection, withTocBookmarks };
|
|
10808
|
+
export { DEFAULT_STYLES_XML, DEFAULT_TABLE_BORDERS, DEFAULT_TOC_INSTRUCTION, DIAGRAM_GRAPHIC_URI, DocxModelValidationError, EMPTY_FIGURES_TEXT, EMPTY_TOC_TEXT, EMU_PER_INCH, EMU_PER_PIXEL, EMU_PER_POINT, LIGATURE_VALUES, PAGE_SIZES, PAGE_SIZE_OPTIONS, PIXELS_PER_INCH, PROPERTY_FIELDS, ST_AlgClass, ST_AlgType, ST_AnnotationVMerge, ST_Border, ST_BrClear, ST_BrType, ST_CalendarType, ST_CaptionPos, ST_ChapterSep, ST_CharacterSpacing, ST_CombineBrackets, ST_ConformanceClass, ST_CryptProv, ST_Direction, ST_DisplacedByCustomXml, ST_DocGrid, ST_DocPartBehavior, ST_DocPartGallery, ST_DocPartType, ST_DocProtect, ST_DropCap, ST_EdGrp, ST_EdnPos, ST_Em, ST_FFTextType, ST_FldCharType, ST_FontFamily, ST_FrameLayout, ST_FrameScrollbar, ST_FtnEdn, ST_FtnPos, ST_HAnchor, ST_HdrFtr, ST_HeightRule, ST_HexColorAuto, ST_HighlightColor, ST_Hint, ST_InfoTextType, ST_Jc, ST_JcTable, ST_LevelSuffix, ST_LineNumberRestart, ST_LineSpacingRule, ST_Lock, ST_MailMergeDest, ST_MailMergeDocType, ST_MailMergeOdsoFMDFieldType, ST_MailMergeSourceType, ST_Merge, ST_MultiLevelType, ST_NumberFormat, ST_ObjectDrawAspect, ST_ObjectUpdateMode, ST_OnOff1, ST_PTabAlignment, ST_PTabLeader, ST_PTabRelativeTo, ST_PageBorderDisplay, ST_PageBorderOffset, ST_PageBorderZOrder, ST_PageOrientation, ST_Pitch, ST_Proof, ST_ProofErr, ST_RelFromH, ST_RelFromV, ST_RestartNumber, ST_RubyAlign, ST_SchemeColorVal, ST_SdtDateMappingType, ST_SectionMark, ST_Shd, ST_StyleSort, ST_StyleType, ST_TabJc, ST_TabTlc, ST_TargetScreenSz, ST_TblLayoutType, ST_TblOverlap, ST_TblStyleOverrideType, ST_TblWidth, ST_TextAlignment, ST_TextDirection, ST_TextEffect, ST_TextboxTightWrap, ST_Theme, ST_ThemeColor, ST_TrueFalse, ST_TrueFalseBlank, ST_Underline, ST_VAnchor, ST_VerticalAlignRun, ST_VerticalJc, ST_View, ST_WmlColorSchemeIndex, ST_Wrap, ST_XAlign, ST_YAlign, ST_Zoom, TWIPS_PER_INCH, TWIPS_PER_POINT, WORD, WORD_HIGHLIGHT_TOKENS, WORD_UNDERLINE_TOKENS, acceptAllRevisions, acceptRevision, alignFromJustification, applyPageSetup, applyThemeShade, applyThemeTint, assertValidDocumentModel, buildTableOfContents, captionParagraphs, changeColumnGap, changeColumnWidth, columnPreset, columnTextWidth, computeListLabels, createDocument, createListDefinition, dateFieldResult, datePicture, defaultStyleCatalogs, diagramColorTheme, diagramsIn, displayListLabel, documentStats, eighthPoints, eighthPointsFromPoints, eighthPointsToPoints, emu, emuFromPixels, emuToPixels, ensureListDefinition, enumValue, equalColumnDraft, fieldName, findRevision, findTableOfContents, formatListNumber, formatNoteNumber, formatWordDate, halfPoints, halfPointsFromPoints, halfPointsToPoints, headingLevel, headingListLevels, isCaptionOf, isFieldLocked, isHeadingListKind, isLigatures, isRunHiddenForReview, isStAlgClass, isStAlgType, isStAnnotationVMerge, isStBorder, isStBrClear, isStBrType, isStCalendarType, isStCaptionPos, isStChapterSep, isStCharacterSpacing, isStCombineBrackets, isStConformanceClass, isStCryptProv, isStDirection, isStDisplacedByCustomXml, isStDocGrid, isStDocPartBehavior, isStDocPartGallery, isStDocPartType, isStDocProtect, isStDropCap, isStEdGrp, isStEdnPos, isStEm, isStFFTextType, isStFldCharType, isStFontFamily, isStFrameLayout, isStFrameScrollbar, isStFtnEdn, isStFtnPos, isStHAnchor, isStHdrFtr, isStHeightRule, isStHexColorAuto, isStHighlightColor, isStHint, isStInfoTextType, isStJc, isStJcTable, isStLevelSuffix, isStLineNumberRestart, isStLineSpacingRule, isStLock, isStMailMergeDest, isStMailMergeDocType, isStMailMergeOdsoFMDFieldType, isStMailMergeSourceType, isStMerge, isStMultiLevelType, isStNumberFormat, isStObjectDrawAspect, isStObjectUpdateMode, isStOnOff1, isStPTabAlignment, isStPTabLeader, isStPTabRelativeTo, isStPageBorderDisplay, isStPageBorderOffset, isStPageBorderZOrder, isStPageOrientation, isStPitch, isStProof, isStProofErr, isStRelFromH, isStRelFromV, isStRestartNumber, isStRubyAlign, isStSchemeColorVal, isStSdtDateMappingType, isStSectionMark, isStShd, isStStyleSort, isStStyleType, isStTabJc, isStTabTlc, isStTargetScreenSz, isStTblLayoutType, isStTblOverlap, isStTblStyleOverrideType, isStTblWidth, isStTextAlignment, isStTextDirection, isStTextEffect, isStTextboxTightWrap, isStTheme, isStThemeColor, isStTrueFalse, isStTrueFalseBlank, isStUnderline, isStVAnchor, isStVerticalAlignRun, isStVerticalJc, isStView, isStWmlColorSchemeIndex, isStWrap, isStXAlign, isStYAlign, isStZoom, isThemeColorToken, isValidLanguageTag, isWordHighlightToken, isWordUnderlineStyle, lineSpacingLabel, lineSpacingOptions, lineSpacingValue, linkStylesToList, listRevisions, loadDocx, numberNotesInOrder, onOffAttribute, onOffElement, pageSizeOf, paragraphTwipsFromAttrs, parseColorSchemeMapping, parseEighthPoints, parseHalfPoints, parseHexColor, parseInteger, parseJustification, parseLineSpacingValue, parseNumberingCatalog, parseOnOff, parseParagraphStyleCatalog, parseRgbColor, parseRunStyleCatalog, parseSignedHalfPoints, parseSignedTwips, parseTableStyleCatalog, parseTextScale, parseTheme2 as parseTheme, parseTintShade, parseTwips, parseUnsignedInteger, plainText2 as plainText, presetOf, readColumnDraft, readPageSetup, rejectAllRevisions, rejectRevision, reportParseWarning, resolveCellVisuals, resolveDiagramColor, resolveNumberingLevel, resolveParagraphFormatting, resolveParagraphNumbering, resolveRunFormatting, resolveStyleNumbering, resolveTableStyleFormatting, resolveThemeColorReference, resolveThemeColorToken, reviewDocumentFormatting, reviewFormattingWarnings, reviewParagraphFormatting, reviewRunFormatting, roundEighthPoints, roundEmu, roundHalfPoints, roundSignedTwips, roundTwips, saveDocx, sectionLayoutJson, sectionsFromLayout, sectionsOf, setColumns, setLineNumbering, setListStartOverride, setMargins, setOrientation, setPageNumbering, setPageSize, setTitlePage, setVerticalAlign, signedTwips, signedTwipsAttr, signedTwipsFromPixels, signedTwipsFromPoints, tableOfFiguresInstruction, tocBookmarks, tocCaptionLabel, tocEntries, tocHyperlinks, tocLevels, transformCase, twips, twipsAttr, twipsFromInches, twipsFromPixels, twipsFromPoints, twipsToInches, twipsToPixels, twipsToPoints, unequalColumnPreset, universalMeasureToTwips, updateTableOfContents, validColumnDraft, validateDocumentModel, validatePageSetup, withParseWarnings, withSection, withTocBookmarks };
|