fix(theme): pageTitle 加 safeJS —— 修 Go 模板 JS 上下文二次转义导致标题天生带引号

在 <script> 里 {{ .Title | jsonify }} 会被 Go 模板按 JS 上下文再转义一层:
标题「留言」渲染成 pageTitle: "\"留言\"",前端每次上报 page_title 都自带
一对引号 —— 评论入库、邮件标题因此出现《"留言"》,历史上 pages 表一堆标题带
引号(17 行)也是这个根因。jsonify 后用 safeJS 标明这就是最终 JS 字面量,
`</` 仍按惯例转义兜底;已验证中文/emoji 标题字面量均合法
This commit is contained in:
zqlit committed 2026-10-05 11:01:20 +08:00
1 parent f7e0596218
commit 3d7d7bd396
1 file changed
+8 -2
+8 -2
View File
@@ -256,8 +256,14 @@
{{/* pageTitle 必须显式传:Artalk 不传时会读 document.title,而 PJAX 切页
早期脚本执行时 document.title 还是上一个页面的(经典竞态),历史上
数据库里一堆文章页的标题被污染成「留言」就是这么来的。head.html 的
<title> 就是纯 .Title,这里与它保持一致。jsonify 防标题里有引号炸模板。 */}}
pageTitle: {{ .Title | jsonify }},
<title> 就是纯 .Title,这里与它保持一致。
★ 必须 safeJS:这段在 <script> 里,Go 模板按 JS 上下文再转义一层,
`jsonify` 的结果会被二次编码 —— 标题 留言 会变成 "\"留言\"",
评论入库/邮件标题就带上了一对引号(《"留言"》)。safeJS 明确告诉
模板「这就是最终 JS 字面量」,不再二次转义;`</` 仍按惯例转义兜底。 */}}
{{ $t := .Title | jsonify }}
pageTitle: {{ replace $t "</" "<\\/" | safeJS }},
emoticons: '{{ .Site.Params.artalk.emoticons | absURL }}',
aiComment: null
};