高亮代码块消失
Safari就是![$[经典表情]::(便便)](/usr/themes/Joe/assets/images/owo/QQ/59.gif)
PC和安卓正常,只苹果端开启单页模式后切换页面时会导致高亮代码块消失。
如图所示,代码块高亮未正确显示,只显示了超出显示范围的文本内容,正确显示应该是以下图示
原因所在
bug原因是因为此主题开启了Turbolinks单页模式,测试关闭后正常。
Safari 对动态插入的 pre和code 节点不会自动重算样式,导致样式缺失。
解决方案
由于“Joe二开主题再续前缘版”开发者是个🐔,此主题bug一堆不修复,只能菜鸟本人上了。
用最笨的方式针对bug解决bug,也就是搞个补丁,使其页面在载入时强制加载prism资源,测试途中会报路径拼接错误,应该是autoloader的原因,也就是获取资源路径错误,错误路径:(站点/分类/{cid}/components/prism-xxx.min.js),正确路径:(/usr/themes/Joe/assets/plugin/prism/1.9.0/components/),因此又加入了劫持代码,使其强制修正绝对路径,切换页面不会报错,但通过链接直接访问依然会概率报此错误。Joe原版主题是没有这个问题的,可能也是因为原版没有Turbolinks的原因吧。
操作步骤
- 补丁文件(prismTurbolinks.js),随便放个位置。
- 主题文件全局搜索(prism.min.js),会出现两个文件:(index.js和prism.php)。
index.js在387行-400行之间引入(prismTurbolinks.js)
prism.php(/Joe/module/single/prism.php)在末尾引入(prismTurbolinks.js)
补丁文件
/**
* 路径校正 & 高亮补丁
* 文件:prismTurbolinks.js
* 解决痛点:
* 1. prism-autoloader 默认用「当前页目录」拼相对路径,导致在深层路由
* (如 /archives/48/)刷新时出现 404:
* 站点/分类/{cid}/components/prism-xxx.min.js
* 2. Turbolinks/Turbo 单页切换时,autoloader 再次用错路径。
*
* 实现思路:
* 0. 不改动 prism.min.js 与 autoloader.min.js 本身,仅运行时矫正。
* 1. 把语言文件目录强制锁成「站点绝对目录」/usr/themes/Joe/assets/plugin/prism/1.9.0/components/
* 2. DOM 构建完立即执行一次 → 覆盖“首次刷新”场景。
* 3. 监听 Turbolinks 5.x 事件 turbolinks:load 与 Turbo 7.x 事件 turbo:load
* → 覆盖“后续单页切换”场景。
* 4. 每次矫正完立即调用 Prism.highlightAll(),确保新插 DOM 的代码块被高亮。
*
* 性能 & 兼容:
* - 无新语法(可选链、箭头函数均未使用),IE11 可跑。
* - 不依赖任何构建工具,直接当普通 JS 文件引入即可。
* - 若页面无 Turbolinks/Turbo,仅多一次空事件监听,无额外开销。
*/
(function () {
/* 1. 语言文件绝对目录(末尾必须带 /) */
var DIR = '/usr/themes/Joe/assets/plugin/prism/1.9.0/components/';
/**
* 核心修复函数:
* - 矫正 autoloader 全局路径
* - 立即高亮当前页面
*/
function fix() {
// 仅当 Prism 与 autoloader 已加载才继续
var al = window.Prism && Prism.plugins && Prism.plugins.autoloader;
if (!al) return;
// 锁目录:防止 autoloader 根据当前页 URL 重新计算相对路径
al.languages_path = DIR;
// 高亮当前已存在于 DOM 的代码块
if (window.Prism && Prism.highlightAll) {
Prism.highlightAll();
}
}
/* 2. 首次进入页面(硬刷新) */
if (document.readyState === 'loading') {
// DOM 尚未解析完,等待 DOMContentLoaded
document.addEventListener('DOMContentLoaded', fix);
} else {
// DOM 已就绪,立即执行
fix();
}
/* 3. 单页路由切换后再次执行(Turbolinks 5.x & Turbo 7.x)*/
document.addEventListener('turbolinks:load', fix);
document.addEventListener('turbo:load', fix);
})();PC和安卓是正常的,针对苹果端以上仅是临时解决方案,通过链接直接访问含有代码块的页面时会报路径拼接错误,大概率是(prism-autoloader.min.js)库的问题,只要在切换路由时让他重新加载依赖就会报这个错误。解决只能在开始就规避这个问题。实在不行还是原版Joe吧,他奶奶的。
