Pelican进阶配置

上周在重新配置博客的时候涉及到了一些以前没接触过的Pelican的配置,现在考完试有空了来把它们理一理,算是个进阶的配置吧。

Markdown扩展

我的内容的编写使用的是Markdown,所以在配置的时候需要适当的设置一下所使用的Markdown扩展,通过在 pelicanconf.py 中对 MD_EXTENSIONS 进行适当的赋值即可,我的配置如下:

MD_EXTENSIONS = ['codehilite(css_class=highlight)', 'extra', 'toc(permalink=true)']

总共三项:

  • 第一个是参考我所引用主题的作者的配置,应该是代码高亮的配置。
  • 第二个包含了一系列的小扩展,我主要是为了获得表格及代码块的支持。
  • 第三个是为了生成目录,我的主题会提取文章的目录。

Pelican的Markdown支持是直接使用的其他人的模块,因此更多的扩展以及详细内容可以参见 Markdown模块官方文档

Pelican page

配置的时候涉及到page是因为我希望增加一个独立的about页面,但我的主题原先没有提供,所以得绕一点了(可能有不用绕的方法,但没搜到)。这部分只介绍一下page的概念以及相关的配置,如何绕的放在下一部分。

page按照直面的翻译也就是 页面 的意思,往后都用这个词来表示。它与你的文章拥有同级的地位,这一点可以从主题的 templates 中拥有 article.htmlpage.html ,只是文章更倾向于内容,而页面可以很随意,所以一般可以拿来构造导航栏(比如about页面)。

页面和文章一样,都是Pelican根据你所编写的内容生成的,内容的格式同样可以是Markdown(或是支持的其他格式),并且也必须放到 content 目录下,为了更好分辨,还可以在 pelicanconf.py 中指定页面所在的文件夹以及页面生成相关的内容,我的配置如下:

PAGE_PATHS = ['pages']
PAGE_URL = '{slug}.html'
PAGE_SAVE_AS = '{slug}.html'
DISPLAY_PAGES_ON_MENU = True # 主题的模板可能会使用的值,一般用于导航栏

content 的目录结构如下:

|—— content
|   |—— posts # 文章的目录
|   |   |—— article1.md
|   |   |—— article2.md
|   |—— pages # 一些不经常变动的页面,比如about
|   |   |—— about.md
|   |—— images  # 图片(静态文件)
|   |—— ...

我的 pages 目录下只有一个 about.md ,按照配置,Pelican会为我生成一个 about.html 的页面。

按需自定义

为了满足自己的需求,你可以任意的修改主题的内容(协议允许的话)或者Pelican的源码,以下为一些我的自己的修改。

设置生成的表格为Bootstrap风格

默认情况下,Pelican为我生成的HTML中的表格使用的是 <table></table> 这样的标签,没有增加任何的样式,很难看。

在主题是基于Bootstrap的前提下,把表格改为Bootstrap风格就非常容易,只要改为 <table class="table"> 即可,两个方法。

(1) 修改生成的内容

前面提到过,Pelican的Markdown支持是依赖于Markdown模块的,因而本质上,它是利用了Markdown模块对输入进行了解析,然后对解析得到的结果进行生成。所以,一个简单的办法就是直接把生成的内容当成字符串进行搜索替换,把 <table> 替换为 <table class="table"> ,这需要修改Pelican的源码,修改 reader.py 中的 MarkdownReaderread 方法:

self._source_path = source_path
self._md = Markdown(extensions=self.extensions)
with pelican_open(source_path) as text:
    content = self._md.convert(text)
metadata = self._parse_metadata(self._md.Meta)
# 增加下面这一行
content = content.replace('<table>', '<table class="table">')

这种方法要改源码,迁移的时候有点麻烦。

(2) 改主题

目的都是给table标签加上class,可以直接修改主题,插入相应的JS代码即可,未考虑兼容性的问题,我直接在主题的 base.html 的末尾增加了如下代码:

<script>
    // Added by Goclis for rerendering table to bootstrap style
    $("table").addClass("table");
</script>

增加about页面

pages 文件夹里增加了一个 about.md ,但希望在导航栏上增加一个About比较麻烦,对主题的 base.html 进行了小小的修改:

<div class="nav-collapse collapse">
    <ul class="nav pull-right top-menu">
        <li {% if page_name == 'index' %} class="active"{% endif %}><a href="/">Home</a></li>
        <li {% if page_name == 'categories' %} class="active"{% endif %}><a href="{{ SITEURL }}/categories.html">Categories</a></li>
        <li {% if page_name == 'tags' %} class="active"{% endif %}><a href="{{ SITEURL }}/tags.html">Tags</a></li>
        <li {% if page_name == 'archives' %} class="active"{% endif %}><a href="{{ SITEURL }}/archives.html">Archives</a></li>

        {% if DISPLAY_PAGES_ON_MENU %}
        {% for p in pages %}
        {% if p.slug == 'about' %}
        <li {% if p == page %} class="active"{% endif %}><a href="{{ SITEURL }}/{{ p.url }}">About</a></li>
        {% endif %}
        {% endfor %}
        {% endif %}
    </ul>
</div>

逻辑主要是下面这部分,通过判断slug,只为 about.md 增加导航,其他页面忽略,这需要在 about.md 的开头设置 Slug: about

小结

总的来说,尽管Pelican是个静态博客,但能够玩出花样的地方还是很多的, Pelican FAQ 里有不少可以参考的问题。

有啥想说的就留个言呗~

comments powered by Disqus