@deckflow/deckuse-pptx 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/LICENSE +662 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/adapter.d.ts +70 -3
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +519 -86
- package/dist/adapter.js.map +1 -1
- package/dist/addressing.d.ts +45 -0
- package/dist/addressing.d.ts.map +1 -0
- package/dist/addressing.js +401 -0
- package/dist/addressing.js.map +1 -0
- package/dist/chart-classify.d.ts +10 -0
- package/dist/chart-classify.d.ts.map +1 -0
- package/dist/chart-classify.js +54 -0
- package/dist/chart-classify.js.map +1 -0
- package/dist/chart.d.ts +33 -0
- package/dist/chart.d.ts.map +1 -0
- package/dist/chart.js +492 -0
- package/dist/chart.js.map +1 -0
- package/dist/edition.d.ts +20 -0
- package/dist/edition.d.ts.map +1 -0
- package/dist/edition.js +46 -0
- package/dist/edition.js.map +1 -0
- package/dist/elements.d.ts.map +1 -1
- package/dist/elements.js +61 -46
- package/dist/elements.js.map +1 -1
- package/dist/hyperlink.d.ts +7 -0
- package/dist/hyperlink.d.ts.map +1 -0
- package/dist/hyperlink.js +83 -0
- package/dist/hyperlink.js.map +1 -0
- package/dist/index-sync.d.ts +7 -0
- package/dist/index-sync.d.ts.map +1 -0
- package/dist/index-sync.js +24 -0
- package/dist/index-sync.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/indexer.d.ts +4 -0
- package/dist/indexer.d.ts.map +1 -1
- package/dist/indexer.js +105 -27
- package/dist/indexer.js.map +1 -1
- package/dist/media.d.ts +15 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +141 -0
- package/dist/media.js.map +1 -0
- package/dist/mutations.d.ts +8 -2
- package/dist/mutations.d.ts.map +1 -1
- package/dist/mutations.js +695 -72
- package/dist/mutations.js.map +1 -1
- package/dist/picture.d.ts.map +1 -1
- package/dist/picture.js +1 -3
- package/dist/picture.js.map +1 -1
- package/dist/properties.d.ts +6 -1
- package/dist/properties.d.ts.map +1 -1
- package/dist/properties.js +159 -10
- package/dist/properties.js.map +1 -1
- package/dist/resolve-properties.d.ts +17 -0
- package/dist/resolve-properties.d.ts.map +1 -0
- package/dist/resolve-properties.js +545 -0
- package/dist/resolve-properties.js.map +1 -0
- package/dist/slides.d.ts +3 -1
- package/dist/slides.d.ts.map +1 -1
- package/dist/slides.js +77 -4
- package/dist/slides.js.map +1 -1
- package/dist/table.d.ts +15 -0
- package/dist/table.d.ts.map +1 -0
- package/dist/table.js +456 -0
- package/dist/table.js.map +1 -0
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/workspace.d.ts +9 -9
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +67 -47
- package/dist/workspace.js.map +1 -1
- package/dist/xml.d.ts +7 -0
- package/dist/xml.d.ts.map +1 -1
- package/dist/xml.js +86 -13
- package/dist/xml.js.map +1 -1
- package/package.json +11 -3
package/dist/elements.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"elements.d.ts","sourceRoot":"","sources":["../src/elements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAY,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"elements.d.ts","sourceRoot":"","sources":["../src/elements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAY,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAyHxD,wBAAsB,UAAU,CAC9B,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,QAAQ,EACb,MAAM,EAAE,OAAO,EACf,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACzB,OAAO,CAAC,OAAO,CAAC,CAgBlB;AACD,eAAO,MAAM,gBAAgB,GAAI,KAAK,QAAQ,EAAE,MAAM,OAAO,KAAG,OAK/D,CAAC;AACF,wBAAgB,WAAW,CACzB,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAKvB;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAQxE"}
|
package/dist/elements.js
CHANGED
|
@@ -1,18 +1,44 @@
|
|
|
1
1
|
import { OpcArchive, parseXml } from '@deckflow/deckuse-opc';
|
|
2
|
+
import { applyChartProperties, chartGraphicFrameXml, createChartPart, } from './chart.js';
|
|
3
|
+
import { addMediaPart, mediaPicXml } from './media.js';
|
|
2
4
|
import { addPicturePart } from './picture.js';
|
|
3
|
-
import { NS, REL, allocateShapeIds, attr, descendants,
|
|
5
|
+
import { NS, REL, allocateShapeIds, attr, descendants, nextShapeId, } from './xml.js';
|
|
4
6
|
const esc = (value) => value.replaceAll('&', '&').replaceAll('"', '"').replaceAll('<', '<');
|
|
5
7
|
const value = (obj, key, fallback) => typeof obj[key] === 'string' ? obj[key] : fallback;
|
|
6
8
|
const num = (obj, key, fallback) => typeof obj[key] === 'number' ? obj[key] : fallback;
|
|
7
9
|
const xfrm = (e) => `<a:xfrm><a:off x="${String(num(e, 'x', 0))}" y="${String(num(e, 'y', 0))}"/><a:ext cx="${String(num(e, 'width', 914400))}" cy="${String(num(e, 'height', 914400))}"/></a:xfrm>`;
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
+
/** graphicFrame uses PresentationML p:xfrm (not DrawingML a:xfrm). */
|
|
11
|
+
const graphicFrameXfrm = (e) => `<p:xfrm><a:off x="${String(num(e, 'x', 0))}" y="${String(num(e, 'y', 0))}"/><a:ext cx="${String(num(e, 'width', 914400))}" cy="${String(num(e, 'height', 914400))}"/></p:xfrm>`;
|
|
12
|
+
const textBody = (text) => {
|
|
13
|
+
const lines = text.split('\n');
|
|
14
|
+
return `<p:txBody><a:bodyPr/><a:lstStyle/>${lines
|
|
15
|
+
.map((line) => `<a:p><a:r><a:t>${esc(line)}</a:t></a:r></a:p>`)
|
|
16
|
+
.join('')}</p:txBody>`;
|
|
17
|
+
};
|
|
18
|
+
const nvPrXml = (e) => {
|
|
19
|
+
const role = typeof e['role'] === 'string' ? e['role'] : undefined;
|
|
20
|
+
if (!role)
|
|
21
|
+
return '<p:nvPr/>';
|
|
22
|
+
const idx = typeof e['placeholderIdx'] === 'string' ? e['placeholderIdx'] : undefined;
|
|
23
|
+
const idxAttr = idx !== undefined ? ` idx="${esc(idx)}"` : '';
|
|
24
|
+
return `<p:nvPr><p:ph type="${esc(role)}"${idxAttr}/></p:nvPr>`;
|
|
25
|
+
};
|
|
26
|
+
const shapeXml = (id, e) => `<p:sp xmlns:p="${NS.p}" xmlns:a="${NS.a}"><p:nvSpPr><p:cNvPr id="${String(id)}" name="${esc(value(e, 'name', `Shape ${String(id)}`))}"/><p:cNvSpPr txBox="1"/>${nvPrXml(e)}</p:nvSpPr><p:spPr>${xfrm(e)}<a:prstGeom prst="${esc(value(e, 'preset', 'rect'))}"><a:avLst/></a:prstGeom></p:spPr>${textBody(value(e, 'text', ''))}</p:sp>`;
|
|
10
27
|
const connectorXml = (id, e) => `<p:cxnSp xmlns:p="${NS.p}" xmlns:a="${NS.a}"><p:nvCxnSpPr><p:cNvPr id="${String(id)}" name="${esc(value(e, 'name', `Connector ${String(id)}`))}"/><p:cNvCxnSpPr/><p:nvPr/></p:nvCxnSpPr><p:spPr>${xfrm(e)}<a:prstGeom prst="line"><a:avLst/></a:prstGeom></p:spPr></p:cxnSp>`;
|
|
11
28
|
const groupXml = (id, e) => `<p:grpSp xmlns:p="${NS.p}" xmlns:a="${NS.a}"><p:nvGrpSpPr><p:cNvPr id="${String(id)}" name="${esc(value(e, 'name', `Group ${String(id)}`))}"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="${String(num(e, 'x', 0))}" y="${String(num(e, 'y', 0))}"/><a:ext cx="${String(num(e, 'width', 914400))}" cy="${String(num(e, 'height', 914400))}"/><a:chOff x="0" y="0"/><a:chExt cx="${String(num(e, 'width', 914400))}" cy="${String(num(e, 'height', 914400))}"/></a:xfrm></p:grpSpPr></p:grpSp>`;
|
|
12
29
|
const tableXml = (id, e) => {
|
|
13
30
|
const rows = Array.isArray(e['rows']) ? e['rows'] : [['']];
|
|
14
31
|
const cols = Math.max(1, ...rows.map((r) => r.length));
|
|
15
|
-
|
|
32
|
+
const colW = String(Math.floor(num(e, 'width', 914400 * cols) / cols));
|
|
33
|
+
const cellXml = (text, header) => {
|
|
34
|
+
const fill = header ? '1B4F72' : 'FFFFFF';
|
|
35
|
+
const color = header ? 'FFFFFF' : '1A1A1A';
|
|
36
|
+
const bold = header ? ' b="1"' : '';
|
|
37
|
+
// tcPr child order per OOXML: lnL/lnR/lnT/lnB … then EG_FillProperties (not a generic a:ln).
|
|
38
|
+
const border = (side) => `<a:${side} w="6350"><a:solidFill><a:srgbClr val="D0D0D0"/></a:solidFill></a:${side}>`;
|
|
39
|
+
return `<a:tc><a:txBody><a:bodyPr/><a:lstStyle/><a:p><a:pPr algn="ctr"/><a:r><a:rPr lang="zh-CN" sz="1100"${bold}><a:solidFill><a:srgbClr val="${color}"/></a:solidFill></a:rPr><a:t>${esc(text)}</a:t></a:r></a:p></a:txBody><a:tcPr>${border('lnL')}${border('lnR')}${border('lnT')}${border('lnB')}<a:solidFill><a:srgbClr val="${fill}"/></a:solidFill></a:tcPr></a:tc>`;
|
|
40
|
+
};
|
|
41
|
+
return `<p:graphicFrame xmlns:p="${NS.p}" xmlns:a="${NS.a}"><p:nvGraphicFramePr><p:cNvPr id="${String(id)}" name="${esc(value(e, 'name', `Table ${String(id)}`))}"/><p:cNvGraphicFramePr/><p:nvPr/></p:nvGraphicFramePr>${graphicFrameXfrm(e)}<a:graphic><a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/table"><a:tbl><a:tblPr firstRow="1"/><a:tblGrid>${Array.from({ length: cols }, () => `<a:gridCol w="${colW}"/>`).join('')}</a:tblGrid>${rows.map((row, rowIndex) => `<a:tr h="370840">${Array.from({ length: cols }, (_, i) => cellXml(typeof row[i] === 'string' ? row[i] : '', rowIndex === 0)).join('')}</a:tr>`).join('')}</a:tbl></a:graphicData></a:graphic></p:graphicFrame>`;
|
|
16
42
|
};
|
|
17
43
|
async function pictureXml(archive, slidePart, id, e) {
|
|
18
44
|
const added = await addPicturePart(archive, slidePart, {
|
|
@@ -24,6 +50,29 @@ async function pictureXml(archive, slidePart, id, e) {
|
|
|
24
50
|
const rid = added.value.rid;
|
|
25
51
|
return `<p:pic xmlns:p="${NS.p}" xmlns:a="${NS.a}" xmlns:r="${NS.r}"><p:nvPicPr><p:cNvPr id="${String(id)}" name="${esc(value(e, 'name', `Picture ${String(id)}`))}"/><p:cNvPicPr><a:picLocks noChangeAspect="1"/></p:cNvPicPr><p:nvPr/></p:nvPicPr><p:blipFill><a:blip r:embed="${rid}"/><a:stretch><a:fillRect/></a:stretch></p:blipFill><p:spPr>${xfrm(e)}<a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr></p:pic>`;
|
|
26
52
|
}
|
|
53
|
+
function chartXml(archive, slidePart, id, e) {
|
|
54
|
+
const chartType = value(e, 'chartType', 'column');
|
|
55
|
+
const data = (e['data'] ?? {});
|
|
56
|
+
const series = Array.isArray(data.series) ? data.series : [];
|
|
57
|
+
if (series.length === 0)
|
|
58
|
+
throw new Error('Chart requires data.series with at least one series');
|
|
59
|
+
const created = createChartPart(archive, slidePart, {
|
|
60
|
+
chartType,
|
|
61
|
+
...(typeof data.title === 'string' ? { title: data.title } : {}),
|
|
62
|
+
categories: Array.isArray(data.categories) ? data.categories : [],
|
|
63
|
+
series,
|
|
64
|
+
});
|
|
65
|
+
return chartGraphicFrameXml(id, created.rid, e);
|
|
66
|
+
}
|
|
67
|
+
async function avMediaXml(archive, slidePart, id, e, kind) {
|
|
68
|
+
const path = typeof e['path'] === 'string' ? e['path'] : undefined;
|
|
69
|
+
if (!path)
|
|
70
|
+
throw new Error(`${kind} requires path`);
|
|
71
|
+
const added = await addMediaPart(archive, slidePart, { path, kind });
|
|
72
|
+
if (!added.ok)
|
|
73
|
+
throw new Error(added.error.message);
|
|
74
|
+
return mediaPicXml(id, e, kind, added.value.fileRid, added.value.mediaRid, added.value.posterRid);
|
|
75
|
+
}
|
|
27
76
|
export async function addElement(archive, slidePart, doc, parent, e) {
|
|
28
77
|
const kind = value(e, 'kind', value(e, 'type', 'textbox')), id = nextShapeId(doc);
|
|
29
78
|
let xml;
|
|
@@ -35,6 +84,12 @@ export async function addElement(archive, slidePart, doc, parent, e) {
|
|
|
35
84
|
xml = tableXml(id, e);
|
|
36
85
|
else if (kind === 'picture')
|
|
37
86
|
xml = await pictureXml(archive, slidePart, id, e);
|
|
87
|
+
else if (kind === 'chart')
|
|
88
|
+
xml = chartXml(archive, slidePart, id, e);
|
|
89
|
+
else if (kind === 'video')
|
|
90
|
+
xml = await avMediaXml(archive, slidePart, id, e, 'video');
|
|
91
|
+
else if (kind === 'audio')
|
|
92
|
+
xml = await avMediaXml(archive, slidePart, id, e, 'audio');
|
|
38
93
|
else
|
|
39
94
|
xml = shapeXml(id, e);
|
|
40
95
|
const node = parseXml(xml).documentElement, imported = doc.importNode(node, true);
|
|
@@ -49,48 +104,8 @@ export const duplicateElement = (doc, node) => {
|
|
|
49
104
|
};
|
|
50
105
|
export function updateChart(archive, part, properties) {
|
|
51
106
|
const chart = archive.readXml(part);
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
(() => {
|
|
55
|
-
if (!chart.documentElement)
|
|
56
|
-
throw new Error('Chart XML has no root');
|
|
57
|
-
return chart.documentElement;
|
|
58
|
-
})(), properties['title']);
|
|
59
|
-
const series = properties['series'];
|
|
60
|
-
if (Array.isArray(series))
|
|
61
|
-
series.forEach((input, index) => {
|
|
62
|
-
if (typeof input !== 'object' || input === null)
|
|
63
|
-
return;
|
|
64
|
-
const spec = input, node = descendants(chart, 'ser')[index];
|
|
65
|
-
if (!node)
|
|
66
|
-
return;
|
|
67
|
-
if (typeof spec['name'] === 'string') {
|
|
68
|
-
const tx = first(node, 'tx');
|
|
69
|
-
if (tx) {
|
|
70
|
-
const v = first(tx, 'v');
|
|
71
|
-
if (v)
|
|
72
|
-
v.textContent = spec['name'];
|
|
73
|
-
else
|
|
74
|
-
setNodeText(tx, spec['name']);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
if (Array.isArray(spec['values'])) {
|
|
78
|
-
const values = spec['values'];
|
|
79
|
-
const cache = first(first(node, 'val') ?? node, 'numCache');
|
|
80
|
-
if (cache) {
|
|
81
|
-
const points = descendants(cache, 'pt');
|
|
82
|
-
values.forEach((entry, i) => {
|
|
83
|
-
const v = first(points[i] ?? cache, 'v');
|
|
84
|
-
if (v)
|
|
85
|
-
v.textContent = String(entry);
|
|
86
|
-
});
|
|
87
|
-
const count = first(cache, 'ptCount');
|
|
88
|
-
if (count)
|
|
89
|
-
count.setAttribute('val', String(values.length));
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
archive.writeXml(part, chart, archive.getPart(part)?.mediaType);
|
|
107
|
+
applyChartProperties(chart, properties);
|
|
108
|
+
archive.writeXml(part, chart);
|
|
94
109
|
return { workbook: archive.getRelationships(part).some((r) => r.type === REL.package) };
|
|
95
110
|
}
|
|
96
111
|
export function setColor(node, from, to) {
|
package/dist/elements.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"elements.js","sourceRoot":"","sources":["../src/elements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EACL,EAAE,EACF,GAAG,EACH,gBAAgB,EAChB,IAAI,EACJ,WAAW,EACX,
|
|
1
|
+
{"version":3,"file":"elements.js","sourceRoot":"","sources":["../src/elements.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { OpcArchive } from '@deckflow/deckuse-opc';
|
|
2
|
+
import type { Element } from '@xmldom/xmldom';
|
|
3
|
+
/** Read the external hyperlink URL on a shape/picture `cNvPr`, if any. */
|
|
4
|
+
export declare const readHyperlink: (archive: OpcArchive, slidePart: string, node: Element) => string | null;
|
|
5
|
+
/** Set or clear an external click hyperlink on a shape/picture. Pass null/empty to clear. */
|
|
6
|
+
export declare function setHyperlink(archive: OpcArchive, slidePart: string, node: Element, url: string | null): void;
|
|
7
|
+
//# sourceMappingURL=hyperlink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hyperlink.d.ts","sourceRoot":"","sources":["../src/hyperlink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,uBAAuB,CAAC;AACzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAa9C,0EAA0E;AAC1E,eAAO,MAAM,aAAa,GAAI,SAAS,UAAU,EAAE,WAAW,MAAM,EAAE,MAAM,OAAO,KAAG,MAAM,GAAG,IAS9F,CAAC;AAyBF,6FAA6F;AAC7F,wBAAgB,YAAY,CAC1B,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,MAAM,GAAG,IAAI,GACjB,IAAI,CAmCN"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { NS, REL, attr, children, cNvPr, first } from './xml.js';
|
|
2
|
+
const nextRelId = (rels) => {
|
|
3
|
+
const used = new Set(rels.map((r) => r.id));
|
|
4
|
+
let n = 1;
|
|
5
|
+
while (used.has(`rId${String(n)}`))
|
|
6
|
+
n++;
|
|
7
|
+
return `rId${String(n)}`;
|
|
8
|
+
};
|
|
9
|
+
const hlinkRidOf = (hlink) => hlink.getAttributeNS(NS.r, 'id') ?? attr(hlink, 'r:id');
|
|
10
|
+
/** Read the external hyperlink URL on a shape/picture `cNvPr`, if any. */
|
|
11
|
+
export const readHyperlink = (archive, slidePart, node) => {
|
|
12
|
+
const pr = cNvPr(node);
|
|
13
|
+
if (!pr)
|
|
14
|
+
return null;
|
|
15
|
+
const hlink = children(pr).find((c) => c.localName === 'hlinkClick') ?? first(pr, 'hlinkClick');
|
|
16
|
+
if (!hlink)
|
|
17
|
+
return null;
|
|
18
|
+
const rid = hlinkRidOf(hlink);
|
|
19
|
+
if (!rid)
|
|
20
|
+
return null;
|
|
21
|
+
const rel = archive.getRelationships(slidePart).find((r) => r.id === rid);
|
|
22
|
+
return rel?.target ?? null;
|
|
23
|
+
};
|
|
24
|
+
const removeHlinkClicks = (pr) => {
|
|
25
|
+
const removed = [];
|
|
26
|
+
for (const child of [...children(pr)]) {
|
|
27
|
+
if (child.localName !== 'hlinkClick')
|
|
28
|
+
continue;
|
|
29
|
+
const rid = hlinkRidOf(child);
|
|
30
|
+
if (rid)
|
|
31
|
+
removed.push(rid);
|
|
32
|
+
pr.removeChild(child);
|
|
33
|
+
}
|
|
34
|
+
return removed;
|
|
35
|
+
};
|
|
36
|
+
const ridStillUsedInDoc = (root, rid, except) => {
|
|
37
|
+
const walk = (node) => {
|
|
38
|
+
if (node !== except) {
|
|
39
|
+
const embed = node.getAttributeNS(NS.r, 'id') ?? attr(node, 'r:id');
|
|
40
|
+
if (embed === rid)
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
for (const child of children(node))
|
|
44
|
+
if (walk(child))
|
|
45
|
+
return true;
|
|
46
|
+
return false;
|
|
47
|
+
};
|
|
48
|
+
return walk(root);
|
|
49
|
+
};
|
|
50
|
+
/** Set or clear an external click hyperlink on a shape/picture. Pass null/empty to clear. */
|
|
51
|
+
export function setHyperlink(archive, slidePart, node, url) {
|
|
52
|
+
const pr = cNvPr(node);
|
|
53
|
+
if (!pr)
|
|
54
|
+
throw new Error('Element has no cNvPr for hyperlink');
|
|
55
|
+
const doc = node.ownerDocument;
|
|
56
|
+
if (!doc?.documentElement)
|
|
57
|
+
throw new Error('Element has no document');
|
|
58
|
+
const removedRids = removeHlinkClicks(pr);
|
|
59
|
+
let rels = [...archive.getRelationships(slidePart)];
|
|
60
|
+
for (const rid of removedRids) {
|
|
61
|
+
const rel = rels.find((r) => r.id === rid);
|
|
62
|
+
if (rel?.type === REL.hyperlink &&
|
|
63
|
+
rel.external &&
|
|
64
|
+
!ridStillUsedInDoc(doc.documentElement, rid))
|
|
65
|
+
rels = rels.filter((r) => r.id !== rid);
|
|
66
|
+
}
|
|
67
|
+
if (url === null || url === '') {
|
|
68
|
+
archive.setRelationships(slidePart, rels);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const rid = nextRelId(rels);
|
|
72
|
+
rels.push({
|
|
73
|
+
id: rid,
|
|
74
|
+
type: REL.hyperlink,
|
|
75
|
+
target: url,
|
|
76
|
+
external: true,
|
|
77
|
+
});
|
|
78
|
+
archive.setRelationships(slidePart, rels);
|
|
79
|
+
const hlink = doc.createElementNS(NS.a, 'a:hlinkClick');
|
|
80
|
+
hlink.setAttributeNS(NS.r, 'r:id', rid);
|
|
81
|
+
pr.appendChild(hlink);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=hyperlink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hyperlink.js","sourceRoot":"","sources":["../src/hyperlink.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { WorkspaceManifest } from '@deckflow/deckuse-core';
|
|
2
|
+
import type { OpcArchive } from '@deckflow/deckuse-opc';
|
|
3
|
+
import type { IndexFile } from './types.js';
|
|
4
|
+
export declare function loadIndex(workspace: string, archive: OpcArchive, manifest: WorkspaceManifest, options?: {
|
|
5
|
+
persist?: boolean;
|
|
6
|
+
}): Promise<IndexFile>;
|
|
7
|
+
//# sourceMappingURL=index-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-sync.d.ts","sourceRoot":"","sources":["../src/index-sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAIxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9B,OAAO,CAAC,SAAS,CAAC,CAepB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { writeMetadata } from '@deckflow/deckuse-workspace';
|
|
3
|
+
import { buildIndex } from './indexer.js';
|
|
4
|
+
import { readIndex } from './workspace.js';
|
|
5
|
+
export async function loadIndex(workspace, archive, manifest, options) {
|
|
6
|
+
const root = resolve(workspace);
|
|
7
|
+
let index;
|
|
8
|
+
try {
|
|
9
|
+
index = await readIndex(root);
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
index = buildIndex(archive, manifest.workspaceId, manifest.revision);
|
|
13
|
+
if (options?.persist)
|
|
14
|
+
await writeMetadata(root, manifest, index);
|
|
15
|
+
return index;
|
|
16
|
+
}
|
|
17
|
+
if (index.revision !== manifest.revision) {
|
|
18
|
+
index = buildIndex(archive, manifest.workspaceId, manifest.revision);
|
|
19
|
+
if (options?.persist)
|
|
20
|
+
await writeMetadata(root, manifest, index);
|
|
21
|
+
}
|
|
22
|
+
return index;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=index-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-sync.js","sourceRoot":"","sources":["../src/index-sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,SAAiB,EACjB,OAAmB,EACnB,QAA2B,EAC3B,OAA+B;IAE/B,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,IAAI,KAAgB,CAAC;IACrB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACrE,IAAI,OAAO,EAAE,OAAO;YAAE,MAAM,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACjE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACzC,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACrE,IAAI,OAAO,EAAE,OAAO;YAAE,MAAM,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export { pptxAdapter, pptxCapabilities } from './adapter.js';
|
|
2
2
|
export { buildIndex } from './indexer.js';
|
|
3
|
+
export { EDITION, EDITION_VARIANT, DISTRIBUTION_CHANNEL, editionMetadata, } from './edition.js';
|
|
4
|
+
export { classifyChartDocument, classifyChartPart } from './chart-classify.js';
|
|
3
5
|
export type { IndexedElement, IndexFile, ElementKind } from './types.js';
|
|
4
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EACL,OAAO,EACP,eAAe,EACf,oBAAoB,EACpB,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export { pptxAdapter, pptxCapabilities } from './adapter.js';
|
|
2
2
|
export { buildIndex } from './indexer.js';
|
|
3
|
+
export { EDITION, EDITION_VARIANT, DISTRIBUTION_CHANNEL, editionMetadata, } from './edition.js';
|
|
4
|
+
export { classifyChartDocument, classifyChartPart } from './chart-classify.js';
|
|
3
5
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EACL,OAAO,EACP,eAAe,EACf,oBAAoB,EACpB,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/indexer.d.ts
CHANGED
|
@@ -2,6 +2,10 @@ import type { ElementRef } from '@deckflow/deckuse-core';
|
|
|
2
2
|
import type { OpcArchive } from '@deckflow/deckuse-opc';
|
|
3
3
|
import type { IndexFile, IndexedElement } from './types.js';
|
|
4
4
|
export declare function buildIndex(archive: OpcArchive, documentId: string, rev: string): IndexFile;
|
|
5
|
+
export declare const slidePageMap: (index: IndexFile) => Map<string, number>;
|
|
6
|
+
export declare const slidesForItem: (index: IndexFile, item: IndexedElement) => number[];
|
|
7
|
+
export declare const slidesForRef: (index: IndexFile, ref: ElementRef) => number[];
|
|
8
|
+
export declare const mergeSlides: (...groups: number[][]) => number[];
|
|
5
9
|
export declare const findIndexed: (index: IndexFile, ref: ElementRef) => IndexedElement | undefined;
|
|
6
10
|
export declare function matchesSelector(item: IndexedElement, selector: string | {
|
|
7
11
|
kind?: string | undefined;
|
package/dist/indexer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,KAAK,EAAe,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAuDzE,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAkM1F;AACD,eAAO,MAAM,YAAY,GAAI,OAAO,SAAS,KAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAUjE,CAAC;AACF,eAAO,MAAM,aAAa,GAAI,OAAO,SAAS,EAAE,MAAM,cAAc,KAAG,MAAM,EAW5E,CAAC;AACF,eAAO,MAAM,YAAY,GAAI,OAAO,SAAS,EAAE,KAAK,UAAU,KAAG,MAAM,EAGtE,CAAC;AACF,eAAO,MAAM,WAAW,GAAI,GAAG,QAAQ,MAAM,EAAE,EAAE,KAAG,MAAM,EACP,CAAC;AACpD,eAAO,MAAM,WAAW,GAAI,OAAO,SAAS,EAAE,KAAK,UAAU,KAAG,cAAc,GAAG,SACS,CAAC;AAC3F,wBAAgB,eAAe,CAC7B,IAAI,EAAE,cAAc,EACpB,QAAQ,EACJ,MAAM,GACN;IACE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;CACxC,GACJ,OAAO,CAkDT"}
|
package/dist/indexer.js
CHANGED
|
@@ -1,21 +1,39 @@
|
|
|
1
1
|
import { basename } from 'node:path';
|
|
2
|
+
import { readSeriesColor } from './chart.js';
|
|
2
3
|
import { mediaHref } from './workspace.js';
|
|
3
4
|
import { NS, REL, attr, cNvPr, children, descendants, first, root, textOf } from './xml.js';
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
: 'shape'
|
|
8
|
-
|
|
9
|
-
? 'picture'
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
5
|
+
const directChild = (node, localName) => children(node).find((child) => child.localName === localName);
|
|
6
|
+
const classify = (node) => {
|
|
7
|
+
if (node.localName === 'sp')
|
|
8
|
+
return first(node, 'txBody') ? 'textbox' : 'shape';
|
|
9
|
+
if (node.localName === 'pic')
|
|
10
|
+
return first(node, 'videoFile') ? 'video' : first(node, 'audioFile') ? 'audio' : 'picture';
|
|
11
|
+
if (node.localName === 'cxnSp')
|
|
12
|
+
return 'connector';
|
|
13
|
+
if (node.localName === 'grpSp')
|
|
14
|
+
return 'group';
|
|
15
|
+
if (node.localName === 'graphicFrame') {
|
|
16
|
+
if (first(node, 'tbl'))
|
|
17
|
+
return 'table';
|
|
18
|
+
if (first(node, 'chart'))
|
|
19
|
+
return 'chart';
|
|
20
|
+
}
|
|
21
|
+
return undefined;
|
|
22
|
+
};
|
|
23
|
+
const readPlaceholder = (node) => {
|
|
24
|
+
const nv = directChild(node, 'nvSpPr') ??
|
|
25
|
+
directChild(node, 'nvPicPr') ??
|
|
26
|
+
directChild(node, 'nvCxnSpPr') ??
|
|
27
|
+
directChild(node, 'nvGraphicFramePr') ??
|
|
28
|
+
directChild(node, 'nvGrpSpPr');
|
|
29
|
+
const nvPr = nv ? directChild(nv, 'nvPr') : undefined;
|
|
30
|
+
const ph = nvPr ? directChild(nvPr, 'ph') : undefined;
|
|
31
|
+
if (!ph)
|
|
32
|
+
return undefined;
|
|
33
|
+
const type = attr(ph, 'type') ?? 'body';
|
|
34
|
+
const idx = attr(ph, 'idx');
|
|
35
|
+
return { type, ...(idx !== undefined ? { idx } : {}) };
|
|
36
|
+
};
|
|
19
37
|
const transformOf = (node) => {
|
|
20
38
|
const x = first(node, 'xfrm');
|
|
21
39
|
if (!x)
|
|
@@ -66,6 +84,17 @@ export function buildIndex(archive, documentId, rev) {
|
|
|
66
84
|
continue;
|
|
67
85
|
}
|
|
68
86
|
const own = attr(cNvPr(child), 'id') ?? child.nodeName, id = `${slideId}:${[...ancestors, own].join('.')}`, transform = transformOf(child), name = attr(cNvPr(child), 'name'), text = textOf(child);
|
|
87
|
+
const ph = readPlaceholder(child);
|
|
88
|
+
const placeholderType = ph?.type;
|
|
89
|
+
const placeholderIdx = ph?.idx;
|
|
90
|
+
const pr = cNvPr(child);
|
|
91
|
+
const hlink = pr
|
|
92
|
+
? children(pr).find((c) => c.localName === 'hlinkClick')
|
|
93
|
+
: undefined;
|
|
94
|
+
const hlinkRid = hlink?.getAttributeNS(NS.r, 'id') ?? (hlink ? attr(hlink, 'r:id') : undefined);
|
|
95
|
+
const hlinkRel = hlinkRid
|
|
96
|
+
? archive.getRelationships(partUri).find((r) => r.id === hlinkRid)
|
|
97
|
+
: undefined;
|
|
69
98
|
const indexed = {
|
|
70
99
|
ref: { documentId, elementId: id, path: `${partUri}#${id}`, revision: rev },
|
|
71
100
|
kind,
|
|
@@ -77,6 +106,13 @@ export function buildIndex(archive, documentId, rev) {
|
|
|
77
106
|
...(text ? { text } : {}),
|
|
78
107
|
...(transform ? { transform } : {}),
|
|
79
108
|
};
|
|
109
|
+
if (placeholderType || hlinkRel) {
|
|
110
|
+
indexed.payload = {
|
|
111
|
+
...(placeholderType ? { placeholder: placeholderType } : {}),
|
|
112
|
+
...(placeholderIdx !== undefined ? { placeholderIdx } : {}),
|
|
113
|
+
...(hlinkRel ? { hyperlink: hlinkRel.target } : {}),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
80
116
|
elements.push(indexed);
|
|
81
117
|
if (kind === 'table') {
|
|
82
118
|
const rows = descendants(child, 'tr');
|
|
@@ -99,20 +135,25 @@ export function buildIndex(archive, documentId, rev) {
|
|
|
99
135
|
}));
|
|
100
136
|
});
|
|
101
137
|
}
|
|
102
|
-
if (kind === 'picture') {
|
|
138
|
+
if (kind === 'picture' || kind === 'video' || kind === 'audio') {
|
|
103
139
|
const blip = first(child, 'blip');
|
|
104
140
|
const embed = blip?.getAttributeNS(NS.r, 'embed') ?? attr(blip, 'r:embed');
|
|
105
141
|
const link = blip?.getAttributeNS(NS.r, 'link') ?? attr(blip, 'r:link');
|
|
106
|
-
const
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
:
|
|
142
|
+
const video = first(child, 'videoFile');
|
|
143
|
+
const audio = first(child, 'audioFile');
|
|
144
|
+
const mediaLink = (video ?? audio)?.getAttributeNS(NS.r, 'link') ??
|
|
145
|
+
attr(video ?? audio, 'r:link') ??
|
|
146
|
+
undefined;
|
|
147
|
+
const rid = mediaLink ?? embed ?? link;
|
|
148
|
+
const rel = rid ? archive.getRelationships(partUri).find((r) => r.id === rid) : undefined;
|
|
110
149
|
if (rel) {
|
|
111
150
|
const mediaPart = rel.resolvedTarget ?? rel.target;
|
|
112
|
-
const external = Boolean(rel.external || (!embed && link));
|
|
151
|
+
const external = Boolean(rel.external || (!embed && link && !mediaLink));
|
|
113
152
|
indexed.payload = {
|
|
153
|
+
...(indexed.payload ?? {}),
|
|
114
154
|
mediaPart,
|
|
115
155
|
href: external ? rel.target : mediaHref(documentId, mediaPart),
|
|
156
|
+
...(kind !== 'picture' ? { mediaKind: kind } : {}),
|
|
116
157
|
...(external ? { external: true } : {}),
|
|
117
158
|
...(!external && rel.resolvedTarget
|
|
118
159
|
? {
|
|
@@ -129,20 +170,27 @@ export function buildIndex(archive, documentId, rev) {
|
|
|
129
170
|
if (cr?.resolvedTarget) {
|
|
130
171
|
const chart = archive.readXml(cr.resolvedTarget);
|
|
131
172
|
indexed.payload = {
|
|
173
|
+
...(indexed.payload ?? {}),
|
|
132
174
|
chartPart: cr.resolvedTarget,
|
|
133
175
|
title: textOf(first(chart, 'title') ?? chart),
|
|
134
|
-
series: descendants(chart, 'ser').map((ser) =>
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
176
|
+
series: descendants(chart, 'ser').map((ser) => {
|
|
177
|
+
const color = readSeriesColor(ser);
|
|
178
|
+
return {
|
|
179
|
+
name: first(first(ser, 'tx') ?? ser, 'v')?.textContent ??
|
|
180
|
+
textOf(first(ser, 'tx') ?? ser),
|
|
181
|
+
values: descendants(first(ser, 'val') ?? ser, 'v').map((v) => v.textContent ?? ''),
|
|
182
|
+
...(color ? { color } : {}),
|
|
183
|
+
};
|
|
184
|
+
}),
|
|
139
185
|
embeddedWorkbook: archive
|
|
140
186
|
.getRelationships(cr.resolvedTarget)
|
|
141
187
|
.some((r) => r.type === REL.package),
|
|
142
188
|
};
|
|
143
189
|
}
|
|
144
190
|
}
|
|
145
|
-
|
|
191
|
+
// Only groups nest addressable descendants; table cells are indexed above.
|
|
192
|
+
if (kind === 'group')
|
|
193
|
+
walk(child, [...ancestors, own], id);
|
|
146
194
|
}
|
|
147
195
|
};
|
|
148
196
|
walk(root(doc), [], `slide:${slideId}`);
|
|
@@ -186,6 +234,36 @@ export function buildIndex(archive, documentId, rev) {
|
|
|
186
234
|
}
|
|
187
235
|
return { revision: rev, elements };
|
|
188
236
|
}
|
|
237
|
+
export const slidePageMap = (index) => {
|
|
238
|
+
const map = new Map();
|
|
239
|
+
let page = 1;
|
|
240
|
+
for (const item of index.elements) {
|
|
241
|
+
if (item.kind !== 'slide')
|
|
242
|
+
continue;
|
|
243
|
+
map.set(item.partUri, page);
|
|
244
|
+
if (item.slideId)
|
|
245
|
+
map.set(item.slideId, page);
|
|
246
|
+
page += 1;
|
|
247
|
+
}
|
|
248
|
+
return map;
|
|
249
|
+
};
|
|
250
|
+
export const slidesForItem = (index, item) => {
|
|
251
|
+
const pages = slidePageMap(index);
|
|
252
|
+
if (item.kind === 'slide') {
|
|
253
|
+
const page = pages.get(item.partUri) ?? (item.slideId ? pages.get(item.slideId) : undefined);
|
|
254
|
+
return page ? [page] : [];
|
|
255
|
+
}
|
|
256
|
+
if (item.slideId) {
|
|
257
|
+
const page = pages.get(item.slideId);
|
|
258
|
+
return page ? [page] : [];
|
|
259
|
+
}
|
|
260
|
+
return [];
|
|
261
|
+
};
|
|
262
|
+
export const slidesForRef = (index, ref) => {
|
|
263
|
+
const item = findIndexed(index, ref);
|
|
264
|
+
return item ? slidesForItem(index, item) : [];
|
|
265
|
+
};
|
|
266
|
+
export const mergeSlides = (...groups) => [...new Set(groups.flat())].sort((a, b) => a - b);
|
|
189
267
|
export const findIndexed = (index, ref) => index.elements.find((e) => e.ref.elementId === ref.elementId || e.ref.path === ref.path);
|
|
190
268
|
export function matchesSelector(item, selector) {
|
|
191
269
|
if (typeof selector === 'string' && (selector === '*' || selector === 'all'))
|