2022-12-05

textlintでRubyファイルを文章校正できるようにした話

これは SmartHR アドベントカレンダーの5日目の記事です。

SmartHRでは textlint という文書の校正ツールを利用しています。過去の記事はこちら

textlintの検知例

しかし、今までtextlintはRubyファイルに対応していませんでした。

この度は textlint-ruby というtextlintでRubyファイルを解析できるようにするためのプラグインを作成したので、ご紹介します。

textlint-rubyの仕組み

textlintで何かを解析するためには、文章をパースして文字列のデータ構造を抽出する必要があります。

例えば、下記のプログラムでは APIでエラーが発生しました という文字列がtextlintに渡すべき値になります。

def create
  redirect_to(root_path, error: 'APIでエラーが発生しました')
end

textlint-rubyでは、ripperを使ってRubyファイルを解析して、抽出した文字列等をtextlint用のASTに変換してくれます。

textlint-rubyの使い方

textlintはすでに導入済みとします。

まずは、対象プロジェクトのGemfileにRubyファイルの解析を担うtextlint-rubyを追加します。

# Gemfile
group :development, :test do
  gem 'textlint-ruby'
end

その後、textlintのプラグインを追加します。

$ pnpm add --dev textlint-plugin-ruby
or
$ npm install --dev textlint-plugin-ruby

.textlintrc に設定を追加すれば設定は完了です。

{
  "plugins": {
    "ruby": {
      "execCommand": ["bundle", "exec", "textlint-ruby", "--stdio"]
    }
  }
}

終わりに

SmartHRに入社して2週目の時に「Rubyの会社なのにtextlintでパースできないのなんで??」と思い立って、数時間でこのプラグインを作成しました。
今となっては、会社の主要プロダクトのほとんどに導入されており、会社のバリューである「一語一句に手間ひまかける」の一助となっています。

このプラグインの作成にあたって、textlint本体にもPRを送って外部プロセスを呼び出せる仕組みになりました。
もし他のプログラミング言語に対応したいときでも、同じ発想でプラグインを作成できるはずです。

みなさまもどうぞお試しあれ。