はなゐろぐ

主に技術関係の覚え書きです。

Markdownで書くブログ記事をtextlintで校正する

2020年10月29日

普段ESLintやstylelintでソースコードをLintすることはありますが、文章のLintはしたことがなかったので、試してみました。

textlintを導入する

まず、textlint本体とルールプリセットをインストールし、設定ファイルを作成します。JS形式なのは私の好みです。

$ npm i -D textlint textlint-rule-preset-ja-spacing textlint-rule-preset-ja-technical-writing textlint-rule-spellcheck-tech-word
$ touch .textlintrc.js

設定ファイルはこんな感じ。preset-ja-technical-writingに関してはデフォルトよりゆるめにしています。

.textlintrc.js
module.exports = {
  rules: {
    // Youtube→YouTubeなど、技術系用語のスペルチェック
    "spellcheck-tech-word": true,
    // 技術系記事を書くためのルール
    "preset-ja-technical-writing": {
      // 一文あたりの最大文字数
      "sentence-length": {
        max: 120,
      },
      // 漢字が連続してよい最大文字数
      "max-kanji-continuous-len": {
        max: 8,
      },
      // 全角の「!?」を許容する
      "no-exclamation-question-mark": {
        // allow to use !
        allowHalfWidthExclamation: false,
        // allow to use !
        allowFullWidthExclamation: true,
        // allow to use ?
        allowHalfWidthQuestion: false,
        // allow to use ?
        allowFullWidthQuestion: true,
      },
    },
    // スペース関連のルール
    "preset-ja-spacing": true,
  },
};

コマンドを叩いてみます。私はHexoを使っているので、パスは下記のようになります。

$ npx textlint source/**/*.md

   11:17 error  Youtube => YouTube                     spellcheck-tech-word
   16:92  error    一つの文で""を3つ以上使用しています  ja-technical-writing/max-ten
   30:2 error  %o => %o                              spellcheck-tech-word
   30:65 error  %} => %}                              spellcheck-tech-word
   32:5 error  Youtube => YouTube                     spellcheck-tech-word
   37:2 error  %o => %o                              spellcheck-tech-word
   37:54 error  %} => %}                              spellcheck-tech-word
   44:2 error  %o => %o                              spellcheck-tech-word
   44:37 error  %} => %}                              spellcheck-tech-word
   51:2 error  %o => %o                              spellcheck-tech-word
   51:66 error  %} => %}                              spellcheck-tech-word
   58:2 error  %o => %o                              spellcheck-tech-word
   58:50 error  %} => %}                              spellcheck-tech-word
   65:2 error  %o => %o                              spellcheck-tech-word
   65:60 error  %} => %}                              spellcheck-tech-word
   72:2 error  %o => %o                              spellcheck-tech-word
   72:45 error  %} => %}                              spellcheck-tech-word
   79:2 error  %a => %a                              spellcheck-tech-word
  100:27  error    "ほど" が連続して2回使われています。   ja-technical-writing/ja-no-successive-word
  (...後略)

大量にエラーが出ました。「✓」がついたものは--fixオプションで自動的に修正できます。右側に表示されているのが引っかかったルールです。これは許容したい、というものがあれば設定ファイルに追記します。私の場合はHEXOの独自記法が引っかかったので、これを許容するようにルールを変えてみます。

$ npm i -D textlint-filter-rule-allowlist

プラグインをインストールできたら、設定ファイルに下記のように追記します。

.textlintrc.js
module.exports = {
  // 前略
  filters: {
    allowlist: {
      allow: [
        // HEXOの独自記法
        "/\\{%\\w+\\s.+\\s%\\}/",
      ],
    },
  },
};

正規表現で該当箇所を指定すると、エラーが出なくなります。

VSCodeと連携する

vscode-textlintをインストールします。私はtextlint.autoFixOnSaveをオンにして、保存時にfixも走るようにしました。

私はVSCodeにPrettierを入れて保存時に自動修正が走るようにしているのですが、これがpreset-ja-spacingの「英数字と日本語の間にスペースを開けない」とバッティングしてしまいました。PrettierリポジトリのIssueにもちょくちょく上がっているようなのですが、なかなか対応されていないようです。幸いMarkdownにおいてはPrettierがないと困るほどではないので、settings.jsonに下記を追記して無効化しました。

settings.json
"prettier.disableLanguages": ["markdown"]

とりあえずこれでしばらく運用してみます。まずは更新ペースを上げなくては…。