转换流程概览
console2svg 并非单纯将终端输出文本放入图像容器中的基础截图工具。 它通过操作系统级伪终端(PTY)启动子进程,将原始输出字节流送入内存终端仿真器中维持准确的虚拟屏幕画面,并最终转换为高度优化的 SVG 矢量图、光栅图像、视频流和实时网络广播。
为了在保留极高画面还原度的同时实现极致的体积精简,console2svg 将整个转换逻辑拆分为明确的五个处理阶段:
[子进程启动 / 输入回放] │ 原始 VT 字节流 ▼[阶段 1: 输入捕获与数据流控制] │ 聚合事件流 ▼[阶段 2: 终端仿真与转义序列解析] │ 虚拟屏幕缓冲区 (ScreenBuffer) ▼[阶段 3: 机密信息检测与遮盖] │ 遮蔽处理后的单元格网格 ▼[阶段 4: SVG 图层组织与结构优化] │ 优化后的矢量标记 ├─► [阶段 5A: 静态图 / 动画 SVG] ├─► [阶段 5B: 高速栅格化 / 视频编码] └─► [阶段 5C: 实时网页流式广播]各阶段职责与导览
Section titled “各阶段职责与导览”整个转换处理流程分为以下五个核心阶段:
阶段 1: 输入捕获与数据流控制
Section titled “阶段 1: 输入捕获与数据流控制”精准还原终端画面的基础在于捕获原始子进程输出时,避免字节损坏与时序抖动。
- PTY 启动、控制与数据流捕获:屏蔽 Windows ConPTY 与 Unix PTY 的底层差异,保障多字节 UTF-8 边界完整性,并通过邻近事件聚合降低解析器负担。
- 确定性输入回放:规范化记录按键的时间戳,并合成规范的 VT 转义序列,确定性地复现终端操作行为。
阶段 2: 终端仿真与转义序列解析
Section titled “阶段 2: 终端仿真与转义序列解析”终端输出流并非纯文本,而是包含光标跳转、屏幕清除以及 SGR 样式修饰等 ANSI 控制序列。
- 转义序列解析与缓冲区更新:采用有状态状态机解析 CSI、OSC 和 SGR 控制码,并在二维
ScreenBuffer中准确处理全角字符宽度、边距与光标位置。 - 特殊字符、制表符与块元素处理:将受字体渲染影响的制表符和块元素替换为平滑的矢量几何路径,消除拼接缝隙与圆角锯齿。
阶段 3: 机密信息检测与遮盖
Section titled “阶段 3: 机密信息检测与遮盖”在捕获用于文档或公开视频的终端会话时,必须防止敏感凭据泄漏到最终画面中。
- QuickLeaks 机密信息检测与遮蔽:基于预编译字面量锚点加速正则扫描,并在双重坐标系间建立映射,直接在 SVG 文本节点中脱敏敏感凭据。
阶段 4: SVG 图层组织与结构优化
Section titled “阶段 4: SVG 图层组织与结构优化”将虚拟屏幕网格映射为标准 SVG 矢量时,需进行严谨的分层与结构合并以防体积膨胀。
- SVG 分层结构与坐标系设计:在统一的字符网格坐标系下,将外边距、窗口外观饰边、投影、背景填充与前景文字清晰解耦为独立图层。
- 转换管线中的多层优化策略:结合写时复制(CoW)快照、XxHash3 行签名校验以及水平相邻单元格矩形/路径合并算法,实现极端的文件体积压缩。
阶段 5: 目标产物输出与生成
Section titled “阶段 5: 目标产物输出与生成”经过结构化与优化的屏幕状态,将根据具体的 CLI 命令分支分发至多种输出管线:
- SMIL 动画 SVG 生成技术:将去重后的行数据存入
<defs>字典,通过离散型 SMIL<animate>属性切换与行级局部差异更新生成极轻量的动画 SVG。 - 基于 resvg 的高速 PNG 栅格化:通过 C ABI 在进程内嵌入 Rust 编写的 resvg 引擎,跨执行周期缓存系统字体扫描结果,在数毫秒内完成单帧渲染。
- ffmpeg 视频编码管线:依托单向推进的仿真引擎、两级内存状态缓存、多线程并行栅格化以及直通 ffmpeg 的
image2pipe管道,稳定高效地输出确定性视频文件。 - live-server 流式架构:内置轻量 HTTP/SSE 服务,通过三层分离推送、静默延迟防抖与客户端 rAF 批量合并机制,在浏览器中流畅投屏终端状态。
关于各处理环节的具体算法实现与技术决策细节,请参阅上述对应章节。