0x00 关于Jekyll和Github Pages

Github作为一个托管代码的平台,还提供了介绍项目的功能,这个功能扩展出来就是一个静态网站的托管平台,就叫Github Pages。Github本身支持Markown文件解析展示,不过这个功能比较简单,有很多工具可以实现把较多的Markdown文件组织转换成静态网站,Github官方推荐的就是Jekyll。Github本身又对托管的代码有版本控制的功能,所以能够实现通过Markdown编辑文档,然后Git管理这些文档并进行发布。

使用Jekyll的方式有多种:

至于为什么要用Markdown来写文档,除了它比较流行支持的平台比较多之外,更重要的还是它内在的好处,就是能够聚焦到内容本身,并且可移植,就像MVC框架一样,M和C的时候不需要太多的关注V的内容。其实Jekyll还是需要修改一点Markdown文件本身的,至少需要加上Front Matter,这是YAML格式编写的文件头,Jekyll通过识别它进行展示,像下面这样:

---
layout: post
title: Blogging Like a Hacker
---

当然,这也是Jekyll比较强大的地方,Markdown文件里面还可以加入很多模版的内容,展示出来的效果非常好,基本上可以满足中小型网站的需要。

如果想不修改一点Markdown文档的内容,就能有一个类似的网站系统,可以参考MkDocs,一个Python实现的工具,使用方法超级简单,具体的介绍参考使用MkDocs管理你的CMS系统

0x01 注册Github账户并创建一个repository

注册账户和创建repository比较简单,访问https://github.com/上操作就可以了。生成的工程名称可以是个人的,也可以创建组织,然后工程名称就是工程的域名了。比如我们的organization是wutongtree,所以repository路径就是:https://github.com/wutongtree/xxx,我们创建的repository名称是wutongtree.github.io。创建完成以后可以在repository的Settings里面找到Github Pages进行设置,默认的访问地址就是username.github.io/repository。

0x02 安装并使用Jekyll-Bootstrap

安装Jekyll

安装Jekyll最简单的方式就是通过RubyGems:

gem install jekyll

用Jekyll-Bootstrap初始化刚创建的repository

记得替换下面的repository:

git clone https://github.com/plusjade/jekyll-bootstrap.git wutongtree.github.io
cd wutongtree.github.io
git remote set-url origin git@github.com:wutongtree/wutongtree.github.io.git

增加或者切换主题

从Github上下载的Jekyll-Bootstrap是没有bootstrap-3这个theme的,但是_layout用的却是bootstrap-3,所以直接运行的话样式是不对的,控制台会报错:

[2016-09-02 23:30:55] ERROR `/assets/themes/bootstrap-3/bootstrap/css/bootstrap-theme.min.css' not found.
[2016-09-02 23:30:55] ERROR `/assets/themes/bootstrap-3/bootstrap/css/bs-sticky-footer.css' not found.
[2016-09-02 23:30:55] ERROR `/assets/themes/bootstrap-3/bootstrap/js/bootstrap.min.js' not found.
[2016-09-02 23:30:55] ERROR `/assets/themes/bootstrap-3/css/style.css' not found.
[2016-09-02 23:30:55] ERROR `/assets/themes/bootstrap-3/bootstrap/css/bootstrap.min.css' not found.
[2016-09-02 23:30:55] ERROR `/assets/themes/bootstrap-3/bootstrap/js/bootstrap.min.js' not found.

有两个办法解决这个问题:

  • 切换主题

比如我用的twitter:

rake theme:switch name="twitter"
  • 增加主题

如果还是想用bootstrap-3,可以增加主题:

rake theme:install git=https://github.com/jekyll-bootstrap-3/bootstrap-theme

会提示是否要切换到新主题。

本地测试

解决了主题的问题以后就可以本地测试一下看看效果了:

jekyll serve

打开http://localhost:4000就可以看到默认页面了

0x03 调整Navigation的顺序

导航栏默认的排列顺序是按页面URL的字母顺序排列的,这个和预期的要求不一样。实现的方法有多种:

  • 给Pages页增加权重或者顺序

在页面的Front Matter上增加一个字段,比如下面的weight:

---
layout: page
title : Archive
header : Post Archive
group: navigation
weight: 1
---

然后修改用到的theme对应的default.html文件,比如:_includes/themes/twitter/default.html,找到

assign pages_list = site.pages

修改为:

assign pages_list = site.pages | sort:"weight"

这种方式需要手动的给每个Pages页面加一个权重,如果要调整需要需要去每个文件改。

  • 利用Jekyll内置的序号

直接修改每个Pages页面的需要,比如:

01_categories.html
02_archive.html

这样,01_categories.html就会排在前面,不过URL里面是带着这个序号的,看着不舒服。

  • 手动排列页面的顺序

专门用一个页面来排列顺序,比如增加一个_data目录,在这个目录下增加一个pages.yml文件,内容如下:

- url: /hyperledger
  title: Hyperledger源码分析
  group: navigation
- url: /devops
  title: 动手实战
  group: navigation
- url: /translations
  title: 原创翻译
  group: navigation
- url: /news
  title: 行业动态
  group: navigation
- url: /resources
  title: 网络资源
  group: navigation

然后修改用到的theme对应的default.html文件,找到

assign pages_list = site.pages

修改为:

assign pages_list = site.data.pages

这种方式的好处是对展示页面统一管理,比较方便,还可以隐藏部分页面。

  • 其他办法

可以把代码改的复杂点,如果你愿意的话。

0x04 编写文章

Jekyll发布的文章都需要带着Front Matter,可以用两种方法:

  • 一种是用Jekyll-Bootstrap里面写好的Ruby Makefile - rake
rake post title="Hello World"

这种方式创建的文章会自带创建时间,文件名格式是:2016-09-03-hello-world.md,存放在_post目录下,生成的文件自带文件头:

---
layout: post
title: "Hello World"
description: ""
category:
tags: []
---


这种方式发布的文章是类似博客系统,安装时间顺序进行排列,没有进行归类,我是用下面的方法。

  • 自己写文件头

为了比较好的对文档进行归类,做成类似wiki的系统,可以在repository的根目录下创建分类目录,然后里面手动创建文件,拷贝上面生成的文件头,不过layout需要修改一下,我用的是page,这样文件名就不用带时间格式了,比如resources/index.md:

---
layout: page
title: "网络资源"
description: ""
group: navigation
---



## 技术类
* [Hyperledger fabric](https://gerrit.hyperledger.org)
* [NXT白皮书中文版](/NXT%E7%99%BD%E7%9A%AE%E4%B9%A6%E4%B8%AD%E6%96%87%E8%AF%91%E6%9C%AC.pdf)
* [PoX的战争——区块链技术在金融工具中的应用](/PoX%E7%9A%84%E6%88%98%E4%BA%89.pdf)

## 产品类
* [Hyperledger](https://www.hyperledger.org/)

## 视频类
* [Blockchain in a Global Context](https://coindesk.wistia.com/medias/rtitd3kev2)

## 新闻类
* [CoinDesk](http://www.coindesk.com/)

这样除了文件头,其他都是原生的Markdown文件,然后再把生成的文章链接到Navigation对应的页面上,现在是手动更新的,如果要做做更多的自动化,可以修改Rakefile或者自己写脚本来实现。

0x05 发布文章

直接在工程的根目录下运行jekyll命令就可以生成静态的网站了,然后再发布到Github上就可以了:

jekyll build
git commit -am "xxx"
git push origin

0x06 一些Jekyll实现的网站

这里有一堆的列表:

个人比较喜欢的:

0xFF 未完待续

还有一些功能没有做尝试,比如每个Pages根据某个category自动生成列表、加上目录导航等。