@bendyline/squisq-cli (英语)
在DOCX,PPTX,PDF,XLSX,CSV,HTML,EPUB,Markdown,和容器ZIP之间转换Squisq文档的命令行工具和程序API——并把它们渲染为MP4视频或动画GIF. 读取 Markdown 二进制文档(.docx编号 :.pptx编号 :.pdf编号 :.xlsx编号 :.csv编号 :.html页:1.dbk 容器、文件夹或预建的 Doc JSON作为输入.
部分 斯奎斯克语Name 单相机.
安装
npm install -g @bendyline/squisq-cli
对于 squisq video (和 convert 改为 mp4 或者说 gif您还需要:
- ffmpeg — 解决于
SQUISQ_FFMPEG{\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}然后是你们的PATH(单位:千美元)brew install ffmpeg编号 :apt install ffmpeg编号 :winget install ffmpeg),然后可选安装ffmpeg-static软件包. - 一个由 Playwright 管理的 Chromium 用于无头帧捕获(例如.
npx playwright install chromium(中文(简体) )
运行 squisq doctor 检查视频工具链。 文档转换为非视频格式没有本地要求.
图标
squisq convert <input>
将文档转换为一个或多个格式。 输入可以是Markdown或二进制文档(.docx, (中文(简体) ), .pptx, (中文(简体) ), .pdf, (中文(简体) ), .xlsx, (中文(简体) ), .csv, (中文(简体) ), .html页:1 .zip编号 :.dbk 容器,或文件夹。 转换通过斯奎斯克 MarkdownDocument 支点模型并保存了文档的大部分口味(结构,格式化,表格,图像)——它并不是一回无所失.
squisq convert input.md -o report.docx # single file; format inferred from extension
squisq convert report.docx -o report.md # binary input → markdown
squisq convert input.md --formats pptx # single format to the default output dir
squisq convert input.md --formats docx,pptx,pdf # multiple formats
squisq convert project.dbk --output-dir ./out --formats html,docx
squisq convert input.md --theme cinematic --transform magazine --formats pptx
| 选项 | 说明 | 默认 |
|---|---|---|
-o, --output <file> | 单身 输出文件; 从扩展名中推断出的格式( 无法与 --formats(中文(简体) ) | —— 说 |
-d, --output-dir | 输出目录(多格式模式) | 与输入相同 |
-f, --formats | 逗号分隔 : docx, (中文(简体) ), pptx, (中文(简体) ), pdf, (中文(简体) ), html, (中文(简体) ), htmlzip, (中文(简体) ), epub, (中文(简体) ), dbk, (中文(简体) ), md, (中文(简体) ), xlsx, (中文(简体) ), csv, (中文(简体) ), mp4, (中文(简体) ), gif | 默认集 |
--overwrite | 替换现有的输出文件( 否则运行拒绝并退出非零) | 关 |
-t, --theme | Squisq主题 id — 内置或自定义主题在 doc的前题中包含 | 无 |
--transform | 导出前应用了变形样式( 如 . documentary, (中文(简体) ), magazine, (中文(简体) ), minimal(中文(简体) ) | 无 |
--no-auto-templates | 禁用未加说明的标题自动选择内容意识模板 | (自动起动) |
v1.5 打破旗帜更改 :
-o现在是一个 单文件 目的地(从扩展中推断出格式)。 旧的-o产出 -目录 行为就是现在-d, --output-dir。一个赤裸的convert <input>没有-o编号 :--formats写入故意排除的默认集md编号 :xlsx编号 :csv编号 :mp4编号 :gif。 。 。 .
注释:
- 现有文件从未默认被覆盖 . 一个赤裸的
convert report.md输入旁边写好几个文件; 如果已有任何文件存在, 运行会拒绝在前面( 在转换任何文件之前) 并退出 1 。 过--overwrite来代替他们 旗帜是--overwrite没有-f,因为-f实值--formats。没有提示——这仍然可以写. - 一个未知
--formatsid是一个很难的错误.-f docx,pfd失败Unknown format: "pfd" (did you mean "pdf"?)并且没有产生任何东西, 而不是警告和退出 0 与PDF 无声缺失. html与独立玩家内置(静态模式)一起生成单个自成一体文件;htmlzip生成一个<name>.html.zip带有外部资产和可选音频的归档.epub嵌入来自输入容器的图像,当doc有叙述段时,生成EPUB 3 Media Overlay.xlsx导出为只使用表格;csv导出第一个表格;mp4财务报告和审定财务报表gif要求渲染工具链(见安装).dbk将输入容器重新序列化为ZIP.
squisq video <input> [output]
将文档渲染为 MP4 或动画 GIF 。 Playwright从一个无头玩家的页面中捕捉到决定性的帧;本地的ffmpeg为MP4编码了H.264+AAC或为GIF生成的全局调色板. 有美人鱼栅栏的文档会自动使用完整的独立播放器,因此图被捕获;其他文档会保留更小的光线播放器. GIF没有音频音轨.
squisq video input.md output.mp4
squisq video input.md output.gif
squisq video input.md --format gif --no-animations
squisq video project.dbk --quality high --fps 30
squisq video ./my-folder --orientation portrait --captions social
squisq video input.md -t documentary --transform magazine --cover-preroll 1.5
squisq video doc.json -o out.mp4
| 选项 | 说明 | 默认 |
|---|---|---|
-o, --output | 产出 .mp4 或者说 .gif 路径; 扩展名选择格式 | <input>.mp4 |
--format | mp4 或者说 gif | 推断,其他 mp4 |
--fps | 每秒框架(MP4 1-120;GIF 1-100) | MP4 30; 全球投资框架 10 |
--quality | MP4 仅限质量 : draft, (中文(简体) ), normal,或 high | 常规 |
--orientation | landscape 或者说 portrait | 景观 |
--captions | off, (中文(简体) ), standard,或 social | MP4 关闭; GIF 标准 |
--animations 编号 : --no-animations | 启用/ 禁用层动画和块过渡 | MP4 已启用; GIF 已禁用 |
--loop | GIF 重复计数 (0 永远, -1 无循环) | 0 个 |
--max-colors | GIF 调色板大小, 2-256 | 256号 |
--dither | GIF 抖动 : bayer, (中文(简体) ), sierra2_4a,或 none | sierra2_4a |
--bayer-scale | 订购拜耳力,0-5 | 3个 |
-t, --theme | 要应用的 Squisq 主题 id | 无 |
--motion | 运动简介 : calm, (中文(简体) ), documentary 或者说 vibrant | 医生,然后主题 |
--transform | 渲染前要应用的变形样式 | 无 |
--cover-preroll | 故事开始前的封面预卷 | 2个 |
--width 编号 : --height | 维度在像素中覆盖—— 一定扯平了 绝对扯平了 | MP4 1080p; GIF 960x540 (英语) |
--overwrite | 替换现有的输出文件( 否则拒绝并退出非零) | 关 |
--no-auto-templates | 禁用未加说明的标题自动选择内容意识模板 | (自动起动) |
--frame-transport | MP4 框架交付 : pipe (流静至ffmpeg)或 memory | pipe |
--capture-format | MP4 仍为每帧捕获 : png 或者说 jpeg (仅管子) | 高级 png,则 jpeg |
--frames-dir | MP4 仅限: 将每个被俘者都拼凑到这里, 运行后保留它 | 无 |
--resume | 只使用 MP4 : 重复使用仍为相同的配置 --frames-dir | 关 |
注释:
- 尺寸必须均匀.
--width 851被立即拒绝——在读取文档或浏览器启动之前Video width must be an even number of pixels (got 851) … Use 850 or 852.奇数被否定,而不是四舍五入,所以一个从未按你没有要求的大小默默无声的船体。 该规则对MP4和GIF相同,并匹配浏览器导出. - 已存在的输出文件从未默认被覆盖 . 检查在渲染前会运行,所以相撞路径需要你花一秒钟,而不是完全捕获. 过
--overwrite替换. - FFmpeg 失败报告一条相关的行(例如:.
[libx264] width not divisible by 2 (851x480) (exit code 1))而不是倾倒整个命令行和stderr缓冲. - MP4在被捕获时将流帧为ffmpeg. 对于任何长度的故事,记忆都保持平平;
--frame-transport memory恢复旧的保留-when-en-encode路径,该路径被限定为几秒1080p相片幻灯片.--frames-dir保持每个平稳(加a)manifest.json命名文档、大小、速率、标题和动画设置),以及--resume跳过重新抓取的静态, 即一个相同的渲染物已经在那里拼接了 . - 外观和自定义的尺寸由本地构成. 渲染页将玩家的取景口钉入导出大小;玩家捆绑会忽略它在抓取前的运行失败,而不会产生字母框的地貌布局.
squisq image <input> [output]
将文档渲染为 盘子 引渡——按一个街区排列
画布——到PNG图像. 仅需要 Playwright Chromium( 无 ffmpeg; 这是一个
单帧捕捉,不是视频编码. 排版来自医生
squisq-dashboard-layout 前题(或 --layout),默认为
自动选取,选择符合区块计数的最小内置布局;
文档标题带默认生成 --no-title 藏来. --style
选择单元格敷料(basic, (中文(简体) ), card, (中文(简体) ), panel, (中文(简体) ), accent ——出自所有主题),,
默认到医生的 squisq-dashboard-style。 。 。 .
squisq image input.md output.png
squisq image input.md --resolution 4k
squisq image input.md --resolution square --layout grid-2x2
squisq image input.md --style card
squisq image input.md --width 1280 --height 720 --no-title
squisq image input.md -t documentary --transform magazine
| 选项 | 说明 | 默认 |
|---|---|---|
-o, --output | 产出 .png 路径 | <input>.png |
--resolution | 已命名预设 : hd, (中文(简体) ), fhd, (中文(简体) ), 4k, (中文(简体) ), square, (中文(简体) ), square-2k, (中文(简体) ), portrait, (中文(简体) ), portrait-4k, (中文(简体) ), standard | fhd |
--width 编号 : --height | 自定义像素( 两者需要一起; 排除) --resolution. 64–7680 每轴, \\ 33 MP; 奇数精细 | 预设 |
--layout | Dashboard 布局 ID( 内置或 doc 自定义布局), 或 auto | auto |
--style | 单元格样式变体 : basic, (中文(简体) ), card, (中文(简体) ), panel, (中文(简体) ), accent (所有主题来源) | 文档设置 |
--title 编号 : --no-title | 显示/隐藏文档标题带 | 显示 |
--format | 产出格式png(中文(简体) ) | png |
-t, --theme | 要应用的 Squisq 主题 id | 无 |
--transform | 渲染前要应用的变形样式 | 无 |
--overwrite | 替换现有的输出文件( 否则拒绝并退出非零) | 关 |
--no-auto-templates | 禁用未加说明的标题自动选择内容意识模板 | (自动起动) |
可通过登记册获取的同为 squisq convert <input> -f png。 。 。 .
squisq doctor
预飞渲染工具链:报告已解析的ffmpeg路径,版本,以及它来自哪个来源(SQUISQ_FFMPEG 内置/ PATH 编号 : ffmpeg-static)在缺失时带有安装提示,尝试进行无头铬发射,报告节点版本,并总结每个地貌准备(video/GIF需要ffmpeg + Chromium;仪表板PNG图像仅需要Chromium).
squisq doctor
squisq validate <input>
结构验证a .md 文档, .zip编号 :.dbk 或文件夹。 报告未知的模板( 带有 DO- you- 意思) , 未解析 {[…]} 注解,标题属性不正确,连接未解决,id重复,数据栅栏差,以及缺少资产引用——有行号.
squisq validate input.md
squisq validate project.dbk --json
squisq validate ./my-folder --strict
| 选项 | 说明 |
|---|---|
--json | 将诊断作为机器可读的JSON |
--strict | 警告时也退出非零 |
诊断报告在三个断层 error, (中文(简体) ), warning,以及 info (信息分别计算并显示). 退出代码取决于 错误 仅限: 0 清洁、只警告或只信息; 1 错误(或任何警告) --strict(三); 2 输入不可读.
squisq transform <input>
这个 condense 操作压缩表和装饰分页符,同时
保留表格数据、对齐、代码、引用和归属。 它验证
返回前的结构等同。 组合操作时,设置
condense 之后 cleanup 因此序列化不会重新引入活塞.
一次性降分 来源 转换为 a .md 文件,按给定的顺序 : unwrap (删除强制行包接,使每个段落都是一行——坚硬的断开), wrap (硬包装段落在字段-代码、表格和标题上未调整的栏宽),和 cleanup (宫殿式规范化:子弹、重点、标题、平板、间距、说明和保留前题)。 不要被混淆 与 --transform <style> 打开幻灯片样式的旗帜 convert编号 :video ——此命令重写下标文本本身.
变换的标记降值默认为 stdout(状态消息为 stderr,因此管道干净).
squisq transform doc.md --ops unwrap
squisq transform doc.md --ops unwrap,cleanup > cleaned.md
squisq transform doc.md --ops wrap --width 100 --in-place
squisq transform doc.md --ops cleanup -o cleaned.md
squisq transform doc.md --ops condense -o compact.md
| 选项 | 说明 |
|---|---|
--ops <list> | 按顺序应用的逗号分离变换(unwrap, (中文(简体) ), wrap, (中文(简体) ), cleanup(中文(简体) ) |
--width <n> | 列宽 wrap (20-500,默认为80) |
-o <file> | 将结果写入文件( 重写以覆盖不包含 --overwrite(中文(简体) ) |
--in-place | 重写输入文件( 与 -o(中文(简体) ) |
--overwrite | 允许 -o 以替换已有文件 |
变形在严格模式下运行:每个变形器重排输出,并与输入文档进行结构对比;如果等同性无法被证明,命令会退出 1 而不排放任何东西。 退出代码 : 0 成功吗, 1 变换/输出失败, 2 输入不可读.
输入格式
所有命令接受 :
| 投入 | 说明 |
|---|---|
.md 文件 | 普通 Markdown 文件 |
| 二进制文件 | .docx, (中文(简体) ), .pptx, (中文(简体) ), .pdf, (中文(简体) ), .xlsx, (中文(简体) ), .csv, (中文(简体) ), .html (单位:千美元)convert(中文(简体) ) |
.zip编号 :.dbk | 带有文档 + 嵌入式介质的容器归档 |
| 文件夹 | 有 Markdown 文件和相关媒体文件的目录 |
.json 文件 | 预建的JSON医生video 仅限) |
程序化 API
导入 @bendyline/squisq-cli/api - 使用与Node.js图书馆相同的管道——不需要外壳。 像CLI一样, renderDocToMp4 财务报告和审定财务报表 renderDocToGif 需要ffmpeg和一个由 Playwright 管理的铬.
convert()
预装包装 @bendyline/squisq-formats' convert() 输入 CLI 格式登记册(每个内置导出方加只输入 CLI) mp4 财务报告和审定财务报表 gif 格式)和默认 resolvePlayerScript (所以HTML/玩家-嵌入式输出在框外有效). 两者均可通过 options。 。 。 . createCliRegistry() 返回同一登记册供直接使用.
import { convert, createCliRegistry, ConversionError } from '@bendyline/squisq-cli/api';
const result = await convert({ kind: 'markdown', markdown: '# Hello' }, 'docx');
// result.bytes (Uint8Array), result.mimeType, result.suggestedFilename, result.warnings
ConversionError (有一个稳定 code)和 ConvertSource 编号 : ConvertOptions 编号 : ConversionResult 编号 : FormatRegistry 类型为方便再出口.
renderDocToMp4
import { renderDocToMp4, readInput } from '@bendyline/squisq-cli/api';
// Load a document from disk (.md, .zip/.dbk, folder, or Doc .json)
const input = await readInput('./my-article.md');
// `doc` is always normalized and ready to render. `markdownDoc` is present
// only when the source was markdown-shaped; `sourceFormat` identifies the input.
const { doc, container, markdownDoc, sourceFormat } = input;
// Render to MP4
const result = await renderDocToMp4(doc, container, {
outputPath: './output.mp4',
fps: 30, // default 30
quality: 'high', // 'draft' | 'normal' | 'high' (default 'normal')
orientation: 'landscape', // 'landscape' | 'portrait' (default 'landscape')
captionStyle: 'social', // 'off' | 'standard' | 'social' (default 'off')
animationsEnabled: false, // static slide changes; media/timing remain active
coverPreRoll: 2, // seconds of cover-slide pre-roll (default 0)
frameTransport: 'pipe', // 'pipe' (default; streams stills to ffmpeg) | 'memory'
captureFormat: 'png', // 'png' | 'jpeg' (default: png for high quality, jpeg otherwise)
framesDir: './frames', // optional: keep every still + manifest; with resume: true, reuse them
onFrame: ({ index, totalFrames, captureMs, reused }) => {}, // per-frame throughput hook
onProgress: (phase, pct) => console.log(`${phase}: ${pct}%`),
});
// result: { duration, frameCount, outputPath, reusedFrameCount?, framesDir? }
console.log(`Rendered ${result.frameCount} frames (${result.duration}s) → ${result.outputPath}`);
容器的音频部分成为了MP4的音频轨道;在道克中发现的定时媒体剪辑和块块视频被嵌入并混入其预定位置.
抓取页面没有从网络上装入任何内容, 因此一个主题字体是渲染
机器缺乏( Google 字体堆栈, 如 war- earth ) DM Sans 机构)
变回倒地 通过字体文件为 fonts每个文件一个条目;
这里的每个渲染器(MP4,GIF,封面和仪表板PNG)都接受:
const fonts: RenderFontFace[] = [
{ family: 'DM Sans', data: await readFile('DMSans-Variable.woff2'), weight: '100 1000' },
{
family: 'DM Sans',
data: await readFile('DMSans-VariableItalic.woff2'),
weight: '100 1000',
style: 'italic',
},
];
await renderDocToMp4(doc, container, { outputPath: './output.mp4', fonts });
format 默认为 'woff2' (另见: 'woff', (中文(简体) ), 'truetype', (中文(简体) ), 'opentype'),以及
unicodeRange 使用 CSS 软件 unicode-range 用于保存一个子集的文件.
renderDocToGif
import { renderDocToGif } from '@bendyline/squisq-cli/api';
const result = await renderDocToGif(doc, input.container, {
outputPath: './output.gif',
fps: 10,
captionStyle: 'off', // override the default 'standard' captions
animationsEnabled: false,
maxColors: 256,
loop: 0,
});
GIF 默认为 960x540 地貌 (540x960 肖像), 10 fps, 标准
标题、无限回路和禁用幻灯片动画/过渡。 设定
captionStyle: 'off' 来省略标题。 嵌入式视频仍然进步,但全部
音频被省略并通过报告 result.warnings。 。 。 .
renderDocToDashboardPng
import { renderDocToDashboardPng } from '@bendyline/squisq-cli/api';
const result = await renderDocToDashboardPng(doc, input.container, {
outputPath: './dashboard.png',
resolution: 'square', // or width/height for custom pixels
layout: 'grid-2x2', // 'auto' (default) picks by block count
style: 'card', // 'basic' (default) | 'card' | 'panel' | 'accent'
title: true,
});
// result: { bytes: Uint8Array, width, height, outputPath? }
把Dashboard递解给一个PNG 需要 Playwright 铬
- 没有ffmpeg. resolution 名称预设从 DASHBOARD_RESOLUTIONS
(默认) fhd,1920×1080;明确 width编号 :height (两者一起)替换
这个 上游应用主题( E){ ...doc, themeId }公约》第2条)
视频渲染器使用.
原生框架编码
对于已经拥有PNG帧而不需要Playwright捕获的呼叫者, aPI直接暴露出原生的FFmpeg层:
import { framesToGifNativeBytes, framesToMp4NativeBytes } from '@bendyline/squisq-cli/api';
const mp4 = await framesToMp4NativeBytes('/usr/bin/ffmpeg', pngFrames, audioBytes, {
fps: 30,
quality: 'high',
});
const gif = await framesToGifNativeBytes('/usr/bin/ffmpeg', pngFrames, {
fps: 10,
width: 960,
height: 540,
});
路径变体写入呼叫器提供输出; 每个 Bytes 变量返回
(单位:千美元) Uint8Array。MP4 垫片带有静默的简短音频,因此无法截取
时间轴 GIF 使用方便压缩的 diff 调色板和已更改的矩形
应用.
extractThumbnails
JPEG 缩略图 :
import { extractThumbnails } from '@bendyline/squisq-cli/api';
await extractThumbnails({
videoPath: './output.mp4',
outputDir: './thumbs',
slug: 'my-article', // filenames: {slug}-{width}x{height}.jpg
sizes: [
{ name: 'og', width: 1200, height: 630, filter: 'scale=1200:630' },
{ name: 'thumb', width: 480, height: 270, filter: 'scale=480:270' },
],
force: false, // overwrite existing files (default false)
});
其他出口
readInput(inputPath)→{ doc: Doc, container: ContentContainer, markdownDoc?: MarkdownDocument, sourceFormat: FormatId }MemoryContentContainer(从@bendyline/squisq/storage(中文(简体) )VideoQuality, (中文(简体) ),VideoOrientation类型(从@bendyline/squisq-video(中文(简体) )DASHBOARD_RESOLUTIONS, (中文(简体) ),DEFAULT_DASHBOARD_RESOLUTION, (中文(简体) ),resolveDashboardDimensions, (中文(简体) ),validateDashboardImageDimensions(从@bendyline/squisq-video(中文(简体) )
见全 API 参考 所有类型和选项.
相关软件包
| 软件包 | 说明 |
|---|---|
| @bendyline/squisq (英语) | 无头核心——计划,模板,下标 |
| @bendyline/squisq-formats (中文(简体) ) | DOCX/PDF/HTML/EPUB/PPTX转换器(由 convert(中文(简体) ) |
| @bendyline/squisq-视频 | 无头视频渲染基础(由 video(中文(简体) ) |
| @bendyline/squisq-反应 | 反应组件 + 独立播放器捆绑 |