RedPen に JavaScript で機能追加
伊藤(takahi_i)
ATL の takahi_i です。いままでも RedPen は Java で機能は実装できたのですが、コンパイルが必要で気軽に機能を実装出来る環境ではありませんでした。そこで v1.3 から JavaScript での機能追加をサポートしました。JavaScript ベースの機能追加ではコンパル作業は必要ありません。
JavaScript での機能拡張に関しては Clear Code 様が書かれたブログ記事があります。この記事を読めば一般的な機能拡張を作るのに不自由しないと思います。まず RedPen で機能を作ってみたいという人は是非ご一読ください。
本稿では前半で機能拡張で実装するメソッド郡(あまり使わないのも含めて)の解説を行います。後半では解説したメソッドをもとに機能を追加してみます。
実装するメソッド
RedPen で機能拡張を行う際に利用(実装)するメソッドは二種類(validate と preValidate)に大別されます。
validate メソッド
validate メソッドは二種類存在します。それぞれ引数によって名前が異なります(validateSentenceとvalidateSection)。どちらのメソッドも入力(文か節)内を検査して、エラーを追加します。
RedPen は文書内の文(もしくは節)のすべてを引数にして validate メソッドを呼び出します。エラーの追加は addError メソッドを利用します。機能を実装するにはどちらかの validate メソッドを実装するだけで十分です。
validateSentence メソッド
validateSentence は引数に文(Sentence)を持ちます。
validateSection メソッド
validateSection は引数に節(Section)をとります。文より大きな規模のチェックを行いたいときに使用します。例えば、著しく類似した節を検知する機能(DuplicatedSection)は節単位の validate メソッドを利用して実装されています。
preValidate メソッド
preValidate メソッドは validate メソッドの前処理をおこなうメソッドです。具体的には validate メソッドが呼び出される前に、全ての文書に対して preValdate メソッドは適用されます。validate メソッドと同様に preValidate メソッドも引数によって二種類存在します(preValidateSentence と preVdalidateSection)。
- preValidateSenence (文を引数にとる preValidate メソッドです)
- preValidateSection (節を引数にとる preValidate メソッドです)
現状 preValidate メソッドが必要だった機能はそれほど多くありません。RedPen が提供している機能で preValidate を利用している数少ない機能に JapaneseStyle があります(Java ですが)。JapaneseStyle はですます調とである調が混在していないかを検査する機能です。JapaneseStyle の実装では preValidate メソッドを利用して、ですます調とである調で書かれた文の出現回数をカウントしています。validate メソッドでは出現回数の少なかったほうの調を利用した文が発見されるとエラーを出力するのです。
次節では validateSentence と preValidateSentence を利用した機能を作成してみます。
NotTooKanji(漢字が多すぎる) 機能
昔文書を書いていたところある共同執筆者の方から「君の文は漢字が多すぎる」という注意を受けたことがあります。理由は漢字が多いと読みにくいというものでした。「漢字を多用しすぎないように」という規約は比較的一般的です。実際にグーグルで “漢字を多用しない” と検索してみると、いくつもの記事がヒットします。
今回開発する NotTooKanji は文書内で使用されている漢字の割合がしきい値以上の時に、エラーを出力します。preValidateSentence メソッドでは文中ので使用された漢字と、すべての文字をカウントしています。validateSentenceメソッドで漢字の割合が 50% 以上の時にエラーを出力する処理を行っています。
エラーの追加には addError メソッドを利用します(引数にはエラーメッセージと、エラーが存在する文)。また NotTooKanji では flushed というフラグを利用してエラーを一回しか出力しないようにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
var THRESHOLD = 0.5 var kanji_count = 0 var moji_count = 0 var flushed = false function preValidateSentence(sentence) { var content = sentence.getContent(); for (var i = 0; i <= content.length - 1; i++) { if(/^[\u4e00-\u9faf]+$/.test(content[i])) { kanji_count++ } moji_count++ } } function validateSentence(sentence) { if ((parseFloat(kanji_count) / moji_count) > THRESHOLD && flushed == false) { addError("文書内に漢字多すぎ。。。><", sentence); flushed = true } } |
利用してみる
以下のようにJavaScript 機能を設定に追加します。
1 2 3 4 5 6 7 |
<redpen-conf lang="ja"> <validators> <validator name="JavaScript" /> </validators> </redpen-conf> |
次に上記の JavaScript ファイルを NotTooKanji.js という名前で RedPen のホームディレクトリ直下の js 以下に保存します。
入力文書として以下の文を “too-much-kanji.txt” というファイル名で保存します(少々人工的な例で恐縮です)。
1 2 |
貴方の文書で漢字が多過ぎる点、気を付け給え。 |
では実行してみます。
1 2 3 4 |
$bin/redpen -c conf/redpen-conf-ja.xml too-much-kanji.txt ... too-much-kanji.txt:1: ValidationError[JavaScript], [NotTooKanji.js] 文書内に漢字多すぎ。。。>< at line: 貴方の文書で漢字が多過ぎる点、気を付け給え。 |
期待どおりにエラーが出力されました。
まとめ
本記事では JavaScript で RedPen の機能拡張を作るときに利用するメソッドの解説をしました。その後実際にメソッドを利用して機能を追加してみました。