博客更新

2020.04.20

最近修改比较多,包括:

  1. 更改部署方式,从 Github Pages 迁移到了自己的服务器上,并引入了权限控制。
  2. 字体修改成思源宋体,并实现从 Typekit 上动态载入字体。

2020.04.08

  • eng-origin类的span表现添加一个hover效果。当鼠标悬停时,英文原文内容的颜色变成深灰色,且字体放大。
  • 修改了正文字体,为宋体思源宋体
  • 禁用「汉字标准格式」,乱改字体太难控制了

2020.03.31

处理search.xml的格式问题。这个比较蛋疼,是编辑器vscode有时候会很诡异地在文档中插入\x08这个ASCII字符,这个字符表示的是backspace操作。这对于正文影响不大,但是生成search.xml时会导致UTF-8的格式问题。我写了一个脚本来搜索替换这个字符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/env python3

import os

replace_t = [chr(8)]


def replace_all(a):
replaced = False
for t in replace_t:
replaced = replaced or (t in a)
a = a.replace(t, '')
return a, replaced


def process_directory(d):
for pname in os.listdir(d):
pname = os.path.join(d, pname)
if os.path.isdir(pname):
process_directory(pname)
continue
elif not pname.endswith('.md'):
continue

with open(pname) as f:
data = f.read()
data, replaced = replace_all(data)
if replaced:
with open(pname, 'w') as f:
f.write(data)


process_directory('./source')

2020.03.30

该由pandoc来处理Heading编号的问题。Next主体的编号只对侧栏有效,无法为正文的标题添加编号。

修改方法是在_config.ymlpandoc设置加上

1
2
3
4
pandoc:
extra:
- shift-heading-level-by: -1
- number-sections: null

上面的shift-heading-level-by是因为之前我在写文章的时候首级Heading使用的##,pandoc编号会出现0.1的现象,即pandoc是从h1开始编号的。加上shift-heading-level-by之后##会被渲染成h1

同时还需要禁用Next主题的编号功能。方法是修改theme/next/_config.yml,设置

1
2
toc:
number: false

同时,为了让一些特殊的文档的要求,需要支持通过front-matter关闭编号功能。这需要我们修改pandoc的逻辑。让hexo-render-pandoc检查输入文件的front-matter,如果发现有unnumbered就不添加number-sections的渲染选项。按照如下内容修改node_modules/hexo-renderer-pandoc/index.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if(config.extra) {
for(var e in config.extra) {
var eoption = config.extra[e];
for (var key in eoption){
if (key === "number-sections" && ('unnumbered' in options)) {
continue
}
extra.push('--' + key);
if(eoption[key]!=null) {
extra.push(eoption[key]);
}
}
}
}

注意在迁移的时候这部分代码会无法同步,需要再次手工修改

不过有一个问题,那就是在渲染器中是看不到front-matter的。渲染的调用方式是(见node_modules/hexo/lib/hexo/post.jsPost.prototype.render函数):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const options = data.markdown || {};
// ...
return ctx.render.render({
text: data.content,
path: source,
engine: data.engine,
toString: true,
onRenderEnd(content) {
if (disableNunjucks) return content;
// Replace cache data with real contents
data.content = cacheObj.loadContent(content);

// Render with Nunjucks
return tag.render(data.content, data);
}
}, options);

因此我们可以通过options这个渲染器的输入参数获取front-matter中的markdown关键字下的内容,也就是说我们在文章的开头加入

1
2
3
4
5
---
# ...
markdown:
unnumbered: true
---

不过这个写法比较麻烦,我们注册一个before-post-render的过滤器来处理

1
2
3
4
5
6
7
8
hexo.extend.filter.register('before_post_render', function (data) {
if ('unnumbered' in data) {
let config = data.markdown || {}
config.unnumbered = data.unnumbered
data.markdown = config
}
return data
}

这样可以自动检测unnumbered并加入到markdown关键字下面。

2020.03.25

挖掘pandoc的扩展markdown功能

2020.03.22

为pages自动添加创建日期。方法为修改scripts/utils.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
hexo.extend.filter.register('before_post_render', function (data) {
var log = this.log;
// before_post_render之前hexo会给data默认添加上date,所以我们要重新解析front-matter
var tmpPost = front.parse(data.raw);
if (!tmpPost.date && !data.skipAutoDateGenerate) {
if (/.*\.org/.test(data.source)) return data;
//add new generated link
tmpPost.date = data.date.format('YYYY-MM-DD hh:mm:ss');
data.skipAutoDateGenerate = true
//process post
let postStr = front.stringify(tmpPost);
postStr = '---\n' + postStr;
fs.writeFileSync(data.full_source, postStr, 'utf-8');
log.i("Add creation date for " + data.source)
return data
}
})

2020.03.17

在pages中现实卜算子阅读计数。修改方法为修改主题中的themes/next/layout/_partials/page/page-header.swig文件,修改后的内容为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<div class="post-meta">
{% if page.description %}
<div class="post-description">{{ page.description }}</div>
{% endif %}
{% include 'breadcrumb.swig' %}
<!--下面的这个div为添加的内容-->
<div>
{% if not is_index and theme.busuanzi_count.enable and theme.busuanzi_count.post_views %}
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon"
{% if not theme.post_meta.item_text %} title="{{ __('post.views') }}" {% endif %}>
<i class="fa fa-{{ theme.busuanzi_count.post_views_icon }}"></i>
{% if theme.post_meta.item_text %} {{ __('post.views') + __('symbol.colon') }} {% endif %}
<span class="busuanzi-value" id="busuanzi_value_page_pv"></span>
</span>
{% endif %}
</div>
</div>

2019.12.01

在根目录下面创建了一个shell脚本文件link_posts.sh,用于创建从pages发布到posts的链接。测试发现Hexo不能识别软链接,所以这里创建的都是硬链接。 按照原理来说git应该不能管理硬链接。所以这里我们创建一个shell脚本,用于将来出现问题之后批量恢复这些链接。

2019.09.19

将展示的代码的字体从14pt降低到13pt。

2019.09.17

添加了一种增加脚注的方法,表现形式为:

脚注字体较小,为红色。通过自定义脚本(根目录下scripts文件夹下utils.js文件)实现:

1
2
3
4
5
6
7
8
9
hexo.extend.filter.register('before_post_render', function (data) {
var config = this.config;
if (data.footnote !== true)
{
return data;
}
data.content = data.content.replace(/【~([^】]+)】/g, '<span class="foot-note-span">【$1】</span>')
return data;
})

2019.08.02

Reference部分文字渲染时不使用标准汉字标准格式的em渲染样式。方法为在_layout.swig中运行

1
2
document.getElementById("refs")
.setAttribute("lang", "en_US");

2019.06.29

在标题前方添加Emoji

2019.06.28

  1. 修改了内容宽度

具体方法为修改文件themes/next/source/css/_variables/Pisces.styl

1
2
3
4
// $content-desktop-large        = 1160px
$content-desktop-large = 960px
// $content-desktop-largest = 73%
$content-desktop-largest = 960px
  1. 启用了Han Support
  2. 在menu中添加update项目
  3. 字体修改为思源宋体:关于如何在网页中引入思源字体:漫谈Typekit
思源宋体

2019.05.20

困扰很久的VS Code引入莫名其妙添加的不可见08和05等控制字符的问题,最后可以通过“Remove backspace control character”这个插件解决。在VS Code的设置中将editor.formatOnSave设置为true来自动处理文件。

2019.05.15

  1. 修复了搜索和Feed的问题:文章中存在不可见字符,导致atom.xmlsearch.xml的格式出错
  2. 替换了字体服务器的CDN,从//fonts.googleapis.com修改为//fonts.css.network

20190507

2

修改了Reference的样式。方法是在themes/next/source/css/_custom/custom.styl文件中添加如下内容:

1
2
3
4
5
6
7
8
div#refs {
font-size: 13px;
line-height: 1.1;
}

div#refs p {
margin: 0;
}

1

通过上标提供短的参考信息的方法:

1
<sup title="Hover Text">?</sup>