@mulmocast/slide 0.1.7 → 0.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 +71 -0
- package/lib/actions/bundle.js +14 -20
- package/lib/actions/bundle.js.map +1 -1
- package/lib/actions/common.d.ts +1 -1
- package/lib/actions/common.d.ts.map +1 -1
- package/lib/actions/common.js +26 -66
- package/lib/actions/common.js.map +1 -1
- package/lib/actions/movie.js +14 -20
- package/lib/actions/movie.js.map +1 -1
- package/lib/actions/preview.d.ts.map +1 -1
- package/lib/actions/preview.js +19 -55
- package/lib/actions/preview.js.map +1 -1
- package/lib/actions/upload.js +5 -44
- package/lib/actions/upload.js.map +1 -1
- package/lib/cli.js +42 -73
- package/lib/cli.js.map +1 -1
- package/lib/convert/markdown-plugins/directive.d.ts +1 -1
- package/lib/convert/markdown-plugins/directive.d.ts.map +1 -1
- package/lib/convert/markdown-plugins/directive.js +2 -5
- package/lib/convert/markdown-plugins/directive.js.map +1 -1
- package/lib/convert/markdown-plugins/index.d.ts +2 -2
- package/lib/convert/markdown-plugins/index.d.ts.map +1 -1
- package/lib/convert/markdown-plugins/index.js +23 -30
- package/lib/convert/markdown-plugins/index.js.map +1 -1
- package/lib/convert/markdown-plugins/layout.d.ts +91 -0
- package/lib/convert/markdown-plugins/layout.d.ts.map +1 -0
- package/lib/convert/markdown-plugins/layout.js +251 -0
- package/lib/convert/markdown-plugins/layout.js.map +1 -0
- package/lib/convert/markdown-plugins/mermaid.d.ts +1 -1
- package/lib/convert/markdown-plugins/mermaid.d.ts.map +1 -1
- package/lib/convert/markdown-plugins/mermaid.js +2 -5
- package/lib/convert/markdown-plugins/mermaid.js.map +1 -1
- package/lib/convert/markdown-plugins/types.d.ts +2 -0
- package/lib/convert/markdown-plugins/types.d.ts.map +1 -1
- package/lib/convert/markdown-plugins/types.js +1 -2
- package/lib/convert/markdown-plugins/types.js.map +1 -1
- package/lib/convert/markdown-transform.d.ts +42 -0
- package/lib/convert/markdown-transform.d.ts.map +1 -0
- package/lib/convert/markdown-transform.js +58 -0
- package/lib/convert/markdown-transform.js.map +1 -0
- package/lib/convert/markdown-utils-common.d.ts +21 -0
- package/lib/convert/markdown-utils-common.d.ts.map +1 -0
- package/lib/convert/markdown-utils-common.js +51 -0
- package/lib/convert/markdown-utils-common.js.map +1 -0
- package/lib/convert/markdown-utils.d.ts +4 -17
- package/lib/convert/markdown-utils.d.ts.map +1 -1
- package/lib/convert/markdown-utils.js +10 -91
- package/lib/convert/markdown-utils.js.map +1 -1
- package/lib/convert/markdown.d.ts +1 -1
- package/lib/convert/markdown.d.ts.map +1 -1
- package/lib/convert/markdown.js +36 -88
- package/lib/convert/markdown.js.map +1 -1
- package/lib/convert/marp.d.ts +4 -11
- package/lib/convert/marp.d.ts.map +1 -1
- package/lib/convert/marp.js +25 -119
- package/lib/convert/marp.js.map +1 -1
- package/lib/convert/movie.d.ts +1 -1
- package/lib/convert/movie.d.ts.map +1 -1
- package/lib/convert/movie.js +26 -64
- package/lib/convert/movie.js.map +1 -1
- package/lib/convert/movie_bundle.js +5 -44
- package/lib/convert/movie_bundle.js.map +1 -1
- package/lib/convert/pdf.d.ts +1 -1
- package/lib/convert/pdf.d.ts.map +1 -1
- package/lib/convert/pdf.js +18 -56
- package/lib/convert/pdf.js.map +1 -1
- package/lib/convert/pptx.d.ts +1 -1
- package/lib/convert/pptx.d.ts.map +1 -1
- package/lib/convert/pptx.js +31 -68
- package/lib/convert/pptx.js.map +1 -1
- package/lib/index.browser.d.ts +13 -0
- package/lib/index.browser.d.ts.map +1 -0
- package/lib/index.browser.js +13 -0
- package/lib/index.browser.js.map +1 -0
- package/lib/index.common.d.ts +17 -0
- package/lib/index.common.d.ts.map +1 -0
- package/lib/index.common.js +18 -0
- package/lib/index.common.js.map +1 -0
- package/lib/index.node.d.ts +11 -0
- package/lib/index.node.d.ts.map +1 -0
- package/lib/index.node.js +13 -0
- package/lib/index.node.js.map +1 -0
- package/lib/utils/audio-save.js +8 -49
- package/lib/utils/audio-save.js.map +1 -1
- package/lib/utils/bundle-server.js +6 -45
- package/lib/utils/bundle-server.js.map +1 -1
- package/lib/utils/dependencies.js +6 -43
- package/lib/utils/dependencies.js.map +1 -1
- package/lib/utils/lang-common.d.ts +10 -0
- package/lib/utils/lang-common.d.ts.map +1 -0
- package/lib/utils/lang-common.js +11 -0
- package/lib/utils/lang-common.js.map +1 -0
- package/lib/utils/lang.d.ts +3 -4
- package/lib/utils/lang.d.ts.map +1 -1
- package/lib/utils/lang.js +11 -21
- package/lib/utils/lang.js.map +1 -1
- package/lib/utils/llm.d.ts +1 -1
- package/lib/utils/llm.d.ts.map +1 -1
- package/lib/utils/llm.js +6 -46
- package/lib/utils/llm.js.map +1 -1
- package/lib/utils/pdf.d.ts +1 -1
- package/lib/utils/pdf.d.ts.map +1 -1
- package/lib/utils/pdf.js +13 -52
- package/lib/utils/pdf.js.map +1 -1
- package/lib/vue/main.js +4 -9
- package/lib/vue/main.js.map +1 -1
- package/package.json +19 -8
package/README.md
CHANGED
|
@@ -291,6 +291,7 @@ yarn markdown path/to/document.md -s heading --mermaid --style corporate-blue
|
|
|
291
291
|
- `-s, --separator` - Slide separator mode (see below)
|
|
292
292
|
- `--mermaid` - Convert mermaid code blocks to mermaid beat type
|
|
293
293
|
- `--directive` - Remove Marp-style directives
|
|
294
|
+
- `--layout` - Auto-detect layout based on content (see below)
|
|
294
295
|
- `--style` - Markdown slide style (e.g., corporate-blue, finance-green)
|
|
295
296
|
|
|
296
297
|
**Separator Modes:**
|
|
@@ -306,6 +307,76 @@ yarn markdown path/to/document.md -s heading --mermaid --style corporate-blue
|
|
|
306
307
|
| `comment` | Split by `<!-- slide -->` | HTML-compatible |
|
|
307
308
|
| `page-break` | Split by `<!-- pagebreak -->` | Print-style documents |
|
|
308
309
|
|
|
310
|
+
**Layout Auto-Detection (`--layout`):**
|
|
311
|
+
|
|
312
|
+
When enabled, the converter automatically detects the best layout based on content.
|
|
313
|
+
|
|
314
|
+
Detection rules are evaluated in order (first match wins):
|
|
315
|
+
|
|
316
|
+
**Phase 1: Header Detection (H1)**
|
|
317
|
+
|
|
318
|
+
If markdown contains an H1 heading (`# Title`), it becomes the header and remaining content is analyzed:
|
|
319
|
+
|
|
320
|
+
```
|
|
321
|
+
┌─────────────────────────────────────┬─────────────────┬─────────────────────────────────┐
|
|
322
|
+
│ Content Pattern │ Layout │ Conditions │
|
|
323
|
+
├─────────────────────────────────────┼─────────────────┼─────────────────────────────────┤
|
|
324
|
+
│ H1 only │ (no layout) │ Only H1, no other content │
|
|
325
|
+
│ │ │ → default markdown (array) │
|
|
326
|
+
├─────────────────────────────────────┼─────────────────┼─────────────────────────────────┤
|
|
327
|
+
│ H1 + unstructured content │ header+content │ H1 + text without H2/H3 │
|
|
328
|
+
│ │ │ → { header, content: [...] } │
|
|
329
|
+
├─────────────────────────────────────┼─────────────────┼─────────────────────────────────┤
|
|
330
|
+
│ H1 + structured content │ header+row-2 │ H1 + content matching row-2/2x2 │
|
|
331
|
+
│ │ header+2x2 │ → { header, "row-2": [...] } │
|
|
332
|
+
└─────────────────────────────────────┴─────────────────┴─────────────────────────────────┘
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
**Phase 2: Content Layout Rules (no H1, or applied to content after H1)**
|
|
336
|
+
|
|
337
|
+
```
|
|
338
|
+
┌─────────────────────────────────────┬────────────┬─────────────────────────────────────┐
|
|
339
|
+
│ Content Pattern │ Layout │ Conditions │
|
|
340
|
+
├─────────────────────────────────────┼────────────┼─────────────────────────────────────┤
|
|
341
|
+
│ 1. Single code block + text │ row-2 │ Exactly 1 code block (```) │
|
|
342
|
+
│ │ │ Text content > 20 chars │
|
|
343
|
+
│ │ │ → [text, code] │
|
|
344
|
+
├─────────────────────────────────────┼────────────┼─────────────────────────────────────┤
|
|
345
|
+
│ 2. Single image + text │ row-2 │ Exactly 1 image (![]()) │
|
|
346
|
+
│ │ │ Text content > 20 chars │
|
|
347
|
+
│ │ │ → [text, image] │
|
|
348
|
+
├─────────────────────────────────────┼────────────┼─────────────────────────────────────┤
|
|
349
|
+
│ 3. 4+ H3 sections (short) │ 2x2 │ 4 or more ### headings │
|
|
350
|
+
│ │ │ Avg content < 200 chars │
|
|
351
|
+
│ │ │ → first 4 sections │
|
|
352
|
+
├─────────────────────────────────────┼────────────┼─────────────────────────────────────┤
|
|
353
|
+
│ 4. 4+ H2 sections (short) │ 2x2 │ 4 or more ## headings │
|
|
354
|
+
│ │ │ Avg content < 200 chars │
|
|
355
|
+
│ │ │ → first 4 sections │
|
|
356
|
+
├─────────────────────────────────────┼────────────┼─────────────────────────────────────┤
|
|
357
|
+
│ 5. 4+ H2 sections (long) │ row-2 │ 4 or more ## headings │
|
|
358
|
+
│ │ │ Avg content >= 200 chars │
|
|
359
|
+
│ │ │ → first 2 sections │
|
|
360
|
+
├─────────────────────────────────────┼────────────┼─────────────────────────────────────┤
|
|
361
|
+
│ 6. 2+ H2 sections │ row-2 │ 2 or more ## headings │
|
|
362
|
+
│ │ │ → first 2 sections │
|
|
363
|
+
├─────────────────────────────────────┼────────────┼─────────────────────────────────────┤
|
|
364
|
+
│ 7. Otherwise │ default │ No layout applied │
|
|
365
|
+
└─────────────────────────────────────┴────────────┴─────────────────────────────────────┘
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
**Notes:**
|
|
369
|
+
- "Meaningful text" = text without headings > 20 characters
|
|
370
|
+
- Multiple code blocks or images → no layout detected
|
|
371
|
+
- H3 has no fallback (only 2x2 if short, otherwise no layout)
|
|
372
|
+
- H1 always becomes header; remaining content is analyzed for structure
|
|
373
|
+
|
|
374
|
+
Example:
|
|
375
|
+
```bash
|
|
376
|
+
# Auto-detect layout for better visual presentation
|
|
377
|
+
mulmo-slide markdown document.md --layout --style corporate-blue
|
|
378
|
+
```
|
|
379
|
+
|
|
309
380
|
**Output:**
|
|
310
381
|
- `scripts/<basename>/mulmo_script.json` - MulmoScript JSON file (Markdown format)
|
|
311
382
|
|
package/lib/actions/bundle.js
CHANGED
|
@@ -1,35 +1,29 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
};
|
|
6
|
-
|
|
7
|
-
exports.runMulmoBundle = runMulmoBundle;
|
|
8
|
-
const mulmocast_1 = require("mulmocast");
|
|
9
|
-
const yargs_1 = __importDefault(require("yargs"));
|
|
10
|
-
const helpers_1 = require("yargs/helpers");
|
|
11
|
-
const common_1 = require("./common");
|
|
12
|
-
async function runMulmoBundle(mulmoScriptPath, outputDir) {
|
|
2
|
+
import { audio, images, translate, mulmoViewerBundle, bundleTargetLang } from "mulmocast";
|
|
3
|
+
import yargs from "yargs";
|
|
4
|
+
import { hideBin } from "yargs/helpers";
|
|
5
|
+
import { initializeContext, runAction } from "./common.js";
|
|
6
|
+
export async function runMulmoBundle(mulmoScriptPath, outputDir) {
|
|
13
7
|
console.log(`\nGenerating bundle with mulmo...`);
|
|
14
8
|
console.log(` Input: ${mulmoScriptPath}`);
|
|
15
9
|
console.log(` Output: ${outputDir}`);
|
|
16
|
-
const context = await
|
|
10
|
+
const context = await initializeContext(mulmoScriptPath, outputDir);
|
|
17
11
|
const current = { context };
|
|
18
12
|
console.log(" Translating...");
|
|
19
|
-
current.context = await
|
|
20
|
-
for (const lang of
|
|
13
|
+
current.context = await translate(current.context, { targetLangs: bundleTargetLang });
|
|
14
|
+
for (const lang of bundleTargetLang.filter((_lang) => _lang !== current.context.lang)) {
|
|
21
15
|
console.log(` Generating audio (${lang})...`);
|
|
22
|
-
current.context = await
|
|
16
|
+
current.context = await audio({ ...current.context, lang });
|
|
23
17
|
}
|
|
24
18
|
console.log(` Generating audio (${current.context.lang})...`);
|
|
25
|
-
current.context = await
|
|
19
|
+
current.context = await audio(current.context);
|
|
26
20
|
console.log(" Generating images...");
|
|
27
|
-
current.context = await
|
|
21
|
+
current.context = await images(current.context);
|
|
28
22
|
console.log(" Creating bundle...");
|
|
29
|
-
await
|
|
23
|
+
await mulmoViewerBundle(current.context, { skipZip: true });
|
|
30
24
|
}
|
|
31
25
|
async function main() {
|
|
32
|
-
const argv = await (
|
|
26
|
+
const argv = await yargs(hideBin(process.argv))
|
|
33
27
|
.usage("Usage: $0 <presentation-file> [options]")
|
|
34
28
|
.command("$0 <file>", "Generate MulmoViewer bundle from presentation", (yargs) => {
|
|
35
29
|
return yargs.positional("file", {
|
|
@@ -54,7 +48,7 @@ async function main() {
|
|
|
54
48
|
})
|
|
55
49
|
.help()
|
|
56
50
|
.parse();
|
|
57
|
-
await
|
|
51
|
+
await runAction("Bundle", argv.file, runMulmoBundle, {
|
|
58
52
|
force: argv.f,
|
|
59
53
|
generateText: argv.g,
|
|
60
54
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/actions/bundle.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/actions/bundle.ts"],"names":[],"mappings":"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"}
|
package/lib/actions/common.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { MulmoStudioContext } from "mulmocast";
|
|
2
|
-
import type { SupportedLang } from "../utils/lang";
|
|
2
|
+
import type { SupportedLang } from "../utils/lang.js";
|
|
3
3
|
export declare function getPackageRoot(): string;
|
|
4
4
|
export declare function getKeynoteScriptPath(): string;
|
|
5
5
|
export type FileType = "pptx" | "marp" | "keynote" | "pdf" | "movie";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/actions/common.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/actions/common.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMtD,wBAAgB,cAAc,IAAI,MAAM,CAGvC;AAGD,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,OAAO,CAAC;AAIrE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAiBzD;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAiCjB;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,iBAAiB,CACrC,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,kBAAkB,CAAC,CA4B7B;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEzF,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,YAAY,EAC1B,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAuCf"}
|
package/lib/actions/common.js
CHANGED
|
@@ -1,65 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.getPackageRoot = getPackageRoot;
|
|
37
|
-
exports.getKeynoteScriptPath = getKeynoteScriptPath;
|
|
38
|
-
exports.detectFileType = detectFileType;
|
|
39
|
-
exports.getBasename = getBasename;
|
|
40
|
-
exports.convertToMulmoScript = convertToMulmoScript;
|
|
41
|
-
exports.initializeContext = initializeContext;
|
|
42
|
-
exports.getMulmoScriptPath = getMulmoScriptPath;
|
|
43
|
-
exports.runAction = runAction;
|
|
44
|
-
const fs = __importStar(require("fs"));
|
|
45
|
-
const path = __importStar(require("path"));
|
|
46
|
-
const child_process_1 = require("child_process");
|
|
47
|
-
const pptx_1 = require("../convert/pptx");
|
|
48
|
-
const marp_1 = require("../convert/marp");
|
|
49
|
-
const pdf_1 = require("../convert/pdf");
|
|
50
|
-
const movie_1 = require("../convert/movie");
|
|
51
|
-
const mulmocast_1 = require("mulmocast");
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import { execSync } from "child_process";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { convertPptx } from "../convert/pptx.js";
|
|
6
|
+
import { convertMarp } from "../convert/marp.js";
|
|
7
|
+
import { convertPdf } from "../convert/pdf.js";
|
|
8
|
+
import { convertMovie } from "../convert/movie.js";
|
|
9
|
+
import { getFileObject, initializeContextFromFiles } from "mulmocast";
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
11
|
+
const __dirname = path.dirname(__filename);
|
|
52
12
|
// Get package root directory (works for both development and npm installed)
|
|
53
|
-
function getPackageRoot() {
|
|
13
|
+
export function getPackageRoot() {
|
|
54
14
|
// __dirname points to lib/actions/ when compiled, so go up 2 levels
|
|
55
15
|
return path.resolve(__dirname, "..", "..");
|
|
56
16
|
}
|
|
57
17
|
// Get path to Keynote AppleScript
|
|
58
|
-
function getKeynoteScriptPath() {
|
|
18
|
+
export function getKeynoteScriptPath() {
|
|
59
19
|
return path.join(getPackageRoot(), "tools", "keynote", "extract.scpt");
|
|
60
20
|
}
|
|
61
21
|
const VIDEO_EXTENSIONS = [".mp4", ".mov", ".mkv", ".webm", ".avi", ".m4v"];
|
|
62
|
-
function detectFileType(filePath) {
|
|
22
|
+
export function detectFileType(filePath) {
|
|
63
23
|
const ext = path.extname(filePath).toLowerCase();
|
|
64
24
|
switch (ext) {
|
|
65
25
|
case ".pptx":
|
|
@@ -77,35 +37,35 @@ function detectFileType(filePath) {
|
|
|
77
37
|
throw new Error(`Unsupported file type: ${ext}`);
|
|
78
38
|
}
|
|
79
39
|
}
|
|
80
|
-
function getBasename(filePath) {
|
|
40
|
+
export function getBasename(filePath) {
|
|
81
41
|
const ext = path.extname(filePath);
|
|
82
42
|
return path.basename(filePath, ext);
|
|
83
43
|
}
|
|
84
|
-
async function convertToMulmoScript(filePath, fileType, options = {}) {
|
|
44
|
+
export async function convertToMulmoScript(filePath, fileType, options = {}) {
|
|
85
45
|
const absolutePath = path.resolve(filePath);
|
|
86
46
|
const { generateText = false, lang } = options;
|
|
87
47
|
console.log(`Converting ${fileType.toUpperCase()} to MulmoScript...`);
|
|
88
48
|
switch (fileType) {
|
|
89
49
|
case "pptx": {
|
|
90
|
-
const result = await
|
|
50
|
+
const result = await convertPptx({ inputPath: absolutePath, generateText, lang });
|
|
91
51
|
return result.mulmoScriptPath;
|
|
92
52
|
}
|
|
93
53
|
case "marp": {
|
|
94
|
-
const result = await
|
|
54
|
+
const result = await convertMarp({ inputPath: absolutePath, generateText, lang });
|
|
95
55
|
return result.mulmoScriptPath;
|
|
96
56
|
}
|
|
97
57
|
case "pdf": {
|
|
98
|
-
const result = await
|
|
58
|
+
const result = await convertPdf({ inputPath: absolutePath, generateText, lang });
|
|
99
59
|
return result.mulmoScriptPath;
|
|
100
60
|
}
|
|
101
61
|
case "movie": {
|
|
102
|
-
const result = await
|
|
62
|
+
const result = await convertMovie({ inputPath: absolutePath, lang });
|
|
103
63
|
return result.mulmoScriptPath;
|
|
104
64
|
}
|
|
105
65
|
case "keynote": {
|
|
106
66
|
const basename = getBasename(filePath);
|
|
107
67
|
const scriptPath = getKeynoteScriptPath();
|
|
108
|
-
|
|
68
|
+
execSync(`osascript "${scriptPath}" "${absolutePath}"`, {
|
|
109
69
|
stdio: "inherit",
|
|
110
70
|
cwd: process.cwd(),
|
|
111
71
|
});
|
|
@@ -113,12 +73,12 @@ async function convertToMulmoScript(filePath, fileType, options = {}) {
|
|
|
113
73
|
}
|
|
114
74
|
}
|
|
115
75
|
}
|
|
116
|
-
async function initializeContext(mulmoScriptPath, outputDir, options = {}) {
|
|
76
|
+
export async function initializeContext(mulmoScriptPath, outputDir, options = {}) {
|
|
117
77
|
const absoluteScriptPath = path.resolve(mulmoScriptPath);
|
|
118
78
|
const scriptDir = path.dirname(absoluteScriptPath);
|
|
119
79
|
const scriptFile = path.basename(absoluteScriptPath);
|
|
120
80
|
const absoluteOutputDir = path.resolve(outputDir);
|
|
121
|
-
const files =
|
|
81
|
+
const files = getFileObject({
|
|
122
82
|
basedir: scriptDir,
|
|
123
83
|
outdir: absoluteOutputDir,
|
|
124
84
|
file: scriptFile,
|
|
@@ -126,16 +86,16 @@ async function initializeContext(mulmoScriptPath, outputDir, options = {}) {
|
|
|
126
86
|
// targetLang sets context.lang (target language for audio)
|
|
127
87
|
// captionLang sets the caption/subtitle language
|
|
128
88
|
// context.studio.script.lang contains the original script language
|
|
129
|
-
const context = await
|
|
89
|
+
const context = await initializeContextFromFiles(files, false, false, false, options.captionLang, options.targetLang);
|
|
130
90
|
if (!context) {
|
|
131
91
|
throw new Error("Failed to initialize MulmoStudio context");
|
|
132
92
|
}
|
|
133
93
|
return context;
|
|
134
94
|
}
|
|
135
|
-
function getMulmoScriptPath(basename) {
|
|
95
|
+
export function getMulmoScriptPath(basename) {
|
|
136
96
|
return path.join("scripts", basename, "mulmo_script.json");
|
|
137
97
|
}
|
|
138
|
-
async function runAction(commandName, inputFile, actionRunner, options = {}) {
|
|
98
|
+
export async function runAction(commandName, inputFile, actionRunner, options = {}) {
|
|
139
99
|
const { force = false, generateText = false } = options;
|
|
140
100
|
if (!fs.existsSync(inputFile)) {
|
|
141
101
|
console.error(`File not found: ${inputFile}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/actions/common.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/actions/common.ts"],"names":[],"mappings":"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"}
|
package/lib/actions/movie.js
CHANGED
|
@@ -1,44 +1,38 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
};
|
|
6
|
-
|
|
7
|
-
exports.runMulmoMovie = runMulmoMovie;
|
|
8
|
-
const mulmocast_1 = require("mulmocast");
|
|
9
|
-
const yargs_1 = __importDefault(require("yargs"));
|
|
10
|
-
const helpers_1 = require("yargs/helpers");
|
|
11
|
-
const common_1 = require("./common");
|
|
12
|
-
async function runMulmoMovie(mulmoScriptPath, outputDir, options = {}) {
|
|
2
|
+
import { audio, images, movie, translate, captions, MulmoStudioContextMethods } from "mulmocast";
|
|
3
|
+
import yargs from "yargs";
|
|
4
|
+
import { hideBin } from "yargs/helpers";
|
|
5
|
+
import { initializeContext, runAction } from "./common.js";
|
|
6
|
+
export async function runMulmoMovie(mulmoScriptPath, outputDir, options = {}) {
|
|
13
7
|
console.log(`\nGenerating movie with mulmo...`);
|
|
14
8
|
console.log(` Input: ${mulmoScriptPath}`);
|
|
15
9
|
console.log(` Output: ${outputDir}`);
|
|
16
|
-
const context = await
|
|
10
|
+
const context = await initializeContext(mulmoScriptPath, outputDir, {
|
|
17
11
|
targetLang: options.targetLang,
|
|
18
12
|
captionLang: options.captionLang,
|
|
19
13
|
});
|
|
20
14
|
const current = { context };
|
|
21
15
|
// Translate if needed (checks targetLang and captionLang)
|
|
22
|
-
if (
|
|
16
|
+
if (MulmoStudioContextMethods.needTranslate(current.context, true)) {
|
|
23
17
|
console.log(" Translating...");
|
|
24
|
-
current.context = await
|
|
18
|
+
current.context = await translate(current.context);
|
|
25
19
|
}
|
|
26
20
|
console.log(" Generating audio...");
|
|
27
|
-
current.context = await
|
|
21
|
+
current.context = await audio(current.context);
|
|
28
22
|
console.log(" Generating images...");
|
|
29
|
-
current.context = await
|
|
23
|
+
current.context = await images(current.context);
|
|
30
24
|
if (options.captionLang) {
|
|
31
25
|
console.log(` Generating captions (${options.captionLang})...`);
|
|
32
|
-
current.context = await
|
|
26
|
+
current.context = await captions(current.context);
|
|
33
27
|
}
|
|
34
28
|
console.log(" Creating movie...");
|
|
35
|
-
const result = await
|
|
29
|
+
const result = await movie(current.context);
|
|
36
30
|
if (!result) {
|
|
37
31
|
throw new Error("Movie generation failed");
|
|
38
32
|
}
|
|
39
33
|
}
|
|
40
34
|
async function main() {
|
|
41
|
-
const argv = await (
|
|
35
|
+
const argv = await yargs(hideBin(process.argv))
|
|
42
36
|
.usage("Usage: $0 <presentation-file> [options]")
|
|
43
37
|
.command("$0 <file>", "Generate movie from presentation", (yargs) => {
|
|
44
38
|
return yargs.positional("file", {
|
|
@@ -77,7 +71,7 @@ async function main() {
|
|
|
77
71
|
const captionLang = argv.c;
|
|
78
72
|
// Create a runner that captures options
|
|
79
73
|
const runner = (mulmoScriptPath, outputDir) => runMulmoMovie(mulmoScriptPath, outputDir, { targetLang, captionLang });
|
|
80
|
-
await
|
|
74
|
+
await runAction("Movie", argv.file, runner, {
|
|
81
75
|
force: argv.f,
|
|
82
76
|
generateText: argv.g,
|
|
83
77
|
});
|
package/lib/actions/movie.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"movie.js","sourceRoot":"","sources":["../../src/actions/movie.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"movie.js","sourceRoot":"","sources":["../../src/actions/movie.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/actions/preview.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/actions/preview.ts"],"names":[],"mappings":";AAoCA,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,MAAqB,GAAG,IAAI,CAiFpE"}
|
package/lib/actions/preview.js
CHANGED
|
@@ -1,63 +1,27 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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.startPreviewServer = startPreviewServer;
|
|
41
|
-
const http = __importStar(require("http"));
|
|
42
|
-
const fs = __importStar(require("fs"));
|
|
43
|
-
const path = __importStar(require("path"));
|
|
44
|
-
const dotenv_1 = __importDefault(require("dotenv"));
|
|
45
|
-
const audio_save_1 = require("../utils/audio-save");
|
|
46
|
-
const bundle_server_1 = require("../utils/bundle-server");
|
|
2
|
+
import * as http from "http";
|
|
3
|
+
import * as fs from "fs";
|
|
4
|
+
import * as path from "path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import dotenv from "dotenv";
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = path.dirname(__filename);
|
|
9
|
+
import { saveBeatText, transcribeAudio, parseRequestBody, } from "../utils/audio-save.js";
|
|
10
|
+
import { findBundles, getMimeType, isValidFile, createFileStream } from "../utils/bundle-server.js";
|
|
47
11
|
// Load .env file
|
|
48
|
-
|
|
12
|
+
dotenv.config();
|
|
49
13
|
const DEFAULT_PORT = 3000;
|
|
50
14
|
// Serve static file
|
|
51
15
|
function serveFile(res, filePath) {
|
|
52
|
-
if (!
|
|
16
|
+
if (!isValidFile(filePath)) {
|
|
53
17
|
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
54
18
|
res.end("Not Found");
|
|
55
19
|
return;
|
|
56
20
|
}
|
|
57
|
-
res.writeHead(200, { "Content-Type":
|
|
58
|
-
|
|
21
|
+
res.writeHead(200, { "Content-Type": getMimeType(filePath) });
|
|
22
|
+
createFileStream(filePath).pipe(res);
|
|
59
23
|
}
|
|
60
|
-
function startPreviewServer(port = DEFAULT_PORT) {
|
|
24
|
+
export function startPreviewServer(port = DEFAULT_PORT) {
|
|
61
25
|
const cwd = process.cwd();
|
|
62
26
|
const outputDir = path.join(cwd, "output");
|
|
63
27
|
// Find the Vue build directory
|
|
@@ -78,33 +42,33 @@ function startPreviewServer(port = DEFAULT_PORT) {
|
|
|
78
42
|
const pathname = url.pathname;
|
|
79
43
|
// API endpoint for bundles list
|
|
80
44
|
if (pathname === "/api/bundles") {
|
|
81
|
-
const bundles =
|
|
45
|
+
const bundles = findBundles(outputDir);
|
|
82
46
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
83
47
|
res.end(JSON.stringify(bundles));
|
|
84
48
|
return;
|
|
85
49
|
}
|
|
86
50
|
// API endpoint for saving recorded audio
|
|
87
51
|
if (pathname === "/api/save-beat-text" && req.method === "POST") {
|
|
88
|
-
const body = await
|
|
52
|
+
const body = await parseRequestBody(req);
|
|
89
53
|
if (!body) {
|
|
90
54
|
res.writeHead(400, { "Content-Type": "application/json" });
|
|
91
55
|
res.end(JSON.stringify({ success: false, error: "Invalid request body" }));
|
|
92
56
|
return;
|
|
93
57
|
}
|
|
94
|
-
const result =
|
|
58
|
+
const result = saveBeatText(outputDir, body);
|
|
95
59
|
res.writeHead(result.success ? 200 : 400, { "Content-Type": "application/json" });
|
|
96
60
|
res.end(JSON.stringify(result));
|
|
97
61
|
return;
|
|
98
62
|
}
|
|
99
63
|
// API endpoint for transcribing audio
|
|
100
64
|
if (pathname === "/api/transcribe" && req.method === "POST") {
|
|
101
|
-
const body = await
|
|
65
|
+
const body = await parseRequestBody(req);
|
|
102
66
|
if (!body) {
|
|
103
67
|
res.writeHead(400, { "Content-Type": "application/json" });
|
|
104
68
|
res.end(JSON.stringify({ success: false, error: "Invalid request body" }));
|
|
105
69
|
return;
|
|
106
70
|
}
|
|
107
|
-
const result = await
|
|
71
|
+
const result = await transcribeAudio(body);
|
|
108
72
|
res.writeHead(result.success ? 200 : 400, { "Content-Type": "application/json" });
|
|
109
73
|
res.end(JSON.stringify(result));
|
|
110
74
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/actions/preview.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/actions/preview.ts"],"names":[],"mappings":"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"}
|