node-pptx-templater 1.0.1 → 1.0.2
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/package.json +6 -6
- package/src/cli/commands/build.js +8 -6
- package/src/cli/commands/debug.js +7 -6
- package/src/cli/commands/extract.js +8 -6
- package/src/cli/commands/inspect.js +7 -5
- package/src/cli/commands/validate.js +7 -5
- package/src/cli/index.js +20 -21
- package/src/core/OutputWriter.js +9 -7
- package/src/core/PPTXTemplater.js +18 -16
- package/src/core/TemplateEngine.js +4 -2
- package/src/index.js +38 -15
- package/src/managers/ChartManager.js +8 -6
- package/src/managers/ContentTypesManager.js +5 -3
- package/src/managers/HyperlinkManager.js +6 -4
- package/src/managers/MediaManager.js +8 -6
- package/src/managers/RelationshipManager.js +7 -5
- package/src/managers/SlideManager.js +10 -8
- package/src/managers/TableManager.js +5 -3
- package/src/managers/ZipManager.js +8 -6
- package/src/managers/charts/ChartCacheGenerator.js +5 -3
- package/src/managers/charts/ChartParser.js +4 -2
- package/src/managers/charts/ChartRelationshipManager.js +4 -2
- package/src/managers/charts/ChartWorkbookUpdater.js +5 -3
- package/src/parsers/XMLParser.js +8 -4
- package/src/templates/blankPptx.js +2 -1
- package/src/templates/slideTemplate.js +8 -3
- package/src/utils/contentTypesHelper.js +4 -2
- package/src/utils/errors.js +17 -7
- package/src/utils/idUtils.js +10 -4
- package/src/utils/logger.js +5 -1
- package/src/utils/relationshipUtils.js +11 -4
- package/src/utils/xmlUtils.js +14 -6
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-pptx-templater",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Low-level PowerPoint OpenXML template engine for Node.js — generate and edit PPTX files directly through XML manipulation without relying on PowerPoint generation libraries.",
|
|
5
5
|
"main": "./src/index.js",
|
|
6
|
-
"type": "
|
|
6
|
+
"type": "commonjs",
|
|
7
7
|
"exports": {
|
|
8
8
|
".": {
|
|
9
|
-
"
|
|
9
|
+
"require": "./src/index.js"
|
|
10
10
|
}
|
|
11
11
|
},
|
|
12
12
|
"bin": {
|
|
@@ -65,8 +65,8 @@
|
|
|
65
65
|
"jszip": "^3.10.1",
|
|
66
66
|
"fs-extra": "^11.2.0",
|
|
67
67
|
"commander": "^12.0.0",
|
|
68
|
-
"chalk": "^
|
|
69
|
-
"ora": "^
|
|
68
|
+
"chalk": "^4.1.2",
|
|
69
|
+
"ora": "^5.4.1"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
72
72
|
"vitest": "^1.6.0",
|
|
@@ -80,4 +80,4 @@
|
|
|
80
80
|
"LICENSE",
|
|
81
81
|
"CHANGELOG.md"
|
|
82
82
|
]
|
|
83
|
-
}
|
|
83
|
+
}
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
* @fileoverview `build` CLI command — builds a PPTX from a template + JSON data.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
const chalk = require('chalk');
|
|
6
|
+
const ora = require('ora');
|
|
7
|
+
const { readFileSync } = require('fs');
|
|
8
|
+
const { resolve } = require('path');
|
|
9
|
+
const { PPTXTemplater } = require('../../index.js');
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Executes the `build` CLI command.
|
|
@@ -15,7 +15,7 @@ import { PPTXTemplater } from '../../index.js';
|
|
|
15
15
|
* @param {string} outputPath - Path for the generated PPTX.
|
|
16
16
|
* @param {Object} opts - CLI options.
|
|
17
17
|
*/
|
|
18
|
-
|
|
18
|
+
async function buildCommand(templatePath, outputPath, opts) {
|
|
19
19
|
const spinner = ora(`Loading template: ${templatePath}`).start();
|
|
20
20
|
|
|
21
21
|
try {
|
|
@@ -77,3 +77,5 @@ export async function buildCommand(templatePath, outputPath, opts) {
|
|
|
77
77
|
process.exit(1);
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
|
+
|
|
81
|
+
module.exports = { buildCommand };
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview `debug` CLI command — diagnoses and repairs corrupted PPTX files.
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import { PPTXTemplater } from '../../index.js';
|
|
4
|
+
const chalk = require('chalk');
|
|
5
|
+
const ora = require('ora');
|
|
6
|
+
const { resolve } = require('path');
|
|
7
|
+
const { PPTXTemplater } = require('../../index.js');
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
async function debugCommand(filePath, opts) {
|
|
11
10
|
const spinner = ora(`Loading PPTX for debug: ${filePath}`).start();
|
|
12
11
|
|
|
13
12
|
try {
|
|
@@ -44,3 +43,5 @@ export async function debugCommand(filePath, opts) {
|
|
|
44
43
|
process.exit(1);
|
|
45
44
|
}
|
|
46
45
|
}
|
|
46
|
+
|
|
47
|
+
module.exports = { debugCommand };
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview `extract` CLI command — extracts XML parts from a PPTX.
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
const chalk = require('chalk');
|
|
5
|
+
const { resolve } = require('path');
|
|
6
|
+
const { writeFileSync } = require('fs');
|
|
7
|
+
const { PPTXTemplater } = require('../../index.js');
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
async function extractCommand(filePath, opts) {
|
|
10
10
|
try {
|
|
11
11
|
const ppt = await PPTXTemplater.load(resolve(filePath));
|
|
12
12
|
|
|
@@ -14,7 +14,7 @@ export async function extractCommand(filePath, opts) {
|
|
|
14
14
|
const slideNum = parseInt(opts.slide, 10);
|
|
15
15
|
// Access internal zip via the engine's buffer
|
|
16
16
|
const buffer = await ppt.toBuffer();
|
|
17
|
-
const JSZip = (
|
|
17
|
+
const JSZip = require('jszip');
|
|
18
18
|
const zip = await JSZip.loadAsync(buffer);
|
|
19
19
|
const slideFile = zip.file(`ppt/slides/slide${slideNum}.xml`);
|
|
20
20
|
|
|
@@ -40,3 +40,5 @@ export async function extractCommand(filePath, opts) {
|
|
|
40
40
|
process.exit(1);
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
+
|
|
44
|
+
module.exports = { extractCommand };
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview `inspect` CLI command — detailed PPTX structure inspection.
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
const chalk = require('chalk');
|
|
5
|
+
const ora = require('ora');
|
|
6
|
+
const { resolve } = require('path');
|
|
7
|
+
const { PPTXTemplater } = require('../../index.js');
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
async function inspectCommand(filePath, opts) {
|
|
10
10
|
const showAll = opts.all;
|
|
11
11
|
const spinner = ora(`Inspecting: ${filePath}`).start();
|
|
12
12
|
|
|
@@ -37,3 +37,5 @@ export async function inspectCommand(filePath, opts) {
|
|
|
37
37
|
process.exit(1);
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
|
+
|
|
41
|
+
module.exports = { inspectCommand };
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview `validate` CLI command.
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
const chalk = require('chalk');
|
|
5
|
+
const ora = require('ora');
|
|
6
|
+
const { resolve } = require('path');
|
|
7
|
+
const { PPTXTemplater } = require('../../index.js');
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
async function validateCommand(filePath, opts) {
|
|
10
10
|
const spinner = ora(`Validating: ${filePath}`).start();
|
|
11
11
|
try {
|
|
12
12
|
const ppt = await PPTXTemplater.load(resolve(filePath));
|
|
@@ -34,3 +34,5 @@ export async function validateCommand(filePath, opts) {
|
|
|
34
34
|
process.exit(1);
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
|
+
|
|
38
|
+
module.exports = { validateCommand };
|
package/src/cli/index.js
CHANGED
|
@@ -18,20 +18,15 @@
|
|
|
18
18
|
* node-pptx-templater --help
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
import { inspectCommand } from './commands/inspect.js';
|
|
31
|
-
import { extractCommand } from './commands/extract.js';
|
|
32
|
-
import { debugCommand } from './commands/debug.js';
|
|
33
|
-
|
|
34
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
21
|
+
const { Command } = require('commander');
|
|
22
|
+
const chalk = require('chalk');
|
|
23
|
+
const { readFileSync } = require('fs');
|
|
24
|
+
const { resolve } = require('path');
|
|
25
|
+
const { buildCommand } = require('./commands/build.js');
|
|
26
|
+
const { validateCommand } = require('./commands/validate.js');
|
|
27
|
+
const { inspectCommand } = require('./commands/inspect.js');
|
|
28
|
+
const { extractCommand } = require('./commands/extract.js');
|
|
29
|
+
const { debugCommand } = require('./commands/debug.js');
|
|
35
30
|
|
|
36
31
|
// Read version from package.json
|
|
37
32
|
const pkg = JSON.parse(
|
|
@@ -121,12 +116,16 @@ program
|
|
|
121
116
|
// ─── Global error handling ──────────────────────────────────────────────────
|
|
122
117
|
program.exitOverride();
|
|
123
118
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
119
|
+
async function main() {
|
|
120
|
+
try {
|
|
121
|
+
await program.parseAsync(process.argv);
|
|
122
|
+
} catch (err) {
|
|
123
|
+
if (err.code === 'commander.helpDisplayed' || err.code === 'commander.version') {
|
|
124
|
+
process.exit(0);
|
|
125
|
+
}
|
|
126
|
+
console.error(chalk.red(`\n✗ Error: ${err.message}\n`));
|
|
127
|
+
process.exit(1);
|
|
129
128
|
}
|
|
130
|
-
console.error(chalk.red(`\n✗ Error: ${err.message}\n`));
|
|
131
|
-
process.exit(1);
|
|
132
129
|
}
|
|
130
|
+
|
|
131
|
+
main();
|
package/src/core/OutputWriter.js
CHANGED
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
* 4. Write to file, buffer, or stream
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
const fsExtra = require('fs-extra');
|
|
12
12
|
const { writeFile, ensureDir } = fsExtra;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
const path = require('path');
|
|
14
|
+
const { XMLParser } = require('../parsers/XMLParser.js');
|
|
15
|
+
const { createLogger } = require('../utils/logger.js');
|
|
16
|
+
const { PPTXError } = require('../utils/errors.js');
|
|
17
|
+
const { Readable } = require('stream');
|
|
18
18
|
|
|
19
19
|
const logger = createLogger('OutputWriter');
|
|
20
20
|
|
|
@@ -22,7 +22,7 @@ const logger = createLogger('OutputWriter');
|
|
|
22
22
|
* @class OutputWriter
|
|
23
23
|
* @description Serializes the modified PPTX to various output formats.
|
|
24
24
|
*/
|
|
25
|
-
|
|
25
|
+
class OutputWriter {
|
|
26
26
|
/** @private @type {ZipManager} */
|
|
27
27
|
#zipManager;
|
|
28
28
|
/** @private @type {ContentTypesManager} */
|
|
@@ -179,3 +179,5 @@ export class OutputWriter {
|
|
|
179
179
|
logger.debug(`Flushed ${info.length} slide(s) to ZIP`);
|
|
180
180
|
}
|
|
181
181
|
}
|
|
182
|
+
|
|
183
|
+
module.exports = { OutputWriter };
|
|
@@ -24,19 +24,19 @@
|
|
|
24
24
|
* └── app.xml — application metadata
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
27
|
+
const { ZipManager } = require('../managers/ZipManager.js');
|
|
28
|
+
const { XMLParser } = require('../parsers/XMLParser.js');
|
|
29
|
+
const { ContentTypesManager } = require('../managers/ContentTypesManager.js');
|
|
30
|
+
const { SlideManager } = require('../managers/SlideManager.js');
|
|
31
|
+
const { ChartManager } = require('../managers/ChartManager.js');
|
|
32
|
+
const { TableManager } = require('../managers/TableManager.js');
|
|
33
|
+
const { HyperlinkManager } = require('../managers/HyperlinkManager.js');
|
|
34
|
+
const { MediaManager } = require('../managers/MediaManager.js');
|
|
35
|
+
const { RelationshipManager } = require('../managers/RelationshipManager.js');
|
|
36
|
+
const { OutputWriter } = require('./OutputWriter.js');
|
|
37
|
+
const { TemplateEngine } = require('./TemplateEngine.js');
|
|
38
|
+
const { createLogger } = require('../utils/logger.js');
|
|
39
|
+
const { PPTXError } = require('../utils/errors.js');
|
|
40
40
|
|
|
41
41
|
const logger = createLogger('PPTXTemplater');
|
|
42
42
|
|
|
@@ -50,7 +50,7 @@ const logger = createLogger('PPTXTemplater');
|
|
|
50
50
|
* ppt.replaceText({ '{{title}}': 'My Report' });
|
|
51
51
|
* await ppt.saveToFile('./output/report.pptx');
|
|
52
52
|
*/
|
|
53
|
-
|
|
53
|
+
class PPTXTemplater {
|
|
54
54
|
/**
|
|
55
55
|
* @private
|
|
56
56
|
* @type {ZipManager}
|
|
@@ -781,8 +781,8 @@ export class PPTXTemplater {
|
|
|
781
781
|
this.#assertLoaded();
|
|
782
782
|
const issues = { valid: true, errors: [], warnings: [] };
|
|
783
783
|
|
|
784
|
-
// We lazy
|
|
785
|
-
const { ChartRelationshipManager } =
|
|
784
|
+
// We lazy require ChartRelationshipManager so we don't circularly depend if not needed
|
|
785
|
+
const { ChartRelationshipManager } = require('../managers/charts/ChartRelationshipManager.js');
|
|
786
786
|
|
|
787
787
|
const chartFiles = this.#zipManager.listFiles('ppt/charts/')
|
|
788
788
|
.filter(f => {
|
|
@@ -959,3 +959,5 @@ export class PPTXTemplater {
|
|
|
959
959
|
get hyperlinkManager() { return this.#hyperlinkManager; }
|
|
960
960
|
get mediaManager() { return this.#mediaManager; }
|
|
961
961
|
}
|
|
962
|
+
|
|
963
|
+
module.exports = { PPTXTemplater };
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
* This "text normalization" approach correctly handles fragmented placeholders.
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
const { createLogger } = require('../utils/logger.js');
|
|
30
30
|
|
|
31
31
|
const logger = createLogger('TemplateEngine');
|
|
32
32
|
|
|
@@ -42,7 +42,7 @@ const DEFAULT_PLACEHOLDER_PATTERN = /\{\{([^{}]+)\}\}/g;
|
|
|
42
42
|
*
|
|
43
43
|
* Implements the text-normalization strategy to handle fragmented placeholders.
|
|
44
44
|
*/
|
|
45
|
-
|
|
45
|
+
class TemplateEngine {
|
|
46
46
|
/** @private @type {XMLParser} */
|
|
47
47
|
#xmlParser;
|
|
48
48
|
|
|
@@ -319,3 +319,5 @@ export class TemplateEngine {
|
|
|
319
319
|
.replace(/'/g, "'");
|
|
320
320
|
}
|
|
321
321
|
}
|
|
322
|
+
|
|
323
|
+
module.exports = { TemplateEngine };
|
package/src/index.js
CHANGED
|
@@ -24,20 +24,43 @@
|
|
|
24
24
|
* └─────────────────────────────────────────────────────────────┘
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
27
|
+
const { PPTXTemplater } = require('./core/PPTXTemplater.js');
|
|
28
|
+
const { ZipManager } = require('./managers/ZipManager.js');
|
|
29
|
+
const { XMLParser } = require('./parsers/XMLParser.js');
|
|
30
|
+
const { SlideManager } = require('./managers/SlideManager.js');
|
|
31
|
+
const { ChartManager } = require('./managers/ChartManager.js');
|
|
32
|
+
const { TableManager } = require('./managers/TableManager.js');
|
|
33
|
+
const { HyperlinkManager } = require('./managers/HyperlinkManager.js');
|
|
34
|
+
const { MediaManager } = require('./managers/MediaManager.js');
|
|
35
|
+
const { RelationshipManager } = require('./managers/RelationshipManager.js');
|
|
36
|
+
const { OutputWriter } = require('./core/OutputWriter.js');
|
|
37
|
+
const { TemplateEngine } = require('./core/TemplateEngine.js');
|
|
38
38
|
|
|
39
39
|
// Utility exports
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
40
|
+
const { generateRelationshipId, parseRelationshipId } = require('./utils/relationshipUtils.js');
|
|
41
|
+
const { validateXML, repairXML } = require('./utils/xmlUtils.js');
|
|
42
|
+
const { createLogger } = require('./utils/logger.js');
|
|
43
|
+
const { PPTXError, SlideNotFoundError, ChartNotFoundError, TableNotFoundError } = require('./utils/errors.js');
|
|
44
|
+
|
|
45
|
+
module.exports = {
|
|
46
|
+
PPTXTemplater,
|
|
47
|
+
ZipManager,
|
|
48
|
+
XMLParser,
|
|
49
|
+
SlideManager,
|
|
50
|
+
ChartManager,
|
|
51
|
+
TableManager,
|
|
52
|
+
HyperlinkManager,
|
|
53
|
+
MediaManager,
|
|
54
|
+
RelationshipManager,
|
|
55
|
+
OutputWriter,
|
|
56
|
+
TemplateEngine,
|
|
57
|
+
generateRelationshipId,
|
|
58
|
+
parseRelationshipId,
|
|
59
|
+
validateXML,
|
|
60
|
+
repairXML,
|
|
61
|
+
createLogger,
|
|
62
|
+
PPTXError,
|
|
63
|
+
SlideNotFoundError,
|
|
64
|
+
ChartNotFoundError,
|
|
65
|
+
TableNotFoundError
|
|
66
|
+
};
|
|
@@ -39,11 +39,11 @@
|
|
|
39
39
|
* We update both to ensure compatibility with both cached and live data.
|
|
40
40
|
*/
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
42
|
+
const { createLogger } = require('../utils/logger.js');
|
|
43
|
+
const { ChartNotFoundError } = require('../utils/errors.js');
|
|
44
|
+
const { REL_TYPES } = require('./RelationshipManager.js');
|
|
45
|
+
const { ChartWorkbookUpdater } = require('./charts/ChartWorkbookUpdater.js');
|
|
46
|
+
const { ChartCacheGenerator } = require('./charts/ChartCacheGenerator.js');
|
|
47
47
|
|
|
48
48
|
const logger = createLogger('ChartManager');
|
|
49
49
|
|
|
@@ -69,7 +69,7 @@ const CHART_TYPE_MAP = {
|
|
|
69
69
|
* Unlike high-level charting libraries, this manager edits the raw OpenXML
|
|
70
70
|
* chart structure, allowing full control while preserving styles and themes.
|
|
71
71
|
*/
|
|
72
|
-
|
|
72
|
+
class ChartManager {
|
|
73
73
|
/** @private @type {XMLParser} */
|
|
74
74
|
#xmlParser;
|
|
75
75
|
/** @private @type {ZipManager} */
|
|
@@ -315,3 +315,5 @@ export class ChartManager {
|
|
|
315
315
|
return 'unknown';
|
|
316
316
|
}
|
|
317
317
|
}
|
|
318
|
+
|
|
319
|
+
module.exports = { ChartManager };
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
* Implements structured, XML-safe manipulation of the OPC manifest.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
const { createLogger } = require('../utils/logger.js');
|
|
8
|
+
const { PPTXError } = require('../utils/errors.js');
|
|
9
9
|
|
|
10
10
|
const logger = createLogger('ContentTypesManager');
|
|
11
11
|
|
|
12
12
|
const TYPES_XML_PATH = '[Content_Types].xml';
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
class ContentTypesManager {
|
|
15
15
|
/** @private @type {XMLParser} */
|
|
16
16
|
#xmlParser;
|
|
17
17
|
|
|
@@ -158,3 +158,5 @@ export class ContentTypesManager {
|
|
|
158
158
|
logger.debug(`Flushed ${TYPES_XML_PATH}`);
|
|
159
159
|
}
|
|
160
160
|
}
|
|
161
|
+
|
|
162
|
+
module.exports = { ContentTypesManager };
|
|
@@ -31,9 +31,9 @@
|
|
|
31
31
|
* Use <a:hlinkMouseOver r:id="..."/> instead of hlinkClick.
|
|
32
32
|
*/
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
const { createLogger } = require('../utils/logger.js');
|
|
35
|
+
const { PPTXError } = require('../utils/errors.js');
|
|
36
|
+
const { REL_TYPES } = require('./RelationshipManager.js');
|
|
37
37
|
|
|
38
38
|
const logger = createLogger('HyperlinkManager');
|
|
39
39
|
|
|
@@ -41,7 +41,7 @@ const logger = createLogger('HyperlinkManager');
|
|
|
41
41
|
* @class HyperlinkManager
|
|
42
42
|
* @description Manages hyperlink creation and modification in PPTX slides.
|
|
43
43
|
*/
|
|
44
|
-
|
|
44
|
+
class HyperlinkManager {
|
|
45
45
|
/** @private @type {XMLParser} */
|
|
46
46
|
#xmlParser;
|
|
47
47
|
/** @private @type {RelationshipManager} */
|
|
@@ -449,3 +449,5 @@ export class HyperlinkManager {
|
|
|
449
449
|
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
450
450
|
}
|
|
451
451
|
}
|
|
452
|
+
|
|
453
|
+
module.exports = { HyperlinkManager };
|
|
@@ -36,11 +36,11 @@
|
|
|
36
36
|
* Audio: MP3, WAV, M4A
|
|
37
37
|
*/
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
39
|
+
const { createHash } = require('crypto');
|
|
40
|
+
const { createLogger } = require('../utils/logger.js');
|
|
41
|
+
const { PPTXError } = require('../utils/errors.js');
|
|
42
|
+
const { REL_TYPES } = require('./RelationshipManager.js');
|
|
43
|
+
const fsExtra = require('fs-extra');
|
|
44
44
|
|
|
45
45
|
const logger = createLogger('MediaManager');
|
|
46
46
|
|
|
@@ -84,7 +84,7 @@ const EXT_TO_MIME = {
|
|
|
84
84
|
* @class MediaManager
|
|
85
85
|
* @description Manages media embedding, deduplication, and retrieval in PPTX files.
|
|
86
86
|
*/
|
|
87
|
-
|
|
87
|
+
class MediaManager {
|
|
88
88
|
/** @private @type {ContentTypesManager} */
|
|
89
89
|
#contentTypesManager;
|
|
90
90
|
/** @private @type {ZipManager} */
|
|
@@ -305,3 +305,5 @@ export class MediaManager {
|
|
|
305
305
|
this.#contentTypesManager.addDefault(ext, mimeType);
|
|
306
306
|
}
|
|
307
307
|
}
|
|
308
|
+
|
|
309
|
+
module.exports = { MediaManager };
|
|
@@ -35,9 +35,9 @@
|
|
|
35
35
|
* - .../slideToSlide → slide → another slide (inter-slide link)
|
|
36
36
|
*/
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
const { createLogger } = require('../utils/logger.js');
|
|
39
|
+
const { PPTXError } = require('../utils/errors.js');
|
|
40
|
+
const { generateRelationshipId } = require('../utils/relationshipUtils.js');
|
|
41
41
|
|
|
42
42
|
const logger = createLogger('RelationshipManager');
|
|
43
43
|
|
|
@@ -45,7 +45,7 @@ const logger = createLogger('RelationshipManager');
|
|
|
45
45
|
* OpenXML relationship type constants.
|
|
46
46
|
* Using shortened forms; full URIs are in the OpenXML spec.
|
|
47
47
|
*/
|
|
48
|
-
|
|
48
|
+
const REL_TYPES = {
|
|
49
49
|
SLIDE: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide',
|
|
50
50
|
SLIDE_LAYOUT: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout',
|
|
51
51
|
SLIDE_MASTER: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster',
|
|
@@ -70,7 +70,7 @@ export const REL_TYPES = {
|
|
|
70
70
|
* - ppt/presentation.xml → ppt/_rels/presentation.xml.rels
|
|
71
71
|
* - ppt/slides/slide1.xml → ppt/slides/_rels/slide1.xml.rels
|
|
72
72
|
*/
|
|
73
|
-
|
|
73
|
+
class RelationshipManager {
|
|
74
74
|
/**
|
|
75
75
|
* @private
|
|
76
76
|
* @type {XMLParser}
|
|
@@ -399,3 +399,5 @@ export class RelationshipManager {
|
|
|
399
399
|
logger.debug(`Removed ${removedCount} orphan relationship(s).`);
|
|
400
400
|
}
|
|
401
401
|
}
|
|
402
|
+
|
|
403
|
+
module.exports = { REL_TYPES, RelationshipManager };
|
|
@@ -24,12 +24,12 @@
|
|
|
24
24
|
* - p:cxnSp → Connectors
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
const { createLogger } = require('../utils/logger.js');
|
|
28
|
+
const { PPTXError, SlideNotFoundError } = require('../utils/errors.js');
|
|
29
|
+
const { REL_TYPES } = require('./RelationshipManager.js');
|
|
30
|
+
const { buildNewSlideXml } = require('../templates/slideTemplate.js');
|
|
31
|
+
const { generateUniqueId } = require('../utils/idUtils.js');
|
|
32
|
+
const { remapRelationshipIds } = require('../utils/relationshipUtils.js');
|
|
33
33
|
|
|
34
34
|
const logger = createLogger('SlideManager');
|
|
35
35
|
|
|
@@ -50,7 +50,7 @@ const SLIDE_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.presen
|
|
|
50
50
|
* @class SlideManager
|
|
51
51
|
* @description Manages slide loading, ordering, modification, and creation.
|
|
52
52
|
*/
|
|
53
|
-
|
|
53
|
+
class SlideManager {
|
|
54
54
|
/** @private @type {XMLParser} */
|
|
55
55
|
#xmlParser;
|
|
56
56
|
/** @private @type {RelationshipManager} */
|
|
@@ -733,7 +733,7 @@ export class SlideManager {
|
|
|
733
733
|
*/
|
|
734
734
|
async exportSlides(slideIndices, sourceEngine) {
|
|
735
735
|
// Lazy import to avoid circular dep
|
|
736
|
-
const { PPTXTemplater } =
|
|
736
|
+
const { PPTXTemplater } = require('../core/PPTXTemplater.js');
|
|
737
737
|
|
|
738
738
|
// Create a blank new PPTX
|
|
739
739
|
const newEngine = await PPTXTemplater.create();
|
|
@@ -948,3 +948,5 @@ export class SlideManager {
|
|
|
948
948
|
}
|
|
949
949
|
}
|
|
950
950
|
}
|
|
951
|
+
|
|
952
|
+
module.exports = { SlideManager };
|
|
@@ -45,8 +45,8 @@
|
|
|
45
45
|
* - <a:tc vMerge="1"> → continuation of vertical merge
|
|
46
46
|
*/
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
const { createLogger } = require('../utils/logger.js');
|
|
49
|
+
const { TableNotFoundError } = require('../utils/errors.js');
|
|
50
50
|
|
|
51
51
|
const logger = createLogger('TableManager');
|
|
52
52
|
|
|
@@ -57,7 +57,7 @@ const logger = createLogger('TableManager');
|
|
|
57
57
|
* The key design principle is "preserve formatting, replace content".
|
|
58
58
|
* We never touch table styles, borders, or fonts — only the text.
|
|
59
59
|
*/
|
|
60
|
-
|
|
60
|
+
class TableManager {
|
|
61
61
|
/** @private @type {XMLParser} */
|
|
62
62
|
#xmlParser;
|
|
63
63
|
|
|
@@ -414,3 +414,5 @@ export class TableManager {
|
|
|
414
414
|
return tables;
|
|
415
415
|
}
|
|
416
416
|
}
|
|
417
|
+
|
|
418
|
+
module.exports = { TableManager };
|