从Octopress迁移到Hugo并不是一件特别简单的事情。
首先这两个系统的模板代码完全不一样,需要重新改写。
其次是Hugo默认会删除Markdown中的所有HTML片段,当然也不支持Liquid Tags(即{% %}
)。
最后是Octopress里的一些功能已经陈旧,有些调用其他服务的API不能完全照搬,需要检查一下是否有更新。
在下文中,我记录了一些我在迁移过程中遇到的坑,以及值得注意的地方。
1. 关于Permalink
我在迁移的时候参考的两篇文章12都讲到了Octopress和Hugo的文件名和路径的不同,以及如何批量修改。 但是实际上并不需要那么复杂,我们可以保留原始的文件名以及Permalink,只需要设置slug即可。 在Markdown的front matter中定义
---
draft: true
slug: foobar
comments: true
---
随后在config.toml
中设置
[permalinks]
posts = "/:year/:month/:slug/"
即可保留原来的路径格式了。
2. 关于layout和theme
Hugo中有两个地方可以定义主题,一个是主目录下的layout,另一个则是新建一个theme。在快速开始的教程中,Hugo是拉取了一个现有的theme。 但如果我们是迁移原有的主题,而且并没有想要共享的愿望的话,实际上可以直接在layout目录下编写,我感觉更加方便直观。
👆 此条纯属个人见解,因为我不爱换主题。
3. 关于Octopress的SCSS
Hugo提供SCSS的编译方案,但是需要安装Hugo的extended版本,默认的版本是不支持编译的。 同时,由于Octopress的SCSS使用了Compass,这导致直接把SCSS拷贝到Hugo是无法编译的。 这里我采用的方法是,直接用了编译后的CSS,随后进行修改更新,并删去不需要的部分。 当然更好的则是改SCSS,解决编译问题。
4. 关于code fence选项
Hugo不支持codeblock,但是提供了highlight的shortcode来处理代码片段的高级功能。
但是实际上我们可以直接在code fence后面设置highlight的选项来达到同样的目的,比如 ```go {linenos=false}
就可以覆盖默认选项,关闭代码行数。
5. 关于两种shortcode的调用方式
Hugo提供两种shortcode的调用方式,分别是{{< shortcode >}}
和{{% shortcode %}}
,测试下来前面一种可以返回HTML,而后面那种返回的HTML依旧会被删除。
6. Markdown中直接插入HTML片段
刚才提到,Hugo默认会删除Markdown中的HTML片段。可以通过两种方式实现这个目标,第一个是使用shortcode,其实现只需要{{ .Inner }}
即可3。另一种则是设置markup.goldmark.renderer.unsafe
为true。
7. 关于category
想要自定义category的页面,可以在layout目录下建立categories目录,并实现list.html
。
8. 关于RSS
Octopress的RSS默认名称为atom.xml
,但是Hugo的RSS文件名为index.xml
且不能更改。所以需要在HTTP服务器上做好跳转。
10. 关于archetype
Hugo也可以自定义新建的Markdown的模板,位于archetypes/default.md
。根据content类型不同,可以定义不同的archetype
11. 关于Disqus功能的迁移
Hugo内置了Disqus的inner template,但是只提供评论功能。Octopress中的显示评论数量的功能需要自己实现,可以照搬Octopress生成的JS,但是需要注意Octopress中使用了data-disqus-identifier
,如果不能确定其定义的话,建议改成data-disqus-url
并赋值.Permalink
。
12. rsync编码转换
由于我原来一直使用MacOS,所以没注意到这个问题。如果在Windows上使用rsync(我用的是MinGW下msys的rsync),由于Windows默认是GBK编码,而服务器Linux上则是UTF-8,如果不加转换则会导致乱码从而无法正常获取页面。
因此我们需要在rsync的参数中添加--iconv=GBK,UTF-8
。
13. Hugo支持Emoji 🐶
在template中可以使用emojify
函数,但是如果想在在Markdown中直接支持的话,需要打开enableEmoji
选项。
同时分享一个Emoji大全:https://www.webfx.com/tools/emoji-cheat-sheet/
14. chroma支持的语言列表
Chroma是Hugo用来进行语言高亮的程序,其支持的语言列表:https://github.com/alecthomas/chroma#supported-languages
15. 分享按钮
原来的百度分享,因为早已无人维护,连HTTPS都不支持,只能舍弃。现在我是自己写了分享按钮,并不复杂,各个APP都提供了分享的API,除了微信,微信只能创建二维码。 但是在这个过程中我一直在思考,到底需不需要分享按钮,很纠结。 一方面只想把这个博客作为自己的后花园,居于互联网世界的一个角落,如果有幸被人搜索到了,那就是缘分。 而另一方面,有时候确实希望分享自己的文章,向外展示自己。 纠结并没有得出结论,于是先实现了放着吧😂。