【T1 PDF 内置阅读重做】iframe 对 arXiv PDF 实测 ERR_ABORTED(浏览器 PDF
插件策略差异)→ pdfjs-dist 6.4.299 客户端 canvas 渲染:只在 /papers/
动态 import(worker ?url 打包,不进全站 bundle);文档一次取回 + IO
懒渲染(rootMargin 400px)+ 页占位 aspect-ratio 防跳动 + 12s 首屏兜底 +
微信 UA 直接兜底;工具条页码/缩放/翻页/下载/arXiv/授权声明保留。红线:
PDF 由访客浏览器直取 arXiv(CORS * 实测),仓内零副本。真页实测:
13 页 canvas 全绘制、首屏墨迹像素非空、零 console 错误。
【T2 斜体排版 bug 真凶】global.css 的 `.prose-* p > em:only-child
{ display:block; text-align:center }` 图注样式按"斜体独占段"自动命中,
把所有正文独占段斜体变成块级居中。改:图注用显式 .fig-cap 驱动 + 补
em/i { display:inline; font-style:italic } 基线;media-sample 迁移新写法,
指南注明旧写法失效原因。实测独占段与行内斜体均 display:inline/italic。
【T3 评论"假挂载"真 bug】原 initArtalk 一进来就置 mounted=true——脚本
404/被拦截时把空容器误标已挂载,5s 兜底被绕过,正是"评论区一直空着"的
来源之一。改为库就绪才算成功;另加三触发路径(IO 主 + 锚点点击 + 滚到
页底 2s 兜底)、5s 失败提示+重试钮、软导航重挂、成功打
data-artalk-mounted=1 供 E2E。
【T4 文章排版类 + 安全白名单】11 个受限类(ink-1/2/3/muted/accent、
font-serif/kai/sans/mono、drop-cap、quote-line、fig-cap)全走 tokens 禁
任意 hex;新增 rehype-class-whitelist.ts:className 白名单 + 剥离 style
与 on*;实测注入用例只剩 class="ink-2",style/onclick 全无。新坑入档:
markdown raw HTML 在 hast 是 type:'raw' 节点、白名单插件看不见 span,必须
先 rehype-raw 再过滤 → 插件链 [rehypeRaw, rehypeClassWhitelist,
rehypeLinkCards]。新依赖:pdfjs-dist、rehype-raw。
车道:op-artalk(T1 6/6、T2 2/2、T3 3/3、T4 6/6);收编复验:build 46 页、
E2E 37/37、四专项 playwright 实测(PDF 13 canvas/斜体 inline/白名单净化/
评论 mounted 标记)
验证: node v26.13.0 + astro 7.4.4 构建 46 页 exit 0;E2E 37/37 PASS
Spec: none (阅读体验四件,车道级交付)
Co-authored-by: GLM-5.3
42 lines
1.8 KiB
JavaScript
42 lines
1.8 KiB
JavaScript
// @ts-check
|
||
import { defineConfig } from 'astro/config';
|
||
import pagefind from 'astro-pagefind';
|
||
import sitemap from '@astrojs/sitemap';
|
||
import { execSync } from 'node:child_process';
|
||
import rehypeLinkCards, { linkCardsReport } from './src/lib/rehype-link-cards';
|
||
import rehypeClassWhitelist from './src/lib/rehype-class-whitelist';
|
||
import rehypeRaw from 'rehype-raw';
|
||
|
||
// 构建透明(T7):commit/时间经 vite.define 注入,页脚与 /about 引用。
|
||
// 四重回退:CI 环境变量优先(GITEA_ACTIONS/GITHUB_SHA)→ 本地 git → dev 占位。
|
||
const sha =
|
||
process.env.GITEA_COMMIT_SHA ||
|
||
process.env.GITHUB_SHA ||
|
||
(() => { try { return execSync('git rev-parse HEAD').toString().trim(); } catch { return 'dev'; } })();
|
||
const date =
|
||
process.env.GITEA_COMMIT_DATE ||
|
||
process.env.GITHUB_COMMIT_DATE ||
|
||
(() => { try { return execSync('git log -1 --format=%cI').toString().trim(); } catch { return new Date().toISOString(); } })();
|
||
|
||
export default defineConfig({
|
||
site: 'https://wait4x.online',
|
||
integrations: [pagefind(), sitemap(), linkCardsReport()],
|
||
markdown: {
|
||
// 独立成段的裸链接 → OG 预览卡(构建期抓取,失败回落普通链接;见 src/lib/rehype-link-cards.ts)
|
||
// 顺序:rehypeRaw 先把 markdown 里的 raw HTML 解析成 hast element(否则白名单看不到 span),
|
||
// 再白名单净化(剥 style/on*/非白名单类),最后链接卡片(节点由插件自建,不经净化)
|
||
rehypePlugins: [rehypeRaw, rehypeClassWhitelist, rehypeLinkCards],
|
||
},
|
||
i18n: {
|
||
defaultLocale: 'zh',
|
||
locales: ['zh', 'en'],
|
||
routing: { prefixDefaultLocale: false },
|
||
},
|
||
vite: {
|
||
define: {
|
||
'import.meta.env.GIT_COMMIT_SHA': JSON.stringify(sha),
|
||
'import.meta.env.GIT_COMMIT_DATE': JSON.stringify(date),
|
||
},
|
||
},
|
||
});
|