本連載を執筆している伊藤(@takahi_i)です。今回が最終回ということで、いままで深く扱えなかったトピックについて解説します。具体的には本稿の前半ではRedPenの機能追加を実際に行ってみます。後半ではRedPenの現状と今後の予定についてみていきます。
RedPenでの機能追加方法
先回RedPenの内部についての解説をしました。その知識をもとにRedPen内部の理解をもとに簡単な機能を実装してみます。実装する機能は半角カナ文字のチェックです。
機能追加:半角カナ機能
半角カナの混入は人目での判別が難しいため、自動で同定してしまいたい処理の一つです。機能を追加するには以下のステップが必要になります。
- Validatorの追加
- メッセージの追加
- テストの作成
Validatorの追加
RedPenに機能を追加するには、抽象クラスValidatorを拡張したクラスを作成します。今回実装する機能をHankakuKanaと名づけることにします。前回すこしふれましたが、機能を呼び出すには実装するクラス名がValidatorというサフィックスをもつ必要があります。そのため今回実装するクラスはHankakuKanaValidatorという名前にします。
Validatorはいくつもメソッドを持ちますが、機能を実現する上でかならず実装しないといけないのがvalidateです。バージョン1.1のRedPenでは3つのvalidateメソッドが存在します。それぞれ、Document, Section, Sentenceを引数にとります。
通常機能を実現するにはValidationメソッドの一つを実装します。機能が一文を独立してチェックするだけで実現できるのであればSentenceを引数に取るメソッドを実装します。逆に文書の節間の関係等をチェックしたい場合にはSection、もしくはDocumentを引数にとるvalidateメソッドを実装する必要があります。
今回実装する機能(半角カナの検知)は一文中の文字を検査するだけで十分です。そのためSentenceを引数にとるvalidateメソッドを実装します。次のコードが作成したHankakuKanaValidatorとなります。
上のコードではpatternというstatic変数に半角カナを検知する正規表現を代入しています。実際に検査を行うvalidateメソッドでは、patternが入力文(sentence)にマッチするかをチェックします。マッチした場合にはcreateValidationErrorメソッドというValidatorが提供するヘルパークラスを使います。createValidationErrorメソッドはValidationErrorという検査のエラー情報を保持するクラスを生成してくれます。
createValidationErrorの第一引数は入力文です。第二引数以降は次節で述べるエラーメッセージの引数として利用されます。HankakuKanaValidatorではマッチした半角文字を引数として渡しています。
メッセージの追加
RedPenではエラーが含まれる文だけでなく、具体的に文のどこが悪かったのかを解説する(エラーメッセージの出力)機能があります。たとえばSentenceLength機能は以下のようなエラー文を出力します。
出力するエラーメッセージにはパラメータを追加して文の具体的な情報を付加できます。たとえばHankakuKanaValidatorでは検知された半角カナ文字を出力します。付加する情報はcreateValidationErrorの第二引数以降で指定します。
先ほど作成したHankakuKanaValidatorでは第二引数に発見した半角文字を与えたことを思い出してください。HanakakuKana機能のエラーメッセージは以下のとおりです。
ここで、{0}はcreateValidationErrorメソッドの第二引数(第一引数はエラーの入っているSentenceオブジェクトなのでひとつずれる)に置き換えられます。
テストの作成
では、作成したHankakuKanaValidatorが期待通りに動作するか検証するためにテストを書いてみます。テスト用のクラスとしてHanakakuKanaValidatorTestを作成しました。今回書いたテストは2つです。一つはtestDetectHankakuKanaで、もう一つはtestRunValidaotrWithoutHanakakuKanaです。testDetectHanakakuKanaは、入力文に含まれる二文字の半角カナ("ハ"と"ナ")にたいしてエラーが出力されるかを検査します。
testRunValidaotrWithoutHanakakuKanaでは入力文に半角カナが含まれていない場合に、エラーを一つも追加しないことを検査しています。
テストを実行するにはredpenのトップディレクトリ上でmvn test
コマンドを実行します。今回の変更を加えた状態でのテストの実行は次項で取り上げますが、無事にテストがすべてパスしたことがわかります。
動作の確認
ここまででHankakuKana機能の実装が終わり、テストが通りました。それでは実際に使ってみましょう。はじめにRedPenのトップディレクトリでmvn install
を実行しRedPenの生成物を出力します。
次に以下のコマンドを実行して生成物を解凍します。
解凍されたディレクトリに移動します。
このディレクトリ以下にRedPenの設定ファイル(conf/redpen-conf-ja)とサンプルテキスト(sample-doc/ja/sampledoc-ja.txt)が入っています。はじめに、設定ファイルにの最後にHankakuKana機能を追加します。設定例は以下のとおりです。
次にサンプル文書に半角カナ文字を追加してみます。
変更した箇所はマージという単語を半角カナ(マージ)に置き換えただけです。この状態でredpenを以下のコマンドで実行します。
上記の出力より、半角カナが無事見つけられていることがわかります。
最近のニュースと今後の予定
連載開始時点から、RedPenには多くの改変が加えれれてきました。その中の多くは第4回で紹介しましたが、それ以降追加された大きな機能は以下の2つです。
ポジション情報の追加
RedPenはエラーを出力する際に、検知されたエラーを含む文が存在する文書内の行数を表示します。利用者の人から2つのポジション情報をエラーに含めてほしいというリクエストを頂きました。そこでバージョン1.1から以下の2つの位置情報をエラーに含める変更を加えました(注意:2つ目のポジション情報は一部の機能だけが対応しています)。
- 文内で文が開始されるポジション
- エラーが発生したポジション情報
現状では、ポジション情報に対応しているのはMarkdownフォーマットだけです。今後、Plainテキスト、Textileフォーマットについてもにポジション情報を追加していく予定です。
サンプルUIの更新
もう一つ、1.1以降ではじまった大きな改良にUIがあります。1.0の頃の素朴なUIから 1.1では大分モダンな感じになっています。
見た目以外の改良点には、現行バージョンではMarkdown、Textileフォーマットへの対応があります。コマンド一つで立ち上がるので、試しに使ってみてください。
Android アプリ
最近@hotchemiさんがRedPenのAndroidアプリを公開されました。Android端末があれば簡単にRedPenの機能を体験できます。是非一度使ってみてください。
文字設定の推測
現在では言語毎に設定されたデフォルト文字をオーバライドするには、設定ファイルに変更を 記載する必要があります(シンボルの設定変更については本連載の第1回を参照してください)。自分がRedPenを使ってみて文字設定を書くのは正直面倒と感じています。そこでどの句読点などの文字が使われているのかを入力文書から推測することを考えています。
まとめ
今回は連載最後ということで、解説しておきたかった残りトピックを取り上げました。そのため機能の追加と、今後の方針についてというかなり発散した内容となってしまいました。
RedPenについての連載自体はこれで終わりますが、今後もRedPenはゆっくりと開発が続いていきます。興味を持っていただいた人は是非使って使用感を教えていただけますと幸いです。さらに、機能の追加をはじめとしたコードへの貢献はいつでも大歓迎です。今後ともどうぞよろしくお願いいたします。