ちょっと話題の記事

Atomとtextlintで始めるその場で文章校正ができる環境の作り方

2017.11.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。サービスグループの武田です。

AWS re:Invent 2017が開催されますね。弊社からは実に34人が現地に乗り込みます。

AWS re:Invent 2017、クラスメソッドは34人が現地参加!そして全社員でイベントを盛り上げます! #reinvent

今年はお留守番ですが、来年は行きたいと今から狙っています。

さて、弊社はブログの執筆を仕事の一環としてとらえており、毎日たくさんの記事が公開されています。

記事を書く際には、内容はもとより、誤字脱字・表記ゆれにも気を付ける必要があります。

今回は文章のチェック・校正を楽にするためのツールとして、以前から気になっていたtextlintを使ってみましたので紹介します。

もちろんこの記事も、textlintを使って書いています。

環境

$ atom -v
Atom    : 1.22.1
Electron: 1.6.15
Chrome  : 56.0.2924.87
Node    : 7.4.0

$ node -v
v6.11.4

textlintとは

今回使用するtextlintとは何か、を簡単に説明すると、日本語などの自然言語で書かれた文章の文法チェックを行ってくれるツールです。

プログラミングの世界では、C言語やJavaScriptなどのプログラミング言語で書かれたソースコードの、文法チェックを行うツールが普及していました。lintあるいはlinterと呼ばれ、ただ動くだけではなく、きれいなソースコードを書くのに一役買っていました。

それと同じように、自然言語で書かれた文章のチェックをできるようにしたものがtextlintです。

textlintの特徴として、チェックルールをプラグイン形式で追加したり、あるいは自分で作るなど柔軟にルールを作ることができます。

textlintはそれ単体でも非常に有用なツールですが、Atomにはtextlintと連携するプラグインが開発されています。それを利用するとエディタ上でエラー内容などが確認できます。

textlintのセットアップ

まずはAtom抜きで、textlint単体で動作するところまで準備を進めていきます。

textlintはNode上で動作するため、Nodeの実行環境がない人は先にそちらを完了させましょう。 (Nodeのインストールについては、ESLintのセットアップなどを参考にしてみてください)

初めに作業用のディレクトリを作成し、そこにpackage.jsonを用意します。package.jsonはNode用の定義ファイルで、プロジェクトで利用するモジュールなどを管理できます。とりあえず試すだけであれば必ずしも必要なファイルではありませんが、用意しておけば、次回からはnpm installとするだけで必要なモジュールがインストールできます。

テキストエディタで用意することもできますが、次のようにnpm initコマンドで生成することもできます。npm initコマンドを実行すると対話形式で項目を聞かれます。基本的にはすべてデフォルトエンターで問題ありません。

$ mkdir /path/to/working_dir && cd $_
$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
name: (working_dir)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /path/to/working_dir/package.json:

{
  "name": "working_dir",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this ok? (yes) yes

package.jsonが作られたら、次にtextlintなどをインストールします。

$ npm install --save-dev prh textlint textlint-rule-preset-ja-technical-writing textlint-rule-prh textlint-rule-spellcheck-tech-word

textlintが本体で、textlint-rule-*が使用されるルールです。ほかにも多数のルールが公開されているので、探してみてください。

prhはあらかじめ用意した辞書を元に、文章の誤植や表記ゆれをチェックするツールです。このprhをtextlintから使えるようにしたのがtextlint-rule-prhということになります。

textlintで使用するルールの指定

インストールが完了したら、次は文章をチェックするルールを指定します。

プロジェクトルートに.textlintrcという名前でルールファイルを用意すると、コマンド実行時に自動で読み込まれます。ほかにもコマンド実行時にルールを指定することや、ルールファイルを明示的に指定することもできます。

サポートされる形式はYAML、JSON、JSの3種類です。今回は、JSON形式のサンプルが多かったためJSON形式で用意してみます。

.textlintrc

{
  "rules": {
    "preset-ja-technical-writing": {
      "no-exclamation-question-mark": false
    },
    "spellcheck-tech-word": true,
    "prh": {
      "rulePaths": [
        "node_modules/prh/prh-rules/media/techbooster.yml",
        "node_modules/prh/prh-rules/media/WEB+DB_PRESS.yml"
      ]
    }
  }
}

preset-ja-technical-writingは技術文書向けのプリセットとなっており、とりあえずガバッとルールを適用できるため便利です。詳細はルール一覧にまとまっています。デフォルト値はやや厳しめの設定となっているようで、用途に合わせて少し緩めることもできます(上記の設定では、感嘆符を使えるようにしています)。

spellcheck-tech-wordprh.rulePathsはそれぞれ辞書を有効にしており、これによって文章内に出てきた技術用語などがチェックされます。

今回はprhモジュールに同梱されているtechbooster.ymlWEB+DB_PRESS.ymlを使用してみます。

実際にチェックしてみる

それでは用意したルールを使って文章をチェックしてみましょう。今回は次の文章をサンプルとします。

sample.txt

今週はみんなre:inventに行っているためオフィスがガランとしている。

帰ってきたらJAVAとjavascriptの違いを聞こうと思う。。

textlintコマンドは.node_modules配下にあるためそれを使います。

$ ./node_modules/.bin/textlint sample.txt

/path/to/working_dir/sample.txt
  3:12  ✓ error  javascript => JavaScript             prh
  3:30  error    弱い表現: "思う" が使われています。  preset-ja-technical-writing/ja-no-weak-phrase
  3:33  error    "。" が連続して2回使われています。   preset-ja-technical-writing/ja-no-successive-word

✕ 3 problems (3 errors, 0 warnings)
✓ 1 fixable problem.
Try to run: $ textlint --fix [file]

ちゃんとチェックされてますね。

辞書を追加してみる

先ほど用意した文章ですが、指摘されていない誤植が2つあります。ひとつはre:invent、もうひとつはJAVAです。辞書にない用語は指摘されませんので、これらが指摘されるように自分で辞書を追加してみましょう。

dict/tech-word.ymlとして次のようなファイルを追加します(書き方はmisc/prh.ymlを参考にしてください)。

tech-word.yml

version: 1

rules:
  - expected: Java
  - expected: re:Invent

そして.textlintrcに、このファイルが読み込まれるように設定を追加します。

.textlintrc

{
  "rules": {
    "preset-ja-technical-writing": {
      "no-exclamation-question-mark": false
    },
    "spellcheck-tech-word": true,
    "prh": {
      "rulePaths": [
        "dict/tech-word.yml",
        "node_modules/prh/prh-rules/media/techbooster.yml",
        "node_modules/prh/prh-rules/media/WEB+DB_PRESS.yml"
      ]
    }
  }
}

それでは再度チェックをしてみましょう。

$ ./node_modules/.bin/textlint sample.txt

/path/to/working_dir/sample.txt
  1:7   ✓ error  re:invent => re:Invent               prh
  3:7   ✓ error  JAVA => Java                         prh
  3:12  ✓ error  javascript => JavaScript             prh
  3:30  error    弱い表現: "思う" が使われています。  preset-ja-technical-writing/ja-no-weak-phrase
  3:33  error    "。" が連続して2回使われています。   preset-ja-technical-writing/ja-no-successive-word

✕ 5 problems (5 errors, 0 warnings)
✓ 3 fixable problems.
Try to run: $ textlint --fix [file]

追加した2つの用語もしっかりと指摘されましたね。

ちなみに、✓マーク が付いているものは、textlint --fixを実行することで自動修正を行うこともできます。便利。

/// 小技

textlint実行時に、わざわざパスで指定するのは面倒ですね。

実はpackage.jsonscriptsに、実行したいコマンドを指定することでもう少し楽ができます。

package.json

{
  "name": "working_dir",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "devDependencies": {
    "prh": "^5.4.3",
    "textlint": "^9.1.1",
    "textlint-rule-preset-ja-technical-writing": "^2.0.0",
    "textlint-rule-prh": "^5.0.1",
    "textlint-rule-spellcheck-tech-word": "^5.0.0"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "lint": "textlint"
  },
  "author": "",
  "license": "ISC"
}

次のようなコマンドで実行できます。

$ npm run lint -s sample.txt

/// 小技ここまで

Atomで確認

以上で、textlintの基本的な動作が確認できました。最後にコマンド実行時ではなく、Atom上で確認できるようにしてみましょう。

GUIまたはコマンドでlinter-textlintをAtomにインストールします。

$ apm install linter-textlint

インストールできたら、先ほどのsample.txtをAtomで開いてみましょう。

$ atom linter-textlint

ファイルが開けたらエラーのある箇所には赤線が引かれています。マウスオーバーすることで指摘内容が確認できます。

Atom上でエラーが確認できました。ファイル保存時にlintが実行されるため、もしエラーが表示されない場合は、一度上書き保存してみてください。

後は指摘された内容を元に、文章を修正して再チェックを繰り返していくだけで、みるみるうちに文章が良くなっていくはずです。

まとめ

誤字脱字は文章を書くときには注意する必要がありますが、注意していても見逃してしまうことはよくあります。

またブログなど個人で書くものについては表記の統一の重要性は低くなりがちですが、外向けのドキュメントなどを書く際には表記の統一は必要不可欠です。

文章のチェックは往々にしてコストの高い作業であるため、こういったツールをうまく使っていきたいですね。

最後に

今回は少ない手間でtextlintを始められる流れを紹介しましたが、このままでは厳しすぎるルールや、表記ルールのコンフリクトが起こりえます。

実際に文章を書く中で、実態に沿ったルールとなるように調整していってください。

それでは、今回はここまで。