jekyll bootstrap + github pages でブログ運用
概要
ローカルで markdown ガリガリ書いてローカルで確認、サーバーへアップロードまで CUI でサクサクできるのでよいです。軽いし。
jekyll 単体だといろいろ面倒なので、ブログ作成支援や bootstrap を使ったレイアウトなどがついてる jekyll bootstrap を使います。 動作を理解するためには、まず jekyll 単体を触ってみたほうがいいかもですが。
セットアップ
基本的には Jekyll Quick Start | ruhoh universal static blog generator に従えばいいのですが、一応ステップバイステップで。ローカルで動かす→サーバーで動かす、という順でいきます。
ローカルにjeklly-bootstrap のインストール
まず jekyll を入れます:
% sudo gem install jekyll
次に jekyll-bootstrap。git clone でローカルに持ってきます。username は自分のユーザ名に変えてください。
% git clone https://github.com/plusjade/jekyll-bootstrap.git _username_.github.io
そして、サーバー稼働:
% cd _username_.github.io
% jekyll serve
...
Server address: http://0.0.0.0:4000/
Server running... press ctrl-c to stop.
と出てくれば、 http://localhost:4000/ で動作が確認できます。そしたらgithub.io 上に持って行きましょう。
また、--port 3000 などとすればポートを指定できます。
github.io 上へインストール
まず、https://github.com/new から "username.github.io" というレポジトリを作成します。"Initialize this repository with a README" はチェックしなくてもよい。
そうしたら、remote repository として github.io を指定し、push します。パスワードを聞かれるので入力すること。url として https://username:password@github.com.... とすると省略できますが、非推奨。
% git remote set-url origin https://_username_@github.com/_username_/_username_.github.io.git
% git push origin master
Password:
http://_username_.github.io で動作確認します。
設定
_config.ymlで、author: 以下の name, email などを適宜設定。
markdown は redcarpet にしとくと吉
title : A Sample Blog
author :
name : Your Name
email : your@mail.address.com
github : username
twitter : account_name
markdown: redcarpet
redcarpet:
extensions: ["autolink"]
運用
運用形態としては、ローカルで *.md を編集→ ローカル上で確認→ サーバーへ push、という形になります。
ページの編集
あまり変更のない固定ページ。直下にabout.md などを作ると、about.html に変換してくれます。
% rake page name="about"
name=以下を省略すると "new-page" となります。
YAMLヘッダで group: navigation と追加すると、ナビゲーションバーに入れてくれます。
---
layout: page
title: "About"
description: ""
group: navigation
---
this is an about page.
ポスト
ブログの記事を編集、追加します。
rake post title="test"
とすると "_posts/2014-11-01-test.md" が作られるので、これを編集します。 title=以下を省略すると "new-post" になります。
ローカルで確認
--watch オプションをつけると、ファイルを変更すると自動的に再生成してくれます。 また、vagrant などで外で編集すると変更を検知してくれないので、--force_polling をつけます。 ラグがあるときは、明示的に "jekyll build" してしまってもよい。
% jekyll serve --watch --force_polling
サーバーへ push
ふつーに add, commit, push します:
% git add .
% git commit -m blog -a
% git push origin master
makefile で簡略化
いろいろタイプするのが面倒なので、makefile を作っておくと楽です:
build:
jekyll build
cmt:
git status
git commit -m msg -a
push:
git push origin master
serve:
jekyll serve --watch --force_polling
serve --watch すると通知表示がうざいので、>/dev/null にしてもいいかも。
カスタマイズ
レイアウトの変更
{% raw %}
_layouts/default.html をいじくります。が、jekyll bootstrap だと _includes/themes/bootstrap-3/default.html を使うようになっているので、 これを直接いじくるか、コピーしてそっちをいじくります。
サイドメニューをつけたいので、default.html の {{ content }} あたりのを以下のように変更。xs, sm では表示しないように。
...
<div class="container">
<div class="raw">
<div class="col-md-3 hidden-xs hidden-sm">
{% include sidebar %}
</div>
<div class="col-md-9">
{{ content }}
</div>
</div>
</div>
</div>
sidebar を _includes/ 以下に作ってそれを include してます。
sidebar ではカテゴリと最新記事を表示するようにしてます。category.html あたりからパクりました。
<h2>Category</h2>
<ul>
{% for category in site.categories %}
<li id="\{\{ category[0] \}\}-ref">{{ category[0] | join: "/" }}</h2>
<ul>
{% assign pages_list = category[1] %}
{% include JB/pages_list %}
</ul>
{% endfor %}
</ul>
<h2>Recent Updated</h2>
<ul class="posts">
{% for post in site.posts %}
<li><span>{{ post.date | date_to_string }}</span> » <a href="{{ BASE_PATH }}{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
</ul>
Pygments
コードの色分けはしたいですね。bootstrap3 には pygments が入っていないようなので、 ぐぐって出てきたのを assets/themes/bootstrap-3/css/pygment_trac.css に保存し、default.html に link を加えます。
...
<link href="{{ ASSET_PATH }}/css/pygment_trac.css" rel="stylesheet" type="text/css" media="all">
ウェブ上での編集
ローカルでの編集を想定してるので、ウェブ上での編集は想定されていないので、 prose.io を使う。あらかじめ登録しておく(authenticate するだけ)。
post.html にprose.io の編集画面へのリンクをはると便利。日付の隣につける:
<div class="date">
<span>{{ page.date | date_to_long_string }}</span>
<span><a href="http://prose.io/#{{site.author.github}}/{{site.author.github}}.github.io/edit/master/{{ page.path }}" target="_blank"><i class="glyphicon glyphicon-edit"></i></a></span>
</div>
見出し番号
body {
counter-reset:h1;
}
.content > h1{counter-increment:h1;counter-reset:h2;}
.content > h2{counter-increment:h2;counter-reset:h3;}
.content > h3{counter-increment:h3;counter-reset:h4;}
.content > h4{counter-increment:h4;counter-reset:h5;}
.content > h1:before{content: counter(h1) ". ";}
.content > h2:before{content: counter(h1) ". " counter(h2) ". ";}
.content > h3:before{content: counter(h1) ". " counter(h2) "." counter(h3) " "; }
.content > h4:before{content: counter(h1) ". " counter(h2) "." counter(h3) "." counter(h4) " "; }
トップで最新記事を表示
[paco.jp » jekyllでトップページにsite.postsの最新記事を表示する] (http://paco.jp/blog/jekyll/ruby/2013/01/01/jekyll%E3%81%A6%E3%82%99%E3%83%88%E3%83%83%E3%83%95%E3%82%9A%E3%83%98%E3%82%9A%E3%83%BC%E3%82%B7%E3%82%99%E3%81%ABsite.posts%E3%81%AE%E6%9C%80%E6%96%B0%E8%A8%98%E4%BA%8B%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B/) を参考に:
% vi index.md
---
layout: default
---
{% include JB/setup %}
{% assign page = site.posts.first %}
{% assign content = page.content %}
{% include themes/bootstrap-3/post.html %}
% vi _layout/default.html
{% if page.url == '/index.html' %}
{% assign page = site.posts.first %}
{% endif %}
...
<link rel='canonical' href='{{site.root_url}}{{page.url}}' />
...
プラグイン
Tips
.emacs
iso-2022-jp だとエラーになるので、utf-8 に。
(set-language-environment "Japanese")
(set-default-coding-systems 'utf-8-unix)
(prefer-coding-system 'utf-8-unix)
参考文献
- [paco.jp » jekyllでトップページにsite.postsの最新記事を表示する] (http://paco.jp/blog/jekyll/ruby/2013/01/01/jekyll%E3%81%A6%E3%82%99%E3%83%88%E3%83%83%E3%83%95%E3%82%9A%E3%83%98%E3%82%9A%E3%83%BC%E3%82%B7%E3%82%99%E3%81%ABsite.posts%E3%81%AE%E6%9C%80%E6%96%B0%E8%A8%98%E4%BA%8B%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B/)
{% endraw %}