この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
どうも。 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 をインストールすると、filters
のallowlist
に無視する設定を書くことができます。
以下が今回扱う正規表現^\[.+\]$[^]*?^\[\/.+\]$
をRegexperを使って可視化したものです。
allowlist
のallow
は配列です。
正規表現で指定する場合は通常の文字列と区別するため、/
で挟み必要に応じでフラグを指定します。
.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を自動で走らせている場合、
拡張子を変えると認識されなくなるため、
別途設定が必要です。注意しましょう。
リンク集
よく開いたページのリンクをまとめておきます。
- Configuring textlint · textlint
- textlint/textlint-filter-rule-allowlist
- 正規表現 - JavaScript | MDN
- Regexper
- JavaScript正規表現テスター - instant tools
書いたコードのGitHubのリンクは以下です。