読者です 読者をやめる 読者になる 読者になる

Fuzoku実践入門ブログ

Amazon で好評発売中の『Fuzoku実践入門』に関するエピソードなどを紹介するブログです。

自動文書検査ツールRedPenをRubyから使えるredpen-rubyを書いてみました

環境

最近、RedPenという技術文書向け校正ツールを知りました。RedPenについては、RedPenを使って技術文書を手軽に校正しよう:連載|gihyo.jp … 技術評論社に詳しい説明があります。

RedPen

本格的に文章を書くようになり、こういったツールを求めていたため、早速試してみることにしたのですが、epubcheckをepub_validatorを使っている身としては、RedPenもRubyから使いたいなぁと思ったので、折角なので最近覚えたRubyを使ってepub_validatorのコードを参考にラッパーツールを作ってみることにしました。

RedPenRuby is a Ruby wrapper for redpen: a text inspection tool.

とりあえず、希望する動作が確保できたので、GitHubリポジトリを公開して、RubyGems.orgにも登録しました。

インストールと使い方

GitHubのREADME.mdにも記載していますが、ここでも解説しておきます。

インストール

RubyGems.orgに登録してありますので、

$ gem install redpen_ruby

でインストールできます。もしくは、Gemfileに

gem 'redpen_ruby'

と記入して、

$ bundle install

を実行しましょう。

コマンドラインからの使い方

まず、コマンドラインからの使い方ですが、gem install redpen_rubyでインストールしている場合、$ redpen_ruby /path/to/config_file /path/to/target_fileという形式で実行できます。

$ redpen_ruby ./lib/redpen-cli-1.0/conf/redpen-conf-ja.xml ./lib/redpen-cli-1.0/sample-doc/ja/sampledoc-ja.md

Checking....FAILED!

This is not a valid document. Checking by RedPen CLI v1.0.1

sampledoc-ja.md:2: ValidationError[SentenceLength], 文長が最大値 "107" を超えています at line: # 分散処理最近利用されているソフトウェアの中には複数の計算機上で動作(分散)するものが多く存在し、このような分散ソフトウェアは複数の計算機で動作することで大量のデータを扱えたり 、高負荷な状況に対処できたりします。
sampledoc-ja.md:2: ValidationError[InvalidSymbol], 不正なシンボル "#" がみつかりました at line: # 分散処理最近利用されているソフトウェアの中には複数の計算機上で動作(分散)するものが多く存在し、このような分散ソフトウェアは複数の計算機で動作することで大量のデータを扱えたり、高負荷な状況に対処できたりします。
sampledoc-ja.md:3: ValidationError[InvalidSymbol], 不正なシンボル "," がみつかりました at line: 本稿では,複数の計算機(クラスタ)でで動作する各サーバーを**インスタンス**と呼びまます。
sampledoc-ja.md:3: ValidationError[KatakanaEndHyphen], カタカナ単語 "サーバー" に不正なハイフンが見つかりました at line: 本稿では,複数の計算機(クラスタ)でで動作する各サーバーを**インスタンス**と呼びまます。
sampledoc-ja.md:2: ValidationError[DoubledWord], 一文に二回以上利用されている単語 "分散" がみつかりました at line: # 分散処理最近利用されているソフトウェアの中には複数の計算機上で動作(分散)するものが多く存在し、このような分散ソフトウェアは複数の計算機で動作することで大 量のデータを扱えたり、高負荷な状況に対処できたりします。
sampledoc-ja.md:2: ValidationError[DoubledWord], 一文に二回以上利用されている単語 "分散" がみつかりました at line: # 分散処理最近利用されているソフトウェアの中には複数の計算機上で動作(分散)するものが多く存在し、このような分散ソフトウェアは複数の計算機で動作することで大 量のデータを扱えたり、高負荷な状況に対処できたりします。
sampledoc-ja.md:2: ValidationError[DoubledWord], 一文に二回以上利用されている単語 "ソフトウェア" がみつかりました at line: # 分散処理最近利用されているソフトウェアの中には複数の計算機上で動作(分散)するものが多く存在し、このような分散ソフトウェアは複数の計算機で動作する ことで大量のデータを扱えたり、高負荷な状況に対処できたりします。
sampledoc-ja.md:2: ValidationError[DoubledWord], 一文に二回以上利用されている単語 "複数" がみつかりました at line: # 分散処理最近利用されているソフトウェアの中には複数の計算機上で動作(分散)するものが多く存在し、このような分散ソフトウェアは複数の計算機で動作することで大 量のデータを扱えたり、高負荷な状況に対処できたりします。
sampledoc-ja.md:2: ValidationError[DoubledWord], 一文に二回以上利用されている単語 "計算" がみつかりました at line: # 分散処理最近利用されているソフトウェアの中には複数の計算機上で動作(分散)するものが多く存在し、このような分散ソフトウェアは複数の計算機で動作することで大 量のデータを扱えたり、高負荷な状況に対処できたりします。
sampledoc-ja.md:2: ValidationError[DoubledWord], 一文に二回以上利用されている単語 "動作" がみつかりました at line: # 分散処理最近利用されているソフトウェアの中には複数の計算機上で動作(分散)するものが多く存在し、このような分散ソフトウェアは複数の計算機で動作することで大 量のデータを扱えたり、高負荷な状況に対処できたりします。
sampledoc-ja.md:2: ValidationError[DoubledWord], 一文に二回以上利用されている単語 "たり" がみつかりました at line: # 分散処理最近利用されているソフトウェアの中には複数の計算機上で動作(分散)するものが多く存在し、このような分散ソフトウェアは複数の計算機で動作することで大 量のデータを扱えたり、高負荷な状況に対処できたりします。
sampledoc-ja.md:5: ValidationError[SpaceBetweenAlphabeticalWord], アルファベット単語の前にスペースが存在しません at line: このような場合、各インデクスの結果をマージしてclientプログラムに渡す機構が必要となります。
sampledoc-ja.md:5: ValidationError[SpaceBetweenAlphabeticalWord], アルファベット単語の後にスペースが存在しません at line: このような場合、各インデクスの結果をマージしてclientプログラムに渡す機構が必要となります。
sampledoc-ja.md:3: ValidationError[SuccessiveWord], 単語 "で" は連続して使用されています at line: 本稿では,複数の計算機(クラスタ)でで動作する各サーバーを**インスタンス**と呼びまます。

この出力結果は、redpen_rubyのプロジェクトルートで実行した場合です。bundle installした場合は、bundle execを付けましょう。

redpen-cli-1.0を同梱しているため、RedPen本体をインストールする必要はありませんが、環境変数JAVA_HOMEはたぶん設定する必要があります。私は.zshenvに次の設定を書いています。

export JAVA_HOME=`/usr/libexec/java_home

ちなみに、コマンドラインからの実行は、通常のredpen-cliとほとんど変りませんので、あまり嬉しくありません。違いとしては、デバッグメッセージが消えているくらいです。

Rubyコード内からの使い方

redpen_rubyの利点は、Rubyコード内で利用できるところです。

require 'redpen_ruby'

config_file = './lib/redpen-cli-1.0/conf/redpen-conf-en.xml'
target_file = './lib/redpen-cli-1.0/sample-doc/en/sampledoc-en.md'

redpen = RedpenRuby.check(config_file, target_file)

if redpen.valid?
  puts 'Ok, Valid!'
else
  puts redpen.messages
end

epub_validatorと同様に、上記のようなコードを書くことで、RubyコードでRedPenを使うことができます。

これで、Rakeを使って思い通りに実行できそうです。

初めてのRubyGemを書いてみた感想

ひとことで言うと、とても簡単でした。

まず、bundle gem redpen_ruby -t -bを実行するだけで、必要なファイル群を自動生成してくれるため、慣れていない私でも、本体コードを書くことだけに集中することができました。

また、コードを書いた後はrake specでテストしつつ、rake installで実際にインストールして最終の動作確認をして、無事に利用できたらrake releaseを実行するだけで公開まで行なえました。

CIについても、bundle gemで生成された.travis.ymlをそのままGitHubにpushするだけで、Travis CIが利用できて、至れり尽くせりでした。

ちなみに、最初は普段使っているCircleCIに揃えようかと思ったのですが、bundle installでビルドエラーになってしまったので、gemの場合はTravis CIの方がお手軽でした。

気になること

こういった形で、外部ツールを含むプログラムを作って公開するのは初めてであるため、ライセンス上問題がないか気になっています。

RedPenはApache License, Version 2.0であるため、ライセンスを明示していれば問題ないと思いましたので、redpen_rubyのライセンスRedPenのLICENSE-HEADER.txtを貼り付けて、その上で、redpen_ruby/lib/redpen-cli-1.0の中にも、LICENSE.txtを放り込んでおきました。

なお、redpen-cli-1.0はRedPenのソースコードを手元でビルドしたものを利用しています。

というわけで、もしこの記事を見たRedPen関係者の方がおられましたら、問題がないか教えていただけると嬉しいです。

追記

Twitterでコミッタの伊藤さんから問題ないとのご返事を頂けました!

まとめ

まだ本格的にRedPenを使い始めたわけではないのですが、これで利用環境が整ったこともあり、執筆が一段落したときに、RedPenを本格導入してみたいと思います。

また、調子に乗って、Issueを立ててみたりしてみたのですが、@takahi_i さんにすぐご対応頂きました。その節は本当にありがとうございました。

今後も、こういったツールを活用し、効率的に執筆生活を続けていければと思いますので、みなさまどうぞ宜しくお願いします。

追記

RedPenのプロジェクトページからリンクしてもらえました!