まくろぐ

textlint で表記揺れをチェックする (proofread-helper, prh)

更新:
作成:

prh と textlint-rule-prh

テキストファイルの表記揺れをチェックする Node.js 製ツールに、proofread-helper (prh) というものがあります。 これを使うと、例えば、テキストファイル内の javascript という文字列を JavaScript に自動的に修正できたりします(大文字・小文字の構成)。

textlint の作者の azu さんが、この prh を textlint から使えるようにするルール定義 textlint-rule-prh を作成してくれています。 prh を直接使うよりも、Markdown ファイルの構文をうまく扱ってくれるみたいです(リンク内のテキストは対象外にするなど)。

インストール

ルールのインストール

textlint 用のルールモジュールである textlint-rule-prh は、次のようにインストールします(textlint 自体はインストール済みであるとします)。 proofread-helper を別途インストールする必要はありません。

$ npm install --save-dev textlint-rule-prh

設定ファイルの作成

proofread-helper (prh) の設定ファイル(表記揺れチェックルール)は、下記のような感じで Yaml ファイルで作成します。

rules.yml
version: 1
rules:
  # 大文字小文字全角半角の統一
  - expected: JavaScript
  - expected: jQuery

textlint の設定ファイルで textlint-rule-prh を有効にし、上記のルールファイルのパスを指定します。

.textlintrc
{
  "rules": {
    "prh": {
      "rulePaths": [
        "./rules.yml"
      ]
    }
  }
}

実行

あとは、textlint を実行すれば、表記揺れを検出してくれます。

$ textlint "content/**/*.md"

/Users/maku/blog/content/page1.md
  175:1  ✓ error  jquery => jQuery  prh

/Users/maku/blog/content/page2.md
  237:1  ✓ error  javascript => JavaScript  prh

✖ 2 problem (2 error, 0 warnings)
✓ 2 fixable problem.
Try to run: $ textlint --fix [file]

textlint-rule-prh は auto fix に対応しているので、 --fix オプションを指定して実行すれば、ファイル内の表記揺れを自動で修正して保存してくれます。

$ textlint --fix "content/**/*.md"

表記揺れルール

proofread-helper (prh) では柔軟な表記揺れルールを定義することができます。 書き方のサンプルは 本家の記述例 を見ると分かりやすいですが、いくつかポイントをまとめておきます。

大文字と小文字の統一

rules:
  - expected: jQuery

このように expected のみを指定しておくと、大文字・小文字の違いだけがある単語を検出してくれます(例: JQueryjQuery)。

パターンに一致したものを修正

rules:
  - expected: ソフトウェア
    pattern: ソフトウエア

pattern に一致する単語が見つかったら、それを expected に修正するよう促します。

次のように pattern に複数の単語を指定することもできます(patternpatterns は同義)。

rules:
  - expected: ソフトウェア
    patterns:
      - ソフトウエア
      - ソフトウエアー
      - ソフトウェアー

pattern の部分に /正規表現/ という指定も可能です。

rules:
  - expected: ソフトウェア
    patterns:
      - /ソフトウ[エ|ェ]アー/
      - ソフトウエア

変換のテスト仕様を記述する

正規表現でパターン指定した場合は、 specs プロパティでテストを記述しておくことよいでしょう。 設定したルールで fromto にうまく変換できない場合は、spec failed となり動作を停止します。

rules:
  - expected: 技術書典
    pattern:  /技術書(店|点|展|てん)/
    specs:
      - from: 技術書点
        to:   技術書典
      - from: 技術書展
        to:   技術書典

サフィックスを追加するときの注意

rules:
  - expected: サーバー
    pattern:  /サーバ(?!ー)/
    specs:
      - from: サーバ
        to:   サーバー
    prh: 最後に伸ばすのが最近の主流みたいです。

例えば、「サーバ」を「サーバー」にするなど、既存の単語にサフィックスを追加する場合はちょっと注意が必要です。 単純に pattern に「サーバ」と指定すると、既に「サーバー」になっているものを「サーバーー」に修正しようとしてしまうので、上記のように指定しておく必要があります。 「ユーザ」を「ユーザー」にしたいときなども同様です。

スペースが必要な単語

rules:
  - expected: VS Code
    pattern: /vs ?code/i
    specs:
      - from: vscode
        to: VS Code
      - from: vs code
        to: VS Code
      - from: VS Code
        to: VS Code

スペースなしの VSCode を、スペースありの VS Code に修正するよう促します。 上記の正規表現だと、もともと正しい VS Code にもヒットしてしまいそうですが、その場合はうまいこと無視してくれるみたいです。

短い英単語では wordBoundary 指定しておく

jsid といった、短い単語の大文字・小文字を変換するときは、次のように wordBoundary オプションを true に設定しておくのがよいようです。 こうしておくと、ある単語の部分文字列として出現したときに無視してくれるようになります。

rules:
  - expected: js
  # pattern: "/\b[JjJj][SsSs]\b/g" # と等価 \b が前後に付与される
    options:
      wordBoundary: true
    specs:
      - from: foo JS bar
        to:   foo js bar
      - from: foo altJS bar
        to:   foo altJS bar
      # 日本語+単語境界の仕様は自分で調べてね…!
      - from: 今日もJS祭り
        to:   今日もjs祭り

関連記事

まくろぐ
サイトマップまくへのメッセージ