Web技術寄りな雑記Blog開発Hackカスタマイズ2019-08-17textlintをてんこ盛りカスタマイズした日本語を静的解析して校正するツールとしてtextlintというものがあります。プログラミング言語の推奨されない記法などを静的解析して警告、修正するLinterという仕組みをMarkdownやTextファイルの日本語にも利用して校正するツールです。今回はこれをゴリゴリにカスタムした話。textlint/textlintGitHubhttps://github.com/以前からtextlintは使っていてある程度カスタムもしていたんですが、どうも上手くできてない部分もあったため本腰を入れて全部ルールを見直してみた、という話です。textlintはそれ自体にはルールを持っておらずエンジンのみです。ルールは好みに応じて追加でインストールする必要があります。今回の方針としてはとりあえずかたっぱしから有用そうなルールをつっこんで、必要ないものや問題のあるものをオフにしていく、てんこもりカスタムをしました。#textlintのインストール方法というか、NPMのライブラリのインストール方法としてはグローバル(端末全体で使うよう)にインストールする方法と、プロジェクトローカルにインストールする方法があります。公式では後者を推奨していますが、僕はあえてのグローバルインストールです。理由としてプロジェクト単位でtextlintを使うような場面があまりないわざわざプロジェクトにインストールしなくてもLintが効いてほしい執筆系でもない限りはルールは個人の好みによるところも大きいちょっとメモ的に書くMarkdownや、そもそもプロジェクトとして管理されてないものにも効かせたい個人の中では一貫してルールは変わることはないということもあってプロジェクトをまたぐようGlobalにインストールしたほうが都合が良いためです。textlintでインストールします。#てんこもりカスタムのためにとりあえずいろんなルールをつっこみます。ルールに関してはtextlintのWikiを見るのが早いでしょう。大まかな方向性としてはプリセット系をぜんぶ入れて、なお足りないものは個別で入れていきます。ちなみに和文特化で英文に関しては今回は考えません。表記揺れから外すものをホワイトリストへコンフリクトしたルールや、複数のルールがバッティングするルールをオフ不必要に強いルールをオフエラーレベルを調整という感じ。textlintをグローバルに入れてるので、ルールも同様にグローバルに入れます。#textlintは.textlintrcファイルで他のリンターと同様に設定ができます。デフォルトが設定されているものがほとんどですが、今回はデフォルト値を参考にしつつ全部のルールに対して指定します。#textlint-filter-rule-whitelistはルールではなくホワイトリスト機能を提供します。これは表記揺れ系を扱うなら入れておいたほうが良いです。いうのもルールは個別にオン/オフが切りかえられますが、textlint-rule-prh経由での表記揺れ対応は個別にオフにできません。--fix)対象なので、ある特定のものだけオフにしようとするならホワイトリストで対応するのが良いです。具体的には、textlint-rule-spellcheck-tech-wordで提供されている、JSer.info用の辞書の「使うべきではない言葉」が落とし穴なのでこれを塞ぎます。これをやっておかないと対象の言葉を使った場合に自動修正をかけるとその文字が「使うべきではない言葉なので修正してください」になってしまいます。「知らない」という単語が対象なのであの日見た花の名前を僕達はまだ知らないという文章だったらあの日見た花の名前を僕達はまだ使うべきではない言葉なので修正してくださいになってしまいます。これは表記揺れのルールの定義があまり良くなく、expectedに使うべきではない言葉なので修正してくださいが指定されています。自動修正でない場合はこれが警告文に表示されるのでわかりやすいのですが、自動修正だと自動でexpectedに指定された文字列に変更されてしまいます。GitHub.GitHubhttps://github.com/なので、このルールが含む言葉を全部ホワイトリストに入れます。〜するほう(が)のルールが個人的によく意図しない動作をしていたので防ぎます。「するほうがいい」みたいな場合はOKなんですが、「する方(かた)はいませんか?」と人の敬称としての「方(かた)」を使った場合も「ほう」に自動修正されてしまうことがあったので潰します。#あとはとりあえず全部のルールを見ていってルールの取捨選択をしていきます。方針としては数値や閾値など細かく設定できるものは必要があれば最適な値を入れる基本は全てのルールを使い、不必要なルールだけをオフルールがバッティングするようであればより有用なほうを選び、それ以外をオフにする誤検出されるようなものはエラーレベルをWarningに落とすのように設定していきます。して出きた僕の設定はこんな感じになりました。