纯静态:.md 正文 + 一份清单 + 逐文件原样包装。无构建依赖、无后端、无第三方库、不用 fetch/XHR。
- 文案唯一来源是
pages/下的 md。 data/ 里的配置表与词条不再向正文供字; 没有任何在用脚本会往 md 写文字(做过的生成器全部退役到 tools/_retired/)。要改文案,改 md,然后跑 update.bat。 - md 里的资源路径一律按站点根写,禁止 ../ 前缀。 正文被注入 网页版/index.html 的 DOM, 浏览器解析相对路径的基准是 index.html 所在目录,与 md 在哪个子目录无关。 所以角色页哪怕在 pages/角色/ 里,也照样写 media/thumb/…、pages/归档/…。 pages_build.js 的自检会按站点根校验每条 src/href,见到 ../ 直接报问题。 (这条是我踩过坑之后写死的:曾经给移动后的角色页加过 ../../media/… 前缀,那会让 64 页的图全断, 已由 tools/_retired/pages_fix_paths.js 全部还原为站点根写法。)
音频已是 MP3:media/sound/ 是 1769 个 .mp3 / 162 MB(原 1.24 GB WAV);语音 96 kbps 单声道 1757 个、MusicBook-* 乐曲 160 kbps 立体声 12 个,合计 3.68 小时。 2026-10 全量体检:1769/1769 可解码、异常 0(node tools/audio_check.js)。本站不保留 WAV 母本,音频只需要 MP3。
网页版/
├── index.html 入口:侧栏 + 正文容器 + favicon,只加载 pagelist.js 与 viewer.js
├── favicon.png 站点图标(181×184 PNG)
├── css/app.css 全部样式(94 条规则,全部经 css_census.js 实渲染证明在用,未用 0)
├── js/viewer.js 清单渲染(三级折叠)、hash 路由、Markdown 渲染、页内查找
├── pages/ ★ 文案唯一来源
│ ├── 主页.md 进站默认页(站点介绍与已知缺口) → 一级「主页」(侧栏第一条)
│ ├── 羁绊.md 羁绊全量 → 一级「汇总」
│ ├── 法典系统.md 法典系统的构筑点说明、六系 × 17 档成长目标等 112 条 → 一级「汇总」
│ ├── 角色/<id>_<名>.md 65 篇 → 一级「角色」+ 二级编号段/形态(含未实装 1043)
│ └── 归档/<分类>/<大文章>/<篇>.md 86 篇 → 一级「归档」+ 二级分类
├── docs/ 每篇 md 的原样包装 154 份 <名>.md.js(勿手改,pages_build.js 重生成)
├── data/
│ ├── pagelist.js ★ 清单:file / doc / id / title / sub / cat / thumb / words
│ ├── assets.js · voices.js · meta.js · report.js · i18n_chs.js · t/*.js
│ │ 抽取层产物:只有素材定位(搬图/搬音)还会用到,正文不再读取
│ │ 版式:一条一行 + 文件头注释,由 `tools/data_pretty.js` 维护(只动空白不动值)
├── media/ sound 1769 个 mp3 / 168 MB、img 498 张 / 431 MB、thumb 1077 张 / 76 MB、ui 1 张(侧标 logo)
│ —— 全部被正文、清单或 index.html 引用,零未引用残留(文件名已不含空格)
├── 站点合计 766 MB(转码前 1.9 GB)
└── tools/ 见「脚本清单」
侧栏从上到下是:先一条「主页」(不分组,进站默认页),再三层结构 一级分组(sub)→ 二级分组(cat)→ 文章条目:
| 一级 | 二级 | 条目 |
|---|---|---|
| 主页 | —(单独一条) | 1 篇 |
| 汇总 | —(cat 为空,条目直挂一级) | 羁绊、法典系统 共 2 篇 |
| 角色 | 初版角色/后续追加/特殊形态/未实装/夏日系列 | 65 篇 |
| 归档 | 11 个分类(01_主线剧情与外传 … 10_战斗对白、11_世界观补遗) | 86 篇 |
- 一个 ## 大标题 = 一篇小文章;不跨大标题合并(要压缩零碎小节用 --min-chars)。
- 小文章放进大文章同名文件夹:pages/归档/04_道具与装备/04_道具与装备文案/04-01_一、道具与素材.md; 同级还有该分类的 图片/、音频/。原大文章 md 切完即删,内容一条不丢。
- 每篇顶部保留 # <大文章> · <本节> 与 > 出自《…》(归档 · <分类>),原大文章开头的引导文字只给第一篇(不重复、不丢)。
- 单篇超 --max-chars(默认 60000 字)时按正文 标签 组边界再切,加「(第N部分)」。
- 文件名 <文章号>-<节名>.md,保证 basename 全局唯一(docs/ 是扁平目录)。
- 幂等:重跑先按前缀清掉本工具生成件再重切。
- 零碎小节靠 tools/_retired/pages_compact.js 合并:10_战斗对白 本身有 168 个 ##(35 片不到 2000 字、最短 93 字), 已用 --folder … --min-chars 20000 合成 25 篇(每篇 2–2.4 万字)。归档当前合计 86 篇:3+4+4+10+7+5+7+11+5+25+5(其中 08 的「四」由 1 篇样例补全成 7 个部分,故该分类 5→11;末尾的 5 是 11_世界观补遗)。 第一版合并它时按文件名字典序读切片,把 key 109 塞到了 key 11 前面;现在按编号数值 + 小节标题里的数字排序, 168 个小节全在、key 从 0 到 60046 零逆序(引导文字只在第一篇)。
- 侧栏:首行左边是「爆裂魔女/角色与剧情资料」文字、右边是站点 logo(media/ui/logo_burstwitch.png),两者同一行——.brand 改成 display:flex + justify-content:space-between,.logo 宽 132px。注意:全站 img{…background:#0d1016} 那条会给每张图铺深色托底(为解包立绘准备的),透明底的 UI 图必须自己加 background:none 覆盖,否则会被看成黑底方块。下接列表;列表顶部一条「主页」(进站默认页),往下「一级分组 → 二级分组 → 条目」三层折叠,没有额外的包裹容器。 展开状态记在内存,筛选/换页不丢;当前正文所在的一二级自动展开;筛选时命中的分组自动全展开。
- 统一排版:65 个角色页结构一致(模板 = 1001_安娜.md):基本信息 → 基础属性 → 角色剧情 → 技能 → 天赋 → 语音 → 装束 → 羁绊;63 页共 1,512 对,未覆盖 0);「### 档案一/二/三/四」子标题已按模板换成真实篇名(232 处上移,正文里那行《篇名》移上来、不留重复行;4 处本来没有篇名行的保持 档案N);6 个夏日角色在 Story 表内无文本,故「角色剧情」下无子标题,13 个角色(含 1043)在 FetterCard 里无配置,故无「羁绊」小节——都是数据本身如此,不是漏页。工具 tools/_retired/pages_roles_uniform.js 带双向守恒校验,对不上就拒写。
- 正文:长文自动生成分栏目录;文末上一页/下一页;图片取不到显示红色「缺文件」并保留原图路径。角色页现在 241 个图链接全部可点开(0 张裸 markdown 图)。
- 装束图鉴:tools/retired/pages_skin_gallery.js 在主立绘下方生成横向并排卡片(.skins/.skin/.sname/.sget/.sdesc,用 span 而非 div,因为渲染器会把整段包进
),装束名/获取方式/描述逐字取自该页原有 ## 装束 行文,图片由 Skin 表按 heroid + 装束名定位:62 套用各自皮肤立绘 source_avatar/hero/body<皮肤id>、64 套默认皮肤复用主立绘、1 套(1035 月光神使)包内无图,卡片上如实写「包内无该套装束立绘」而不是放坏图;旧 ## 装束 小节因文字已进卡片而删除(64 页,逐条覆盖校验通过才删)。tools/_retired/pages_portrait_links.js 另把 51 张好感立绘与全部主立绘补上 media/img 原图并包成可点开链接(角色页现在 0 张裸图、241 个图链接)。 图片/音频这类资源直链一律 target="_blank" 开新标签页(在 viewer.js 渲染层统一加,md 里不写 target), 因为正文靠 hash 路由,在当前页打开原图会顶掉阅读位置;站内 .md 跳转与目录锚点 #hN 不受影响。
- 页内查找:筛选框输入后按回车标黄,↑ ↓ 逐处跳转,Esc 清空。
- 角色语音表:角色页的「## 语音」四列表,固定排在「天赋」之后、「装束」之前;1560 行、中配 1181 / 日配 803(1043 的 24 条全有中配、无日配);播放器用 media/sound/*.mp3,已逐个复验与 WAV 母本时长一致。
- 好感立绘缺图:14 个角色的好感立绘在解包里根本不存在,正文中已删除。没有一张是这些角色的好感立绘;也没有拿别的立绘顶替。
file:// 下 fetch 读不到同目录文件,<script src> 能。构建器把每份 md 原文包成 window.DB_DOC["pages/…"] = "…"(只做 JSON 转义,</ 写成 </,处理 U+2028/29,正文一字不动)。 所以改了 md 必须重跑 update.bat,页面才会变。
日常(留在 tools/,共 7 个)
| 脚本 | 作用 |
|---|---|
| tools/pages_build.js | 扫 pages/**/.md → 生成 pagelist.js 与 docs/.md.js + 自检(重名/缺包装/资源按站点根是否存在)。只读 md 和清单,不写 md。--check 不写盘 |
| update.bat | 两步:跑 pages_build.js,然后打开页面 |
| tools/make_thumbs.js | 零依赖 PNG:解码 → 裁透明边 → alpha 加权面积平均缩放 → 自适应 filter 重编码;带 --selftest(解→重编→再解逐字节相等)。只写 media 图,不碰 md |
| tools/audio_check.js | MP3 体检(只读,不依赖任何母本):逐个用 ffmpeg 解开,报异常/时长/码率分布 |
| tools/data_pretty.js | data/.js 与 data/t/.js 的排版器:保序递归下降解析 → 一条一行 + 文件头注释。只改空白不改值(数字留原样、字符串按值重编码、键序不变),写前逐 token 比对,不等价就拒写;幂等,--check / --dry 不写盘。pages_build.js 出清单时直接复用它的排版函数,所以构建不会把版式压回一行 |
| tools/site_move_unused.js | 把没被引用的素材按原路径搬进 _未引用资源/(--dry 先看) |
| tools/css_census.js | 用 viewer.js 自己的 md2html() 渲染全部 md,对表 app.css 找死规则(只读) |
| tools/pages_archive_media.js、tools/pages_archive_audio.js | 从 _export 按字段值搬归档图/音(只搬文件)。重跑会把已搬进 _未引用资源/ 的东西再拷回来 |
| tools/site_update.js | 旧打包器存根,只转发到 pages_build.js(兼容旧 .bat) |
APK → Lua 明文→ web_extract.py→ data/ →(历史上)web_pages.py 出 md。现在 md 是手改面,data/ 只在素材定位时用到。
- 14 张好感立绘不存在(见上),已改文字占位。
- 1043 维多利亚(未实装)已成页:CardCharacter 无此行 → 无品质/职业/CV/属性/技能/装束表数据;但包内有她的 dialogue 24 条(中配 35 个 1043-* bank,已拷入 media/sound/)、Story 10430001–10430004 四篇档案、Skin 10430001 装束署名「斯托拉蒂」、一张好感立绘与三张技能图标(图标因无技能文案而未列)。
- docs/ 是扁平目录 ⇒ md 文件名必须全站唯一,pages_build.js 会拒绝重名并退出非 0。
git add -A
git commit -m "站点初始化:148 篇文章 + 1769 段 MP3 + 5324 张图"
git push -u origin main