本連載を執筆している伊藤
今回の主な目的は,
RedPen のコンポーネント
RedPenは次のコンポーネントで構成されています。
- RedPen:コンポーネント群を使って文書校正処理を実行します。
- DocumentParser:入力文書をDocumentモデルという文書を表すデータ構造に変換します。文書フォーマット毎に実装が存在します。
- Documentモデル:DocumentParserによって生成される文書を表現するデータ構造です。内部にParagraph
(パラグラフ) やSentence (文) など, 文書の部品を保持しています。 - Validator群:Documentモデル内の部分にたいして検査を行います。各Validatorは"文長検査"など,
ひとつの検査項目に対応します。 - そのほか
(Formatter, Configuration, Tokenizer) :RedPenが校正処理を行うのに利用されるコンポーネント群です。
RedPenを拡張する際に必要なコンポーネントはDocumentモデルとValidator群です。Documentモデルは文書を表すデータの構造です。Validator群は入力Documentの一部
以下,
Documentモデル
Documentモデルは文書フォーマットに依存しない抽象的な文書を表します。次の図はDocumentモデルを表します。次節で紹介する機能追加がフォーマットに非依存で記述できるのは,
図中の四角形はDocumentモデル内のブロックを表します。各ブロックの解説は以下のとおりです。
- Document:文書を表します。ひとつのファイルに相当します。
- FileName:ファイル名を保持します。
- Header:節のヘッダを表します。文集合も保持します。
- Section:節に相当します。節は入れ子関係があります。たとえば節1は節1.
1を保持します。 - Paragraph:節内に存在するパラグラフをあらわします。図内には表示されていませんがParagraphは文
(Sentence) の集合を保持します。 - ListBlock:文内のリストを保持します。図内には表示されていませんがリスト要素は文
(Sentence) を保持します。
ブロックは入れ子構造になっています。たとえばDocumentはFileNameを持つことがわかります。ブロックを表す四角形の後ろに付いている"…"という記載は,
Sentence
先の図には登場しませんが,
- lineNum:行
- links:リンク集合
- isFirstSentence:パラグラフの開始文であればtrueそうでなければfalse
- tokens:文内の単語集合。単語はTokenizerによって分割されます。利用されるTokenizerは設定言語によって異なります。日本語
(ja) を指定した場合にはKuromojiが入力文を単語に分割します。
Sentenceは次節で述べるValidatorの入力として使用されます。
DocumentParserを追加する
DocumentParserは入力文書からDocumentを生成します。DocumentParser自体はインターフェースで,
現在までにPlainTextParser,
Validator
ValidatorはRedPenプロジェクトに存在する抽象クラスです。RedPenが提供する機能はValidatorを継承したクラスによって実装されています。たとえばSentenceLength機能はSentenceLengthValidatorというクラスで実装されています。
Validatorを継承するクラスを作るにはいくつか
validateメソッド
機能を追加するにはValidatorを継承するクラスを作り,
現状Validatorは二種類のvalidateメソッドを提供しています。ひとつは文
public void validate(List<ValidationError> errors, Sentence sentence)
public void validate(List<ValidationError> errorList, Document document)
文内の情報だけで検査ができるものはSentenceを引数にとるもので十分です。しかし検査に節の情報が必要な場合にはSectionを引数にとるvalidateを実装します。Sectionを引数にとるValidatorの実装としては,
入力ブロックにエラーがみつかった場合には,
例:validateメソッド
SentenceLengthValidatorのvalidateメソッドです。パラメータは発見されたエラーを保持するerrorsと入力のSentenceです。文内に不正な表現が存在するとにerrorsにValidationErrorが追加されます。次の例でもcreateValidationErrorメソッドで生成されたエラーがerrorsに追加され,
@Override
public void validate(List<ValidationError> errors, Sentence sentence) {
if (sentence.getContent().length() > maxLength) {
errors.add(createValidationError(sentence, sentence.getContent().length(), maxLength));
}
}
ここでcreateValidationErrorはValidatorクラスが提供するメソッドで,