
textlintで正規表現を使って特定範囲を無視させる方法
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
どうも。 eetann(えーたん) です。
本記事では半角 [, ] を全角 [, ] に置き換えて表示している部分があります。
DevelopersIO ではシンタックスハイライトを[shell]code[/shell]のように書いています。
独自の記法であるため、Markdownのファイルで下書きをしていると文章校正ツール textlint で無視されずに何らかのルールで指摘されてしまうことが多いです(例:文字数制限)。
そこで、本記事では[shell]code[/shell]の記法を例に、正規表現で特定範囲を無視するtextlintの設定をします。
先にまとめ
textlint-filter-rule-allowlist をインストールし、
textlintの設定ファイルである.textlintrcに無視する範囲を以下のように書きます。
{
"filters": {
"allowlist": {
"allow": [
"/^\\[.+\\]$[^]*?^\\[\\/.+\\]$/m"
]
}
},
"rules": {
"preset-ja-technical-writing": true
}
}
具体例
設定前の状態
今回はルールのプリセットとして textlint-rule-preset-ja-technical-writing を使いました。
以下がtextlintを適用するサンプル(Markdownを想定)です。
サンプルの文章です。

[サンプルのリンク](https://dev.classmethod.jp/author/eetann) です。
[text]
シンタックスハイライトの中です
[/text]
[text title="README.md"]
タイトル付きです。
[/text]
[text firstline="2,5-7"]
2行目、5から7行目をハイライトします。
./
|-- hoge.txt
`-- foo
|-- bar.md
|-- dam.txt
|-- index.html
|-- lalala.ts
`-- momo.ts
[/text]
[サンプルのリンク2](https://dev.classmethod.jp/author/eetann) です。
以下が無視する範囲の設定前の.textlintrcです。
{
"rules": {
"preset-ja-technical-writing": true
}
}
[text]code[/text] の範囲を無視する設定をしてないため、以下のように怒られます。
- 文末が"。"で終わっていない
- 100文字を超えている

正規表現で指定する例
上記サンプルの[text]〜[/text]、[text title="README.md"]〜[/text]、[text firstline="2,5-7"]〜[/text]を無視できるようにします。
以下の画像の黄色でハイライトされている3箇所です。

textlint-filter-rule-allowlist をインストールすると、filtersのallowlistに無視する設定を書くことができます。
以下が今回扱う正規表現^\[.+\]$[^]*?^\[\/.+\]$をRegexperを使って可視化したものです。

allowlistのallowは配列です。
正規表現で指定する場合は通常の文字列と区別するため、/で挟み必要に応じでフラグを指定します。
{
"filters": {
"allowlist": {
"allow": [
"/^\\[.+\\]$[^]*?^\\[\\/.+\\]$/m"
]
}
},
"rules": {
"preset-ja-technical-writing": true
}
}
textlint-filter-rule-allowlistは内部で regexp-string-matcher(さらに to-regex)を使っています。そのため、jsonの文字列ではRegExpの形式で書きます。
たとえば、[を文字列として扱いたい場合は\[ではなく\\[のようにエスケープします。
regexp-string-matcherでは、フラグgがデフォルトで付与されています。
今回はシンタックスハイライト内のソースコードを書く部分が複数行に渡る(=改行を含む)ため、フラグmも使います。
フラグmを使う場合、改行を含む任意の一文字は.ではなく[^]にします。
参考:
一時的ならコメントで挟む
正規表現で設定ファイルに指定するのではなく、一時的に無効にしたい箇所はtextlint-filter-rule-commentsをインストールし、コメントで挟めば可能です。
.textlintrcのfiltersのcommentsをtrueにします。
{
"filters": {
"comments": true,
"allowlist": {
"allow": [
"/^\\[.+\\]$[^]*?^\\[\\/.+\\]$/m"
]
}
},
"rules": {
"preset-ja-technical-writing": true
}
}
以下のようにtextlint-disableとtextlint-enableのコメントアウトと改行で挟みます。
<!-- textlint-disable --> これはとても長い文章の例で、 長くするため適当な文章にしており、 textlintに長いですと注意されますが、 無視したい場合はtextlintの設定ファイル`.textlintrc`にて設定を変えて コメントアウトで挟めば可能です。 <!-- textlint-enable -->
参考:
その他
.textlintrcはYAMLでも書ける
Configuring textlintを眺めていて気がついたのですが、
.textlintrcはJSONだけではなくYAMLやJavaScriptで書けるようです。
また、拡張子も.textlintrc.yamlなどに変えても読み込めるようです。
以下、YAML形式で書いた例です。 {}や""が省けます。
filters:
comments: true
allowlist:
allow:
- /^\[.+\]$[^]*?^\[\/.+\]$/m
rules:
preset-ja-technical-writing: true
テキストエディタのプラグインで .textlintrc があるディレクトリをルートとしてtextlintを自動で走らせている場合、
拡張子を変えると認識されなくなるため、
別途設定が必要です。注意しましょう。
リンク集
よく開いたページのリンクをまとめておきます。
- Configuring textlint · textlint
- textlint/textlint-filter-rule-allowlist
- 正規表現 - JavaScript | MDN
- Regexper
- JavaScript正規表現テスター - instant tools
書いたコードのGitHubのリンクは以下です。







