@mulmocast/slide 0.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.
Files changed (47) hide show
  1. package/README.md +458 -0
  2. package/lib/actions/bundle.d.ts +3 -0
  3. package/lib/actions/bundle.d.ts.map +1 -0
  4. package/lib/actions/bundle.js +60 -0
  5. package/lib/actions/bundle.js.map +1 -0
  6. package/lib/actions/common.d.ts +21 -0
  7. package/lib/actions/common.d.ts.map +1 -0
  8. package/lib/actions/common.js +159 -0
  9. package/lib/actions/common.js.map +1 -0
  10. package/lib/actions/movie.d.ts +3 -0
  11. package/lib/actions/movie.d.ts.map +1 -0
  12. package/lib/actions/movie.js +58 -0
  13. package/lib/actions/movie.js.map +1 -0
  14. package/lib/actions/upload.d.ts +6 -0
  15. package/lib/actions/upload.d.ts.map +1 -0
  16. package/lib/actions/upload.js +172 -0
  17. package/lib/actions/upload.js.map +1 -0
  18. package/lib/cli.d.ts +3 -0
  19. package/lib/cli.d.ts.map +1 -0
  20. package/lib/cli.js +301 -0
  21. package/lib/cli.js.map +1 -0
  22. package/lib/convert/marp.d.ts +22 -0
  23. package/lib/convert/marp.d.ts.map +1 -0
  24. package/lib/convert/marp.js +375 -0
  25. package/lib/convert/marp.js.map +1 -0
  26. package/lib/convert/pdf.d.ts +14 -0
  27. package/lib/convert/pdf.d.ts.map +1 -0
  28. package/lib/convert/pdf.js +130 -0
  29. package/lib/convert/pdf.js.map +1 -0
  30. package/lib/convert/pptx.d.ts +13 -0
  31. package/lib/convert/pptx.d.ts.map +1 -0
  32. package/lib/convert/pptx.js +138 -0
  33. package/lib/convert/pptx.js.map +1 -0
  34. package/lib/utils/lang.d.ts +16 -0
  35. package/lib/utils/lang.d.ts.map +1 -0
  36. package/lib/utils/lang.js +37 -0
  37. package/lib/utils/lang.js.map +1 -0
  38. package/lib/utils/llm.d.ts +21 -0
  39. package/lib/utils/llm.d.ts.map +1 -0
  40. package/lib/utils/llm.js +200 -0
  41. package/lib/utils/llm.js.map +1 -0
  42. package/lib/utils/pdf.d.ts +37 -0
  43. package/lib/utils/pdf.d.ts.map +1 -0
  44. package/lib/utils/pdf.js +142 -0
  45. package/lib/utils/pdf.js.map +1 -0
  46. package/package.json +67 -0
  47. package/tools/keynote/extract.scpt +195 -0
@@ -0,0 +1,375 @@
1
+ #!/usr/bin/env tsx
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.parseSlides = parseSlides;
41
+ exports.extractNotesFromSlide = extractNotesFromSlide;
42
+ exports.extractNotesFromSlides = extractNotesFromSlides;
43
+ exports.extractMarkdownFromSlide = extractMarkdownFromSlide;
44
+ exports.extractMarkdownFromSlides = extractMarkdownFromSlides;
45
+ exports.convertMarp = convertMarp;
46
+ const fs = __importStar(require("fs"));
47
+ const path = __importStar(require("path"));
48
+ const child_process_1 = require("child_process");
49
+ const mulmocast_1 = require("mulmocast");
50
+ const yargs_1 = __importDefault(require("yargs"));
51
+ const helpers_1 = require("yargs/helpers");
52
+ const lang_1 = require("../utils/lang");
53
+ const llm_1 = require("../utils/llm");
54
+ // Parse markdown content into slides (removes YAML front matter)
55
+ function parseSlides(content) {
56
+ // Split by slide separator
57
+ const slides = content.split(/\n---\n/);
58
+ // Remove YAML front matter (first section if it starts with ---)
59
+ if (slides.length > 0 && slides[0].trim().startsWith("---")) {
60
+ slides.shift();
61
+ }
62
+ return slides;
63
+ }
64
+ // Extract notes from a single slide
65
+ function extractNotesFromSlide(slideContent) {
66
+ const commentRegex = /<!--\s*([\s\S]*?)\s*-->/g;
67
+ const matches = [...slideContent.matchAll(commentRegex)].map((m) => m[1].trim());
68
+ return matches.join("\n");
69
+ }
70
+ // Extract speaker notes from parsed slides
71
+ function extractNotesFromSlides(slides) {
72
+ const notes = [];
73
+ for (const slide of slides) {
74
+ const slideNotes = extractNotesFromSlide(slide);
75
+ notes.push(slideNotes);
76
+ }
77
+ return notes;
78
+ }
79
+ // Extract markdown content from a single slide (removes HTML comments)
80
+ function extractMarkdownFromSlide(slideContent) {
81
+ // Remove HTML comments (speaker notes)
82
+ const slideWithoutNotes = slideContent.replace(/<!--\s*[\s\S]*?\s*-->/g, "");
83
+ // Split into lines, trim, and filter out empty lines
84
+ const lines = slideWithoutNotes
85
+ .split("\n")
86
+ .map((line) => line.trim())
87
+ .filter((line) => line.length > 0);
88
+ return lines;
89
+ }
90
+ // Extract markdown content from parsed slides
91
+ function extractMarkdownFromSlides(slides) {
92
+ const slideMarkdowns = [];
93
+ for (const slide of slides) {
94
+ slideMarkdowns.push(extractMarkdownFromSlide(slide));
95
+ }
96
+ return slideMarkdowns;
97
+ }
98
+ // Setup output directories
99
+ function setupOutputDirectories(basename, customOutputDir) {
100
+ const outputFolder = customOutputDir || path.join(process.cwd(), "scripts", basename);
101
+ const outputImagesFolder = path.join(outputFolder, "images");
102
+ // Create directories if they don't exist
103
+ if (!fs.existsSync(outputFolder)) {
104
+ fs.mkdirSync(outputFolder, { recursive: true });
105
+ }
106
+ if (!fs.existsSync(outputImagesFolder)) {
107
+ fs.mkdirSync(outputImagesFolder, { recursive: true });
108
+ }
109
+ // Clean existing PNG files
110
+ const files = fs.readdirSync(outputImagesFolder);
111
+ for (const file of files) {
112
+ if (file.endsWith(".png")) {
113
+ fs.unlinkSync(path.join(outputImagesFolder, file));
114
+ }
115
+ }
116
+ return outputFolder;
117
+ }
118
+ // Extract speaker notes from markdown file
119
+ function extractSpeakerNotes(markdownPath) {
120
+ const content = fs.readFileSync(markdownPath, "utf-8");
121
+ const slides = parseSlides(content);
122
+ return extractNotesFromSlides(slides);
123
+ }
124
+ // Render slides to images using Marp CLI
125
+ function renderSlidesToImages(markdownPath, outputFolder, themePath, allowLocalFiles = false) {
126
+ const imagesFolder = path.join(outputFolder, "images");
127
+ // Build Marp CLI command with optional theme and allow-local-files
128
+ const marpCommand = [
129
+ `npx @marp-team/marp-cli "${markdownPath}" -o "${imagesFolder}/slide.png" --images png`,
130
+ themePath ? `--theme "${themePath}"` : "",
131
+ allowLocalFiles ? "--allow-local-files" : "",
132
+ ]
133
+ .filter(Boolean)
134
+ .join(" ");
135
+ // Execute Marp CLI to generate PNG images directly
136
+ try {
137
+ (0, child_process_1.execSync)(marpCommand, {
138
+ stdio: "inherit",
139
+ });
140
+ }
141
+ catch (error) {
142
+ console.error("Error: Failed to render Marp presentation to images", error);
143
+ console.error("Make sure @marp-team/marp-cli is installed");
144
+ throw new Error("Failed to render Marp presentation");
145
+ }
146
+ // Count generated images
147
+ const files = fs.readdirSync(imagesFolder);
148
+ const imageFiles = files.filter((f) => f.startsWith("slide.") && f.endsWith(".png"));
149
+ const slideCount = imageFiles.length;
150
+ // Rename generated images to match expected format (images.001.png, etc.)
151
+ renameGeneratedImages(imagesFolder, slideCount);
152
+ return slideCount;
153
+ }
154
+ // Rename Marp-generated images to expected format
155
+ function renameGeneratedImages(imagesFolder, slideCount) {
156
+ Array.from({ length: slideCount }, (_, i) => i + 1).forEach((i) => {
157
+ const marpFilename = `slide.${String(i).padStart(3, "0")}.png`;
158
+ const expectedFilename = `images.${String(i).padStart(3, "0")}.png`;
159
+ const marpPath = path.join(imagesFolder, marpFilename);
160
+ const expectedPath = path.join(imagesFolder, expectedFilename);
161
+ if (fs.existsSync(marpPath)) {
162
+ fs.renameSync(marpPath, expectedPath);
163
+ }
164
+ });
165
+ }
166
+ // Generate MulmoScript JSON with image paths
167
+ function generateMulmoScriptImage(notes, slideCount, outputFolder, lang) {
168
+ const imagesFolder = path.join(outputFolder, "images");
169
+ // Align notes array length with slide count
170
+ while (notes.length < slideCount) {
171
+ notes.push("");
172
+ }
173
+ const beats = notes.slice(0, slideCount).map((note, index) => {
174
+ const slideNum = String(index + 1).padStart(3, "0");
175
+ const imagePath = path.join(imagesFolder, `images.${slideNum}.png`);
176
+ return {
177
+ text: note || "",
178
+ image: {
179
+ type: "image",
180
+ source: {
181
+ kind: "path",
182
+ path: imagePath,
183
+ },
184
+ },
185
+ };
186
+ });
187
+ const mulmocast = {
188
+ $mulmocast: {
189
+ version: "1.1",
190
+ credit: "closing",
191
+ },
192
+ lang,
193
+ beats,
194
+ };
195
+ // Validate mulmoScript
196
+ const result = mulmocast_1.mulmoScriptSchema.safeParse(mulmocast);
197
+ if (!result.success) {
198
+ console.error("MulmoScript validation failed:");
199
+ console.error(result.error.format());
200
+ throw new Error("Invalid MulmoScript generated");
201
+ }
202
+ const scriptPath = path.join(outputFolder, "mulmo_script.json");
203
+ fs.writeFileSync(scriptPath, JSON.stringify(result.data, null, 2), "utf-8");
204
+ return scriptPath;
205
+ }
206
+ // Extract markdown content from each slide in a file
207
+ function extractSlideMarkdown(markdownPath) {
208
+ const content = fs.readFileSync(markdownPath, "utf-8");
209
+ const slides = parseSlides(content);
210
+ return extractMarkdownFromSlides(slides);
211
+ }
212
+ // Generate MulmoScript JSON with Markdown
213
+ function generateMulmoScriptMarkdown(notes, slideMarkdowns, outputFolder, lang) {
214
+ // Align notes array length with slide count
215
+ while (notes.length < slideMarkdowns.length) {
216
+ notes.push("");
217
+ }
218
+ const beats = slideMarkdowns.map((markdown, index) => {
219
+ return {
220
+ text: notes[index] || "",
221
+ image: {
222
+ type: "markdown",
223
+ markdown,
224
+ },
225
+ };
226
+ });
227
+ const mulmocast = {
228
+ $mulmocast: {
229
+ version: "1.1",
230
+ credit: "closing",
231
+ },
232
+ lang,
233
+ beats,
234
+ };
235
+ // Validate mulmoScript
236
+ const result = mulmocast_1.mulmoScriptSchema.safeParse(mulmocast);
237
+ if (!result.success) {
238
+ console.error("MulmoScript (markdown) validation failed:");
239
+ console.error(result.error.format());
240
+ throw new Error("Invalid MulmoScript generated");
241
+ }
242
+ const scriptPath = path.join(outputFolder, "mulmo_script-markdown.json");
243
+ fs.writeFileSync(scriptPath, JSON.stringify(result.data, null, 2), "utf-8");
244
+ return scriptPath;
245
+ }
246
+ // Cleanup temporary files
247
+ function cleanupTempFiles(outputFolder) {
248
+ const tempFolder = path.join(outputFolder, ".temp");
249
+ if (fs.existsSync(tempFolder)) {
250
+ fs.rmSync(tempFolder, { recursive: true, force: true });
251
+ }
252
+ }
253
+ // Main conversion function (exported for use by movie command)
254
+ async function convertMarp(options) {
255
+ const inputPath = path.resolve(options.inputPath);
256
+ const themePath = options.themePath ? path.resolve(options.themePath) : undefined;
257
+ const allowLocalFiles = options.allowLocalFiles ?? false;
258
+ const lang = (0, lang_1.resolveLang)(options.lang);
259
+ const generateText = options.generateText ?? false;
260
+ if (!fs.existsSync(inputPath)) {
261
+ throw new Error(`File not found: ${inputPath}`);
262
+ }
263
+ if (!inputPath.endsWith(".md")) {
264
+ throw new Error("Input file must be a .md (Markdown) file");
265
+ }
266
+ if (themePath && !fs.existsSync(themePath)) {
267
+ throw new Error(`Theme file not found: ${themePath}`);
268
+ }
269
+ console.log("Starting Marp to MulmoScript conversion...\n");
270
+ console.log(`Input file: ${inputPath}`);
271
+ if (themePath) {
272
+ console.log(`Custom theme: ${themePath}`);
273
+ }
274
+ if (allowLocalFiles) {
275
+ console.log(`Allow local files: enabled`);
276
+ }
277
+ // Get basename from input file
278
+ const basename = path.basename(inputPath, ".md");
279
+ // Setup output directories
280
+ const outputFolder = setupOutputDirectories(basename, options.outputDir);
281
+ console.log(`Output directory: ${outputFolder}`);
282
+ // Extract speaker notes
283
+ const notes = extractSpeakerNotes(inputPath);
284
+ console.log(`Extracted ${notes.length} speaker notes`);
285
+ // Render to images
286
+ console.log("Rendering slides to images...");
287
+ const slideCount = renderSlidesToImages(inputPath, outputFolder, themePath, allowLocalFiles);
288
+ console.log(`Rendered ${slideCount} slides`);
289
+ // Extract markdown for markdown format
290
+ console.log("Extracting slide markdown...");
291
+ const slideMarkdowns = extractSlideMarkdown(inputPath);
292
+ console.log(`Extracted ${slideMarkdowns.length} slide markdowns`);
293
+ // Generate text using LLM if requested
294
+ if (generateText) {
295
+ console.log("Generating narration text with LLM...");
296
+ const slides = slideMarkdowns.map((markdown, index) => ({
297
+ index,
298
+ markdown,
299
+ existingText: notes[index] || "",
300
+ }));
301
+ const generatedTexts = await (0, llm_1.generateTextFromMarkdown)({
302
+ slides,
303
+ lang,
304
+ title: basename,
305
+ });
306
+ for (const generated of generatedTexts) {
307
+ if (generated.index < notes.length) {
308
+ notes[generated.index] = generated.text;
309
+ }
310
+ else {
311
+ notes.push(generated.text);
312
+ }
313
+ }
314
+ console.log(`Generated text for ${generatedTexts.length} slides`);
315
+ }
316
+ // Generate both MulmoScript formats
317
+ console.log("Generating MulmoScript JSON files...");
318
+ const mulmoScriptPath = generateMulmoScriptImage(notes, slideCount, outputFolder, lang);
319
+ console.log(`✓ Created ${mulmoScriptPath} (PNG format)`);
320
+ const markdownScriptPath = generateMulmoScriptMarkdown(notes, slideMarkdowns, outputFolder, lang);
321
+ console.log(`✓ Created ${markdownScriptPath} (Markdown format)`);
322
+ // Cleanup
323
+ cleanupTempFiles(outputFolder);
324
+ console.log(`\n✓ Successfully generated MulmoScript with ${slideCount} slides`);
325
+ return {
326
+ mulmoScriptPath,
327
+ markdownScriptPath,
328
+ slideCount,
329
+ };
330
+ }
331
+ async function main() {
332
+ const argv = await (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
333
+ .usage("Usage: $0 <marp-file.md> [options]")
334
+ .command("$0 <file>", "Convert Marp markdown to MulmoScript", (yargs) => {
335
+ return yargs.positional("file", {
336
+ describe: "Marp markdown file to convert",
337
+ type: "string",
338
+ demandOption: true,
339
+ });
340
+ })
341
+ .options({
342
+ ...lang_1.langOption,
343
+ theme: {
344
+ type: "string",
345
+ description: "Path to custom theme CSS file",
346
+ },
347
+ "allow-local-files": {
348
+ type: "boolean",
349
+ description: "Allow local file access in Marp",
350
+ default: false,
351
+ },
352
+ g: {
353
+ alias: "generate-text",
354
+ type: "boolean",
355
+ description: "Generate narration text using LLM",
356
+ default: false,
357
+ },
358
+ })
359
+ .help()
360
+ .parse();
361
+ await convertMarp({
362
+ inputPath: argv.file,
363
+ lang: argv.l,
364
+ themePath: argv.theme,
365
+ allowLocalFiles: argv["allow-local-files"],
366
+ generateText: argv.g,
367
+ });
368
+ }
369
+ if (require.main === module) {
370
+ main().catch((error) => {
371
+ console.error("\n✗ Error:", error instanceof Error ? error.message : String(error));
372
+ process.exit(1);
373
+ });
374
+ }
375
+ //# sourceMappingURL=marp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marp.js","sourceRoot":"","sources":["../../src/convert/marp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env tsx
2
+ import { type SupportedLang } from "../utils/lang";
3
+ export interface ConvertPdfOptions {
4
+ inputPath: string;
5
+ outputDir?: string;
6
+ lang?: SupportedLang;
7
+ generateText?: boolean;
8
+ }
9
+ export interface ConvertPdfResult {
10
+ mulmoScriptPath: string;
11
+ slideCount: number;
12
+ }
13
+ export declare function convertPdf(options: ConvertPdfOptions): Promise<ConvertPdfResult>;
14
+ //# sourceMappingURL=pdf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../src/convert/pdf.ts"],"names":[],"mappings":";AAMA,OAAO,EAA2B,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAQ5E,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0DtF"}
@@ -0,0 +1,130 @@
1
+ #!/usr/bin/env tsx
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.convertPdf = convertPdf;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const yargs_1 = __importDefault(require("yargs"));
44
+ const helpers_1 = require("yargs/helpers");
45
+ const lang_1 = require("../utils/lang");
46
+ const pdf_1 = require("../utils/pdf");
47
+ async function convertPdf(options) {
48
+ const { inputPath, lang, generateText = false } = options;
49
+ const resolvedLang = (0, lang_1.resolveLang)(lang);
50
+ const pdfFile = path.resolve(inputPath);
51
+ if (!fs.existsSync(pdfFile)) {
52
+ throw new Error(`File not found: ${pdfFile}`);
53
+ }
54
+ const basename = path.basename(pdfFile, ".pdf");
55
+ const outputDir = options.outputDir || path.join("scripts", basename);
56
+ const imagesDir = path.join(outputDir, "images");
57
+ // Create output directories
58
+ if (!fs.existsSync(outputDir)) {
59
+ fs.mkdirSync(outputDir, { recursive: true });
60
+ }
61
+ console.log(`Converting ${pdfFile} to ${outputDir}/`);
62
+ // Convert PDF to PNG images
63
+ console.log("Converting PDF to images...");
64
+ const { slideCount } = (0, pdf_1.convertPdfToImages)({
65
+ pdfPath: pdfFile,
66
+ imagesDir,
67
+ basename,
68
+ });
69
+ // Extract text from PDF if generating narration
70
+ const extractedTexts = [];
71
+ if (generateText) {
72
+ console.log("Extracting text from PDF...");
73
+ const pageTexts = await (0, pdf_1.extractTextFromPdf)(pdfFile);
74
+ pageTexts.forEach((page) => {
75
+ extractedTexts[page.pageNumber] = page.text;
76
+ });
77
+ console.log(`Extracted text from ${pageTexts.length} pages`);
78
+ }
79
+ // Build MulmoScript
80
+ const { mulmoScript } = await (0, pdf_1.buildMulmoScriptFromImages)({
81
+ slideCount,
82
+ imagesDir,
83
+ basename,
84
+ lang: resolvedLang,
85
+ extractedTexts,
86
+ generateText,
87
+ title: basename,
88
+ });
89
+ // Write MulmoScript to JSON file
90
+ const jsonPath = path.join(outputDir, "mulmo_script.json");
91
+ (0, pdf_1.writeMulmoScript)(mulmoScript, jsonPath);
92
+ return {
93
+ mulmoScriptPath: jsonPath,
94
+ slideCount,
95
+ };
96
+ }
97
+ async function main() {
98
+ const argv = await (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
99
+ .usage("Usage: $0 <pdf-file> [options]")
100
+ .command("$0 <file>", "Convert PDF to MulmoScript", (yargs) => {
101
+ return yargs.positional("file", {
102
+ describe: "PDF file to convert",
103
+ type: "string",
104
+ demandOption: true,
105
+ });
106
+ })
107
+ .options({
108
+ ...lang_1.langOption,
109
+ g: {
110
+ alias: "generate-text",
111
+ type: "boolean",
112
+ description: "Generate narration text using LLM",
113
+ default: false,
114
+ },
115
+ })
116
+ .help()
117
+ .parse();
118
+ await convertPdf({
119
+ inputPath: argv.file,
120
+ lang: argv.l,
121
+ generateText: argv.g,
122
+ });
123
+ }
124
+ if (require.main === module) {
125
+ main().catch((error) => {
126
+ console.error("Error:", error.message);
127
+ process.exit(1);
128
+ });
129
+ }
130
+ //# sourceMappingURL=pdf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../src/convert/pdf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type SupportedLang } from "../utils/lang";
2
+ export interface ConvertPptxOptions {
3
+ inputPath: string;
4
+ outputDir?: string;
5
+ lang?: SupportedLang;
6
+ generateText?: boolean;
7
+ }
8
+ export interface ConvertPptxResult {
9
+ mulmoScriptPath: string;
10
+ slideCount: number;
11
+ }
12
+ export declare function convertPptx(options: ConvertPptxOptions): Promise<ConvertPptxResult>;
13
+ //# sourceMappingURL=pptx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pptx.d.ts","sourceRoot":"","sources":["../../src/convert/pptx.ts"],"names":[],"mappings":"AAMA,OAAO,EAA2B,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAG5E,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoEzF"}