hexo博客改造

修改首页摘要中的锚链接可直接跳转到正文

背景
博主喜欢把“table of content”即目录放到<!-- more -->标签前面作为文章在首页的一个摘要,简洁明了可辨识,并且博主使用VSCode写文,有插件可以直接生成TOC因此非常方便
问题
但是因为TOC都是锚链接因此在首页的链接是无法跳转到正文的
简单的解决办法就是把TOC的链接地址改为绝对路径的引用

1
2
3
[章节1](#章节1)
修改为
[章节1](/post/文章/章节1)

但是这样引入的问题就是,在正文中点击文章中的TOC链接会重新打开页面
解决方案
这里就是正文了,思路就是修改themes/next/layout/_macro/post.swig这个文件,这个文件是用来做首页的一系列处理的

themes/next/layout/_macro/post.swig
1
2
3
4
5
6
7
8
9
{% if is_index %}
...(忽略一段)
{% elif post.excerpt %}
- {{ post.excerpt }}
+ {{ post.excerpt|replace('href="#','href="'+url_for(post.path)+'#','ig') }}
}
<!--noindex-->
<div class="post-button text-center">
<a class="btn" href="{{ url_for(post.path) }}{% if theme.scroll_to_more %}#{{ __('post.more') }}{% endif %}" rel="contents">

效果可以直接返回博客首页看本文的摘要
解释
加了一个replace过滤器对摘要内容替换链接地址,markdown文章解析到首页后是html格式的

在post.swig文件的if is_index的代码块内是根据各种条件来生成摘要,这里只对通过<!-- more -->分割形成的摘要做了处理,其他的并没有处理

1
2
3
4
上述的toc链接解析后如下
<a href="#章节1">章节1</a>
replace后替换为
<a href="/post/文章#章节1">章节1</a>

相关知识
swing的replace
第一个参数是被替换的文本,支持正则匹配,第二个是要替换成的问题,第三个可选参数是匹配类型,如果不写则只会替换一个文本

i:ignorCase忽略大小写
m:mutiple允许多行匹配
g:globle进行全局匹配,指匹配到目标串的结尾


replace(search, replacement[, flags])

Name Type Optional Default Description
search string undefined String or pattern to replace from the input.
replacement string undefined String to replace matched pattern.
flags string ✔ undefined Regular Expression flags. ‘g’: global match, ‘i’: ignore case, ‘m’: match over multiple lines

潜在的问题
不做任何判断的直接replace链接是不严谨的,有可能会替换掉并不应该替换的链接

博主对swig语法一点不懂,全靠直觉暴力写了这个东西,逻辑上并不严谨,但是怎奈因为swig不熟没法写复杂的逻辑,如有哪位大神懂还望指点一二

hexo博客相关其他文章