☰
ljg-classic RenderClassic 使用指南:把 classic JSON 渲染为 HTML、长图 PNG、manifest 与重叠视觉验收切片
2026/10/9 12:13:05 网站建设 项目流程

【免费下载链接】ljg-skills

项目地址:https://gitcode.com/gh_mirrors/lj/ljg-skills
点击查看免费下载

导读

RenderClassic是 ljg-classic「古文笺」技能中的核心渲染工具:它读取一份符合 InputSchema 的 classic JSON(原文 token + 彩色夹注 + 章节解读),输出完整 HTML、单张长图 PNG 与带哈希校验的 manifest,并可额外生成覆盖全高的重叠 QA 切片用于视觉验收。本文以 RenderClassic.help.md 为主干,结合 RenderClassic.ts 源码与 RenderClassic.test.ts 测试,讲清命令行参数、输入 JSON 约束、渲染前校验、渲染后 DOM 审计与 QA 切片机制,帮助你把一章古文可靠地渲染成可交付的 PNG 长图。

一、RenderClassic 是什么:一份 JSON 产出四种产物

RenderClassic位于 skills/ljg-classic/Tools/RenderClassic.ts,是一个由 Bun 直接执行的命令行工具,一次运行同时产出:

产物说明
HTML完整语义化页面:书名、章节、可选意旨图、原文+夹注、章节解读、来源页脚
PNG按完整文档高度截图的长图,宽度由--width控制,默认 1080px
manifest与产物同名的.manifest.json(schemaVersion 2),记录输入、路径、像素尺寸、DOM 审计结果、token/注解统计与各文件 SHA-256
QA 切片可选(--slices-dir),覆盖全高的重叠 PNG 切片,供逐段目视检查

渲染流程固定为「校验 → 生成 HTML → 用 Playwright 无头 Chromium 加载 → DOM 审计 → 截整图 → 可选切重叠切片 → 写 manifest」。依赖在 package.json 中声明为playwright,工具本身不依赖任何远程截图服务。

二、命令行用法与参数详解

2.1 标准调用

bun Tools/RenderClassic.ts \ --input <classic.json> \ --output <classic.png> \ --html <classic.html> \ --width 1080 \ --slices-dir <qa-slices>

2.2 参数总表

参数必填说明
--input <path>是classic JSON 规格文件路径
--output <path>是输出 PNG 路径
--html <path>否输出 HTML 路径;省略时写到 PNG 同目录的同名 HTML(如classic.png→classic.html)
--width <720-1600>否图片宽度像素,默认1080;必须是 720–1600 的整数
--slices-dir <path>否保存重叠 QA 切片的目录
--help/-h否打印当前参数帮助并退出

运行bun Tools/RenderClassic.ts --help可查看当前参数(输出内容与 RenderClassic.ts 中printHelp一致)。

2.3 参数解析的底层逻辑

从 parseArgs 可以看出三点实现细节:

  • --input与--output缺失即报错退出:源码直接抛"--input and --output are required; use --help for usage"。
  • 宽度严格校验:Number.parseInt后必须满足整数且落在MIN_WIDTH = 720与MAX_WIDTH = 1600(见 RenderClassic.ts 常量定义)之间,否则抛--width must be an integer from 720 to 1600。
  • 默认 HTML 路径推导:省略--html时,用output去掉扩展名后拼接.html,且所有路径都会先resolve成绝对路径,保证后续 Playwright 用file://URL 加载时路径一致。

三、输入 JSON:结构、字段与 heroImage 规则

渲染器读取 UTF-8 JSON,最小结构如下(完整字段说明见 InputSchema.md):

{ "book": "道德经", "chapter": "第十六章", "heroImage": "assets/第十六章-意旨图.png", "heroAlt": "山谷晨雾中,万物从静处显出往复", "original": "致虚极,守静笃。", "source": "采用通行本;标点为本次整理", "passages": [ { "tokens": [ { "text": "致虚极", "note": "尽力使内心虚静", "tone": "word" }, { "text": ",", "punctuation": true }, { "text": "守静笃", "note": "彻底守住清静", "tone": "clause" }, { "text": "。", "punctuation": true } ] } ], "interpretation": [ "这一章先处理人的观看位置。心被眼前得失占满时,人只能跟着变化跑;把心放空并守住安静,才有机会看见变化重复出现的轨迹。" ] }

3.1 字段要求

字段类型要求
bookstring必填,非空;显示在页首
chapterstring必填,非空;显示在书名下
heroImagestring可选;本地 PNG/JPEG/WebP,绝对路径或相对 JSON 的路径;禁止 URL 与 data URI
heroAltstringheroImage存在时必填;一句话说明可见画面和章节意旨,不重复书名章节
originalstring必填;锁定底本的完整原文,必须与全部 token 顺序拼接完全一致
sourcestring可选;显示在页尾,不推断不存在的版本信息
passagesarray必填,至少一段
passages[].tokensarray必填,按原文顺序排列
textstring必填,必须保留底本原字
punctuationboolean标点设为true;设为true时不要求note
notestring所有非标点 token 必填
toneenum非标点必填:word、clause、variant
pinyinstring可选,只用于必要读音
interpretationstring[]必填,至少一段自然中文

3.2 内容不变量(校验的硬性前提)

  1. 按 token 顺序拼接text,必须与original逐字一致;
  2. punctuation !== true的 token 全部有非空note和合法tone;
  3. interpretation不是逐句翻译列表,而是完整章节解读;
  4. JSON 中不放 HTML;渲染器统一转义并控制样式;
  5. heroImage与heroAlt成对出现;图片在渲染时编码为 data URL,HTML 不保留本地热链;
  6. interpretation不得出现「解读边界」;边界条件写进自然段,不显示写作脚手架。

3.3 顶部意旨图(heroImage)规则

文档特别强调:heroImage只接受本地 PNG/JPEG/WebP,路径可为相对 JSON 文件的路径或绝对路径;渲染器会把它编码进 HTML,不保留文件热链。源码把这一规则落实为三道防线:

  • 路径合法性:validateSpec用/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i拦截带协议(如https:)或//开头的路径,抛heroImage must be a local file path,见 RenderClassic.ts;测试 RenderClassic.test.ts 验证了远程 URL 与 data URI 都会被拒绝。
  • 成对约束:heroImage存在时heroAlt必须为非空字符串;反之单独出现heroAlt会报错。
  • 内嵌编码:readHeroDataUri按扩展名映射 MIME(.png→image/png、.jpg/.jpeg→image/jpeg、.webp→image/webp),检查文件存在且非空后转成data:image/...;base64,...,最终写入<figure class="hero">,见 RenderClassic.ts。因此产物 HTML 完全自包含、不依赖任何本地或远程图片资源。

四、渲染前校验:validateSpec 逐项过门

文档原文提到"渲染前会校验原文逐字回读、非标点注解覆盖、tone 枚举、顶部配图和章节解读禁词",这些全部由 validateSpec 完成,顺序如下:

  1. 顶层字段:book、chapter、original必须是非空字符串;passages与interpretation必须是非空数组。
  2. hero 规则:本地路径、成对 alt、禁止 URL/data URI(见 3.3)。
  3. token 级校验:punctuation若提供必须是 boolean;非标点 token 必须有非空text、非空note、合法tone;标点 token 不允许带note/pinyin/tone。
  4. tone 枚举:VALID_TONES为{"word","clause","variant"},非法值抛tone must be word, clause, or variant。
  5. 换行处理:源码允许把换行作为{ "text": "\n", "punctuation": true }单独成 token(锁定底本可能含有意义的行界),同时禁止空格、制表符等空白标点,也禁止把换行夹在text里不拆分——见 RenderClassic.ts,测试 RenderClassic.test.ts 覆盖了这些拒绝分支。
  6. 原文逐字回读:把所有 token 的text顺序拼接后与original严格比对,不一致即抛Original round-trip mismatch。测试 RenderClassic.test.ts 用修改original的方式验证了该门禁。
  7. 注解覆盖:非标点 token 必须有note,缺注即抛note must be a non-empty string(见测试 RenderClassic.test.ts),从而保证"逐字注解"覆盖率 100%。
  8. 章节解读禁词:任何解读段含「解读边界」即抛错(见 RenderClassic.ts),确保写作脚手架不泄漏到交付内容中。

五、渲染产物:HTML 结构、PNG 与 manifest

5.1 HTML 语义骨架

renderHtml(RenderClassic.ts)产出lang="zh-CN"文档,正文按以下顺序排布:

书名(.book,data-book) 章节(h1.chapter,data-chapter) 章节意旨图(可选,figure.hero,data-hero) 原文 + 彩色夹注(article.classic,每段 passage 含 token-unit) 章节解读(section.interpretation,data-interpretation,标题固定「章节解读」) 来源(footer.source,data-source)

夹注的渲染逻辑值得注意:

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询