RedPenを使って技術文書を手軽に校正しよう

第6回 RedPenの機能追加と今後

この記事を読むのに必要な時間:およそ 4 分

本連載を執筆している伊藤@takahi_iです。今回が最終回ということで,いままで深く扱えなかったトピックについて解説します。具体的には本稿の前半ではRedPenの機能追加を実際に行ってみます。後半ではRedPenの現状と今後の予定についてみていきます。

RedPenでの機能追加方法

先回RedPenの内部についての解説をしました。その知識をもとにRedPen内部の理解をもとに簡単な機能を実装してみます。実装する機能は半角カナ文字のチェックです。

機能追加:半角カナ機能

半角カナの混入は人目での判別が難しいため,自動で同定してしまいたい処理の一つです。機能を追加するには以下のステップが必要になります。

  • Validatorの追加
    • validateメソッドの実装
  • メッセージの追加
  • テストの作成

Validatorの追加

RedPenに機能を追加するには,抽象クラスValidatorを拡張したクラスを作成します。今回実装する機能をHankakuKanaと名づけることにします。前回すこしふれましたが,機能を呼び出すには実装するクラス名がValidatorというサフィックスをもつ必要があります。そのため今回実装するクラスはHankakuKanaValidatorという名前にします。

Validatorはいくつもメソッドを持ちますが,機能を実現する上でかならず実装しないといけないのがvalidateです。バージョン1.1のRedPenでは3つのvalidateメソッドが存在します。それぞれ,Document, Section, Sentenceを引数にとります。

validate(List<ValidationError> errorList, Document document)
validate(List<ValidationError> errors, Section section)
validate(List<ValidationError> errors, Sentence sentence)

通常機能を実現するにはValidationメソッドの一つを実装します。機能が一文を独立してチェックするだけで実現できるのであればSentenceを引数に取るメソッドを実装します。逆に文書の節間の関係等をチェックしたい場合にはSection,もしくはDocumentを引数にとるvalidateメソッドを実装する必要があります。

今回実装する機能(半角カナの検知)は一文中の文字を検査するだけで十分です。そのためSentenceを引数にとるvalidateメソッドを実装します。次のコードが作成したHankakuKanaValidatorとなります。

public class HankakuKanaValidator extends Validator {
  private static Pattern pattern = Pattern.compile("[\\uFF65-\\uFF9F\\s-]");
  public HankakuKanaValidator() {}

  @Override
  public void validate(List<ValidationError> errors, Sentence sentence) {
    Matcher matcher = pattern.matcher(sentence.getContent());
    while (matcher.find()) {
      errors.add(createValidationError(sentence,
          sentence.getContent().charAt(matcher.start())));
    }
  }
}

上のコードではpatternというstatic変数に半角カナを検知する正規表現を代入しています。実際に検査を行うvalidateメソッドでは,patternが入力文(sentence)にマッチするかをチェックします。マッチした場合にはcreateValidationErrorメソッドというValidatorが提供するヘルパークラスを使います。createValidationErrorメソッドはValidationErrorという検査のエラー情報を保持するクラスを生成してくれます。

createValidationErrorの第一引数は入力文です。第二引数以降は次節で述べるエラーメッセージの引数として利用されます。HankakuKanaValidatorではマッチした半角文字を引数として渡しています。

メッセージの追加

RedPenではエラーが含まれる文だけでなく,具体的に文のどこが悪かったのかを解説する(エラーメッセージの出力)機能があります。たとえばSentenceLength機能は以下のようなエラー文を出力します。

文長("80")が最大値 "100" を超えています。

出力するエラーメッセージにはパラメータを追加して文の具体的な情報を付加できます。たとえばHankakuKanaValidatorでは検知された半角カナ文字を出力します。付加する情報はcreateValidationErrorの第二引数以降で指定します。

先ほど作成したHankakuKanaValidatorでは第二引数に発見した半角文字を与えたことを思い出してください。HanakakuKana機能のエラーメッセージは以下のとおりです。

HankakuKanaValidator=半角カナの文字 "{0}" が見つかりました。

ここで,{0}はcreateValidationErrorメソッドの第二引数(第一引数はエラーの入っているSentenceオブジェクトなのでひとつずれる)に置き換えられます。

テストの作成

では,作成したHankakuKanaValidatorが期待通りに動作するか検証するためにテストを書いてみます。テスト用のクラスとしてHanakakuKanaValidatorTestを作成しました。今回書いたテストは2つです。一つはtestDetectHankakuKanaで,もう一つはtestRunValidaotrWithoutHanakakuKanaです。testDetectHanakakuKanaは,入力文に含まれる二文字の半角カナ("ハ"と"ナ")にたいしてエラーが出力されるかを検査します。

testRunValidaotrWithoutHanakakuKanaでは入力文に半角カナが含まれていない場合に,エラーを一つも追加しないことを検査しています。

public class HankakuKanaValidatorTest {
  @Test
  public void testDetectHankakuKana() {
    Validator validator = new HankakuKanaValidator();
    List<ValidationError> errors = new ArrayList<>();
    validator.validate(errors, new Sentence("岩の木陰にハナが咲いている", 0));
    assertEquals(2, errors.size());
  }

  @Test
  public void testRunValidatorWithoutHanakakuKana() {
    Validator validator = new HankakuKanaValidator();
    List<ValidationError> errors = new ArrayList<>();
    validator.validate(errors, new Sentence("岩の木陰にハナが咲いている", 0));
    assertEquals(0, errors.size());
  }
}

テストを実行するにはredpenのトップディレクトリ上でmvn testコマンドを実行します。今回の変更を加えた状態でのテストの実行は次項で取り上げますが,無事にテストがすべてパスしたことがわかります。

著者プロフィール

伊藤敬彦(いとうたかひこ)

ソフトウェアエンジニア。専門はデータマイニングと情報検索だが,他にも色々やってみたいと感じている。

コメント

コメントの記入