pelicanのMarkdownファイル自動生成ツール

Posted by one_meets_seven on 日 19 2月 2017

pelicanの記事半自動生成ツール

  • pelicanでブログ記事を生成するときの手間を省けたかった
  • 対話式でメタ情報を入力してmdファイルを生成してくれるCUIツール
  • pythonで書いた(ていうかpelican-quickstartモロパクリした)

ことのいきさつ

このサイト(静的WebジェネレータPelican製)で新しく記事を書くとき,
Markdownファイルの先頭に何個かメタ情報を書く必要がある.

Title: ブログタイトル
Date: 2017-02-19
Tags: python, CUI
Slug: works/170219hoeghoge
Author: one_meets_seven
Summary: 要約

# タイトル

(ここでCategoryがないのはプラグインのcategory_metaによるもの。後述)
このメタ情報を毎回mdファイルを新規作成するたびに書くのがめんどくさい.
Dateとか直書きダサいし超めんどくさい,日付なんだから自動化したい.
もうちょっと楽しく書きたい.

せっかくなのでCUIツールをつくって自動化しよう.

インスパイア

理想像はすぐに思い浮かんだ.
pelicanのプロジェクトディレクトリを初めて構築する際の雛形ジェネレータコマンド pelican-quickstart だった.

pelican-quickstart は対話式による標準入力で設定を決めていく感じだった.
あれならある程度記入必須なタイトルやカテゴリのメタ情報の設定に向いている.

というわけでソースコードめっちゃパクった.
askメソッドとか丸写ししたレベル.

テンプレート

なにがめんどくさいってTitle:とかDate:とかキー名も毎回いちいち書く必要がある.
不変だからテンプレート化してしまう.

template_post.md.in

Title: $title
Date: $date
Tags: $tags
Slug: $slug
Author: one_meets_seven
Summary: $summary
Status: $status

# $title

ツール使用例

早速だけど使ってみたらこんな感じ.
(ツール名はpost_generator.py)

post_generator

  1. ブログのタイトルを聞かれる.
  2. ブログのカテゴリを聞かれる.(この場合は英語記述のほう(次節参照))
  3. タグを聞かれる.
  4. URLの後ろを聞かれる.(この例だと作成されるブログ記事のURLはworks/170219hoge_development.htmlというURLになる)
  5. ブログの要約を聞かれる.
  6. 非公開(下書き)か公開か?Yesでdraft(非公開)状態, Noでpublished(公開)状態となる.

これでcontent/works/170219hoge_development.mdというファイルが生成される.

post_generated

メタ情報がテンプレートファイルに埋め込まれて自動生成されている.

Categoryについて

PelicanはCategoryを日本語文字で登録すると,
そのカテゴリのディレクトリ名は意味不明なアルファベットに変換される.
そこでcategory_metaというプラグインを導入

例えば
機械学習という名前のカテゴリ名を作りたい.
実際に記事作成時にCategory: 機械学習とすると
ぐちゃぐちゃなURLのカテゴリ用ページが作られてしまう.

URLをmachine_learningにしてサイトで表示されるカテゴリ名を機械学習にする場合

まずプラグインの使用をONにする.
pelicanconf.pyPLUGINScategory_metaを追加するだけ.

# 僕のいまのpelicanconf.py環境です
PLUGIN_PATHS = ['pelican-plugins']
PLUGINS = ['liquid_tags.notebook', 'render_math', 'category_meta']

contentディレクトリ内にmachine_learningディレクトリを作成し,
index.mdというファイルを用意する.

content/machine_learning/index.md

Title: 機械学習
Date: 2017-01-01

Dateもないとエラーを吐くので適当に記入
これでcontent/machine_learningディレクトリ内に記事を記入していけば
いい
はずだが

実は

CRITICAL: AttributeError: can't set attribute

というエラーがでる.
GitHubのIssueにも上がってるがバグっぽい
https://github.com/getpelican/pelican-plugins/issues/855

いまのところpluginのソースcategory_meta/category_meta.pyの73行を以下のように変更するしかないっぽい

    category.slug = slug

を,

    category._slug = slug

に変更.
(前アンダースコアを呼び出し。。)

まとめ

pelicanの記事用markdownファイルの自動生成CUIツールをつくった.
作ってから気づいたけどこんなプラグインとか既にありそうだと思った.

ソースコードです.
https://gist.github.com/kazukousen/0423d3681538cf8299a23c1591247bab

tags: python, CUI


Comments !