Hugoでtextlintを使ってみる

What’s lint ?

lintというのは「主にC言語のソースコードに対し、コンパイラよりも詳細かつ厳密なチェックを行うプログラムである by wikipedia」で、lintを自然言語に適用した実装がtextlintになるようです
もちろん即戦力で仕事につかう、もしくは御大尽でお金が余ってて仕方ないということであればJust Right!のようなツールを検討するのですが、そこまでではないけれども質を上げることにも取り組みたいと思い立ったので、まずはtextlintで1段だけ高いところの景色を見てみる
やっぱお金で解決しようとなった時にJust Right!を導入すればいい

設定メモ

Node.jsをインストールする

Windows10でtextlintを動作させるには、Node.jsが必要らしいのでNode.jsをインストールする
インストーラはhttps://nodejs.org/ja/にアクセスして、ダウンロードした
ダウンロードサイト
STEP01:
STEP01
STEP02:
STEP02
STEP03:
STEP03
STEP04:
STEP04
STEP05:
STEP05
STEP06:
STEP06
STEP07:
STEP07

PS > node --version
v10.15.0
PS > npm --version
6.4.1

textlintを使えるようにする

PS > cd C:\UserDocument\website\

PS > npm init --yes
Wrote to C:\UserDocument\website\package.json:

{
  "name": "website",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

PS > npm install --save-dev textlint
npm WARN deprecated circular-json@0.3.3: CircularJSON is in maintenance only, flatted is its successor.
npm WARN website@1.0.0 No description
npm WARN website@1.0.0 No repository field.

+ textlint@11.2.1
added 191 packages from 95 contributors and audited 354 packages in 8.628s
found 0 vulnerabilities

textlintはスタイルルールがないと動作しない

技術文書向けのtextlintルールプリセット(textlint-rule-preset-ja-technical-writing)を使えるようにする

PS > npm install --save-dev textlint-rule-preset-ja-technical-writing
npm WARN website@1.0.0 No description
npm WARN website@1.0.0 No repository field.

+ textlint-rule-preset-ja-technical-writing@3.1.0
added 82 packages from 29 contributors and audited 781 packages in 18.758s
found 0 vulnerabilities

PS > ./node_modules/.bin/textlint --init
.textlintrc is created.

PS > cat .\.textlintrc
{
  "filters": {},
  "rules": {
    "preset-ja-technical-writing": true
  }
}

JTF日本語標準スタイルガイド for textlint(textlint-rule-preset-JTF-style)を使えるようにする

『JTF日本語標準スタイルガイド(翻訳用)』は、実務翻訳において和訳時に使用できる日本語表記ガイドラインです。2012年1月30日に初版を公開しました。『JTF日本語標準スタイルガイド』はどなたでも無償で使用できます。日本語の表記のゆらぎを防いで、スムーズに表記を統一するためのガイドラインとして活用してください

PS > npm install --save-dev textlint-rule-preset-jtf-style
npm WARN website@1.0.0 No description
npm WARN website@1.0.0 No repository field.

+ textlint-rule-preset-jtf-style@2.3.2
added 25 packages from 13 contributors and audited 409 packages in 2.278s
found 0 vulnerabilities

.textlintrcに追加したスタイルルールを追記しておく

PS > cat .\.textlintrc
{
  "filters": {},
  "rules": {
    "preset-ja-technical-writing": true,
    "preset-jtf-style": true
  }
}

早速textlintを使ってみた

短めのコンテンツの場合

PS > ./node_modules/.bin/textlint content\post\サイトのリニューアルをはじめました\index.md

C:\UserDocument\website\content\post\サイトのリニューアルをはじめました\index.md
   1:1   error  Line 1 sentence length(124) exceeds the maximum sentence length of 100.
Over 24 characters   preset-ja-technical-writing/sentence-length
  10:1   error  Line 10 sentence length(101) exceeds the maximum sentence length of 100.
Over 1 characters  preset-ja-technical-writing/sentence-length
  10:51  error  弱い表現: "思います" が使われています。                                   preset-ja-technical-writing/ja-no-weak-phrase
  14:51  error  文末が"。"で終わっていません。                                            preset-ja-technical-writing/ja-no-mixed-period

✖ 4 problems (4 errors, 0 warnings)

長めのコンテンツの場合

 PS > ./node_modules/.bin/textlint content\post\退役させたSSL-VPN環境をやっぱりRaspberryPi3を使って復活させる\index.md

C:\UserDocument\website\content\post\退役させたSSL-VPN環境をやっぱりRaspberryPi3を使って復活させる\index.md
    1:1    error    Line 1 sentence length(133) exceeds the maximum sentence length of 100.
Over 33 characters    preset-ja-technical-writing/sentence-length
    5:13   error    文末が"。"で終わっていません。                                             preset-ja-technical-writing/ja-no-mixed-period
    8:39   error    文末が"。"で終わっていません。                                             preset-ja-technical-writing/ja-no-mixed-period
   10:8    error    Disallow to use "?"                                                       preset-ja-technical-writing/no-exclamation-question-mark
   11:8    ✓ error  半角のかっこ()が使用されています。全角のかっこ()を使用してください。     preset-jtf-style/4.3.1.丸かっこ()
   11:12   ✓ error  半角のかっこ()が使用されています。全角のかっこ()を使用してください。     preset-jtf-style/4.3.1.丸かっこ()
   13:37   ✓ error  半角のかっこ()が使用されています。全角のかっこ()を使用してください。     preset-jtf-style/4.3.1.丸かっこ()
   15:14   error    Disallow to use "?"                                                       preset-ja-technical-writing/no-exclamation-question-mark
   18:19   ✓ error  半角のかっこ()が使用されています。全角のかっこ()を使用してください。     preset-jtf-style/4.3.1.丸かっこ()
   18:24   ✓ error  半角のかっこ()が使用されています。全角のかっこ()を使用してください。     preset-jtf-style/4.3.1.丸かっこ()
   20:67   ✓ error  半角のかっこ()が使用されています。全角のかっこ()を使用してください。     preset-jtf-style/4.3.1.丸かっこ()
   20:76   ✓ error  半角のかっこ()が使用されています。全角のかっこ()を使用してください。     preset-jtf-style/4.3.1.丸かっこ()
   21:20   error    一文に二回以上利用されている助詞 "も" がみつかりました。                   preset-ja-technical-writing/no-doubled-joshi
   23:3    ✓ error  原則として、全角文字どうしの間にスペースを入れません。                     preset-jtf-style/3.1.2.全角文字どうし
   24:37   ✓ error  原則として、全角文字と半角文字の間にスペースを入れません。                 preset-jtf-style/3.1.1.全角文字と半角文字の間
   25:1    error    一文に二回以上利用されている助詞 "で" がみつかりました。                   preset-ja-technical-writing/no-doubled-joshi
   25:10   error    文末が"。"で終わっていません。                                             preset-ja-technical-writing/ja-no-mixed-period
   29:35   ✓ error  文末が"。"で終わっていません。末尾に不要なスペースがあります。             preset-ja-technical-writing/ja-no-mixed-period
   52:13   error    文末が"。"で終わっていません。                                             preset-ja-technical-writing/ja-no-mixed-period
   71:17   error    文末が"。"で終わっていません。                                             preset-ja-technical-writing/ja-no-mixed-period
   75:40   error    文末が"。"で終わっていません。                                             preset-ja-technical-writing/ja-no-mixed-period
   86:10   error    文末が"。"で終わっていません。                                             preset-ja-technical-writing/ja-no-mixed-period
   91:16   error    文末が"。"で終わっていません。                                             preset-ja-technical-writing/ja-no-mixed-period
  110:22   error    文末が"。"で終わっていません。                                             preset-ja-technical-writing/ja-no-mixed-period
  127:17   error    文末が"。"で終わっていません。                                             preset-ja-technical-writing/ja-no-mixed-period
  189:1    error    Line 189 sentence length(108) exceeds the maximum sentence length of 100.
Over 8 characters  preset-ja-technical-writing/sentence-length
  189:107  ✓ error  文末が"。"で終わっていません。末尾に不要なスペースがあります。             preset-ja-technical-writing/ja-no-mixed-period
  290:1    error    Line 290 sentence length(133) exceeds the maximum sentence length of 100.
Over 33 characters  preset-ja-technical-writing/sentence-length
  291:107  ✓ error  文末が"。"で終わっていません。末尾に不要なスペースがあります。             preset-ja-technical-writing/ja-no-mixed-period
  312:36   ✓ error  原則として、全角文字と半角文字の間にスペースを入れません。                 preset-jtf-style/3.1.1.全角文字と半角文字の間
  312:40   ✓ error  原則として、全角文字と半角文字の間にスペースを入れません。                 preset-jtf-style/3.1.1.全角文字と半角文字の間
  312:72   ✓ error  文末が"。"で終わっていません。末尾に不要なスペースがあります。             preset-ja-technical-writing/ja-no-mixed-period

✖ 32 problems (32 errors, 0 warnings)
✓ 15 fixable problems.
Try to run: $ textlint --fix [file]

簡単に修正が適用できそうな内容はtextlint --fixコマンドで直してくれるようだ
あとはよきに計らってくれるルールを見つけてくるなり、自分で書くなりすればいい

どうしようもないエラーは除外する(暫定対応)

いずれのページにも表示されている1行目のエラー
1:1 error Line 1 sentence length(124) exceeds the maximum sentence length of 100.
は静的サイトジェネレーターのHugoFront Matterが引っかかってしまっていて、これはどうしようもないので除外する

HugoFront Matterの例

+++
date = "2017-03-11T13:41:00+09:00"
title = "サイトのリニューアルをはじめました"
type = "post"
tags = ["お知らせ"]
aliases = ["/post/site_renew/"]

+++

Markdownで書かれたコンテンツの先頭に書いておく、Hugoのためのパラメータを書いた+++で囲まれたブロック

textlint-filter-rule-whitelistを使って対応してみる

PS > npm install --save-dev textlint-filter-rule-whitelist
npm WARN website@1.0.0 No description
npm WARN website@1.0.0 No repository field.

+ textlint-filter-rule-whitelist@2.0.0
added 20 packages from 21 contributors and audited 885 packages in 5.432s
found 0 vulnerabilities
PS > cat .\.textlintrc
{
  "filters": {
    "whitelist": {
    "allow": [
        "/^\\+{3}[\\s\\S]*?\\+{3}/m"
    ]
  },
  "rules": {
    "preset-ja-technical-writing": true,
    "preset-jtf-style": true
  }
}

きちんと対応できているかを確認する

PS > ./node_modules/.bin/textlint content\post\サイトのリニューアルをはじめました\index.md

C:\UserDocument\website\content\post\サイトのリニューアルをはじめました\index.md
  10:1   error  Line 10 sentence length(101) exceeds the maximum sentence length of 100.
Over 1 characters  preset-ja-technical-writing/sentence-length
  10:51  error  弱い表現: "思います" が使われています。                                   preset-ja-technical-writing/ja-no-weak-phrase
  14:51  error  文末が"。"で終わっていません。                                            preset-ja-technical-writing/ja-no-mixed-period

✖ 3 problems (3 errors, 0 warnings)

HugoFront Matter絡みの1行目のエラーが検知されなくなった