@bendyline/squisq-formats 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -10
- package/dist/{chunk-ULLIPBEJ.js → chunk-743COJWQ.js} +6 -2
- package/dist/chunk-743COJWQ.js.map +1 -0
- package/dist/{chunk-KAK4V57E.js → chunk-BHHEDPRB.js} +16 -112
- package/dist/chunk-BHHEDPRB.js.map +1 -0
- package/dist/{chunk-MQHCXI56.js → chunk-CLGUOVYR.js} +193 -23
- package/dist/chunk-CLGUOVYR.js.map +1 -0
- package/dist/chunk-FIFCQN3W.js +630 -0
- package/dist/chunk-FIFCQN3W.js.map +1 -0
- package/dist/chunk-KJ4NS4DX.js +120 -0
- package/dist/chunk-KJ4NS4DX.js.map +1 -0
- package/dist/{chunk-TBPD5PCU.js → chunk-S3Y7H2BK.js} +161 -11
- package/dist/chunk-S3Y7H2BK.js.map +1 -0
- package/dist/docx/export.d.ts +15 -0
- package/dist/docx/export.d.ts.map +1 -1
- package/dist/docx/export.js +144 -19
- package/dist/docx/export.js.map +1 -1
- package/dist/docx/import.d.ts +13 -0
- package/dist/docx/import.d.ts.map +1 -1
- package/dist/docx/import.js +102 -10
- package/dist/docx/import.js.map +1 -1
- package/dist/docx/index.d.ts +1 -1
- package/dist/docx/index.d.ts.map +1 -1
- package/dist/docx/index.js +1 -1
- package/dist/docx/index.js.map +1 -1
- package/dist/html/htmlTemplate.d.ts +6 -0
- package/dist/html/htmlTemplate.d.ts.map +1 -1
- package/dist/html/htmlTemplate.js +5 -1
- package/dist/html/htmlTemplate.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/ooxml/index.d.ts +1 -1
- package/dist/ooxml/index.d.ts.map +1 -1
- package/dist/ooxml/index.js +1 -1
- package/dist/ooxml/index.js.map +1 -1
- package/dist/ooxml/namespaces.d.ts +10 -0
- package/dist/ooxml/namespaces.d.ts.map +1 -1
- package/dist/ooxml/namespaces.js +10 -0
- package/dist/ooxml/namespaces.js.map +1 -1
- package/dist/pdf/export.d.ts +6 -0
- package/dist/pdf/export.d.ts.map +1 -1
- package/dist/pdf/export.js +37 -9
- package/dist/pdf/export.js.map +1 -1
- package/dist/pdf/import.d.ts +16 -0
- package/dist/pdf/import.d.ts.map +1 -1
- package/dist/pdf/import.js +177 -0
- package/dist/pdf/import.js.map +1 -1
- package/dist/pdf/index.d.ts +1 -1
- package/dist/pdf/index.d.ts.map +1 -1
- package/dist/pdf/index.js +1 -1
- package/dist/pdf/index.js.map +1 -1
- package/dist/pptx/export.d.ts +75 -0
- package/dist/pptx/export.d.ts.map +1 -0
- package/dist/pptx/export.js +722 -0
- package/dist/pptx/export.js.map +1 -0
- package/dist/pptx/index.d.ts +12 -27
- package/dist/pptx/index.d.ts.map +1 -1
- package/dist/pptx/index.js +12 -22
- package/dist/pptx/index.js.map +1 -1
- package/dist/pptx/styles.d.ts +54 -0
- package/dist/pptx/styles.d.ts.map +1 -0
- package/dist/pptx/styles.js +73 -0
- package/dist/pptx/styles.js.map +1 -0
- package/dist/pptx/templates.d.ts +24 -0
- package/dist/pptx/templates.d.ts.map +1 -0
- package/dist/pptx/templates.js +158 -0
- package/dist/pptx/templates.js.map +1 -0
- package/package.json +2 -2
- package/src/docx/export.ts +183 -20
- package/src/docx/import.ts +127 -10
- package/src/docx/index.ts +1 -1
- package/src/html/htmlTemplate.ts +13 -0
- package/src/index.ts +2 -2
- package/src/ooxml/index.ts +7 -0
- package/src/ooxml/namespaces.ts +23 -0
- package/src/pdf/export.ts +57 -9
- package/src/pdf/import.ts +228 -0
- package/src/pdf/index.ts +1 -1
- package/src/pptx/export.ts +1041 -0
- package/src/pptx/index.ts +15 -37
- package/src/pptx/styles.ts +96 -0
- package/src/pptx/templates.ts +187 -0
- package/dist/chunk-532L4D5D.js +0 -21
- package/dist/chunk-532L4D5D.js.map +0 -1
- package/dist/chunk-KAK4V57E.js.map +0 -1
- package/dist/chunk-MQHCXI56.js.map +0 -1
- package/dist/chunk-TBPD5PCU.js.map +0 -1
- package/dist/chunk-ULLIPBEJ.js.map +0 -1
package/src/pptx/index.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @bendyline/squisq-formats PPTX Module
|
|
2
|
+
* @bendyline/squisq-formats PPTX Module
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* PowerPoint .pptx export support using PresentationML (`<p:presentation>`,
|
|
5
|
+
* `<p:sld>`) via the shared ooxml/ infrastructure.
|
|
6
|
+
*
|
|
7
|
+
* Slide segmentation: each H1/H2 heading starts a new slide by default.
|
|
8
|
+
* Inline formatting (bold, italic, code, links) is preserved as DrawingML runs.
|
|
9
|
+
*
|
|
10
|
+
* Import is not yet implemented.
|
|
7
11
|
*
|
|
8
12
|
* @example
|
|
9
13
|
* ```ts
|
|
@@ -11,19 +15,14 @@
|
|
|
11
15
|
* ```
|
|
12
16
|
*/
|
|
13
17
|
|
|
18
|
+
// Export
|
|
19
|
+
export { markdownDocToPptx, docToPptx } from './export.js';
|
|
20
|
+
export type { PptxExportOptions } from './export.js';
|
|
21
|
+
|
|
22
|
+
// Import (stubs — not yet implemented)
|
|
14
23
|
import type { MarkdownDocument } from '@bendyline/squisq/markdown';
|
|
15
24
|
import type { Doc } from '@bendyline/squisq/schemas';
|
|
16
25
|
|
|
17
|
-
/**
|
|
18
|
-
* Options for PPTX export (placeholder).
|
|
19
|
-
*/
|
|
20
|
-
export interface PptxExportOptions {
|
|
21
|
-
/** Presentation title */
|
|
22
|
-
title?: string;
|
|
23
|
-
/** Presentation author */
|
|
24
|
-
author?: string;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
26
|
/**
|
|
28
27
|
* Options for PPTX import (placeholder).
|
|
29
28
|
*/
|
|
@@ -32,31 +31,10 @@ export interface PptxImportOptions {
|
|
|
32
31
|
extractImages?: boolean;
|
|
33
32
|
}
|
|
34
33
|
|
|
35
|
-
/**
|
|
36
|
-
* Convert a MarkdownDocument to a .pptx Blob.
|
|
37
|
-
*
|
|
38
|
-
* @throws Error — PPTX support is not yet implemented
|
|
39
|
-
*/
|
|
40
|
-
export async function markdownDocToPptx(
|
|
41
|
-
_doc: MarkdownDocument,
|
|
42
|
-
_options?: PptxExportOptions,
|
|
43
|
-
): Promise<Blob> {
|
|
44
|
-
throw new Error('PPTX export is not yet implemented');
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Convert a squisq Doc to a .pptx Blob.
|
|
49
|
-
*
|
|
50
|
-
* @throws Error — PPTX support is not yet implemented
|
|
51
|
-
*/
|
|
52
|
-
export async function docToPptx(_doc: Doc, _options?: PptxExportOptions): Promise<Blob> {
|
|
53
|
-
throw new Error('PPTX export is not yet implemented');
|
|
54
|
-
}
|
|
55
|
-
|
|
56
34
|
/**
|
|
57
35
|
* Convert a .pptx file to a MarkdownDocument.
|
|
58
36
|
*
|
|
59
|
-
* @throws Error — PPTX
|
|
37
|
+
* @throws Error — PPTX import is not yet implemented
|
|
60
38
|
*/
|
|
61
39
|
export async function pptxToMarkdownDoc(
|
|
62
40
|
_data: ArrayBuffer | Blob,
|
|
@@ -68,7 +46,7 @@ export async function pptxToMarkdownDoc(
|
|
|
68
46
|
/**
|
|
69
47
|
* Convert a .pptx file to a squisq Doc.
|
|
70
48
|
*
|
|
71
|
-
* @throws Error — PPTX
|
|
49
|
+
* @throws Error — PPTX import is not yet implemented
|
|
72
50
|
*/
|
|
73
51
|
export async function pptxToDoc(
|
|
74
52
|
_data: ArrayBuffer | Blob,
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PPTX Constants & Style Definitions
|
|
3
|
+
*
|
|
4
|
+
* Shared constants for PPTX export: slide dimensions, text box positioning,
|
|
5
|
+
* font sizes, and unit conversion helpers. All dimensions are in EMU
|
|
6
|
+
* (English Metric Units) unless otherwise noted.
|
|
7
|
+
*
|
|
8
|
+
* 1 inch = 914400 EMU
|
|
9
|
+
* 1 point = 12700 EMU
|
|
10
|
+
* Font sizes in PPTX are in hundredths of a point (centi-points).
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
// ============================================
|
|
14
|
+
// Slide Dimensions (EMU)
|
|
15
|
+
// ============================================
|
|
16
|
+
|
|
17
|
+
/** Widescreen slide width: 10 inches */
|
|
18
|
+
export const SLIDE_WIDTH = 9144000;
|
|
19
|
+
|
|
20
|
+
/** Widescreen slide height: 7.5 inches */
|
|
21
|
+
export const SLIDE_HEIGHT = 6858000;
|
|
22
|
+
|
|
23
|
+
// ============================================
|
|
24
|
+
// Title Shape Positioning (EMU)
|
|
25
|
+
// ============================================
|
|
26
|
+
|
|
27
|
+
/** Title shape left offset: 0.5 inches */
|
|
28
|
+
export const TITLE_LEFT = 457200;
|
|
29
|
+
|
|
30
|
+
/** Title shape top offset: 0.3 inches */
|
|
31
|
+
export const TITLE_TOP = 274638;
|
|
32
|
+
|
|
33
|
+
/** Title shape width: 9 inches */
|
|
34
|
+
export const TITLE_WIDTH = 8229600;
|
|
35
|
+
|
|
36
|
+
/** Title shape height: 1.25 inches */
|
|
37
|
+
export const TITLE_HEIGHT = 1143000;
|
|
38
|
+
|
|
39
|
+
// ============================================
|
|
40
|
+
// Body Shape Positioning (EMU)
|
|
41
|
+
// ============================================
|
|
42
|
+
|
|
43
|
+
/** Body shape left offset: 0.5 inches */
|
|
44
|
+
export const BODY_LEFT = 457200;
|
|
45
|
+
|
|
46
|
+
/** Body shape top offset: 1.75 inches */
|
|
47
|
+
export const BODY_TOP = 1600200;
|
|
48
|
+
|
|
49
|
+
/** Body shape width: 9 inches */
|
|
50
|
+
export const BODY_WIDTH = 8229600;
|
|
51
|
+
|
|
52
|
+
/** Body shape height: 4.95 inches */
|
|
53
|
+
export const BODY_HEIGHT = 4525963;
|
|
54
|
+
|
|
55
|
+
// ============================================
|
|
56
|
+
// Default Fonts & Sizes
|
|
57
|
+
// ============================================
|
|
58
|
+
|
|
59
|
+
/** Default font for body text */
|
|
60
|
+
export const DEFAULT_FONT = 'Calibri';
|
|
61
|
+
|
|
62
|
+
/** Default font for titles */
|
|
63
|
+
export const DEFAULT_TITLE_FONT = 'Calibri Light';
|
|
64
|
+
|
|
65
|
+
/** Default font for code blocks */
|
|
66
|
+
export const DEFAULT_CODE_FONT = 'Consolas';
|
|
67
|
+
|
|
68
|
+
/** Default title font size in centi-points (44pt) */
|
|
69
|
+
export const DEFAULT_TITLE_SIZE = 4400;
|
|
70
|
+
|
|
71
|
+
/** Default body font size in centi-points (18pt) */
|
|
72
|
+
export const DEFAULT_BODY_SIZE = 1800;
|
|
73
|
+
|
|
74
|
+
/** Default code font size in centi-points (14pt) */
|
|
75
|
+
export const DEFAULT_CODE_SIZE = 1400;
|
|
76
|
+
|
|
77
|
+
/** Hyperlink color (standard blue) */
|
|
78
|
+
export const HYPERLINK_COLOR = '0563C1';
|
|
79
|
+
|
|
80
|
+
// ============================================
|
|
81
|
+
// Unit Helpers
|
|
82
|
+
// ============================================
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Convert inches to EMUs.
|
|
86
|
+
*/
|
|
87
|
+
export function inchesToEmu(inches: number): number {
|
|
88
|
+
return Math.round(inches * 914400);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Convert points to centi-points (PPTX font size unit).
|
|
93
|
+
*/
|
|
94
|
+
export function pointsToCentiPoints(points: number): number {
|
|
95
|
+
return Math.round(points * 100);
|
|
96
|
+
}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PPTX Boilerplate Templates
|
|
3
|
+
*
|
|
4
|
+
* Minimal but valid XML templates for the required PPTX support parts:
|
|
5
|
+
* slide master, slide layout, and theme. These are semi-static — they
|
|
6
|
+
* don't change per-document but are required for PowerPoint to open the file.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { xmlDeclaration } from '../ooxml/xmlUtils.js';
|
|
10
|
+
import { NS_PML, NS_DRAWINGML, NS_R } from '../ooxml/namespaces.js';
|
|
11
|
+
import {
|
|
12
|
+
SLIDE_WIDTH,
|
|
13
|
+
SLIDE_HEIGHT,
|
|
14
|
+
TITLE_LEFT,
|
|
15
|
+
TITLE_TOP,
|
|
16
|
+
TITLE_WIDTH,
|
|
17
|
+
TITLE_HEIGHT,
|
|
18
|
+
BODY_LEFT,
|
|
19
|
+
BODY_TOP,
|
|
20
|
+
BODY_WIDTH,
|
|
21
|
+
BODY_HEIGHT,
|
|
22
|
+
} from './styles.js';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Build presentation.xml — the root document listing all slides.
|
|
26
|
+
*/
|
|
27
|
+
export function buildPresentationXml(
|
|
28
|
+
slideCount: number,
|
|
29
|
+
slideRelIds: string[],
|
|
30
|
+
slideMasterRelId: string,
|
|
31
|
+
_themeRelId: string,
|
|
32
|
+
): string {
|
|
33
|
+
const sldIdList: string[] = [];
|
|
34
|
+
for (let i = 0; i < slideCount; i++) {
|
|
35
|
+
// Slide IDs start at 256 (PowerPoint convention)
|
|
36
|
+
sldIdList.push(`<p:sldId id="${256 + i}" r:id="${slideRelIds[i]}"/>`);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
xmlDeclaration() +
|
|
41
|
+
`<p:presentation xmlns:a="${NS_DRAWINGML}" xmlns:r="${NS_R}" xmlns:p="${NS_PML}"` +
|
|
42
|
+
` saveSubsetFonts="1">` +
|
|
43
|
+
`<p:sldMasterIdLst>` +
|
|
44
|
+
`<p:sldMasterId id="2147483648" r:id="${slideMasterRelId}"/>` +
|
|
45
|
+
`</p:sldMasterIdLst>` +
|
|
46
|
+
`<p:sldIdLst>${sldIdList.join('')}</p:sldIdLst>` +
|
|
47
|
+
`<p:sldSz cx="${SLIDE_WIDTH}" cy="${SLIDE_HEIGHT}" type="screen4x3"/>` +
|
|
48
|
+
`<p:notesSz cx="${SLIDE_HEIGHT}" cy="${SLIDE_WIDTH}"/>` +
|
|
49
|
+
`</p:presentation>`
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Build a minimal slide master (slideMaster1.xml).
|
|
55
|
+
*/
|
|
56
|
+
export function buildSlideMasterXml(layoutRelId: string): string {
|
|
57
|
+
return (
|
|
58
|
+
xmlDeclaration() +
|
|
59
|
+
`<p:sldMaster xmlns:a="${NS_DRAWINGML}" xmlns:r="${NS_R}" xmlns:p="${NS_PML}">` +
|
|
60
|
+
`<p:cSld>` +
|
|
61
|
+
`<p:bg>` +
|
|
62
|
+
`<p:bgRef idx="1001">` +
|
|
63
|
+
`<a:schemeClr val="bg1"/>` +
|
|
64
|
+
`</p:bgRef>` +
|
|
65
|
+
`</p:bg>` +
|
|
66
|
+
`<p:spTree>` +
|
|
67
|
+
`<p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr>` +
|
|
68
|
+
`<p:grpSpPr/>` +
|
|
69
|
+
`</p:spTree>` +
|
|
70
|
+
`</p:cSld>` +
|
|
71
|
+
`<p:clrMap bg1="lt1" tx1="dk1" bg2="lt2" tx2="dk2"` +
|
|
72
|
+
` accent1="accent1" accent2="accent2" accent3="accent3" accent4="accent4"` +
|
|
73
|
+
` accent5="accent5" accent6="accent6" hlink="hlink" folHlink="folHlink"/>` +
|
|
74
|
+
`<p:sldLayoutIdLst>` +
|
|
75
|
+
`<p:sldLayoutId id="2147483649" r:id="${layoutRelId}"/>` +
|
|
76
|
+
`</p:sldLayoutIdLst>` +
|
|
77
|
+
`</p:sldMaster>`
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Build a minimal slide layout (slideLayout1.xml) — title + content.
|
|
83
|
+
*/
|
|
84
|
+
export function buildSlideLayoutXml(_masterRelId: string): string {
|
|
85
|
+
return (
|
|
86
|
+
xmlDeclaration() +
|
|
87
|
+
`<p:sldLayout xmlns:a="${NS_DRAWINGML}" xmlns:r="${NS_R}" xmlns:p="${NS_PML}"` +
|
|
88
|
+
` type="obj" preserve="1">` +
|
|
89
|
+
`<p:cSld name="Title and Content">` +
|
|
90
|
+
`<p:spTree>` +
|
|
91
|
+
`<p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr>` +
|
|
92
|
+
`<p:grpSpPr/>` +
|
|
93
|
+
// Title placeholder
|
|
94
|
+
`<p:sp>` +
|
|
95
|
+
`<p:nvSpPr>` +
|
|
96
|
+
`<p:cNvPr id="2" name="Title 1"/>` +
|
|
97
|
+
`<p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr>` +
|
|
98
|
+
`<p:nvPr><p:ph type="title"/></p:nvPr>` +
|
|
99
|
+
`</p:nvSpPr>` +
|
|
100
|
+
`<p:spPr>` +
|
|
101
|
+
`<a:xfrm><a:off x="${TITLE_LEFT}" y="${TITLE_TOP}"/>` +
|
|
102
|
+
`<a:ext cx="${TITLE_WIDTH}" cy="${TITLE_HEIGHT}"/></a:xfrm>` +
|
|
103
|
+
`</p:spPr>` +
|
|
104
|
+
`<p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody>` +
|
|
105
|
+
`</p:sp>` +
|
|
106
|
+
// Content placeholder
|
|
107
|
+
`<p:sp>` +
|
|
108
|
+
`<p:nvSpPr>` +
|
|
109
|
+
`<p:cNvPr id="3" name="Content 2"/>` +
|
|
110
|
+
`<p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr>` +
|
|
111
|
+
`<p:nvPr><p:ph idx="1"/></p:nvPr>` +
|
|
112
|
+
`</p:nvSpPr>` +
|
|
113
|
+
`<p:spPr>` +
|
|
114
|
+
`<a:xfrm><a:off x="${BODY_LEFT}" y="${BODY_TOP}"/>` +
|
|
115
|
+
`<a:ext cx="${BODY_WIDTH}" cy="${BODY_HEIGHT}"/></a:xfrm>` +
|
|
116
|
+
`</p:spPr>` +
|
|
117
|
+
`<p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody>` +
|
|
118
|
+
`</p:sp>` +
|
|
119
|
+
`</p:spTree>` +
|
|
120
|
+
`</p:cSld>` +
|
|
121
|
+
`</p:sldLayout>`
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Build a minimal DrawingML theme (theme1.xml).
|
|
127
|
+
*/
|
|
128
|
+
export function buildThemeXml(): string {
|
|
129
|
+
return (
|
|
130
|
+
xmlDeclaration() +
|
|
131
|
+
`<a:theme xmlns:a="${NS_DRAWINGML}" name="Office Theme">` +
|
|
132
|
+
`<a:themeElements>` +
|
|
133
|
+
// Color scheme
|
|
134
|
+
`<a:clrScheme name="Office">` +
|
|
135
|
+
`<a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1>` +
|
|
136
|
+
`<a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1>` +
|
|
137
|
+
`<a:dk2><a:srgbClr val="44546A"/></a:dk2>` +
|
|
138
|
+
`<a:lt2><a:srgbClr val="E7E6E6"/></a:lt2>` +
|
|
139
|
+
`<a:accent1><a:srgbClr val="4472C4"/></a:accent1>` +
|
|
140
|
+
`<a:accent2><a:srgbClr val="ED7D31"/></a:accent2>` +
|
|
141
|
+
`<a:accent3><a:srgbClr val="A5A5A5"/></a:accent3>` +
|
|
142
|
+
`<a:accent4><a:srgbClr val="FFC000"/></a:accent4>` +
|
|
143
|
+
`<a:accent5><a:srgbClr val="5B9BD5"/></a:accent5>` +
|
|
144
|
+
`<a:accent6><a:srgbClr val="70AD47"/></a:accent6>` +
|
|
145
|
+
`<a:hlink><a:srgbClr val="0563C1"/></a:hlink>` +
|
|
146
|
+
`<a:folHlink><a:srgbClr val="954F72"/></a:folHlink>` +
|
|
147
|
+
`</a:clrScheme>` +
|
|
148
|
+
// Font scheme
|
|
149
|
+
`<a:fontScheme name="Office">` +
|
|
150
|
+
`<a:majorFont>` +
|
|
151
|
+
`<a:latin typeface="Calibri Light"/>` +
|
|
152
|
+
`<a:ea typeface=""/>` +
|
|
153
|
+
`<a:cs typeface=""/>` +
|
|
154
|
+
`</a:majorFont>` +
|
|
155
|
+
`<a:minorFont>` +
|
|
156
|
+
`<a:latin typeface="Calibri"/>` +
|
|
157
|
+
`<a:ea typeface=""/>` +
|
|
158
|
+
`<a:cs typeface=""/>` +
|
|
159
|
+
`</a:minorFont>` +
|
|
160
|
+
`</a:fontScheme>` +
|
|
161
|
+
// Format scheme (minimal)
|
|
162
|
+
`<a:fmtScheme name="Office">` +
|
|
163
|
+
`<a:fillStyleLst>` +
|
|
164
|
+
`<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>` +
|
|
165
|
+
`<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>` +
|
|
166
|
+
`<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>` +
|
|
167
|
+
`</a:fillStyleLst>` +
|
|
168
|
+
`<a:lnStyleLst>` +
|
|
169
|
+
`<a:ln w="6350"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill></a:ln>` +
|
|
170
|
+
`<a:ln w="6350"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill></a:ln>` +
|
|
171
|
+
`<a:ln w="6350"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill></a:ln>` +
|
|
172
|
+
`</a:lnStyleLst>` +
|
|
173
|
+
`<a:effectStyleLst>` +
|
|
174
|
+
`<a:effectStyle><a:effectLst/></a:effectStyle>` +
|
|
175
|
+
`<a:effectStyle><a:effectLst/></a:effectStyle>` +
|
|
176
|
+
`<a:effectStyle><a:effectLst/></a:effectStyle>` +
|
|
177
|
+
`</a:effectStyleLst>` +
|
|
178
|
+
`<a:bgFillStyleLst>` +
|
|
179
|
+
`<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>` +
|
|
180
|
+
`<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>` +
|
|
181
|
+
`<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>` +
|
|
182
|
+
`</a:bgFillStyleLst>` +
|
|
183
|
+
`</a:fmtScheme>` +
|
|
184
|
+
`</a:themeElements>` +
|
|
185
|
+
`</a:theme>`
|
|
186
|
+
);
|
|
187
|
+
}
|
package/dist/chunk-532L4D5D.js
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
// src/pptx/index.ts
|
|
2
|
-
async function markdownDocToPptx(_doc, _options) {
|
|
3
|
-
throw new Error("PPTX export is not yet implemented");
|
|
4
|
-
}
|
|
5
|
-
async function docToPptx(_doc, _options) {
|
|
6
|
-
throw new Error("PPTX export is not yet implemented");
|
|
7
|
-
}
|
|
8
|
-
async function pptxToMarkdownDoc(_data, _options) {
|
|
9
|
-
throw new Error("PPTX import is not yet implemented");
|
|
10
|
-
}
|
|
11
|
-
async function pptxToDoc(_data, _options) {
|
|
12
|
-
throw new Error("PPTX import is not yet implemented");
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export {
|
|
16
|
-
markdownDocToPptx,
|
|
17
|
-
docToPptx,
|
|
18
|
-
pptxToMarkdownDoc,
|
|
19
|
-
pptxToDoc
|
|
20
|
-
};
|
|
21
|
-
//# sourceMappingURL=chunk-532L4D5D.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pptx/index.ts"],"sourcesContent":["/**\n * @bendyline/squisq-formats PPTX Module (Stub)\n *\n * Placeholder for PowerPoint .pptx import/export support.\n * Will use PresentationML (`<p:presentation>`, `<p:sld>`) via the\n * shared ooxml/ infrastructure.\n *\n * @example\n * ```ts\n * import { markdownDocToPptx } from '@bendyline/squisq-formats/pptx';\n * ```\n */\n\nimport type { MarkdownDocument } from '@bendyline/squisq/markdown';\nimport type { Doc } from '@bendyline/squisq/schemas';\n\n/**\n * Options for PPTX export (placeholder).\n */\nexport interface PptxExportOptions {\n /** Presentation title */\n title?: string;\n /** Presentation author */\n author?: string;\n}\n\n/**\n * Options for PPTX import (placeholder).\n */\nexport interface PptxImportOptions {\n /** Whether to extract embedded images as data URIs */\n extractImages?: boolean;\n}\n\n/**\n * Convert a MarkdownDocument to a .pptx Blob.\n *\n * @throws Error — PPTX support is not yet implemented\n */\nexport async function markdownDocToPptx(\n _doc: MarkdownDocument,\n _options?: PptxExportOptions,\n): Promise<Blob> {\n throw new Error('PPTX export is not yet implemented');\n}\n\n/**\n * Convert a squisq Doc to a .pptx Blob.\n *\n * @throws Error — PPTX support is not yet implemented\n */\nexport async function docToPptx(_doc: Doc, _options?: PptxExportOptions): Promise<Blob> {\n throw new Error('PPTX export is not yet implemented');\n}\n\n/**\n * Convert a .pptx file to a MarkdownDocument.\n *\n * @throws Error — PPTX support is not yet implemented\n */\nexport async function pptxToMarkdownDoc(\n _data: ArrayBuffer | Blob,\n _options?: PptxImportOptions,\n): Promise<MarkdownDocument> {\n throw new Error('PPTX import is not yet implemented');\n}\n\n/**\n * Convert a .pptx file to a squisq Doc.\n *\n * @throws Error — PPTX support is not yet implemented\n */\nexport async function pptxToDoc(\n _data: ArrayBuffer | Blob,\n _options?: PptxImportOptions,\n): Promise<Doc> {\n throw new Error('PPTX import is not yet implemented');\n}\n"],"mappings":";AAuCA,eAAsB,kBACpB,MACA,UACe;AACf,QAAM,IAAI,MAAM,oCAAoC;AACtD;AAOA,eAAsB,UAAU,MAAW,UAA6C;AACtF,QAAM,IAAI,MAAM,oCAAoC;AACtD;AAOA,eAAsB,kBACpB,OACA,UAC2B;AAC3B,QAAM,IAAI,MAAM,oCAAoC;AACtD;AAOA,eAAsB,UACpB,OACA,UACc;AACd,QAAM,IAAI,MAAM,oCAAoC;AACtD;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ooxml/namespaces.ts","../src/ooxml/xmlUtils.ts","../src/ooxml/writer.ts","../src/ooxml/reader.ts"],"sourcesContent":["/**\n * OOXML Namespace Constants\n *\n * All Office Open XML namespace URIs used across DOCX, PPTX, and XLSX.\n * Organized by category for easy reference.\n */\n\n// ============================================\n// Package-level namespaces (shared by all formats)\n// ============================================\n\n/** Relationships namespace (used in _rels/*.rels files) */\nexport const NS_RELATIONSHIPS = 'http://schemas.openxmlformats.org/package/2006/relationships';\n\n/** Content Types namespace ([Content_Types].xml) */\nexport const NS_CONTENT_TYPES = 'http://schemas.openxmlformats.org/package/2006/content-types';\n\n// ============================================\n// Relationship type URIs\n// ============================================\n\n/** Relationship type: Office document (main part) */\nexport const REL_OFFICE_DOCUMENT =\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument';\n\n/** Relationship type: Core properties */\nexport const REL_CORE_PROPERTIES =\n 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties';\n\n/** Relationship type: Extended properties (app.xml) */\nexport const REL_EXTENDED_PROPERTIES =\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties';\n\n/** Relationship type: Styles */\nexport const REL_STYLES =\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles';\n\n/** Relationship type: Numbering */\nexport const REL_NUMBERING =\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering';\n\n/** Relationship type: Font table */\nexport const REL_FONT_TABLE =\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable';\n\n/** Relationship type: Settings */\nexport const REL_SETTINGS =\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings';\n\n/** Relationship type: Hyperlink */\nexport const REL_HYPERLINK =\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink';\n\n/** Relationship type: Image */\nexport const REL_IMAGE =\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image';\n\n/** Relationship type: Footnotes */\nexport const REL_FOOTNOTES =\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes';\n\n/** Relationship type: Theme */\nexport const REL_THEME =\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme';\n\n// ============================================\n// WordprocessingML (DOCX)\n// ============================================\n\n/** WordprocessingML main namespace (w:) */\nexport const NS_WML = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main';\n\n// ============================================\n// PresentationML (PPTX)\n// ============================================\n\n/** PresentationML main namespace (p:) */\nexport const NS_PML = 'http://schemas.openxmlformats.org/presentationml/2006/main';\n\n// ============================================\n// SpreadsheetML (XLSX)\n// ============================================\n\n/** SpreadsheetML main namespace */\nexport const NS_SML = 'http://schemas.openxmlformats.org/spreadsheetml/2006/main';\n\n// ============================================\n// DrawingML (shared across formats)\n// ============================================\n\n/** DrawingML main namespace (a:) */\nexport const NS_DRAWINGML = 'http://schemas.openxmlformats.org/drawingml/2006/main';\n\n/** DrawingML WordprocessingML drawing namespace (wp:) */\nexport const NS_WP_DRAWING =\n 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing';\n\n/** DrawingML picture namespace (pic:) */\nexport const NS_PICTURE = 'http://schemas.openxmlformats.org/drawingml/2006/picture';\n\n// ============================================\n// Dublin Core / Core Properties\n// ============================================\n\n/** Dublin Core elements namespace */\nexport const NS_DC = 'http://purl.org/dc/elements/1.1/';\n\n/** Dublin Core terms namespace */\nexport const NS_DCTERMS = 'http://purl.org/dc/terms/';\n\n/** Core properties namespace */\nexport const NS_CORE_PROPERTIES =\n 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties';\n\n/** XML Schema Instance namespace */\nexport const NS_XSI = 'http://www.w3.org/2001/XMLSchema-instance';\n\n// ============================================\n// Markup Compatibility\n// ============================================\n\n/** Markup Compatibility namespace (mc:) */\nexport const NS_MC = 'http://schemas.openxmlformats.org/markup-compatibility/2006';\n\n/** Office relationships namespace (r:) */\nexport const NS_R = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships';\n\n// ============================================\n// Content type strings\n// ============================================\n\nexport const CONTENT_TYPE_RELATIONSHIPS =\n 'application/vnd.openxmlformats-package.relationships+xml';\n\nexport const CONTENT_TYPE_CORE_PROPERTIES =\n 'application/vnd.openxmlformats-package.core-properties+xml';\n\nexport const CONTENT_TYPE_DOCX_DOCUMENT =\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml';\n\nexport const CONTENT_TYPE_DOCX_STYLES =\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml';\n\nexport const CONTENT_TYPE_DOCX_NUMBERING =\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml';\n\nexport const CONTENT_TYPE_DOCX_SETTINGS =\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml';\n\nexport const CONTENT_TYPE_DOCX_FONT_TABLE =\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml';\n\nexport const CONTENT_TYPE_DOCX_FOOTNOTES =\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml';\n\nexport const CONTENT_TYPE_PPTX_PRESENTATION =\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml';\n\nexport const CONTENT_TYPE_XLSX_WORKBOOK =\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml';\n","/**\n * XML Utility Functions\n *\n * Lightweight helpers for generating well-formed XML strings.\n * Used by all OOXML writers (DOCX, PPTX, XLSX) to construct\n * part content without a heavy DOM library.\n */\n\n/**\n * XML declaration for the start of every OOXML part.\n */\nexport function xmlDeclaration(): string {\n return '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>';\n}\n\n/**\n * Escape a string for safe inclusion in XML text content or attribute values.\n *\n * Handles the five predefined XML entities:\n * - & → &\n * - < → <\n * - > → >\n * - \" → "\n * - ' → '\n */\nexport function escapeXml(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/**\n * Build an XML attribute string from a key-value record.\n * Only includes entries where the value is defined and non-empty.\n *\n * @example\n * ```ts\n * attrString({ 'w:val': 'Heading1', 'w:eastAsia': undefined })\n * // ' w:val=\"Heading1\"'\n * ```\n */\nexport function attrString(attrs?: Record<string, string | undefined>): string {\n if (!attrs) return '';\n const parts: string[] = [];\n for (const [key, value] of Object.entries(attrs)) {\n if (value !== undefined && value !== '') {\n parts.push(` ${key}=\"${escapeXml(value)}\"`);\n }\n }\n return parts.join('');\n}\n\n/**\n * Build a self-closing XML element: `<tag attr=\"val\"/>`.\n *\n * @example\n * ```ts\n * selfClosingElement('w:b')\n * // '<w:b/>'\n *\n * selfClosingElement('w:pStyle', { 'w:val': 'Heading1' })\n * // '<w:pStyle w:val=\"Heading1\"/>'\n * ```\n */\nexport function selfClosingElement(\n tag: string,\n attrs?: Record<string, string | undefined>,\n): string {\n return `<${tag}${attrString(attrs)}/>`;\n}\n\n/**\n * Build an XML element with children: `<tag attr=\"val\">...children...</tag>`.\n * Children are concatenated directly (no extra whitespace).\n *\n * @example\n * ```ts\n * xmlElement('w:p', {},\n * xmlElement('w:r', {},\n * xmlElement('w:t', {}, 'Hello')\n * )\n * )\n * // '<w:p><w:r><w:t>Hello</w:t></w:r></w:p>'\n * ```\n */\nexport function xmlElement(\n tag: string,\n attrs?: Record<string, string | undefined>,\n ...children: string[]\n): string {\n const content = children.join('');\n if (content === '') {\n return selfClosingElement(tag, attrs);\n }\n return `<${tag}${attrString(attrs)}>${content}</${tag}>`;\n}\n\n/**\n * Build an XML text element: `<tag attr=\"val\">escaped text</tag>`.\n * The text value is XML-escaped automatically.\n *\n * This is a convenience for the common pattern of wrapping text in an element,\n * where you want automatic escaping (unlike `xmlElement` which takes raw children).\n *\n * @example\n * ```ts\n * textElement('w:t', { 'xml:space': 'preserve' }, 'Hello & world')\n * // '<w:t xml:space=\"preserve\">Hello & world</w:t>'\n * ```\n */\nexport function textElement(\n tag: string,\n attrs?: Record<string, string | undefined>,\n text?: string,\n): string {\n if (text === undefined || text === '') {\n return selfClosingElement(tag, attrs);\n }\n return `<${tag}${attrString(attrs)}>${escapeXml(text)}</${tag}>`;\n}\n","/**\n * OOXML Package Writer\n *\n * Builds OOXML archives (.docx, .pptx, .xlsx) from parts.\n * Handles automatic generation of [Content_Types].xml and\n * _rels/*.rels files from the registered parts and relationships.\n */\n\nimport JSZip from 'jszip';\nimport type { CoreProperties, PackagePart, PendingRelationship, Relationship } from './types.js';\nimport {\n NS_CONTENT_TYPES,\n NS_RELATIONSHIPS,\n NS_CORE_PROPERTIES,\n NS_DC,\n NS_DCTERMS,\n NS_XSI,\n CONTENT_TYPE_RELATIONSHIPS,\n CONTENT_TYPE_CORE_PROPERTIES,\n REL_CORE_PROPERTIES,\n} from './namespaces.js';\nimport { xmlDeclaration, escapeXml } from './xmlUtils.js';\n\n// ============================================\n// Package Builder\n// ============================================\n\n/**\n * Mutable builder for constructing an OOXML package.\n *\n * Add parts, relationships, and core properties, then call `toBlob()`\n * or `toArrayBuffer()` to produce the final ZIP archive.\n *\n * @example\n * ```ts\n * const builder = createPackage();\n * builder.addPart('word/document.xml', documentXml, CONTENT_TYPE_DOCX_DOCUMENT);\n * builder.addRelationship('', {\n * id: 'rId1',\n * type: REL_OFFICE_DOCUMENT,\n * target: 'word/document.xml',\n * });\n * const blob = await builder.toBlob();\n * ```\n */\nexport interface OoxmlPackageBuilder {\n /**\n * Add an XML or text part to the package.\n *\n * @param path - Path within the archive (e.g., \"word/document.xml\")\n * @param content - XML string content\n * @param contentType - MIME content type for [Content_Types].xml\n */\n addPart(path: string, content: string, contentType: string): void;\n\n /**\n * Add a binary part to the package (e.g., an image).\n *\n * @param path - Path within the archive (e.g., \"word/media/image1.png\")\n * @param data - Binary content\n * @param contentType - MIME content type (e.g., \"image/png\")\n */\n addBinaryPart(path: string, data: ArrayBuffer | Uint8Array, contentType: string): void;\n\n /**\n * Register a relationship.\n *\n * @param sourcePart - The part this relationship belongs to (e.g., \"word/document.xml\").\n * Use \"\" (empty string) for root-level relationships (_rels/.rels).\n * @param rel - The relationship entry\n */\n addRelationship(sourcePart: string, rel: Relationship): void;\n\n /**\n * Set core document properties (docProps/core.xml).\n * Calling this multiple times overwrites previous values.\n */\n setCoreProperties(props: CoreProperties): void;\n\n /**\n * Assemble the final OOXML package as a Blob.\n * Generates [Content_Types].xml and all _rels/*.rels files automatically.\n */\n toBlob(): Promise<Blob>;\n\n /**\n * Assemble the final OOXML package as an ArrayBuffer.\n */\n toArrayBuffer(): Promise<ArrayBuffer>;\n}\n\n/**\n * Create a new OOXML package builder.\n */\nexport function createPackage(): OoxmlPackageBuilder {\n const parts: PackagePart[] = [];\n const relationships: PendingRelationship[] = [];\n let coreProps: CoreProperties | undefined;\n\n return {\n addPart(path, content, contentType) {\n parts.push({ path, content, contentType });\n },\n\n addBinaryPart(path, data, contentType) {\n parts.push({ path, binaryContent: data, contentType });\n },\n\n addRelationship(sourcePart, rel) {\n relationships.push({ sourcePart, relationship: rel });\n },\n\n setCoreProperties(props) {\n coreProps = props;\n },\n\n async toBlob() {\n const zip = assemble(parts, relationships, coreProps);\n return zip.generateAsync({ type: 'blob' });\n },\n\n async toArrayBuffer() {\n const zip = assemble(parts, relationships, coreProps);\n return zip.generateAsync({ type: 'arraybuffer' });\n },\n };\n}\n\n// ============================================\n// Assembly\n// ============================================\n\n/**\n * Assemble a JSZip archive from parts, relationships, and core properties.\n */\nfunction assemble(\n parts: PackagePart[],\n relationships: PendingRelationship[],\n coreProps?: CoreProperties,\n): JSZip {\n const zip = new JSZip();\n\n // Write content parts\n for (const part of parts) {\n if (part.content !== undefined) {\n zip.file(part.path, part.content);\n } else if (part.binaryContent !== undefined) {\n zip.file(part.path, part.binaryContent);\n }\n }\n\n // Add core properties if set\n if (coreProps) {\n const coreXml = buildCorePropertiesXml(coreProps);\n zip.file('docProps/core.xml', coreXml);\n\n // Add relationship to core properties\n relationships.push({\n sourcePart: '',\n relationship: {\n id: `rId${relationships.length + 100}`,\n type: REL_CORE_PROPERTIES,\n target: 'docProps/core.xml',\n },\n });\n }\n\n // Build and write [Content_Types].xml\n zip.file('[Content_Types].xml', buildContentTypesXml(parts, coreProps));\n\n // Build and write _rels/*.rels files\n const relsBySource = groupRelationshipsBySource(relationships);\n for (const [sourcePart, rels] of relsBySource) {\n const relsPath = sourcePart === '' ? '_rels/.rels' : buildRelsPath(sourcePart);\n zip.file(relsPath, buildRelationshipsXml(rels));\n }\n\n return zip;\n}\n\n// ============================================\n// [Content_Types].xml\n// ============================================\n\nfunction buildContentTypesXml(parts: PackagePart[], coreProps?: CoreProperties): string {\n const lines: string[] = [xmlDeclaration()];\n lines.push(`<Types xmlns=\"${NS_CONTENT_TYPES}\">`);\n\n // Default extension types\n const extensionTypes = new Map<string, string>();\n extensionTypes.set('rels', CONTENT_TYPE_RELATIONSHIPS);\n extensionTypes.set('xml', 'application/xml');\n\n // Collect extensions from binary parts (e.g., png, jpeg)\n for (const part of parts) {\n if (part.binaryContent !== undefined) {\n const ext = getExtension(part.path);\n if (ext && !extensionTypes.has(ext)) {\n extensionTypes.set(ext, part.contentType);\n }\n }\n }\n\n for (const [ext, ct] of extensionTypes) {\n lines.push(` <Default Extension=\"${escapeXml(ext)}\" ContentType=\"${escapeXml(ct)}\"/>`);\n }\n\n // Override entries for each XML part\n for (const part of parts) {\n if (part.content !== undefined) {\n lines.push(\n ` <Override PartName=\"/${escapeXml(part.path)}\" ContentType=\"${escapeXml(part.contentType)}\"/>`,\n );\n }\n }\n\n // Core properties override\n if (coreProps) {\n lines.push(\n ` <Override PartName=\"/docProps/core.xml\" ContentType=\"${CONTENT_TYPE_CORE_PROPERTIES}\"/>`,\n );\n }\n\n lines.push('</Types>');\n return lines.join('\\n');\n}\n\n// ============================================\n// Relationships XML\n// ============================================\n\nfunction buildRelationshipsXml(rels: Relationship[]): string {\n const lines: string[] = [xmlDeclaration()];\n lines.push(`<Relationships xmlns=\"${NS_RELATIONSHIPS}\">`);\n\n for (const rel of rels) {\n const attrs: string[] = [\n `Id=\"${escapeXml(rel.id)}\"`,\n `Type=\"${escapeXml(rel.type)}\"`,\n `Target=\"${escapeXml(rel.target)}\"`,\n ];\n if (rel.targetMode) {\n attrs.push(`TargetMode=\"${escapeXml(rel.targetMode)}\"`);\n }\n lines.push(` <Relationship ${attrs.join(' ')}/>`);\n }\n\n lines.push('</Relationships>');\n return lines.join('\\n');\n}\n\n// ============================================\n// Core Properties XML\n// ============================================\n\nfunction buildCorePropertiesXml(props: CoreProperties): string {\n const lines: string[] = [xmlDeclaration()];\n lines.push(\n `<cp:coreProperties` +\n ` xmlns:cp=\"${NS_CORE_PROPERTIES}\"` +\n ` xmlns:dc=\"${NS_DC}\"` +\n ` xmlns:dcterms=\"${NS_DCTERMS}\"` +\n ` xmlns:xsi=\"${NS_XSI}\">`,\n );\n\n if (props.title) lines.push(` <dc:title>${escapeXml(props.title)}</dc:title>`);\n if (props.subject) lines.push(` <dc:subject>${escapeXml(props.subject)}</dc:subject>`);\n if (props.creator) lines.push(` <dc:creator>${escapeXml(props.creator)}</dc:creator>`);\n if (props.description)\n lines.push(` <dc:description>${escapeXml(props.description)}</dc:description>`);\n if (props.keywords) lines.push(` <cp:keywords>${escapeXml(props.keywords)}</cp:keywords>`);\n if (props.lastModifiedBy)\n lines.push(` <cp:lastModifiedBy>${escapeXml(props.lastModifiedBy)}</cp:lastModifiedBy>`);\n if (props.revision) lines.push(` <cp:revision>${escapeXml(props.revision)}</cp:revision>`);\n if (props.created) {\n lines.push(\n ` <dcterms:created xsi:type=\"dcterms:W3CDTF\">${escapeXml(props.created)}</dcterms:created>`,\n );\n }\n if (props.modified) {\n lines.push(\n ` <dcterms:modified xsi:type=\"dcterms:W3CDTF\">${escapeXml(props.modified)}</dcterms:modified>`,\n );\n }\n\n lines.push('</cp:coreProperties>');\n return lines.join('\\n');\n}\n\n// ============================================\n// Helpers\n// ============================================\n\nfunction getExtension(path: string): string | undefined {\n const dot = path.lastIndexOf('.');\n if (dot === -1) return undefined;\n return path.substring(dot + 1).toLowerCase();\n}\n\nfunction buildRelsPath(partPath: string): string {\n const lastSlash = partPath.lastIndexOf('/');\n if (lastSlash === -1) {\n return `_rels/${partPath}.rels`;\n }\n const dir = partPath.substring(0, lastSlash);\n const file = partPath.substring(lastSlash + 1);\n return `${dir}/_rels/${file}.rels`;\n}\n\nfunction groupRelationshipsBySource(pending: PendingRelationship[]): Map<string, Relationship[]> {\n const grouped = new Map<string, Relationship[]>();\n for (const { sourcePart, relationship } of pending) {\n let list = grouped.get(sourcePart);\n if (!list) {\n list = [];\n grouped.set(sourcePart, list);\n }\n list.push(relationship);\n }\n return grouped;\n}\n","/**\n * OOXML Package Reader\n *\n * Opens OOXML archives (.docx, .pptx, .xlsx) and parses their\n * structural metadata: [Content_Types].xml, relationships, and\n * core properties.\n *\n * Uses JSZip to unzip and the browser's DOMParser to parse XML.\n */\n\nimport JSZip from 'jszip';\nimport type { OoxmlPackage, ContentTypeMap, Relationship, CoreProperties } from './types.js';\nimport { NS_RELATIONSHIPS, NS_DC, NS_DCTERMS, NS_CORE_PROPERTIES } from './namespaces.js';\n\n// ============================================\n// Package Opening\n// ============================================\n\n/**\n * Open an OOXML package from raw data.\n *\n * Parses the ZIP archive, [Content_Types].xml, and root relationships.\n *\n * @param data - The raw .docx/.pptx/.xlsx file as ArrayBuffer or Blob\n * @returns A parsed OoxmlPackage\n */\nexport async function openPackage(data: ArrayBuffer | Blob): Promise<OoxmlPackage> {\n const zip = await JSZip.loadAsync(data);\n const contentTypes = await parseContentTypes(zip);\n const rootRelationships = await parseRelationships(zip, '');\n\n return { zip, contentTypes, rootRelationships };\n}\n\n// ============================================\n// Content Types\n// ============================================\n\n/**\n * Parse [Content_Types].xml from the archive.\n */\nasync function parseContentTypes(zip: JSZip): Promise<ContentTypeMap> {\n const overrides = new Map<string, string>();\n const defaults = new Map<string, string>();\n\n const file = zip.file('[Content_Types].xml');\n if (!file) return { overrides, defaults };\n\n const text = await file.async('text');\n const doc = new DOMParser().parseFromString(text, 'application/xml');\n\n // Parse <Default Extension=\"rels\" ContentType=\"...\" />\n const defaultEls = doc.getElementsByTagName('Default');\n for (let i = 0; i < defaultEls.length; i++) {\n const el = defaultEls[i];\n const ext = el.getAttribute('Extension');\n const ct = el.getAttribute('ContentType');\n if (ext && ct) defaults.set(ext, ct);\n }\n\n // Parse <Override PartName=\"/word/document.xml\" ContentType=\"...\" />\n const overrideEls = doc.getElementsByTagName('Override');\n for (let i = 0; i < overrideEls.length; i++) {\n const el = overrideEls[i];\n const partName = el.getAttribute('PartName');\n const ct = el.getAttribute('ContentType');\n if (partName && ct) {\n // Normalize: strip leading slash\n overrides.set(partName.replace(/^\\//, ''), ct);\n }\n }\n\n return { overrides, defaults };\n}\n\n// ============================================\n// Relationships\n// ============================================\n\n/**\n * Parse relationships for a specific part.\n *\n * @param pkg - The OOXML package (or the zip directly)\n * @param partPath - The part path (e.g., \"word/document.xml\").\n * Use \"\" for root-level relationships (_rels/.rels).\n * @returns Array of relationship entries\n */\nexport async function getPartRelationships(\n pkg: OoxmlPackage,\n partPath: string,\n): Promise<Relationship[]> {\n return parseRelationships(pkg.zip, partPath);\n}\n\n/**\n * Parse a _rels/*.rels file from the ZIP.\n *\n * For root relationships, relsPath = \"_rels/.rels\".\n * For part relationships, relsPath = \"<dir>/_rels/<filename>.rels\".\n */\nasync function parseRelationships(zip: JSZip, partPath: string): Promise<Relationship[]> {\n const relsPath = partPath === '' ? '_rels/.rels' : buildRelsPath(partPath);\n\n const file = zip.file(relsPath);\n if (!file) return [];\n\n const text = await file.async('text');\n const doc = new DOMParser().parseFromString(text, 'application/xml');\n const result: Relationship[] = [];\n\n const els = doc.getElementsByTagNameNS(NS_RELATIONSHIPS, 'Relationship');\n // Fallback in case namespace isn't used (some generators omit it)\n const fallbackEls = els.length > 0 ? els : doc.getElementsByTagName('Relationship');\n\n for (let i = 0; i < fallbackEls.length; i++) {\n const el = fallbackEls[i];\n const id = el.getAttribute('Id');\n const type = el.getAttribute('Type');\n const target = el.getAttribute('Target');\n if (id && type && target) {\n const targetMode = el.getAttribute('TargetMode') as 'Internal' | 'External' | null;\n result.push({\n id,\n type,\n target,\n ...(targetMode ? { targetMode } : {}),\n });\n }\n }\n\n return result;\n}\n\n/**\n * Build the _rels path for a given part path.\n *\n * \"word/document.xml\" → \"word/_rels/document.xml.rels\"\n * \"xl/workbook.xml\" → \"xl/_rels/workbook.xml.rels\"\n */\nfunction buildRelsPath(partPath: string): string {\n const lastSlash = partPath.lastIndexOf('/');\n if (lastSlash === -1) {\n return `_rels/${partPath}.rels`;\n }\n const dir = partPath.substring(0, lastSlash);\n const file = partPath.substring(lastSlash + 1);\n return `${dir}/_rels/${file}.rels`;\n}\n\n// ============================================\n// Part Access\n// ============================================\n\n/**\n * Extract an XML part from the package and parse it as a DOM Document.\n *\n * @param pkg - The OOXML package\n * @param partPath - Path within the archive (e.g., \"word/document.xml\")\n * @returns Parsed XML Document, or null if the part doesn't exist\n */\nexport async function getPartXml(pkg: OoxmlPackage, partPath: string): Promise<Document | null> {\n const file = pkg.zip.file(partPath);\n if (!file) return null;\n\n const text = await file.async('text');\n return new DOMParser().parseFromString(text, 'application/xml');\n}\n\n/**\n * Extract a binary part from the package (e.g., an image from word/media/).\n *\n * @param pkg - The OOXML package\n * @param partPath - Path within the archive\n * @returns The binary content, or null if the part doesn't exist\n */\nexport async function getPartBinary(\n pkg: OoxmlPackage,\n partPath: string,\n): Promise<ArrayBuffer | null> {\n const file = pkg.zip.file(partPath);\n if (!file) return null;\n return file.async('arraybuffer');\n}\n\n// ============================================\n// Core Properties\n// ============================================\n\n/**\n * Parse core document properties from docProps/core.xml.\n *\n * @param pkg - The OOXML package\n * @returns Parsed core properties (all fields optional)\n */\nexport async function getCoreProperties(pkg: OoxmlPackage): Promise<CoreProperties> {\n const doc = await getPartXml(pkg, 'docProps/core.xml');\n if (!doc) return {};\n\n function getText(ns: string, localName: string): string | undefined {\n const els = doc!.getElementsByTagNameNS(ns, localName);\n if (els.length > 0 && els[0].textContent) {\n return els[0].textContent;\n }\n return undefined;\n }\n\n return {\n title: getText(NS_DC, 'title'),\n subject: getText(NS_DC, 'subject'),\n creator: getText(NS_DC, 'creator'),\n description: getText(NS_DC, 'description'),\n keywords: getText(NS_CORE_PROPERTIES, 'keywords'),\n lastModifiedBy: getText(NS_CORE_PROPERTIES, 'lastModifiedBy'),\n revision: getText(NS_CORE_PROPERTIES, 'revision'),\n created: getText(NS_DCTERMS, 'created'),\n modified: getText(NS_DCTERMS, 'modified'),\n };\n}\n"],"mappings":"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","names":["JSZip","JSZip","buildRelsPath"]}
|