【hexo】markdown标题自动编号
前言
有时候,我们想像world文档那样给标题编号,如下表所示。
标题一 1
标题二 1.1
标题三 1.1.1
但是原始的hexo是不支持这种功能的,所以我们利用css的计数器(counter)来实现此功能。
css计数器
在css里,我们可以声明一个计数器,假设其名称为counter_xxx
,那么我们可以使用counter()
函数获得它当前的值。
1 | counter(counter_xxx); |
与此同时,我们可以使用counter-reset
属性指定需要重置的计数器,使用counter-increment
属性指定计数加一的计数器。
1 | h1 { |
如上代码所示,每有一个h1
出现时,计数器counter_h1
的值就会加一,而counter_h2
的值就会重置为0。我们刚好可以利用这个,配合伪类选择器:before
来实现标题的自动编号。
标题自动编号的实现
直接上代码,这里只实现三级标题,剩下的类似。
1 | h1 { |
如上代码所示,当h1
出现时,它会使counter_h1
增加1,同时重置counter_h2
为0。而h1:before
的显示内容则是counter_h1
的值,即1``2``3
等。
同理当h2
出现时,它会使counter_h2
增加1,同时重置counter_h3
为0。而h2:before
的显示内容则是counter_h1
的值与counter_h2
的值的拼接,即1.1``1.2``1.3
。
h3
类似会显示为1.1.1``1.1.2``1.1.3
。实现了自动编号。
一级标题前加分隔线
为了美观,我们可以使用js给一级标题前自动加一个分隔线<hr>
。
打开工程目录\themes\next\source\js\src\utils.js
,添加如下代码。
1 | $(document).ready(function(){ |
结果
如果markdown文档里有以下输入。
1 | # 标题一 |
则会有如下显示。
![markdown标题自动编号](/post/741d5d83/pic5-1.png)