PelicanのMakefileを書き換えて便利機能を追加する

スポンサード リンク

Pelicanはmakeでブログを作っていく。最初からある機能はシンプルなもので,Tinkererのように記事の生成をする機能はない。そこで,自分で Makefile を書き換えて記事の管理機能を作ることにした。

ちなみに,以前の記事: Pelicanで複数のサイトを生成・管理する でも Makefile を編集してマルチサイト機能を追加している。今回は,マルチサイトを前提に機能を追加していくことにしよう。

新しい記事を書く $ make new

make edit で新しい記事を書けるようにしよう。仕様は

  • make edit f=hoge.rst でファイル名を指定する
  • ファイル名の指定がない場合は,現在のUNIXTIMEをファイル名とする。e.g. 1423890327.rst
  • 環境変数 EDITOR にあるエディタで開く。環境変数がないならデフォルトはvimを使う
  • ファイルは content/2015-02/hoge.rst という形式で,現在日時から自動的に配置する

とする。これを実現するには次のように Makefile に記述すればいい。なお, $(PREFIX)はマルチサイト用の変数 だ。これは Pelicanで複数のサイトを生成・管理する で追加した。

EDITOR?=vim
ifdef f
    NEWFILE=$(f)
endif

new:
    test -e $(PREFIX)_content/`date +%Y-%m` || mkdir $(PREFIX)_content/`date +%Y-%m`
ifdef NEWFILE
    $(EDITOR) "$(PREFIX)_content/`date +%Y-%m`/$(NEWFILE)"
else
    $(EDITOR) "$(PREFIX)_content/`date +%Y-%m`/`date +%s`.rst"
endif

既存の記事を編集する $ make edit

make edit で既存の記事を楽に探して編集できるようにしよう。仕様は

  • content以下の *.rst*.md を更新日時の新しい方から一覧表示する
  • mooz/percol で選択する
  • make edit q=hoge でpercolにクエリーを渡す
  • 更新日時でも絞り込めるように,日時の情報もpercolに渡す
  • [未実装] 記事のタイトルでも絞り込める
  • [未実装] :status: draft な記事を絞り込める

とする。 Makefile は次のようになる。

EDITOR?=vim
ifdef q
    QUERY=$(q)
endif

edit:
    which percol
ifdef QUERY
    $(EDITOR) "`find ./$(PREFIX)_content -regex '.*\.\(rst\|md\)' -print0 |xargs -0 ls -lat --time-style=+"%Y/%m/%d %H:%M:%S" | awk '{for(i=6;i<NF;i++){printf("%s%s",$$i,OFS=" ")}print $$NF}' | percol --query=$(QUERY) | awk '{for(i=3;i<NF;i++){printf("%s%s",$$i,OFS=" ")}print $$NF}' `"
else
    $(EDITOR) "`find ./$(PREFIX)_content -regex '.*\.\(rst\|md\)' -print0 |xargs -0 ls -lat --time-style=+"%Y/%m/%d %H:%M:%S" | awk '{for(i=6;i<NF;i++){printf("%s%s",$$i,OFS=" ")}print $$NF}' | percol | awk '{for(i=3;i<NF;i++){printf("%s%s",$$i,OFS=" ")}print $$NF}' `"
endif

ワンライナーを無理につかったから読みづらくなってしまったな。そのうちpythonで書き直す予定。

ちなみに編集したいファイル名がわかりきっている場合は,いちいちpercolを通すのも面倒なので

$ make new f=hoge.rst

で対処できる。

既存の記事を削除する $ make del

make del で既存の記事を探して削除できるようにしよう。仕様は

  • content以下の *.rst*.mdmooz/percol で選択できるようにする
  • make del q=hoge でpercolにクエリーを渡す
  • 削除するまえにユーザーに確認する
ifdef q
    QUERY=$(q)
endif

del:
    which percol
ifdef QUERY
    rm -i "`find ./$(PREFIX)_content -regex '.*\.\(rst\|md\)' | percol --query='$(QUERY)'`"
else
    rm -i "`find ./$(PREFIX)_content -regex '.*\.\(rst\|md\)' | percol`"
endif

自動的に make publish し続ける $ make republish

make regenerate ではファイル更新を監視して自動的に make html し続けてくれる。同じように make publish し続けるルール republish を書いてみた。

republish:
    $(PELICAN) -r $(INPUTDIR) -o $(OUTPUTDIR) -s $(PUBLISHCONF) --cache-path $(CACHEDIR) $(PELICANOPTS)

rsync_uploadするとgitでpushする

rsyncで本番サーバーにコピーするということは,編集が一区切りついたということ。このタイミングで自動的にgitでpushしておくべきだろう。ということで,書いてみた。

rsync_upload: publish
    rsync -e "ssh -p $(SSH_PORT) -i $(SSH_KEY)" -P -rvzc --delete $(OUTPUTDIR)/ $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR) --cvs-exclude
    git add -A
    git commit -m 'hook rcyns_upload'
    git push origin master

わすれずに.PHONYに追記しておこう

makeのルールを追加したら, .PHONY の追記もお忘れなく。

.PHONY: html help clean regenerate serve devserver publish ssh_upload rsync_upload dropbox_upload ftp_upload s3_upload cf_upload github edit cotent republish

Comments !

social