《Hexo: 从零开始编写自己的主题》6. 添加自己的脚本处理数学公式

《Hexo: 从零开始编写自己的主题》

1. Hexo概述以及Hexo工作原理
2. 入门Hexo主题编写
3. 优化样式,设计自己的主题
4. fancybox优化图片展示效果、代码高亮以及数学公式
5. 添加本地搜索功能以及发布博客让官网接收

6. 添加自己的脚本,以处理数学公式为例

6.1 问题描述

这个应该算法是 hexo 的一个BUG或者说是hexo的不足。正常情况下,我们将 markdown 文件渲染为 html 时,需要保护一些特别部分不被渲染,比如说代码块与公式。

代码块中写

<h1> Hello World </h1>

很明显这块代码不应该被渲染,公式也是如此,但是对于复杂的公式,可能存在大公式里包含小公式的情况,hexo 有可能只渲染子模块,比如:

公式为

$$
f(x)=\left\{
\begin{aligned}
x & = & \cos(t) \\
y & = & \sin(t) \\
z & = & \frac xy
\end{aligned}
\right.
$$

$$
F^{HLLC}=\left\{
\begin{array}{rcl}
F_L       &      & {0      <      S_L}\\
F^*_L     &      & {S_L \leq 0 < S_M}\\
F^*_R     &      & {S_M \leq 0 < S_R}\\
F_R       &      & {S_R \leq 0}
\end{array} \right. 
$$

$$
f(x)=
\begin{cases}
0,& \text{x=0}\\
1,& \text{x!=0}
\end{cases}
$$

在这里插入图片描述

6.2 解决方法

为了保护我们的公式不被瞎渲染,我们需要在公式前后加 p 标签,即

<p>
$$
f(x)=\left\{
\begin{aligned}
x & = & \cos(t) \\
y & = & \sin(t) \\
z & = & \frac xy
\end{aligned}
\right.
$$
</p>

所以接下来就是算法设计部分,我们拿到的是markdown 的文字,在渲染前进行 过滤处理。

以下内容的概念就是在 “before_post_render” 时触发的代码,即对所有的博客进行渲染前的工作。

hexo.extend.filter.register('before_post_render', data => {
	// 在这对 data 进行处理
    return data;
  }, 5);

总体思路为:

  1. 将原文划分为 “代码块” 与 “非代码块” 两部分。如果是代码块的公式,不做处理。比如 ```bash 中的内容。
  2. 非代码块的内容根据 两个美元符号 $$ 进行 split,再对每一个分割块进行处理。
// 根据 $$ 将原内容分块
// 如果是奇数块则前后添加 $$ 符号
function dollarsHandle(data) {
     var math_blocks = data.split('$$')
     var newContent = ""
     if (math_blocks.length > 2) {
         math_blocks.forEach((one, i)=>{
            if (i % 2 == 1 ) {
                newContent += '<p>$$'
                newContent += one
                newContent += '$$</p>'
             } else {
                 newContent += one
             }
         })
        return newContent
     }
     return data
}


hexo.extend.filter.register('before_post_render', data => {
    // 首先根据 ```划分为代码块与非代码块
    var blocks = data.content.split('```')
    blocks.forEach((block, i) => {
        // 如果是偶数块
        if (i % 2 == 0) {
            blocks[i] = dollarsHandle(block)
        }
    })

    if (blocks.length > 2) {
        var newDataContent = ""
        blocks.forEach((block, i)=>{
            newDataContent += block
            newDataContent += "```"
        })
        data.content = newDataContent
    } else {
        data.content = dollarsHandle(data.content)
    }
    return data;
  }, 5);

6.3 效果查看

前往我的个人网站 https://smileyan.cn/heyan/ 查看效果。

源码的地址为:https://github.com/smile-yan/hexo-theme-heyan

6.4 总结

如果觉得别人的主题不够符合自己的喜好,那就自己写个主题。

如果觉得 hexo 渲染可能存在问题,那就自己写脚本纠正官方的问题。

如果觉得本文有用,请点个赞支持一下吧~ 感谢!

Smileyan
2022.4.25 11:34

引用\[1\]:根据你提供的引用内容,你遇到了一个问题,即无法加载文件并且系统禁止运行脚本。这个问题可能是由于PowerShell执行策略的限制导致的。引用\[2\]中提到了解决步骤,你可以尝试以管理员身份打开终端,并执行以下命令来修改执行策略:set-ExecutionPolicy RemoteSigned。这样应该可以解决你遇到的问题。引用\[3\]中提到了一个类似的问题,但是在执行set-ExecutionPolicy命令时忘记写RemoteSigned参数,导致出现了其他选项。所以请确保在执行命令时正确地输入参数。希望这些信息对你有帮助。 #### 引用[.reference_title] - *1* [nodemon : 无法加载文件 D:\NodeJs\node_global\nodemon.ps1,因为在此系统上禁止运行脚本。有关详细信息,...](https://blog.csdn.net/jiu_mu_mu/article/details/118712332)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [VS Code中报错:无法加载文件 D:\nodejs\node_global\hs.ps1。因为在此系统上禁止运行脚本...](https://blog.csdn.net/chen__cheng/article/details/116999611)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

smile-yan

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值