Pelican常用插件和功能的使用以及一些坑
1. 前言
博客搭建并设置好后,还可以给其添加一些额外的功能;而对于Pelican博客,又另外有许多好用的插件可扩展使用。
目前这个博客我添加了以下几种功能:
- 网站Logo和背景大图
- Google Analytics谷歌分析
- Pygment代码语法高亮
- Gitalk留言系统
使用了以下几个插件:
- neighbours # 一个在文章页面用于显示上一篇/下一篇文章的插件
- tipue_search # 一个实现本地站内搜索的插件
- tag_cloud # 标签云插件
- similar posts # 一个用于推荐相关文章的插件
- sitemap # 用于生成站点地图的插件
- pelican-toc # 用于生成文章目录的插件
- random_recd_posts # 这个是自己随手写的一个随机推荐站点内文章的插件。
这几个插件也是见到许多人比较常用的,所以主要介绍一下其安装、设置和使用过程中遇到的问题。(Pelican的插件有挺多的,大家可以在官方插件库这里查看还有哪些切合自己需要。
2. 添加的功能
2.1 网站Logo和背景大图
网站logo和背景图其实是主题模板的特定设置,所以这一项是需要根据主题而定的,如果主题不提供显示logo和背景图的设置,则只能自己修改代码添加。这里我是基于自制的主题,要使用logo的话,需要两个logo文件(默认尺寸165x56),一个是PC桌面浏览器显示的logo,另一个是手机或者窄屏时显示的logo,比如我这里是logo.png
和logo_white.png
;要使用背景大图的话,需要一张大图片,这里假设为bg.jpg
(无尺寸限制)。在静态文件目录中放置好这些文件(比如将它们放在images文件夹)后,在设置文件pelicanconf.py
中按如下指定:
SITELOGO = 'images/logo.png'
SITELOGO_WHITE = 'images/logo_white.png'
BG_IMG = 'images/bg.jpg'
即可生效。
2.2 Google Analytics谷歌分析
设置GA的话,需要先去Google Analytics官网,用自己的google帐号登陆后在创建一个绑定这个博客地址的分析帐号,然后在管理帐号的媒体资源设置中查看获取这个帐号对应的跟踪ID(类似UA-123456789-1),在设置文件pelicanconf.py
中添加自己的跟踪ID:
GOOGLE_ANALYTICS = 'UA-123456789-1'
一般主题都有analytics.html
这样一个模板文件,这个模板文件内容即是各种跟踪代码,模板会自动应用上面的设置。
关于google的跟踪代码,以前使用的是analytics.js
,现在最新推荐的是gtag.js
,可以通过这两个官方网页了解:GA开发者网站,如何添加gtag.js到网站。
大部分的主题使用的是旧的跟踪代码analytics.js
,如果想要更新成gtag.js
,则可以编辑analytics.html
文件,将其中{% if GOOGLE_ANALYTICS %}
到{% endif %}
之间的代码换成以下:
{% if GOOGLE_ANALYTICS %}
<script async src="https://www.googletagmanager.com/gtag/js?id={{ GOOGLE_ANALYTICS }}"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '{{ GOOGLE_ANALYTICS }}');
</script>
{% endif %}
2.3 Pygment代码语法高亮
Pelican支持Pygment代码语法高亮,只要写文章时在代码段前一行写上对应的格式语句,即可自动生效。
一般主题都会带一个跟主题色彩相搭配的Pygment的CSS文件,如果我们对主题的Pygment效果不满意,可以自己编辑其中的CSS规则,也可以到Pyment官网演示站点,找自己喜欢的风格,下载对应的CSS文件来替换主题中的pygment.css文件。
要注意的是,不管是主题自带的还是下载的pygment.css文件,都可以测试一下在文章的代码段中包含特殊符号或者中文字符,看看这些字符会不会带有红框,出现红框的话,则pygment.css文件中应该有
.highlight .err { border: 1px solid #FF0000 } /* Error */
这样一条规则,可以将其删除/注释掉,或者编辑成自己想要的样式。
2.4 Gitalk留言系统
关于留言系统,现在似乎国内能用又不会硬塞些乱七八糟元素的已经很少了。国外的也是处于被墙和可能被墙的状态。 所以选择用Github的Issue系统来当留言系统。
开始时使用的是Gitment,但设置后,在登陆初始化时却一直显示在登陆状态,查看了下Gitment上其他用户发起的此类问题的issue,似乎是Gitment作者的校验服务器没在用了,有人提供自用的服务器地址,却是个公众号强行加自己的网站链接;也有人发了自建服务器的教程,但是是不适用于没有购置服务器而是将博客托管在GithubPage的用户的。所以改用Gitalk,设置基本一样,初始化还更简单些。
这里是Gitalk的官方中文说明页面。
简单些说,就是先申请一个Github应用授权,然后在模板文件中引用一个CSS文件,引用一个JS文件,在article.html
页面插入一段显示界面的div代码,插入一段设置留言系统的js代码即可。
申请Github应用授权,在自己的Github账户页面中的设置页面最下边的Developer settings
开发者设置的OAuth Apps
项新建申请。
申请了一个授权后,比如在我自己的这个主题中,是先在设置文件pelicanconf.py
中添加申请到的Github应用授权信息变量:
GITALK_GITHUB_ID = 'elvynlee' # 自己的github用户名
REPO_TO_STORE_COMMENTS = 'elvynlee.github.io' # 储存留言的库,可以用博客这个库,也可以新建一个库
OAUTH_CLIENT_ID = 'c6db63j9jeac7ffc3aac' # 申请到的授权ID
OAUTH_CLIENT_SECRET = '8557b7ea273b274a266779f0afba25c604707493' # 申请到的授权secret码
然后设置留言系统的js代码如下调用变量:
<script>
var gitalk = new Gitalk({
clientID: '{{ OAUTH_CLIENT_ID }}',
clientSecret: '{{ OAUTH_CLIENT_SECRET }}',
repo: '{{ REPO_TO_STORE_COMMENTS }}',
owner: '{{ GITALK_GITHUB_ID }}',
admin: ['{{ GITALK_GITHUB_ID }}',],
id: '{{ article.locale_date }}-{{ article.slug }}',
distractionFreeMode: false,
})
gitalk.render('gitalk-container')
</script>
而用于显示界面的div层代码则很简单:
{% if GITALK_GITHUB_ID %}
<div id="gitalk-container" class="mdl-card__supporting-text el-comments">
</div>
{% endif %}
最后是记得,每发布一篇文章,都要在其下的留言系统中先登陆一下自己的Github账号新建一个issue当这篇文章的留言系统。
3. 添加的插件
常规的添加插件的方法:在Pelican目录下新建一个plugins
文件夹,将要使用的插件以文件夹的方式放到这个plugins
文件夹下,然后在设置文件pelicanconf.py
中,添加:
PLUGIN_PATHS = ['plugins',]
PLUGINS = ['neighbors', 'tipue_search', 'tag_cloud', 'similar_posts',
'sitemap', 'pelican-toc', 'random_recd_posts']
第一行即指定插件的路径和目录名;第二行即指定所要使用的插件名,这些插件名应该跟插件的文件夹同名。 所以,也可以直接克隆复制Pelican官方的插件库到本地,然后将路径指到这个插件库。
下面针对这几个用到插件主要说一些对比区别和遇到的坑。
3.1 neighbours
neighbours插件添加安装好即可生效,不需要任何额外设置。一般主题模板文件也会包含,简单地调用两个变量实现上一篇文章/下一篇文章的功能。
3.2 tipue_search
注意这里,Tipue Search是一个成熟的jQuery站内搜索插件,而这里tipue_search是一个调用Tipue Search实现本地站内搜索的Pelican插件。
其原理是tipue_search会将整个站点的文章内容序列化后生成一个tipuesearch_content.js
内容文件,而Tipue Search可以从这个内容文件中检索我们要搜索的信息。
所以如果主题模板包含有tipue_search插件的模块,则只需下载安装好插件,在插件列表中添加'tipue_search'
并且加上应用到哪些模板文件,就可以生效:
PLUGINS = [..., 'tipue_search', ...]
DIRECT_TEMPLATES = ['index', 'tags', 'categories', 'authors', 'archives', 'search']
如果主题中不带tipue_search插件的模块,而我们要安装使用tipue_search插件的话,就需要安装'tipue_search'
pelican插件同时,下载Tipue Search的这个jQuery插件的文件,并自己编写相应的页面代码,以下供参考:
Tipue Search依赖jQuery,所以确保我们的base.html页面中有引用jquery文件。
在Tipue Search官网下载其需要的js和css文件,比如我们将这里的文件下载后一起放在tipuesearch
文件夹中。
安装添加Pelican插件tipue_search
,设置文件中我们添加一个变量TIPUE_SEARCH
用于模块判断
PLUGINS = [..., 'tipue_search', ...]
TIPUE_SEARCH = True
DIRECT_TEMPLATES = ['index', 'tags', 'categories', 'authors', 'archives', 'search']
新建一个search.html文件,文件代码为:
{% extends "base.html" %}
{% block extra_css %}
<link rel="stylesheet" href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/tipuesearch/tipuesearch.css"/>
{% endblock %}
{% block content %}
<div id="tipue_search_content">
</div>
{% endblock content %}
{% block extra_js %}
<script src="{{ SITEURL }}/tipuesearch_content.js"></script>
<script src="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/tipuesearch/tipuesearch_set.js"></script>
<script src="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/tipuesearch/tipuesearch.min.js"></script>
<script>
$(document).ready(function() {
$('#tipue_search_input').tipuesearch({
'minimumLength': 1,
'show': 15,
'showTime': false,
'showURL': false,
'wholeWords': false,
});
});
</script>
{% endblock extra_js %}
这个页面代码中,注意的几点是:
- 调用Tipue Search的文件是在继承base.html页面中的extra_css和extra_js两个块中扩展调用的,内容文件也是在这里调用。这样扩展的前提是base.html页面中有这两个块。
- 注意调用本地文件使用的地址变量,这里是以放置在主题文件夹下为例
- 最后一段对Tipue Search的设置代码中,
'minimumLength'
设为1
和'wholeWords'
设为false
,都是针对中文搜索,这样设置后,我们搜索单个中文字也可以有搜索结果。
最后,在base.html页面中,将搜索框的提交跳转到这个search.html页面,搜索框的代码类似这样:
<form class="" action="/search.html" onsubmit="return validateForm(this.elements['q'].value);">
<input class="" type="text" name="q" id="tipue_search_input">
</form>
最后加一小段js判断代码:
<script>
function validateForm(query)
{
return (query.length > 0);
}
</script>
这样即完整地添加了tipue_search插件。
以下是几点注意的地方:
- 如果有自己的搜索框界面,记得将Tipue Search的CSS文件中的
#tipue_search_input {}
的规则注释掉,不然搜索结果页会优先引用它。 - 如果设置都正确了,搜索时却显示nothing found,一是检查生成的
tipuesearch_content.js
内容文件是否在output根目录下,二是检查对jQuery文件的引用是否在所有js文件引用和js代码块的前面。 - Tipue Search默认的设置对中文搜索是不友好的,需要在设置代码中添加这两项
'minimumLength': 1,
和'wholeWords': false,
才会正常。 - 可以编辑tipuesearch.css方便地自定义修改样式,但布局在js文件中,修改比较复杂。
- 将tipuesearch模块放到其他页面时,记得检验搜索能否出结果。试过将搜索模块单独放在index页面,结果搜索不了。没有细究,最后还是固定放在base页面。
3.3 tag_cloud
tag_cloud默认安装添加后,初始的模块效果是很简单的,所以安装标签云模块更多的工作是编写好看的CSS样式。
tag_cloud的设置有:
TAG_CLOUD_STEPS = 4
TAG_CLOUD_MAX_ITEMS = 100
TAG_CLOUD_SORTING = 'random'
TAG_CLOUD_BADGE = True
这里有一个坑:
比如TAG_CLOUD_STEPS设置为4,然后在编写对应的CSS规则中官方是按tag-1,tag-2,tag-3,tag-4的示例,当我们也设置了好tag-1,tag-2,tag-3,tag-4后,实际使用时随着某个tag的数量增多,会发现代码中无端出来一个tag-0
的class,由于我们没有编写tag-0
的规则,它会显示成默认的效果。
所以,当发现有这样的问题时,可以通过修改steps让插件重新分配一次,或者最好加上一个tag-0
的规则。
3.4 similar posts
similar posts是用于当前文章相关推荐的一个插件,另外可以实现此功能的还有一个related posts。两者的区别是similar posts会计算标签tag的权重来推荐相关文章,更能推荐到关联度高的文章。
插件的安装和使用没有什么要注意的。
3.5 sitemap
sitemap插件用于生成站点地图,可以将生成的sitemap定期提交到搜索引擎的webmaster(Google现在是Google Search Console),让搜索引擎收录网站的文章。
安装添加插件后,再在设置文件pelicanconf.py
中添加:
SITEMAP = {
'format': 'xml',
'priorities': {
'articles': 0.5,
'indexes': 0.5,
'pages': 0.5
},
'changefreqs': {
'articles': 'weekly',
'indexes': 'daily',
'pages': 'weekly'
}
}
生成的文件为output目录下的sitemap.xml
。
3.6 pelican-toc
pelican-toc是生成文章目录的插件。这里也有另一个功能类似的插件extract toc,两者的区别是extract toc是读取pelican从文章生成的目录,pelican-toc则不通过pelican而自己来生成文章目录。貌似区别不大。
目录的CSS样式可以自行编写CSS规则定制。
3.7 random_recd_posts
这是一个自己随手编写的插件,随机获取整个站点的指定篇文章,用于首页的随机推荐模块。
当然,由于是静态站点,所以从访问者角度,是不能浏览页面时刷新一次就变成不同的随机文章的,而只是每次我们重新生成站点发布时它才重新随机生成推荐的文章。
4. 结语
其他的插件,需要用到时再更新补充吧。