@bendyline/squisq-cli

中文文档
2.9.30发布于 2026/11/08MITTypeScriptES Module构建来源已验证近 30 天下载 7188

Squisq CLI ——转换文档并渲染出MP4视频或动画 GIF

中文使用文档
文档目录19 节
  1. 安装
  2. 图标
  3. squisq convert <input>
  4. squisq video <input> [output]
  5. squisq image <input> [output]
  6. squisq doctor
  7. squisq validate <input>
  8. squisq transform <input>
  9. 输入格式
  10. 程序化 API
  11. convert()
  12. renderDocToMp4
  13. renderDocToGif
  14. renderDocToDashboardPng
  15. 原生框架编码
  16. extractThumbnails
  17. 其他出口
  18. 相关软件包
  19. 许可证

@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 MIT License

安装

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, --themeSquisq主题 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。没有提示——这仍然可以写.
  • 一个未知 --formats id是一个很难的错误. -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
--formatmp4 或者说 gif推断,其他 mp4
--fps每秒框架(MP4 1-120;GIF 1-100)MP4 30; 全球投资框架 10
--qualityMP4 仅限质量 : draft, (中文(简体) ), normal,或 high常规
--orientationlandscape 或者说 portrait景观
--captionsoff, (中文(简体) ), standard,或 socialMP4 关闭; GIF 标准
--animations 编号 : --no-animations启用/ 禁用层动画和块过渡MP4 已启用; GIF 已禁用
--loopGIF 重复计数 (0 永远, -1 无循环)0 个
--max-colorsGIF 调色板大小, 2-256256号
--ditherGIF 抖动 : bayer, (中文(简体) ), sierra2_4a,或 nonesierra2_4a
--bayer-scale订购拜耳力,0-53个
-t, --theme要应用的 Squisq 主题 id无
--motion运动简介 : calm, (中文(简体) ), documentary 或者说 vibrant医生,然后主题
--transform渲染前要应用的变形样式无
--cover-preroll故事开始前的封面预卷2个
--width 编号 : --height维度在像素中覆盖—— 一定扯平了 绝对扯平了MP4 1080p; GIF 960x540 (英语)
--overwrite替换现有的输出文件( 否则拒绝并退出非零)关
--no-auto-templates禁用未加说明的标题自动选择内容意识模板(自动起动)
--frame-transportMP4 框架交付 : pipe (流静至ffmpeg)或 memorypipe
--capture-formatMP4 仍为每帧捕获 : png 或者说 jpeg (仅管子)高级 png,则 jpeg
--frames-dirMP4 仅限: 将每个被俘者都拼凑到这里, 运行后保留它无
--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, (中文(简体) ), standardfhd
--width 编号 : --height自定义像素( 两者需要一起; 排除) --resolution. 64–7680 每轴, \\ 33 MP; 奇数精细预设
--layoutDashboard 布局 ID( 内置或 doc 自定义布局), 或 autoauto
--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-反应反应组件 + 独立播放器捆绑

许可证

麻省理工学院

版本与发布记录

@bendyline/squisq-cli 共发布 91 个版本,首次发布于 2026/03/26;过去 12 个月发布了 91 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
2.9.30latest2026/11/08今天
2.9.292026/11/07今天
2.9.282026/11/052 天前
2.9.272026/11/053 天前
2.9.262026/11/017 天前
2.9.252026/10/308 天前

关于 @bendyline/squisq-cli 的常见问题

@bendyline/squisq-cli 是什么?

Squisq CLI ——转换文档并渲染出MP4视频或动画 GIF

如何安装 @bendyline/squisq-cli?

在项目目录运行 npm install @bendyline/squisq-cli,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 squisq,可以用 npx squisq 直接运行。

@bendyline/squisq-cli 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@bendyline/squisq-cli 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@bendyline/squisq-cli 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js ^22.22.2 || ^24.15.0 || >=26.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@bendyline/squisq-cli 可以商用吗?

@bendyline/squisq-cli 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@bendyline/squisq-cli 的下载量有多少?

根据 npm 官方下载统计,@bendyline/squisq-cli 在 2026/10/08 – 2026/11/06 这 30 天内被下载 7,188 次,日均约 240 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@bendyline/squisq-cli 还在维护吗?

最新版本 2.9.30 发布于 2026/11/08(今天);至今共发布 91 个版本,其中过去 12 个月发布了 91 个;首次发布于 2026/03/26。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。