Pelican静态博客搭建总结

2013.09.08/2015.01.09发布于笔记暂无评论/目录

介绍Pelican并总结在搭建Pelican博客过程中需要注意的问题等。

Pelican介绍

Pelican是一个用Python语言编写的静态网站生成器,支持使用restructuredText和Markdown写文章,配置灵活,扩展性强。目前Pelican已发布3.2.2版本,有许多优秀的主题插件可供使用。

配置文件介绍

以下内容以Pelican3.2.2的配置文件为标准,选择部分难设置的变量进行说明。

时区和时间设置

时间的具体显示样式取决于所使用的主题,需要查看对应的jinja2代码,时间的格式见这里

TIMEZONE = 'Asia/Shanghai'
DEFAULT_DATE_FORMAT = '%Y-%m-%d %H:%M:%S'

其他有用的设置

使用目录名作为文章的分类名

USE_FOLDER_AS_CATEGORY = True

使用文件名作为文章或页面的slug(url)

FILENAME_METADATA = '(?P<slug>.*)'

页面的显示路径和保存路径,推荐下面的方式

ARTICLE_URL = '{category}/{slug}.html'
ARTICLE_SAVE_AS = ARTICLE_URL
PAGE_URL = '{slug}.html'
PAGE_SAVE_AS = PAGE_URL
CATEGORY_URL = '{slug}/index.html'
CATEGORY_SAVE_AS = CATEGORY_URL
TAG_URL = 'tag/{slug}.html'
TAG_SAVE_AS = TAG_URL
TAGS_SAVE_AS = 'tag/index.html'

需要注意的问题

Plugin执行顺序

实际使用(pelican3.4)的时候发现,注册在同一信号下的plugin的执行顺序是随机的(坑爹),所以最好不要有相互依赖的关系,否则。。。

优秀主题推荐

官方主题仓库见这里,另外github上还有许多没有加入官方主题仓库的优秀pelican主题,请善用github的搜索功能。

Elegant

Elegant是我见过的pelican主题里最优雅漂亮的一个了,功能也超齐全,这里有一篇作者写的介绍和配置文章。

Niu-X2

接下来是毛遂自荐,Niu-X2是本人业余时间用bootstrap3创作的一个主题,本站目前正在用,功能比较齐全,不算漂亮但很对我自己的口味,代码和配置方法都在这里。官方主题仓库里的那个niu-x2版本比较老了,如果感兴趣请直接从我的仓库里拉取。

本博客目前在用的主题是Niu-X2的一个带侧边栏的分支,代码见niu-x2-sidebar。相对与Niu-X2,目前的主题添加了目录定位和目录自动滚动等功能,同时还完善了脚注(footnote)支持(示例见这篇文章)。需要注意的是,添加侧边栏后,主题的自适应性不如Niu-X2。具体表现是,当可视区域比较窄的时候,侧边栏会被置于页面底部,目前还没有解决办法。

优秀插件推荐

使用插件会延长pelican的编译时间,不过这不是什么问题。这里仅推荐我认为必备的插件,另外官方插件仓库见这里

sitemap

sitemap可以生成xml和txt格式的网站地图,配置见插件的readme。配置举例:

SITEMAP = {
    'format': 'xml',
    'priorities': {
        'articles': 0.5,
        'indexes': 0.5,
        'pages': 0.5
        },
    'changefreqs': {
        'articles': 'weekly',
        'indexes': 'daily',
        'pages': 'monthly'
        }
    }

gzip_cache

gzip_cache可以将所有的页面压缩为gz格式,有效加快页面的加载速度。

配置文件

下面是我的配置文件,基于niu-x2-sidebaricomoon分支。(已屏蔽部分账号信息,使用时请自行替换)

::python
#!/usr/bin/env python
# -*- coding: utf-8 -*- #
from __future__ import unicode_literals
from collections import OrderedDict
import datetime

AUTHOR = u'Ma Wenbao'
SITENAME = u'MWB日常笔记'
SITEURL = 'https://www.mawenbao.com'

TIMEZONE = 'Asia/Shanghai'
DATE_FORMATS = {
        'zh_CN': '%Y-%m-%d %H:%M:%S',
}
DEFAULT_DATE_FORMAT = '%Y-%m-%d %H:%M:%S'
DEFAULT_DATE = 'fs'  # use filesystem's mtime
LOCALE = ('zh_CN.utf8',)
DEFAULT_LANG = u'zh_CN'
FILENAME_METADATA = '(?P<slug>.*)'
GOOGLE_ANALYTICS = 'XXXXXX'
# feed config
FEED_DOMAIN = SITEURL
FEED_ALL_RSS = 'feed.xml'
FEED_MAX_ITEMS = 20
FEED_ALL_ATOM = None
CATEGORY_FEED_ATOM = None
TRANSLATION_FEED_ATOM = None
# use directory name as category if not set
USE_FOLDER_AS_CATEGORY = True
DELETE_OUTPUT_DIRECTORY = True
DEFAULT_CATEGORY = 'uncategorized'
DEFAULT_PAGINATION = 7

READERS = {
    'html': None,
}

STATIC_PATHS = [
    'static',
    'extra',
]
EXTRA_PATH_METADATA = {
    'extra/CNAME': { 'path': 'CNAME' },
    'extra/.nojekyll': { 'path': '.nojekyll' },
    'extra/README': { 'path': 'README.md' },
    'extra/favicon.ico': { 'path': 'favicon.ico' },
    'extra/LICENSE.txt': { 'path': 'LICENSE.txt' },
    'extra/robots.txt': { 'path': 'robots.txt' },
    'extra/BingSiteAuth.xml': {'path': 'BingSiteAuth.xml' },
}

ARTICLE_URL = '{category}/{slug}.html'
ARTICLE_SAVE_AS = ARTICLE_URL
PAGE_URL = '{slug}.html'
PAGE_SAVE_AS = PAGE_URL
CATEGORY_URL = '{slug}/index.html'
CATEGORY_SAVE_AS = CATEGORY_URL
TAG_URL = 'tag/{slug}.html'
TAG_SAVE_AS = TAG_URL
TAGS_SAVE_AS = 'tag/index.html'
# disable author pages
AUTHOR_SAVE_AS = ''
AUTHORS_SAVE_AS = ''

TEMPLATE_PAGES = {
    "404.html": "404.html",
    "archives_updatedate.html": "archives_updatedate.html",
}
JINJA_EXTENSIONS = [
    'jinja2.ext.ExprStmtExtension',
]

# plugin config
PLUGIN_PATHS = ['./plugins']
PLUGINS = [
    #'pandoc_reader',
    #'gzip_cache',
    'update_date',
    'extract_headings',
    'sitemap',
    'summary',
    'niux2_lazyload_helper',
    #'minify',
]
UPDATEDATE_MODE = 'metadata'

# extrac_headings plugin config
import md5
def my_slugify(value, sep):
    m = md5.md5(value.encode('UTF-8'))
    return m.digest().encode('hex')[:6]
MY_SLUGIFY_FUNC = my_slugify
MY_TOC_LIST_TYPE = 'ol'

# niux2_lazyload_helper plugin config
import os
def my_img_url_2_path(url):
    if not url.startswith('//static.mawenbao.com'):
        print("ignore " + url)
        return ''
    return os.path.abspath(os.path.join('content', 'static', url[1 + url.index('/', 2):]))
MY_IMG_URL2PATH_FUNC = my_img_url_2_path

from markdown.extensions import codehilite
MD_EXTENSIONS = ([
    'extra',
    'footnotes',
    'tables',
    codehilite.CodeHiliteExtension(configs=[('linenums', False), ('guess_lang', False)]),
])

# sitemap plugin config
SITEMAP = {
    'format': 'xml',
    'priorities': {
        'articles': 0.5,
        'indexes': 0.5,
        'pages': 0.5
    },
    'changefreqs': {
        'articles': 'weekly',
        'indexes': 'daily',
        'pages': 'monthly'
    }
}

# cache policy, currently no cache
LOAD_CONTENT_CACHE = False
CACHE_CONTENT = False
#CHECK_MODIFIED_METHOD = 'md5'

# theme config
THEME = './themes/niu-x2-sidebar'
NIUX2_DEBUG = False

# niu-x2 theme config
NIUX2_AUTHOR_TRANSL = '作者'
NIUX2_404_TITLE_TRANSL = '404错误 页面未找到!'
NIUX2_404_INFO_TRANSL = '请求页面未找到!'
NIUX2_TAG_TRANSL = '标签'
NIUX2_ARCHIVE_TRANSL = '存档'
NIUX2_ARCHIVE_UPDATEDATE_TRANSL = '存档 (按修改时间)'
NIUX2_CATEGORY_TRANSL = '分类'
NIUX2_TAG_CLEAR_TRANSL = '清空'
NIUX2_TAG_FILTER_TRANSL = '过滤标签,不妨试试[0-9]{3}'
NIUX2_HEADER_TOC_TRANSL = '目录'
NIUX2_SEARCH_TRANSL = '搜索'
NIUX2_SEARCH_PLACEHOLDER_TRANSL = '按回车开始搜索 ...'
NIUX2_COMMENTS_TRANSL = '评论'
NIUX2_PUBLISHED_TRANSL = '发布时间'
NIUX2_LASTMOD_TRANSL = '最后修改'
NIUX2_PAGE_TITLE_TRANSL = '页面'
NIUX2_RECENT_UPDATE_TRANSL = '最近修改'
NIUX2_HIDE_SIDEBAR_TRANSL = '隐藏侧边栏'
NIUX2_SHOW_SIDEBAR_TRANSL = '显示侧边栏'
NIUX2_REVISION_HISTORY_TRANSL = '修订历史'
NIUX2_VIEW_SOURCE_TRANSL = '查看源文件'

NIUX2_DUOSHUO_SHORTNAME = 'XXXXXX'
#NIUX2_DUOSHUO_THREAD_KEY = 'slug'
NIUX2_PYGMENTS_THEME = 'github'
NIUX2_PAGINATOR_LENGTH = 11
NIUX2_RECENT_UPDATE_NUM = 10
NIUX2_FAVICON_URL = '/favicon.ico'
NIUX2_GOOGLE_CSE_ID = 'XXXXXX'
NIUX2_DISPLAY_TITLE = True
NIUX2_LAZY_LOAD = True
NIUX2_LAZY_LOAD_TEXT = 'orz 努力加载中'
NIUX2_LAZY_LOAD_ICON = 'icon-spin icon-spinner2'
NIUX2_TOOLBAR = True
NIUX2_TOOLBAR_LOAD_ICON = 'icon-spin icon-4x icon-spinner9'

#NIUX2_LIB_THEME = 'http://cdn.mawenbao.com/niu-x2-sidebar'
NIUX2_LIB_FONT_ICONS = 'http://cdn.mawenbao.com/font-icons'
NIUX2_LIB_JQUERY = 'http://cdn.mawenbao.com/jquery/jquery-1.11.0.min.js'
NIUX2_LIB_BOOTSTRAP = 'http://cdn.mawenbao.com/bootstrap/3.1.1'

NIUX2_CATEGORY_MAP = {
    'code': ('代码', 'icon-code'),
    'collection': ('搜藏', 'icon-briefcase'),
    'essay': ('随笔', 'icon-leaf'),
    'life': ('日常', 'icon-coffee'),
    'note': ('笔记', 'icon-book'),
    'research': ('研究', 'icon-flask'),
}

NIUX2_HEADER_SECTIONS = [
    ('关于', 'about me', '/about.html', 'icon-anchor'),
    ('使用协议', 'agreement', '/agreement.html', 'icon-exclamation-circle'),
    ('项目', 'my projects', '/my_projects.html', 'icon-rocket'),
    ('标签', 'tags', '/tag/', 'icon-tag'),
]

NIUX2_HEADER_DROPDOWN_SECTIONS = OrderedDict()
NIUX2_HEADER_DROPDOWN_SECTIONS[('存档', 'icon-archive')] = [
    ('存档 (按发布时间)', 'archives order by publish time', '/archives.html', 'icon-calendar'),
    ('存档 (按修改时间)', 'archives order by modify time', '/archives_updatedate.html', 'icon-pencil'),
]

NIUX2_FOOTER_LINKS = [
    ('关于', 'about me', '/about.html', ''),
    ('使用协议', 'terms, license and privacy etc.', '/agreement.html', ''),
    ('沪ICP备14018579号-1', '备案号', 'http://www.miitbeian.gov.cn/', ''),
]

NIUX2_FOOTER_ICONS = [
    ('icon-key', 'my public key', '/my_gnupg.html'),
    ('icon-envelope-o', 'my email address', 'mailto: mwenbao@gmail.com'),
    ('icon-github-alt', 'my github page', 'http://github.com/mawenbao'),
    ('icon-rss', 'subscribe my blog', '/feed.xml'),
]

阅读资料

#pelican#setup#static_blog#总结

评论