エイプリルフールに被ってしまいましたが、 ClojureでJekyllライクなブログジェネレータを作りました。
misaki / Jekyll inspired static site generator
当ブログはJekyllを使ってGitHub Pages上で運用しているのですが、
jekyll --server
のファイル変更から反映までの遅さ(何か手があるのかもしれないですが)
とClojurianで主にClojureのブログなのにrubyで運用してるのが納得いかなかったので(rubyは好きですが)
作ってみました。
"misaki" という名前は Jekyll が人名なので同じく人の名前にしたかったのと "美しく咲く" というがちょっと綺麗かなぁという軽いのりで付けてます。
あ、でも伊東美咲は好きです。綺麗なお姉さん好きです。
サンプルの実行†
以下のコマンドでGitHubからとってこれます。
$ git clone git://github.com/liquidz/misaki.git $ cd misaki $ lein run sample
ローカルサーバが起動するので http://localhost:8080/ にアクセスしましょう。
なおサンプルと同じものをデモページとしてこちらにも公開しています。
自分のブログを作る†
1からファイルを用意しても良いのですが、面倒だと思うのでサンプルをコピーして ローカルサーバを起動させましょう。
$ cp -pir sample your_blog $ lein run your_blog
ローカルサーバの起動中は watchtower でテンプレートファイルを監視しているので変更すれば自動的にHTMLへのコンパイルが走ります。
デフォルトではコピーしたディレクトリ配下の "_template" 内にテンプレート(.clj)、ポストファイル(_post)、レイアウトファイル(_layout)が 配置されているので、そのあたりを編集しつつブラウザで確認という流れで作っていくことになります。
$ vi your_blog/_template/index.html.clj
なおテンプレートなどディレクトリ構成の詳細はドキュメントの Directory Structure を参照してください。
ただドキュメントよりサンプルソースを見たほうが早いかもしれないです。
テンプレートサンプル†
テンプレートはclojureのコードになっています。HTMLへのコンパイルには hiccup を使っているのでhiccupを使ったことのある方であればすんなり入れるかなと思っています。
;; テンプレートオプション ;; ---- ;; レイアウト定義 ; @layout default ;; テンプレートタイトル ; @title sample tempalte ;; Clojureコードなので関数定義できます (defn h1 [s] [:h1 s]) ;; site変数でテンプレートオプションにアクセスできます (h1 (:title site)) [:p "Welcome to misaki world!"] ;; コードハイライト #-CLJ (println "google-code-prettify highlight!") CLJ
テンプレートではコメント内に以下のフォーマットでテンプレートオプションを定義できます。
; @key value
テンプレートオプションではそのテンプレートに適用するレイアウトを指定したり、 テンプレート自体のタイトルを定義することができます。
レイアウトはテンプレート同様にClojureコードなので オプションや関数を同様に定義することができます。 共通して使う定義や関数についてはレイアウト側で定義しておくと便利かもしれないです。
レイアウトの詳細についてはドキュメントの Edit Template の "Layout file" の項目を参照してください。
なおテンプレートオプションへのアクセスについては
上記サンプルにもある通り site
といった特別な変数が利用できます。
site の内容†
site ;=> {:title "sample template" ; :date org.joda.time.DateTime ;更新日 ; :posts [post1 post2 ... postN]
:posts
の内容については後述します。
エントリーの追加†
デフォルトでは _template/_posts/ 配下にファイルを作成することで ブログのエントリーを追加することができます。
エントリーファイルはJekyll同様にファイル名のフォーマットが以下のように決まっています。
YYYY-MM-DD-タイトル.html.clj
このファイル名が /YYYY/MM/タイトル.html というURLに対応します。
(:posts site) の内容†
(first (:posts site)) ;=> {:title "post title" ; :url "post url" ; :date org.joda.time.DateTime ;ファイル名の日付 ; :file java.io.File ; エントリーファイル ; :lazy-content エントリーの内容(clojure.lang.Delay) }
なおテンプレート編集やレイアウトに関する詳細はドキュメントの Edit Template を参照してください。
出力されたHTML†
今回の例でいえば "your_blog/" ディレクトリ配下がドキュメントルートになり コンパイルされたHTMLはすべて your_blog 配下に出力されます。
なのでGitHub Pagesへ反映する場合にはこのディレクトリ毎pushしてしまえば良いのですが、 その場合、テンプレートファイルも一緒にpushされます。
これは私自信がテンプレートとHTMLを別レポジトリで管理したくないから という理由でこのようなディレクトリ構成にしているのですが、 もしテンプレートとHTMLを別々に管理したい場合には _config.clj でmisaki内で扱うディレクトリのパスを扱っており、 それを変更することで実現可能です。
ドキュメント†
本エントリではあくまで紹介という体で全部の機能は紹介していませんし、 紹介している機能でも詳細を省いたりしています。
少しでも興味をもっていただけたのならば、GitHubの Wiki にまとめていますのでご参照ください。
なお英文はかなり適当です。。
最後に†
まだアルファバージョンということでとりあえず動くかな?というレベルです。 今後の流れとしてはまずはこのブログ自体をJekyllからmisakiに移行させて 足りない機能などあれば追加していきたいと思っています。
またClojureScriptにも対応させてJSを置き換えたいですし、 CSSまわりで良いライブラリがあればそれを導入して、 前回のエントリのタイトルじゃないですが、全部Clojureでブログ運用 とか出来ても良いのかなぁと思っています。