这篇主要是总结下折腾个人博客的经验,前人已经刷了无数攻略,这个副本并不难,只是需要花时间。遇到问题时,Google始终是你最好的老师...

0x01 Requirement

  • 搭建简单,维护备份方便
  • 写博客方便,支持MD格式
  • 模板美观大方,可以装B,不会丑的狗带
  • 社区活跃,遇到问题可以抱大神大腿

0x02 Solution

主要是三大类解决方案:

a. 商业化产品

  • Lofter
  • CSDN

b. 个人博客(CMS)

  • Wordpress
  • Durpal

c. 静态页面

  • Pelican
  • jekyll
  • Ortopress
  • 商业化产品首先不考虑,服务受提供商制约,用户体验有待提高,备份也很头疼,且没有折腾的意义...
  • 使用过Wordpress,需要数据库等后面一套,略庞大,肯定需要独立空间,我懒...

自从搭建一个免费的,无限流量的Blog----github Pages和Jekyll入门之后,国内的个人博客就如雨后春笋,资料大把,原理类似...

Static Site Generators记录了github中各个开源的静态网站生成器star的情况,排名前五的是jekyll(Ruby)、Octopress(Ruby)、Hexo(Javascript)、Hugo(Go)、Pelican(Python)

  • Jekyll Jekyll在Github上有20000+stars,远远领先于第二名的关注度,笔者没用过ruby,且国内ruby源被GFWfuck后,设置淘宝源各种蛋疼...遂放弃
  • Ortopress同理,但是看到别人做的效果挺好的就关注了下:陋室

0x03 Pelican

笔者使用Python,并且之前接触过Pelican,考虑了一下就选择了最熟悉的Pelican,毕竟它叫Pel I Can...

1.Introduce

  • pelican是一个用python生成的静态站点生成器。具有以下特点:
  • 支持Markdown和reStructuredText格式;
  • 可以使用简单的命令生成文件;
  • 具有简单易用的版本控制系统;
  • 完全静态,可在任何地方输出;

2.Setup

安装pelican

pip install pelican Markdown

如有印刷格式上的需要,还需要安装typogrify

pip install typogrify

3.Usage

  • pelican-quickstart创建站点到/var/www/pelican/,根据脚本提示配置参数

a.站点结构

yourproject/
├── content
│   └── (pages)
├── output
├── develop_server.sh
├── fabfile.py
├── Makefile
├── pelicanconf.py       # Main settings file
└── publishconf.py       # Settings to use when ready to publish

b.文档内容

  • pelican支持三种格式:reStructuredText、markdown以及AsciiDoc

reStructuredText要求文件后缀为.rst,并且源文件格式如下:

My super title
##############

:date: 2010-10-03 10:20
:modified: 2010-10-04 18:40
:tags: thats, awesome
:category: yeah
:slug: my-super-post
:authors: Alexis Metaireau, Conan Doyle
:summary: Short version for index and feeds

This is the content of my super blog post.

Markdown要求文件后缀为.md, .markdown, .mkd, 或 .mdown,并且源文件格式如下:

Title: My super title
Date: 2010-12-03 10:20
Modified: 2010-12-05 19:30
Category: Python
Tags: pelican, publishing
Slug: my-super-post
Authors: Alexis Metaireau, Conan Doyle
Summary: Short version for index and feeds

This is the content of my super blog post.

还支持翻译、语法高亮、内置内容(模板)、从其他站点导入等功能;

c.输出和启动

  • 编辑好Markdown或reStructuredText文件后,pelican会将内容转换为静态html格式,输出到output中
pelican /path/to/your/content/ [-s path/to/your/settings.py]
  • 启动服务器
cd output
python -m SimpleHTTPServer      #python2
python -m http.server           #python3
  • 打开浏览器http://192.168.1.112:8000/,预览效果;

d.配置主题

Pelican支持大量的开源主题,GitHub上的pelican-themes项目有几十套主题,大部分都带了效果预览图。可以从里面挑一个喜欢的主题样式来使用。还有一个更方便的挑选主题的方式,直接打开pelicanthemes挑选(加载略慢)。一个网页里就列出了几乎所有的主题。该博客使用pelican-bootstrap3主题,并在这套主题的基础上进行了一些定制。选定好喜欢的主题后,从GitHub上下载下来所有的主题,安装主题:

mkdir pelican
cd pelican
git clone https://github.com/getpelican/pelican-themes.git
pelican-themes -i pelican-bootstrap3

然后在pelicanconf.py里通过下面代码指定博客主题:

THEME = 'pelican-bootstrap3'

通常的做法是,选中一个自己喜欢的主题后,会进行一些定制。Pelican使用Jinja2来配置主题。一个主题的典型结构如下:

├── static
│   ├── css
│   └── images
└── templates
    ├── analytics.html      // 这是Google Analytics的代码
    ├── archives.html       // 这个是博客归档页面的模板
    ├── article.html        // 这个是博客正文的显示模板
    ├── base.html           // 这个是所有页面的父类模板,即所有页面都引用这个页面。比如网页导航栏啊之类的,都定义在这里
    ├── categories.html     // 所有博客文章的分类列表
    ├── category.html       // 某个博客分类的文章列表模板
    ├── index.html          // 主页
    ├── page.html           // 分页显示的模板
    ├── tag.html            // 某类标签下的文章列表
    └── tags.html           // 所有的标签列表页面模板

稍微有点Jinja的知识加上一些HTML和CSS的知识,就可以自己定义主题了。

e.配置插件

插件同主题类似,到github上down下来,虽然大部分插件都是全主题可用的,但是也存在好用与否的问题, 有些插件在原生主题上就需要自己改base.css才能用,所以尽量配套选,避免麻烦.

git clone --recursive https://github.com/getpelican/pelican-plugins

将需要安装的插件添加到pelicanconf.py文件中,新版本将关键字改为PLUFIN_PATHS以及列表的形式。

PLUGIN_PATHS = [u"pelican-plugins"]
PLUGINS = [u"sitemap", u"tag_cloud", u"gzip_cache", u"related_posts", u"tipue_search", u"pelican-toc"]

tag_cloud, related_posts, gzip_cache参考手册设置即可

sitemap

Pelican的sitemap插件可以导出站点地图,Google Webmaster是Google的站长工具,方便Google收录博客:

a. 在pelicanconf.py中添加sitemap,同时别忘了设置SITEURL,否则生成的sitemap.xml不正确

SITEURL = u'https://pelucky.github.io'

SITEMAP = {
    "format": "xml",
    "priorities": {
        "articles": 0.7,
        "indexes": 0.5,
        "pages": 0.3,
    },
    "changefreqs": {
        "articles": "monthly",
        "indexes": "daily",
        "pages": "monthly",
    }
}

b. 登录Google Webmasters,注册博客并测试sitemap,测试通过后提交,过段时间就可以查看Google已经收录了博客。

tag_cloud

这个应该是必装的,否则右侧tag选项永远显示为空,在pelicanconf.py中添加:

DISPLAY_TAGS_ON_SIDEBAR = True
TAGS_URL = "tags.html"
tag_cloud = True

pelican-toc

添加Table of Contents,即可显示文章的目录,需要自行下载到pelican-plugins,参考pelican-toc,自带的extract_toc没这个方便...

在配置文件中添加:

PLUGINS = ['pelican-toc']

TOC = {
    'TOC_HEADERS' : '^h[1-6]',  # What headers should be included in the generated toc
                                # Expected format is a regular expression

    'TOC_RUN'     : 'true'      # Default value for toc generation, if it does not evaluate
                                # to 'true' no toc will be generated
}

在模板文件中添加,可以添加到文章最上面或(article.html)sidebar处:

{% if article.toc %}
    {{article.toc}}
{% endif %}

f.Google Analytics

Google Analytics申请账号,会要求检验你拥有该站点的所有权,需要下载googlexxxx.html,上传并点击该链接来确认。记下跟踪ID。 在pelicanconf.py添加

GOOGLE_ANALYTICS = u'跟踪ID'

之后即可到Google Analytics的控制台查看访问情况;

g.一键Github

若要一键上传到Github,需要修改Makefile脚本两处地方:

publish:
$(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)

......

github: publish
cd $(OUTPUTDIR) ; git add . ;  git commit -am 'Update pages' ; git push

以后写完文章在Pelican目录下执行make github就可以一键部署了。

h.取消代码中红框

参考:修复pelican代码中红框

在使用Markdown的代码块时,如果代码中有汉字或者按规定书写错误的代码,则生成的HTML文件中错误的代码会有红框框住,output/theme/pygment.css文件中定义了该样式,注释或者删除掉。

.err {
border:1px solid #FF0000;
}

由于output中的内容每次都会生成,故需要把模板中的pygment.css进行更换,如果之前使用了 pelican-themes -i pelican-bootstrap安装,则一般会在如下位置,直接vim修改模板中的pygment.css:

pel@debian:~/pelican$ pelican-themes -p
/usr/local/lib/python2.7/dist-packages/pelican/themes

i.评论系统

Disqus上申请一个站点,记牢Shortname(不需要加后缀),评论系统加载起来有点慢,国内也可以使用多说。 在pelicanconf.py添加

DISQUS_SITENAME = 'Shortname'

j.插入图片

有两种方法:

  • 一种是使用云存储,设置为公开图片,直接链接过来,如Picasa来维护图片,推荐使用云图床;
![Test Cloud img](https://lh3.googleusercontent.com/-rBvjY3F2wEU/VvD3yZ9T-1I/AAAAAAAAAVc/LsPcb3CIxtomUcXq5aVKj27qSrI4OserwCCo/s400-Ic42/3d94dcb44aed2e730566c2068601a18b86d6fa7f.jpg)

Test Cloud img

  • 另一种使用本地图片,参考,但Github有图片容量限制。content目录下建立一个 images目录 然后在 pelicanconf.py 中添加:
STATIC_PATHS = ["images"]

在文章中引用图片,路径要设置为本文件与图片文件中的相对路径,如果文件路径变更了,就需要修改图片的相对路径,那个真蠢...可参考

![Test img](../../../../../../images/test.jpg)

Test img

k.设置域名

待续...

l.站内搜索

站内搜索有两种解决方案,一种是采用Google的站内搜索,另一种是使用静态搜索引擎;

  • Google站内搜索 由于Bootstrap支持Tipue Search,故没怎么折腾Google站内搜索,参考:pelican建站攻略补充(站内搜索,和标签云)

  • Tipue Search静态搜索引擎 原理就是每次生成静态网站的时候,同时会生成一个JSON格式的索引文件,前端加载一个检索入口即可搜索网站内容,比较适合中小型的静态网站;

PLUGINS = [u"tipue_search"]

Tipue Search
DIRECT_TEMPLATES = (('index', 'tags', 'categories', 'archives', 'search',))
SEARCH_URL = '/search'

Tips:

从pelican-plugins下git下来的Tipue Search有bug,搜索出来的URL会显示undefined,参考此处,将Tipue_Search更新至5.0即可,具体更新的方法参考Site search with Tipue for Pelican,要注意查看template/search.html中的路径;

m.从WordPress迁移到Pelican

  1. 导出WordPress数据;在 WordPress 后台 -> 工具 -> 导出。即可导出并下载包含全部文章、页面、评论、自定义栏目、分类目录和标签的 xml 文件。
  2. 将xml转成Markdown;使用 exitwp 自动处理xml文件。下载后将导出的 xml 放入 wordpress-xml 目录中,运行 python exitwp.py 即可将 xml 转成 Markdown。
  3. 需要注意的是转换出的文件注释部分,关于Tags,Category,Date等Meta部分需要按Pelican的形式进行格式调整,以便被Pelican解析,其实还是有点工作量的...

看文档发现,有pelican-import可以直接从wordpress导入,参考

n.URL配置

默认的URL太low了,可以更优雅...但要注意修改后本地图片的相对路径需要该.

打开pelicanconf.py配置文件,添加如下,具体配置请参见官方文档

ARTICLE_URL = 'pages/{date:%Y}/{date:%m}/{date:%d}/{slug}/'
ARTICLE_SAVE_AS = 'pages/{date:%Y}/{date:%m}/{date:%d}/{slug}/index.html'
PAGE_URL = 'pages/{slug}/'
PAGE_SAVE_AS = 'pages/{slug}/index.html'

o.更换字体

Pelican默认的字体使用了Google的字体服务,会导致加载速度巨慢,更改国内的源或将字体文件放到github上

#static/css/目录下css文件中,例如gumby.css
@import url(//fonts.googleapi.com/css?family=Open+Sans:400,300,600,700);
#替换为
@import url(//fonts.useso.com/css?family=Open+Sans:400,300,600,700);
  • 如何创建github-page、git使用就不介绍了...
  • 之后的折腾就都来自Pelican docs
  • Bootstrap3很值得看,里面介绍了模板支持的功能
  • Blog Source code
  • 感谢林无知的Nono熊

Reference


Comments

comments powered by Disqus