@bendyline/squisq-cli 1.1.5 → 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/dist/api.d.ts +45 -14
- package/dist/api.js +482 -301
- package/dist/api.js.map +1 -1
- package/dist/index.d.ts +2 -12
- package/dist/index.js +889 -20
- package/dist/index.js.map +1 -1
- package/package.json +8 -7
- package/dist/__tests__/convert.test.d.ts +0 -7
- package/dist/__tests__/convert.test.d.ts.map +0 -1
- package/dist/__tests__/convert.test.js +0 -127
- package/dist/__tests__/convert.test.js.map +0 -1
- package/dist/__tests__/html-export.test.d.ts +0 -8
- package/dist/__tests__/html-export.test.d.ts.map +0 -1
- package/dist/__tests__/html-export.test.js +0 -126
- package/dist/__tests__/html-export.test.js.map +0 -1
- package/dist/__tests__/readInput.test.d.ts +0 -5
- package/dist/__tests__/readInput.test.d.ts.map +0 -1
- package/dist/__tests__/readInput.test.js +0 -120
- package/dist/__tests__/readInput.test.js.map +0 -1
- package/dist/api.d.ts.map +0 -1
- package/dist/commands/convert.d.ts +0 -15
- package/dist/commands/convert.d.ts.map +0 -1
- package/dist/commands/convert.js +0 -264
- package/dist/commands/convert.js.map +0 -1
- package/dist/commands/video.d.ts +0 -12
- package/dist/commands/video.d.ts.map +0 -1
- package/dist/commands/video.js +0 -122
- package/dist/commands/video.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/util/detectFfmpeg.d.ts +0 -15
- package/dist/util/detectFfmpeg.d.ts.map +0 -1
- package/dist/util/detectFfmpeg.js +0 -29
- package/dist/util/detectFfmpeg.js.map +0 -1
- package/dist/util/nativeEncoder.d.ts +0 -27
- package/dist/util/nativeEncoder.d.ts.map +0 -1
- package/dist/util/nativeEncoder.js +0 -106
- package/dist/util/nativeEncoder.js.map +0 -1
- package/dist/util/readInput.d.ts +0 -31
- package/dist/util/readInput.d.ts.map +0 -1
- package/dist/util/readInput.js +0 -142
- package/dist/util/readInput.js.map +0 -1
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* readInput unit tests
|
|
3
|
-
*/
|
|
4
|
-
import { describe, it, beforeEach, afterEach } from 'mocha';
|
|
5
|
-
import { expect } from 'chai';
|
|
6
|
-
import { readInput } from '../util/readInput.js';
|
|
7
|
-
import { writeFile, mkdir, rm } from 'node:fs/promises';
|
|
8
|
-
import { join } from 'node:path';
|
|
9
|
-
import { tmpdir } from 'node:os';
|
|
10
|
-
import { containerToZip } from '@bendyline/squisq-formats/container';
|
|
11
|
-
import { MemoryContentContainer } from '@bendyline/squisq/storage';
|
|
12
|
-
const FIXTURE_MD = join(import.meta.dirname, 'fixtures', 'test.md');
|
|
13
|
-
describe('readInput', () => {
|
|
14
|
-
let tempDir;
|
|
15
|
-
beforeEach(async () => {
|
|
16
|
-
tempDir = join(tmpdir(), `squisq-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
17
|
-
await mkdir(tempDir, { recursive: true });
|
|
18
|
-
});
|
|
19
|
-
afterEach(async () => {
|
|
20
|
-
await rm(tempDir, { recursive: true, force: true });
|
|
21
|
-
});
|
|
22
|
-
it('reads a .md file into a container and MarkdownDocument', async () => {
|
|
23
|
-
const result = await readInput(FIXTURE_MD);
|
|
24
|
-
expect(result.markdownDoc).to.not.equal(null);
|
|
25
|
-
expect(result.markdownDoc).to.have.property('type', 'document');
|
|
26
|
-
expect(result.markdownDoc.children).to.be.an('array');
|
|
27
|
-
expect(result.markdownDoc.children.length).to.be.greaterThan(0);
|
|
28
|
-
const docContent = await result.container.readDocument();
|
|
29
|
-
expect(docContent).to.be.a('string').that.includes('# Test Document');
|
|
30
|
-
});
|
|
31
|
-
it('reads a .zip container', async () => {
|
|
32
|
-
// Build a minimal container ZIP
|
|
33
|
-
const container = new MemoryContentContainer();
|
|
34
|
-
await container.writeDocument('# From ZIP\n\nHello from a ZIP container.');
|
|
35
|
-
const blob = await containerToZip(container);
|
|
36
|
-
const buf = Buffer.from(await blob.arrayBuffer());
|
|
37
|
-
const zipPath = join(tempDir, 'test.zip');
|
|
38
|
-
await writeFile(zipPath, buf);
|
|
39
|
-
const result = await readInput(zipPath);
|
|
40
|
-
expect(result.markdownDoc).to.not.equal(null);
|
|
41
|
-
expect(result.markdownDoc.type).to.equal('document');
|
|
42
|
-
const doc = await result.container.readDocument();
|
|
43
|
-
expect(doc).to.include('# From ZIP');
|
|
44
|
-
});
|
|
45
|
-
it('reads a .dbk container (same as .zip)', async () => {
|
|
46
|
-
const container = new MemoryContentContainer();
|
|
47
|
-
await container.writeDocument('# From DBK\n\nHello from a DBK container.');
|
|
48
|
-
const blob = await containerToZip(container);
|
|
49
|
-
const buf = Buffer.from(await blob.arrayBuffer());
|
|
50
|
-
const dbkPath = join(tempDir, 'test.dbk');
|
|
51
|
-
await writeFile(dbkPath, buf);
|
|
52
|
-
const result = await readInput(dbkPath);
|
|
53
|
-
expect(result.markdownDoc).to.not.equal(null);
|
|
54
|
-
expect(result.markdownDoc.type).to.equal('document');
|
|
55
|
-
const doc = await result.container.readDocument();
|
|
56
|
-
expect(doc).to.include('# From DBK');
|
|
57
|
-
});
|
|
58
|
-
it('reads a folder with markdown and media', async () => {
|
|
59
|
-
const folderPath = join(tempDir, 'mydoc');
|
|
60
|
-
await mkdir(folderPath, { recursive: true });
|
|
61
|
-
await writeFile(join(folderPath, 'index.md'), '# Folder Doc\n\nContent here.');
|
|
62
|
-
await writeFile(join(folderPath, 'image.txt'), 'placeholder');
|
|
63
|
-
const result = await readInput(folderPath);
|
|
64
|
-
expect(result.markdownDoc).to.not.equal(null);
|
|
65
|
-
expect(result.markdownDoc.type).to.equal('document');
|
|
66
|
-
const doc = await result.container.readDocument();
|
|
67
|
-
expect(doc).to.include('# Folder Doc');
|
|
68
|
-
// Media files are also in the container
|
|
69
|
-
const files = await result.container.listFiles();
|
|
70
|
-
const paths = files.map((f) => f.path);
|
|
71
|
-
expect(paths).to.include('image.txt');
|
|
72
|
-
});
|
|
73
|
-
it('throws on folder with no markdown file', async () => {
|
|
74
|
-
const folderPath = join(tempDir, 'empty');
|
|
75
|
-
await mkdir(folderPath, { recursive: true });
|
|
76
|
-
await writeFile(join(folderPath, 'image.png'), Buffer.from([0x89, 0x50]));
|
|
77
|
-
try {
|
|
78
|
-
await readInput(folderPath);
|
|
79
|
-
expect.fail('Expected an error');
|
|
80
|
-
}
|
|
81
|
-
catch (err) {
|
|
82
|
-
expect(err).to.be.instanceOf(Error);
|
|
83
|
-
expect(err.message).to.include('No markdown document');
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
it('reads a .json file as Doc JSON', async () => {
|
|
87
|
-
const doc = {
|
|
88
|
-
articleId: 'test-article',
|
|
89
|
-
duration: 30,
|
|
90
|
-
blocks: [{ id: 'b1', startTime: 0, duration: 30, audioSegment: 0 }],
|
|
91
|
-
audio: { segments: [] },
|
|
92
|
-
};
|
|
93
|
-
const jsonPath = join(tempDir, 'doc.json');
|
|
94
|
-
await writeFile(jsonPath, JSON.stringify(doc));
|
|
95
|
-
const result = await readInput(jsonPath);
|
|
96
|
-
expect(result.markdownDoc).to.equal(null);
|
|
97
|
-
expect(result.doc).to.deep.include({ articleId: 'test-article', duration: 30 });
|
|
98
|
-
expect(result.doc.blocks).to.have.length(1);
|
|
99
|
-
});
|
|
100
|
-
it('reads a folder with doc.json instead of markdown', async () => {
|
|
101
|
-
const folderPath = join(tempDir, 'jsondoc');
|
|
102
|
-
await mkdir(folderPath, { recursive: true });
|
|
103
|
-
const doc = {
|
|
104
|
-
articleId: 'folder-doc',
|
|
105
|
-
duration: 20,
|
|
106
|
-
blocks: [],
|
|
107
|
-
audio: { segments: [] },
|
|
108
|
-
};
|
|
109
|
-
await writeFile(join(folderPath, 'doc.json'), JSON.stringify(doc));
|
|
110
|
-
await writeFile(join(folderPath, 'image.txt'), 'placeholder');
|
|
111
|
-
const result = await readInput(folderPath);
|
|
112
|
-
expect(result.markdownDoc).to.equal(null);
|
|
113
|
-
expect(result.doc).to.deep.include({ articleId: 'folder-doc' });
|
|
114
|
-
// Media files are still in the container
|
|
115
|
-
const files = await result.container.listFiles();
|
|
116
|
-
const paths = files.map((f) => f.path);
|
|
117
|
-
expect(paths).to.include('image.txt');
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
//# sourceMappingURL=readInput.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"readInput.test.js","sourceRoot":"","sources":["../../src/__tests__/readInput.test.ts"],"names":[],"mappings":"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"}
|
package/dist/api.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAM9E,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,kCAAkC;AAClC,MAAM,WAAW,qBAAqB;IACpC,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAC;IAEnB,uCAAuC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,mDAAmD;IACnD,OAAO,CAAC,EAAE,YAAY,CAAC;IAEvB,gDAAgD;IAChD,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAE/B,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;IAErC,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvD;AAED,yCAAyC;AACzC,MAAM,WAAW,oBAAoB;IACnC,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAC;IAEjB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IAEnB,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,sBAAsB,EACjC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CA8L/B;AAmID,sCAAsC;AACtC,MAAM,WAAW,aAAa;IAC5B,iFAAiF;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qCAAqC;AACrC,MAAM,WAAW,wBAAwB;IACvC,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,sDAAsD;IACtD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCxF"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* convert command
|
|
3
|
-
*
|
|
4
|
-
* Reads a markdown file, ZIP/DBK container, or folder and exports to
|
|
5
|
-
* all supported formats: DOCX, PPTX, PDF, HTML, and container ZIP (.dbk).
|
|
6
|
-
*
|
|
7
|
-
* Supports optional --theme and --transform flags to apply a squisq theme
|
|
8
|
-
* and/or transform style before exporting.
|
|
9
|
-
*
|
|
10
|
-
* Usage:
|
|
11
|
-
* squisq convert <input> [--output-dir <dir>] [--formats <list>] [--theme <id>] [--transform <style>]
|
|
12
|
-
*/
|
|
13
|
-
import type { Command } from 'commander';
|
|
14
|
-
export declare function registerConvertCommand(program: Command): void;
|
|
15
|
-
//# sourceMappingURL=convert.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+BzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwB7D"}
|
package/dist/commands/convert.js
DELETED
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* convert command
|
|
3
|
-
*
|
|
4
|
-
* Reads a markdown file, ZIP/DBK container, or folder and exports to
|
|
5
|
-
* all supported formats: DOCX, PPTX, PDF, HTML, and container ZIP (.dbk).
|
|
6
|
-
*
|
|
7
|
-
* Supports optional --theme and --transform flags to apply a squisq theme
|
|
8
|
-
* and/or transform style before exporting.
|
|
9
|
-
*
|
|
10
|
-
* Usage:
|
|
11
|
-
* squisq convert <input> [--output-dir <dir>] [--formats <list>] [--theme <id>] [--transform <style>]
|
|
12
|
-
*/
|
|
13
|
-
import { writeFile, mkdir } from 'node:fs/promises';
|
|
14
|
-
import { dirname, basename, extname, join, resolve } from 'node:path';
|
|
15
|
-
import { readInput } from '../util/readInput.js';
|
|
16
|
-
const ALL_FORMATS = ['docx', 'pptx', 'pdf', 'html', 'htmlzip', 'epub', 'dbk'];
|
|
17
|
-
function parseFormats(value) {
|
|
18
|
-
const requested = value.split(',').map((s) => s.trim().toLowerCase());
|
|
19
|
-
const valid = [];
|
|
20
|
-
for (const r of requested) {
|
|
21
|
-
if (ALL_FORMATS.includes(r)) {
|
|
22
|
-
valid.push(r);
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
console.warn(`Unknown format "${r}" — skipping. Valid: ${ALL_FORMATS.join(', ')}`);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
if (valid.length === 0) {
|
|
29
|
-
throw new Error(`No valid formats specified. Valid: ${ALL_FORMATS.join(', ')}`);
|
|
30
|
-
}
|
|
31
|
-
return valid;
|
|
32
|
-
}
|
|
33
|
-
export function registerConvertCommand(program) {
|
|
34
|
-
program
|
|
35
|
-
.command('convert')
|
|
36
|
-
.description('Convert a markdown document to DOCX, PPTX, PDF, HTML, and DBK container formats')
|
|
37
|
-
.argument('<input>', 'Path to .md file, .zip/.dbk container, or folder')
|
|
38
|
-
.option('-o, --output-dir <dir>', 'Output directory (default: same as input)')
|
|
39
|
-
.option('-f, --formats <list>', `Comma-separated formats to produce (default: all). Valid: ${ALL_FORMATS.join(', ')}`)
|
|
40
|
-
.option('-t, --theme <id>', 'Squisq theme ID to apply (e.g., documentary, cinematic, bold)')
|
|
41
|
-
.option('--transform <style>', 'Transform style to apply before export (e.g., documentary, magazine, minimal)')
|
|
42
|
-
.action(async (inputPath, opts) => {
|
|
43
|
-
try {
|
|
44
|
-
await runConvert(inputPath, opts);
|
|
45
|
-
}
|
|
46
|
-
catch (err) {
|
|
47
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
48
|
-
console.error(`Error: ${message}`);
|
|
49
|
-
process.exitCode = 1;
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
async function runConvert(inputPath, opts) {
|
|
54
|
-
const resolvedInput = resolve(inputPath);
|
|
55
|
-
// Determine which formats to produce
|
|
56
|
-
const formats = opts.formats ? parseFormats(opts.formats) : [...ALL_FORMATS];
|
|
57
|
-
// Determine output directory and base filename
|
|
58
|
-
const outputDir = opts.outputDir ? resolve(opts.outputDir) : dirname(resolvedInput);
|
|
59
|
-
const inputBasename = basename(resolvedInput);
|
|
60
|
-
const inputExt = extname(inputBasename);
|
|
61
|
-
const baseName = inputExt ? inputBasename.slice(0, -inputExt.length) : inputBasename;
|
|
62
|
-
// Ensure output directory exists
|
|
63
|
-
await mkdir(outputDir, { recursive: true });
|
|
64
|
-
// Validate theme and transform IDs
|
|
65
|
-
if (opts.theme) {
|
|
66
|
-
const { getAvailableThemes } = await import('@bendyline/squisq/schemas');
|
|
67
|
-
const themes = getAvailableThemes();
|
|
68
|
-
if (!themes.includes(opts.theme)) {
|
|
69
|
-
throw new Error(`Unknown theme "${opts.theme}". Available: ${themes.join(', ')}`);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
if (opts.transform) {
|
|
73
|
-
const { getTransformStyleIds } = await import('@bendyline/squisq/transform');
|
|
74
|
-
const styles = getTransformStyleIds();
|
|
75
|
-
if (!styles.includes(opts.transform)) {
|
|
76
|
-
throw new Error(`Unknown transform style "${opts.transform}". Available: ${styles.join(', ')}`);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
console.error(`Reading: ${resolvedInput}`);
|
|
80
|
-
const result = await readInput(resolvedInput);
|
|
81
|
-
const { container } = result;
|
|
82
|
-
if (!result.markdownDoc) {
|
|
83
|
-
throw new Error('Convert command requires a markdown document. JSON Doc input is not supported for convert — use the video command instead.');
|
|
84
|
-
}
|
|
85
|
-
// Apply transform if requested
|
|
86
|
-
let exportMarkdownDoc = result.markdownDoc;
|
|
87
|
-
if (opts.transform) {
|
|
88
|
-
exportMarkdownDoc = await applyTransformToMarkdown(result.markdownDoc, container, opts.transform, opts.theme);
|
|
89
|
-
console.error(` Applied transform: ${opts.transform}`);
|
|
90
|
-
}
|
|
91
|
-
const themeId = opts.theme;
|
|
92
|
-
for (const format of formats) {
|
|
93
|
-
const outPath = join(outputDir, `${baseName}.${format}`);
|
|
94
|
-
switch (format) {
|
|
95
|
-
case 'docx': {
|
|
96
|
-
const { markdownDocToDocx } = await import('@bendyline/squisq-formats/docx');
|
|
97
|
-
const buf = await markdownDocToDocx(exportMarkdownDoc, { themeId });
|
|
98
|
-
await writeFile(outPath, Buffer.from(buf));
|
|
99
|
-
break;
|
|
100
|
-
}
|
|
101
|
-
case 'pptx': {
|
|
102
|
-
const { markdownDocToPptx } = await import('@bendyline/squisq-formats/pptx');
|
|
103
|
-
// Collect images from container for PPTX embedding
|
|
104
|
-
const images = await collectContainerImages(container);
|
|
105
|
-
const buf = await markdownDocToPptx(exportMarkdownDoc, { themeId, images });
|
|
106
|
-
await writeFile(outPath, Buffer.from(buf));
|
|
107
|
-
break;
|
|
108
|
-
}
|
|
109
|
-
case 'pdf': {
|
|
110
|
-
const { markdownDocToPdf } = await import('@bendyline/squisq-formats/pdf');
|
|
111
|
-
const buf = await markdownDocToPdf(exportMarkdownDoc, { themeId });
|
|
112
|
-
await writeFile(outPath, Buffer.from(buf));
|
|
113
|
-
break;
|
|
114
|
-
}
|
|
115
|
-
case 'html': {
|
|
116
|
-
const { markdownToDoc } = await import('@bendyline/squisq/doc');
|
|
117
|
-
const { docToHtml } = await import('@bendyline/squisq-formats/html');
|
|
118
|
-
const { PLAYER_BUNDLE } = await import('@bendyline/squisq-react/standalone-source');
|
|
119
|
-
const doc = markdownToDoc(exportMarkdownDoc);
|
|
120
|
-
const images = await collectImagesForHtml(doc, container);
|
|
121
|
-
const html = docToHtml(doc, {
|
|
122
|
-
playerScript: PLAYER_BUNDLE,
|
|
123
|
-
images,
|
|
124
|
-
title: baseName,
|
|
125
|
-
mode: 'static',
|
|
126
|
-
themeId,
|
|
127
|
-
});
|
|
128
|
-
await writeFile(outPath, html, 'utf-8');
|
|
129
|
-
break;
|
|
130
|
-
}
|
|
131
|
-
case 'htmlzip': {
|
|
132
|
-
const { markdownToDoc } = await import('@bendyline/squisq/doc');
|
|
133
|
-
const { docToHtmlZip } = await import('@bendyline/squisq-formats/html');
|
|
134
|
-
const { PLAYER_BUNDLE } = await import('@bendyline/squisq-react/standalone-source');
|
|
135
|
-
const doc = markdownToDoc(exportMarkdownDoc);
|
|
136
|
-
const images = await collectImagesForHtml(doc, container);
|
|
137
|
-
const blob = await docToHtmlZip(doc, {
|
|
138
|
-
playerScript: PLAYER_BUNDLE,
|
|
139
|
-
images,
|
|
140
|
-
title: baseName,
|
|
141
|
-
mode: 'static',
|
|
142
|
-
themeId,
|
|
143
|
-
});
|
|
144
|
-
const buf = Buffer.from(await blob.arrayBuffer());
|
|
145
|
-
await writeFile(outPath.replace(/\.htmlzip$/, '.html.zip'), buf);
|
|
146
|
-
break;
|
|
147
|
-
}
|
|
148
|
-
case 'epub': {
|
|
149
|
-
const { markdownDocToEpub } = await import('@bendyline/squisq-formats/epub');
|
|
150
|
-
const images = await collectContainerImages(container);
|
|
151
|
-
// Collect audio narration from container if Doc has audio segments
|
|
152
|
-
const epubAudio = new Map();
|
|
153
|
-
const audioSegments = result.doc?.audio?.segments;
|
|
154
|
-
if (audioSegments?.length) {
|
|
155
|
-
for (const seg of audioSegments) {
|
|
156
|
-
const data = await container.readFile(seg.src);
|
|
157
|
-
if (data)
|
|
158
|
-
epubAudio.set(seg.src, data);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
const hasNarration = epubAudio.size > 0;
|
|
162
|
-
const buf = await markdownDocToEpub(exportMarkdownDoc, {
|
|
163
|
-
title: baseName,
|
|
164
|
-
themeId,
|
|
165
|
-
images,
|
|
166
|
-
audio: hasNarration ? epubAudio : undefined,
|
|
167
|
-
audioSegments: hasNarration ? audioSegments : undefined,
|
|
168
|
-
totalDuration: hasNarration ? result.doc?.duration : undefined,
|
|
169
|
-
});
|
|
170
|
-
await writeFile(outPath, Buffer.from(buf));
|
|
171
|
-
break;
|
|
172
|
-
}
|
|
173
|
-
case 'dbk': {
|
|
174
|
-
const { containerToZip } = await import('@bendyline/squisq-formats/container');
|
|
175
|
-
const blob = await containerToZip(container);
|
|
176
|
-
const buf = await blob.arrayBuffer();
|
|
177
|
-
await writeFile(outPath, Buffer.from(buf));
|
|
178
|
-
break;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
console.error(` ✓ ${outPath}`);
|
|
182
|
-
}
|
|
183
|
-
console.error('Done.');
|
|
184
|
-
}
|
|
185
|
-
// ============================================
|
|
186
|
-
// Transform Pipeline
|
|
187
|
-
// ============================================
|
|
188
|
-
/**
|
|
189
|
-
* Apply a transform style to a MarkdownDocument.
|
|
190
|
-
* Pipeline: MarkdownDocument → Doc → applyTransform → docToMarkdown → MarkdownDocument
|
|
191
|
-
*/
|
|
192
|
-
async function applyTransformToMarkdown(markdownDoc, container, transformStyle, themeId) {
|
|
193
|
-
const { markdownToDoc, docToMarkdown } = await import('@bendyline/squisq/doc');
|
|
194
|
-
const { applyTransform, extractDocImages } = await import('@bendyline/squisq/transform');
|
|
195
|
-
const doc = markdownToDoc(markdownDoc);
|
|
196
|
-
// Extract image metadata from the doc for transform interleaving
|
|
197
|
-
const images = extractDocImages(doc.blocks);
|
|
198
|
-
const result = applyTransform(doc, transformStyle, {
|
|
199
|
-
themeId,
|
|
200
|
-
images,
|
|
201
|
-
});
|
|
202
|
-
return docToMarkdown(result.doc);
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Collect images for HTML export, keying each by both its container path and
|
|
206
|
-
* its filename. The standalone player resolves by exact key first then by
|
|
207
|
-
* filename, so both keyings handle path mismatches between how the Doc
|
|
208
|
-
* references images and how they're stored in the container.
|
|
209
|
-
*
|
|
210
|
-
* Only images referenced by the Doc are included — unreferenced container
|
|
211
|
-
* images would bloat the HTML output unnecessarily.
|
|
212
|
-
*/
|
|
213
|
-
async function collectImagesForHtml(doc, container) {
|
|
214
|
-
const { collectImagePaths, extractFilename } = await import('@bendyline/squisq-formats/html');
|
|
215
|
-
const images = new Map();
|
|
216
|
-
const docPaths = collectImagePaths(doc);
|
|
217
|
-
// Try exact paths first
|
|
218
|
-
const needByFilename = new Set();
|
|
219
|
-
for (const imgPath of docPaths) {
|
|
220
|
-
const data = await container.readFile(imgPath);
|
|
221
|
-
if (data) {
|
|
222
|
-
images.set(imgPath, data);
|
|
223
|
-
const filename = extractFilename(imgPath);
|
|
224
|
-
if (filename !== imgPath)
|
|
225
|
-
images.set(filename, data);
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
needByFilename.add(extractFilename(imgPath));
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
// For any doc paths that didn't resolve, scan the container for a file
|
|
232
|
-
// with the same basename (handles "images/hero.jpg" vs "hero.jpg" mismatches).
|
|
233
|
-
if (needByFilename.size > 0) {
|
|
234
|
-
const files = await container.listFiles();
|
|
235
|
-
for (const file of files) {
|
|
236
|
-
const filename = extractFilename(file.path);
|
|
237
|
-
if (needByFilename.has(filename)) {
|
|
238
|
-
const data = await container.readFile(file.path);
|
|
239
|
-
if (data) {
|
|
240
|
-
images.set(filename, data);
|
|
241
|
-
images.set(file.path, data);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
return images;
|
|
247
|
-
}
|
|
248
|
-
/**
|
|
249
|
-
* Collect all image files from a container as a Map<path, ArrayBuffer>.
|
|
250
|
-
*/
|
|
251
|
-
async function collectContainerImages(container) {
|
|
252
|
-
const images = new Map();
|
|
253
|
-
const files = await container.listFiles();
|
|
254
|
-
for (const file of files) {
|
|
255
|
-
if (/\.(jpg|jpeg|png|gif|webp|svg|bmp|avif)$/i.test(file.path)) {
|
|
256
|
-
const data = await container.readFile(file.path);
|
|
257
|
-
if (data) {
|
|
258
|
-
images.set(file.path, data);
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
return images;
|
|
263
|
-
}
|
|
264
|
-
//# sourceMappingURL=convert.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/video.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* video command
|
|
3
|
-
*
|
|
4
|
-
* Renders a squisq document to MP4 video by delegating to the
|
|
5
|
-
* programmatic renderDocToMp4 API.
|
|
6
|
-
*
|
|
7
|
-
* Usage:
|
|
8
|
-
* squisq video <input> [-o output.mp4] [--fps 30] [--quality normal] [--orientation landscape]
|
|
9
|
-
*/
|
|
10
|
-
import type { Command } from 'commander';
|
|
11
|
-
export declare function registerVideoCommand(program: Command): void;
|
|
12
|
-
//# sourceMappingURL=video.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"video.d.ts","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsC3D"}
|
package/dist/commands/video.js
DELETED
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* video command
|
|
3
|
-
*
|
|
4
|
-
* Renders a squisq document to MP4 video by delegating to the
|
|
5
|
-
* programmatic renderDocToMp4 API.
|
|
6
|
-
*
|
|
7
|
-
* Usage:
|
|
8
|
-
* squisq video <input> [-o output.mp4] [--fps 30] [--quality normal] [--orientation landscape]
|
|
9
|
-
*/
|
|
10
|
-
import { mkdir } from 'node:fs/promises';
|
|
11
|
-
import { dirname, basename, extname, resolve } from 'node:path';
|
|
12
|
-
import { readInput } from '../util/readInput.js';
|
|
13
|
-
import { renderDocToMp4 } from '../api.js';
|
|
14
|
-
const VALID_QUALITIES = ['draft', 'normal', 'high'];
|
|
15
|
-
const VALID_ORIENTATIONS = ['landscape', 'portrait'];
|
|
16
|
-
const VALID_CAPTIONS = ['off', 'standard', 'social'];
|
|
17
|
-
export function registerVideoCommand(program) {
|
|
18
|
-
program
|
|
19
|
-
.command('video')
|
|
20
|
-
.description('Render a squisq document to MP4 video')
|
|
21
|
-
.argument('<input>', 'Path to .md file, .zip/.dbk container, or folder')
|
|
22
|
-
.argument('[output]', 'Output MP4 path (default: <input>.mp4)')
|
|
23
|
-
.option('-o, --output <path>', 'Output MP4 path (default: <input>.mp4)')
|
|
24
|
-
.option('--fps <number>', 'Frames per second (default: 30)', '30')
|
|
25
|
-
.option('--quality <level>', `Encoding quality: ${VALID_QUALITIES.join(', ')} (default: normal)`, 'normal')
|
|
26
|
-
.option('--orientation <orient>', `Video orientation: ${VALID_ORIENTATIONS.join(', ')} (default: landscape)`, 'landscape')
|
|
27
|
-
.option('--captions <style>', `Caption style: ${VALID_CAPTIONS.join(', ')} (default: off)`, 'off')
|
|
28
|
-
.option('--width <pixels>', 'Override video width')
|
|
29
|
-
.option('--height <pixels>', 'Override video height')
|
|
30
|
-
.action(async (inputPath, outputArg, opts) => {
|
|
31
|
-
try {
|
|
32
|
-
// Positional output arg takes precedence, then -o flag
|
|
33
|
-
if (outputArg && !opts.output) {
|
|
34
|
-
opts.output = outputArg;
|
|
35
|
-
}
|
|
36
|
-
await runVideo(inputPath, opts);
|
|
37
|
-
}
|
|
38
|
-
catch (err) {
|
|
39
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
40
|
-
console.error(`Error: ${message}`);
|
|
41
|
-
process.exitCode = 1;
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
async function runVideo(inputPath, opts) {
|
|
46
|
-
const resolvedInput = resolve(inputPath);
|
|
47
|
-
// Validate options
|
|
48
|
-
const fps = parseInt(opts.fps ?? '30', 10);
|
|
49
|
-
if (isNaN(fps) || fps < 1 || fps > 120) {
|
|
50
|
-
throw new Error('FPS must be a number between 1 and 120');
|
|
51
|
-
}
|
|
52
|
-
const quality = opts.quality ?? 'normal';
|
|
53
|
-
if (!VALID_QUALITIES.includes(quality)) {
|
|
54
|
-
throw new Error(`Invalid quality "${quality}". Valid: ${VALID_QUALITIES.join(', ')}`);
|
|
55
|
-
}
|
|
56
|
-
const orientation = opts.orientation ?? 'landscape';
|
|
57
|
-
if (!VALID_ORIENTATIONS.includes(orientation)) {
|
|
58
|
-
throw new Error(`Invalid orientation "${orientation}". Valid: ${VALID_ORIENTATIONS.join(', ')}`);
|
|
59
|
-
}
|
|
60
|
-
const captions = opts.captions ?? 'off';
|
|
61
|
-
if (!VALID_CAPTIONS.includes(captions)) {
|
|
62
|
-
throw new Error(`Invalid captions "${captions}". Valid: ${VALID_CAPTIONS.join(', ')}`);
|
|
63
|
-
}
|
|
64
|
-
const captionStyle = captions === 'off' ? undefined : captions;
|
|
65
|
-
// Determine output path
|
|
66
|
-
const inputBasename = basename(resolvedInput);
|
|
67
|
-
const inputExt = extname(inputBasename);
|
|
68
|
-
const baseName = inputExt ? inputBasename.slice(0, -inputExt.length) : inputBasename;
|
|
69
|
-
const outputPath = opts.output
|
|
70
|
-
? resolve(opts.output)
|
|
71
|
-
: resolve(dirname(resolvedInput), `${baseName}.mp4`);
|
|
72
|
-
// Ensure output directory exists
|
|
73
|
-
await mkdir(dirname(outputPath), { recursive: true });
|
|
74
|
-
// ── Step 1: Read input ──────────────────────────────────────────
|
|
75
|
-
console.error(`Reading: ${resolvedInput}`);
|
|
76
|
-
const result = await readInput(resolvedInput);
|
|
77
|
-
const { container } = result;
|
|
78
|
-
// ── Step 2: Get or parse Doc ────────────────────────────────────
|
|
79
|
-
let doc;
|
|
80
|
-
if (result.doc) {
|
|
81
|
-
console.error('Using pre-built Doc JSON');
|
|
82
|
-
doc = result.doc;
|
|
83
|
-
}
|
|
84
|
-
else if (result.markdownDoc) {
|
|
85
|
-
const { markdownToDoc } = await import('@bendyline/squisq/doc');
|
|
86
|
-
doc = markdownToDoc(result.markdownDoc);
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
throw new Error('No document found in input');
|
|
90
|
-
}
|
|
91
|
-
console.error(`Rendering: ${fps} fps, quality: ${quality}, orientation: ${orientation}, captions: ${captions}`);
|
|
92
|
-
// ── Step 3: Render via programmatic API ─────────────────────────
|
|
93
|
-
const result2 = await renderDocToMp4(doc, container, {
|
|
94
|
-
outputPath,
|
|
95
|
-
fps,
|
|
96
|
-
quality: quality,
|
|
97
|
-
orientation: orientation,
|
|
98
|
-
width: opts.width ? parseInt(opts.width, 10) : undefined,
|
|
99
|
-
height: opts.height ? parseInt(opts.height, 10) : undefined,
|
|
100
|
-
captionStyle,
|
|
101
|
-
coverPreRoll: 2,
|
|
102
|
-
onProgress: (phase, percent) => {
|
|
103
|
-
writeProgress(phase, percent, 100);
|
|
104
|
-
},
|
|
105
|
-
});
|
|
106
|
-
clearProgress();
|
|
107
|
-
console.error(` ✓ ${outputPath} (${result2.duration.toFixed(1)}s, ${result2.frameCount} frames)`);
|
|
108
|
-
console.error('Done.');
|
|
109
|
-
}
|
|
110
|
-
// ── Progress helpers ──────────────────────────────────────────────
|
|
111
|
-
const BAR_WIDTH = 30;
|
|
112
|
-
function writeProgress(label, current, total, detail) {
|
|
113
|
-
const pct = Math.min(100, Math.round((current / total) * 100));
|
|
114
|
-
const filled = Math.round((pct / 100) * BAR_WIDTH);
|
|
115
|
-
const bar = '█'.repeat(filled) + '░'.repeat(BAR_WIDTH - filled);
|
|
116
|
-
const suffix = detail ? ` (${detail})` : '';
|
|
117
|
-
process.stderr.write(`\r ${label}: ${bar} ${pct}%${suffix} `);
|
|
118
|
-
}
|
|
119
|
-
function clearProgress() {
|
|
120
|
-
process.stderr.write('\r' + ' '.repeat(80) + '\r');
|
|
121
|
-
}
|
|
122
|
-
//# sourceMappingURL=video.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* detectFfmpeg
|
|
3
|
-
*
|
|
4
|
-
* Checks whether a native ffmpeg binary is available on the system PATH.
|
|
5
|
-
* Returns the absolute path to the binary if found, or null if not.
|
|
6
|
-
*
|
|
7
|
-
* Uses `which` on macOS/Linux and `where` on Windows.
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* Detect whether native ffmpeg is installed and available on PATH.
|
|
11
|
-
*
|
|
12
|
-
* @returns Absolute path to ffmpeg binary, or null if not found
|
|
13
|
-
*/
|
|
14
|
-
export declare function detectFfmpeg(): Promise<string | null>;
|
|
15
|
-
//# sourceMappingURL=detectFfmpeg.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detectFfmpeg.d.ts","sourceRoot":"","sources":["../../src/util/detectFfmpeg.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;;GAIG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAc3D"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* detectFfmpeg
|
|
3
|
-
*
|
|
4
|
-
* Checks whether a native ffmpeg binary is available on the system PATH.
|
|
5
|
-
* Returns the absolute path to the binary if found, or null if not.
|
|
6
|
-
*
|
|
7
|
-
* Uses `which` on macOS/Linux and `where` on Windows.
|
|
8
|
-
*/
|
|
9
|
-
import { execFile } from 'node:child_process';
|
|
10
|
-
/**
|
|
11
|
-
* Detect whether native ffmpeg is installed and available on PATH.
|
|
12
|
-
*
|
|
13
|
-
* @returns Absolute path to ffmpeg binary, or null if not found
|
|
14
|
-
*/
|
|
15
|
-
export async function detectFfmpeg() {
|
|
16
|
-
const command = process.platform === 'win32' ? 'where' : 'which';
|
|
17
|
-
return new Promise((resolve) => {
|
|
18
|
-
execFile(command, ['ffmpeg'], { timeout: 5000 }, (err, stdout) => {
|
|
19
|
-
if (err || !stdout.trim()) {
|
|
20
|
-
resolve(null);
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
// `which` and `where` can return multiple lines; take the first
|
|
24
|
-
const path = stdout.trim().split('\n')[0].trim();
|
|
25
|
-
resolve(path);
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=detectFfmpeg.js.map
|