日本語などの文章を校正できるルールをもっているLintツールであるtextlint v12をリリースしました。 Markdownプラグインのアップデートと各パッケージのバージョン統一が主な変更となります。

リリースノートは次のページにも書いているので、興味がある人は見てください。

簡単に変更のサマリを書いておきます。

textlint利用者向けの変更点

次のコマンドでtextlint 12へアップデートできます。

npm install textlint@12
# or
yarn install textlint@12

textlintは、文章の構文を認識してLintすることで誤検知を減らしています。 たとえば、MarkdownのCodeBlockの中のコードを単純にスペルチェックしてしまうと赤線だらけになってしまいます。 textlintの各ルールには、CodeBlockの中はチェックしないといったように、各ルールごとに文章のどの構文(リンクやテキスト、リスト、コードなど)を対象にチェックするかといった実装を含んでいます。

この構文を認識するために、textlintでは各ファイルフォーマットごとにプラグインが用意してあって、ビルトインではテキストとMarkdownが含まれています。 外部のプラグインとしてHTMLRe:VIEWLaTeX2などがあります。

プラグインの一覧は次のページにまとまっています。

textlint 12ではこのビルトインで含まれていているMarkdownプラグインが大きく変更されています。 内部的に使っているMarkdownのパーサが大きく変わっています。

このアップデートで、今まで上手く認識できていなかった箇所も認識されるようになる場合があります。 その場合は、文章を変更してなくても新しいエラーが見つかるようになるかもしれません。(メジャーアップデートの主な理由です)

また、textlint 12からNode.js 12以上が必須となっています。 Node.js 10以下はサポートが終了しているので、Node.js 12、14、16などへアップデートしてください。

textlintのルールを作っている人向けの変更点

textlint-testertextlint-scriptsがアップデートされて、どちらも12となっています。

create-textlint-ruleのコマンド経由でルールを作ってる人は次のテンプレートが使われていると思います。

この場合は、次のコマンドでtextlint-testertextlint-scriptsをそれぞれアップデートしてください。

npm install textlint-scripts@12 textlint-tester@12 --save-dev
# or
yarn install textlint-scripts@12 textlint-tester@12 --dev

基本的に機能的な変更はありませんが、textlint-tester@12では、ES Modulesの export default でエクスポートするようになりました。 そのため、使う側も import TextLintTester from "textlint-tester" でインポートする必要があります。

次のように require で書いている場合は、importに変更してみてください。

- const TextLintTester = require("textlint-tester");
+ import TextLintTester from "textlint-tester";

実際の変更例は、次のPRが参考になると思います。

何かtextlintのルールを書いてみたい!という人がいたら、次のIssueにルールのアイデアが溜まっているので実装してみると良いかもしれません。 Issueやtextlint-ja/textlint-ja - Gitterとかで相談してみてください。

先ほども書いていたように、MarkdownのパーサがアップデートされたことでTxtASTのvalueが微妙に変わっていることがあります。

基本的にはあまり影響ないはずですが、CommonMarkの仕様で、パラグラフの前後にスペースがある場合に、 Strvalueにはそのスペースが含まれなくなっています。

なので、文章の先頭や末尾のスペースを Str nodeで扱う場合には工夫が必要になります。(親であるParagraph nodeの方を見るなどが必要)

Markdown AST

また、このアップデートにあわせて AST explorer もアップデートしています。 URLで保存もできるようになってるので、プラグイン周りのバグレポートなどにも利用出来ます。

textlint 12では、プラグインが生成するASTがTxtAST Interfaceとしてvalidかを判定する@textlint/ast-testerもアップデートしています。 エラーメッセージがわかりやすくなっているので、新しいファイルフォーマットのプラグインを作る場合には利用してください。

使われているプラグイン周りは、メンテナは複数人いた方がいいので関連するIssueをいくつか立てています。

textlintの日本語のGitterでも話したりしているので、プラグインのメンテナンスに興味がある人は来てみてください。

基本的には textlint orgとかに移管して複数人でメンテナンスできる状態にするのが健全なのかなと思っています。

内部的な変更点

textlint/textlint: The pluggable natural language linter for text and markdown.はmonorepoですが、今まで各パッケージのバージョンはIndependent(それぞれバラバラ)にしていました。

一つのプロダクトを扱うmonorepoでバージョンがバラバラだとやっぱりわかりにくいので、textlint 12ですべてのパッケージのバージョンを12.0.0へと統一しました。

Breaking Changes Package Previous version Current version
textlint 11.9.1 12.0.0
textlint-tester 5.3.5 12.0.0
textlint-scripts 3.0.0 12.0.0
  @textlint/ast-node-types 4.4.3 12.0.0
  @textlint/ast-traverse 2.3.5 12.0.0
  @textlint/ast-tester 2.3.5 12.0.0
  @textlint/feature-flag 3.3.5 12.0.0
  @textlint/fixer-formatter 3.3.5 12.0.0
@textlint/kernel 3.4.5 12.0.0
  @textlint/linter-formatter 3.3.5 12.0.0
  @textlint/module-interop 1.2.5 12.0.0
@textlint/textlint-plugin-markdown 5.3.5 12.0.0
  @textlint/textlint-plugin-text 4.3.5 12.0.0
@textlint/types 1.5.5 12.0.0
@textlint/utils 1.2.5 12.0.0

この過程でtextlint-scriptsもmonorepoへ追加しました。

textlint editorのベータリリース

ブラウザ拡張としてtextlintを任意のサイトで動かせる@textlint/editorをベータリリースしています。

textlint editorの目的は次の記事やスライドで話しています。

textlint editorはテキストエリア上で赤線を出して修正したりするWordとかgrammarlyみたいなものです。 各人のtextlintの設定を使えるようにしているので、カスタマイズ性は維持しています。

CIとかコマンドラインで継続的に回してチェックとして使うtextlintと違って、 エディタなら必ずエラーを直さなくても良くて無視するという選択もある気がします。 そのため、日本語向けみたいな安易なプリセットを用意しておくのが良いのかなとか思ったりしています。

また、ベータなので@textlint/editorにバグレポートやドキュメントのPRとか待っています。

あとブラウザ拡張として動くということは、普通にtextlintがブラウザで動くということです。 textchecker-elementという汎用的なtextareaにオーバーレイする仕組みと、@textlint/script-compilerというtextlintと設定をWeb Workersとしてコンパイルするツールを作っています。

まだAPIとかは安定してないので変わると思いますが、普通にウェブサービスとかにもtextlintを簡単に組み込んだりできるようになる気がするので、 この辺どういうものがあるといいとかのアイデアをください。

Thanks to Support!

最近、VELC(ヴェルク)さんがOpen Source Sponsorになってくれたりしました。

他にも70名以上の人がGitHub Sponsorsになってくれています。 あらためてありがとうございます!

自分のGitHub Sponsorsのページは https://github.com/sponsors/azu です。 興味がある人は見てください。