From 1217b363ca49149a4d544cb37238b95efa425ee9 Mon Sep 17 00:00:00 2001 From: wangkeyu-u <189725962+wangkeyu-u@users.noreply.github.com> Date: Thu, 8 Oct 2026 00:24:04 +0800 Subject: [PATCH] fix: safely embed gallery JSON in HTML scripts --- .github/workflows/ci.yml | 1 + README.md | 3 ++ docs/maintenance.md | 2 ++ docs/validation.md | 2 ++ package.json | 3 +- preview-gallery.html | 2 +- scripts/gen-gallery.js | 30 +++++++++++------ tests/embedded-data.js | 73 ++++++++++++++++++++++++++++++++++++++++ 8 files changed, 104 insertions(+), 12 deletions(-) create mode 100644 tests/embedded-data.js diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index da2d4b3..a37b971 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,5 +20,6 @@ jobs: - run: npx playwright install --with-deps chromium - run: npm run build - run: git diff --exit-code -- preview-gallery.html + - run: npm run test:embedded-data - run: npm test - run: npm run test:copy diff --git a/README.md b/README.md index a2ac940..842913c 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ Node.js 22+。从仓库根目录执行: npm ci npm run build npx playwright install chromium +npm run test:embedded-data npm test npm run test:copy ``` @@ -35,6 +36,8 @@ npm run test:copy 功能检查覆盖卡片、图片、筛选、选择、持久化和复制。测试截图写入被忽略的 `.artifacts/`。它不评估提示词生成页面与原网站的视觉或动画一致程度。 +`npm run test:embedded-data` 用 Chromium 解析真实模板生成的临时页面,检查提示词中的 ``、HTML 注释、替换符号和 Unicode 分隔符能完整恢复为数据,且附加脚本不会执行。临时页面在测试结束后删除。 + ## 维护与记录 - [维护工具](docs/maintenance.md):各脚本的输入、输出和运行范围。 diff --git a/docs/maintenance.md b/docs/maintenance.md index b9a6429..bef4ea8 100644 --- a/docs/maintenance.md +++ b/docs/maintenance.md @@ -2,6 +2,8 @@ 所有命令从仓库根目录运行。`npm run build` 是日常构建入口;不会重抓页面或更改条目。 +画廊构建器在嵌入 JSON 时转义 `<` 和 Unicode 行/段分隔符,并用回调填入模板占位符。提示词中的脚本结束标签、HTML 注释与 `$&` 等替换符号因此保留为普通数据;浏览器读取后的内容与原 JSON 一致。维护模板或构建器后运行 `npm run test:embedded-data`:真实 Chromium 回归使用临时数据与页面,不访问条目网站,也不修改 `preview-data.json`。 + | 工具 | 输入 | 输出/影响 | | --- | --- | --- | | `scripts/gen-gallery.js` | 模板、preview-data.json | preview-gallery.html | diff --git a/docs/validation.md b/docs/validation.md index 8ed75b2..96ce808 100644 --- a/docs/validation.md +++ b/docs/validation.md @@ -4,6 +4,8 @@ `npm test` 检查本地画廊的卡片数量、图片加载、筛选、选择、localStorage、复制和控制台错误。`npm run test:copy` 检查单卡复制入口。这些检查不测量第三方网站或 AI 重建的动画质量。 +`npm run test:embedded-data` 检查浏览器实际解析嵌入数据的行为:普通中文与转义字符、脚本结束标签(含大小写变化)、HTML 注释、`$&` 等替换符号和 Unicode 行/段分隔符。要求完整数据恢复、画廊初始化完成、只保留模板原有脚本且提示词内附加脚本没有执行。该回归只覆盖 JSON 嵌入边界,不代表所有卡片 HTML 渲染输入都完成了安全审查。 + ## 历史复现记录 旧 README 报告 204 项进入评估、194 项标为复现通过、其中 191 项标为动画还原。`preview-data.json` 保留原有状态、失败记录、备注和提示词;本次清理没有重新判定这些状态。194/204 约为 95.1%,旧文档括号中的 100% 是错误表述。 diff --git a/package.json b/package.json index 6e70222..7905ac5 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "scripts": { "build": "node scripts/gen-gallery.js", "test": "node tests/functional.js", - "test:copy": "node tests/smoke-copy.js" + "test:copy": "node tests/smoke-copy.js", + "test:embedded-data": "node --test tests/embedded-data.js" } } diff --git a/preview-gallery.html b/preview-gallery.html index f93b874..bbac21a 100644 --- a/preview-gallery.html +++ b/preview-gallery.html @@ -163,7 +163,7 @@