textlintで正規表現を使って特定範囲を無視させる方法

textlintで特定範囲を無視するための設定を紹介します。
2022.05.11

どうも。 eetann(えーたん) です。

本記事では半角 [, ] を全角 , に置き換えて表示している部分があります。

DevelopersIO ではシンタックスハイライトを[shell]code[/shell]のように書いています。 独自の記法であるため、Markdownのファイルで下書きをしていると文章校正ツール textlint で無視されずに何らかのルールで指摘されてしまうことが多いです(例:文字数制限)。

そこで、本記事では[shell]code[/shell]の記法を例に、正規表現で特定範囲を無視するtextlintの設定をします。

先にまとめ

textlint-filter-rule-allowlist をインストールし、 textlintの設定ファイルである.textlintrcに無視する範囲を以下のように書きます。

.textlintrc

{
  "filters": {
    "allowlist": {
      "allow": [
        "/^\\[.+\\]$[^]*?^\\[\\/.+\\]$/m"
      ]
    }
  },
  "rules": {
    "preset-ja-technical-writing": true
  }
}

具体例

設定前の状態

今回はルールのプリセットとして textlint-rule-preset-ja-technical-writing を使いました。

以下がtextlintを適用するサンプル(Markdownを想定)です。

textlintを適用する文章

サンプルの文章です。

![hoge](./images/hoge.png)

[サンプルのリンク](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です。

.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 をインストールすると、filtersallowlistに無視する設定を書くことができます。

以下が今回扱う正規表現^\[.+\]$[^]*?^\[\/.+\]$Regexperを使って可視化したものです。

allowlistallowは配列です。 正規表現で指定する場合は通常の文字列と区別するため、/で挟み必要に応じでフラグを指定します。

.textlintrc

{
  "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にします。

.textlintrc

{
  "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形式で書いた例です。 {}""が省けます。

.textlintrc.yaml

filters:
  comments: true
  allowlist:
    allow:
    - /^\[.+\]$[^]*?^\[\/.+\]$/m
rules:
  preset-ja-technical-writing: true

テキストエディタのプラグインで .textlintrc があるディレクトリをルートとしてtextlintを自動で走らせている場合、 拡張子を変えると認識されなくなるため、 別途設定が必要です。注意しましょう。

リンク集

よく開いたページのリンクをまとめておきます。

書いたコードのGitHubのリンクは以下です。