理系学生日記

おまえはいつまで学生気分なのか

blogsync と textlint ではじめる、ブログエントリの文書校正

はてなで Blog を書くようにしてから随分になるんですが、ようやく重い腰をあげ、Blogsync と textlint で基本的な文書構成ができる仕組みを立ち上げてみました。

$ make draft

するとエントリが下書きできるようになり、

$ make lint

すると文書構成が行われて、

$ make release

すると、Blog が投稿されるようになっています。

Blogsync

文書校正するためには、エントリの内容をローカルに配置する必要がありますが、このためにはやっぱり blogsync を使っています。

v0.9.1 で omit_domain の対応がはいってから、特にディレクトリがすっきりしました。

草稿を書く

草稿を書くのは、blogsync post --draft を使っています。

このコマンドは標準入力からブログエントリの内容を受け取り、それをはてなブログに「下書き」状態で保存するとともにローカルにも配置する、ということをしてくれます。 ぼくはエントリをすぐに書き出す方なので、Makefile に以下のターゲットを指定しています。

draft:
    echo | blogsync post --draft kiririmode.hatenablog.jp 2>&1 \
    | grep store \
    | awk '{print $$3}' \
    | xargs -L1 emacsclient

最初の行で空の下書きエントリをはてなブログにアップロードし、2・3 行目でそのローカル上のファイルパスを特定し、 それを emacsclient に送り込むということをしています。

これにより、make draft を叩くと以下の内容の Emacs バッファが開き、エントリ作成を開始できます。

---
Title:Date: 2018-08-20T10:16:54+09:00
URL: https://kiririmode.hatenablog.jp/entry/20180820/1534727814
EditURL: (snip)
Draft: true
---

文書を校正する

文書校正には、textlint を使っています。

textlint の何が良いかというと、ぼくがはてな Blog を書くフォーマットである Markdown を直接校正できるってことにあります。 どうも AST にして解析してくれるっぽくて、

  • [textlint-rule-preset-japanese](https://github.com/textlint-ja/textlint-rule-preset-japanese)

というような Markdown 特有の記述に特段文句を言わないのも良いです。

細かくルールを取捨選択するのがちょっと大変かなと思ったので、

の 2 つをプリセットとして使っています。

これらを以下のような .textlintrc で指定し、プロジェクトのディレクトリに配置して textlint すれば、文書校正してくれるかんじになります。

{
    "rules": {
        "preset-japanese": true,
        "preset-jtf-style": {
            "3.1.1.全角文字と半角文字の間": false,
            "4.3.1.丸かっこ()": false
        }
    }
}

make lint を打つと、以下のように文書校正がはじまります。

$ make lint
find entry -newer blogged-time -name \*.md -print0 \
        | xargs --no-run-if-empty -0 grep -L ignore-lint  \
        | xargs --no-run-if-empty npm run lint

> hatenablog@1.0.0 lint /Users/kiririmode/hatenablog
> textlint -f pretty-error "entry/20180819/1534634594.md" "entry/20180820/1534727814.md"

preset-japanese/max-ten: 一つの文で"、"3つ以上使用しています
/Users/kiririmode/hatenablog/entry/20180820/1534727814.md:58:57
                                                                                                                      v
    57.
    58. 最初の行で、空の下書きエントリをはてなブログにアップロードし、23 行目でそのローカル上のファイルパスを特定し、
    59. それを `emacsclient` に送り込む、ということをしています。

Makefile のターゲットは、こんなかんじになっています。

lint:
    find entry -newer blogged-time -name \*.md -print0 \
    | xargs --no-run-if-empty -0 egrep -L '<[[:space:]]*ignore-lint[[:space:]]*>'  \
    | xargs --no-run-if-empty npm run lint

まず、blogged-time というファイルの mtime は最新の Blog 投稿日時になっています。 find でそれ以降に変更 or 新規作成されたエントリを抽出し、そのなかで ignore-lint というメッセージを含まないエントリを対象に lint をかけます。

このあたりは、以前エントリに書きました。

あとは、文句言われた内容に合わせて修正っていったかんじ。

エントリ投稿

release: lint
    find entry -newer blogged-time -name \*.md -print0 \
    | xargs --no-run-if-empty -0 -L 1 blogsync push
    touch -t $(shell date +%Y%m%d%H%M.%S) blogged-time

エントリ投稿はこんなかんじで、lint かけたあとで、投稿する形になっています。 成功したら、touchblogged-time の mtime を変更します。

文書校正を運用しはじめての感想

自分の文書の癖に明示的に気付けるのがすごく大きかったです。 ぼくはどうも一文が長くなりがちで、句点も多用しがちだったので、そのあたりを修正しないとエントリ投稿ができなくなりました。 あとは、同じ助詞が 1 文に複数あるとか、ケアレスミスに気付けるのも良い。 機械に任せることができると楽で良いです。