textlint向けのルールとして敬体(ですます調)と常体(である調)を一つの文書内でどちらを使うか統一するtextlint-rule-no-mix-dearu-desumasuというルールを書きました。

初期からあったのですが、kuromoji.js形態素解析した結果をベースとしたり、明示的にどちらを優先するかのオプションを追加したので改めて紹介します。

インストール

npm install textlint-rule-no-mix-dearu-desumasu

使い方

.textlintrc(Recommended)に設定するのを推奨しています。 後述するオプション設定もできるのでこちらの方が便利です。

{
    "rules": {
        "no-mix-dearu-desumasu": true
    }
}

CLIの--ruleオプションだとデフォルト設定のみになります。

textlint --rule no-mix-dearu-desumasu README.md

オプション

追記(2016-05-22): デフォルトでは strict: false にしています。 strict:falseでは少し緩めで文末のチェックのみ限定しているので、文中のチェックを入れたい場合はstrict: trueをオプションに加える必要があります。

このルールでは、本文、見出し、箇条書きをそれぞれ独立してチェックし、その項目内で表記が混在していないかを見つけます。 なので、本文と見出しの間で表記が混在するのは問題ありません。

  • 本文(Markdownなら通常の文章部分)
  • 見出し(Markdownなら#)
  • 箇条書き(Markdownなら* item- item)

それぞれの項目ごとに優先する表記をオプションで設定できます。

  • 本文(Body)
  • 見出し(Header)
  • 箇条書き(List)

デフォルトは ""(空)で、多く使われている表記を自動的に優先します。 優先したい表記を "である" または "ですます" で指定します。

{
    "rules": {
        "no-mix-dearu-desumasu": {
             "preferInHeader": "", // "である" or "ですます"
             "preferInBody": "",   // "である" or "ですます"
             "preferInList": "",    // "である" or "ですます"
             // 文末以外でも、敬体(ですます調)と常体(である調)を厳しくチェックするかどうか
             "strict": false
        }
    }
}

例えば、以下の例だと

  • 見出しは"自動"(多く使われてる表記に統一を促す)
  • 本文は"ですます"
  • 箇条書きは"である"
  • Strict modeでチェック

というルールでチェックします。

{
    "rules": {
        "no-mix-dearu-desumasu": {
             "preferInHeader": "", // "である" or "ですます"
             "preferInBody": "ですます",// "である" or "ですます"
             "preferInList": "である",    // "である" or "ですます"
             // 文末以外でも、敬体(ですます調)と常体(である調)を厳しくチェックするかどうか
             "strict": true
        }
    }
}

これは、本文と箇条書きで表記が異なるのは一般的によくあることなので、それぞれの項目ごとに設定できるようになっています。

リファクタリング例

このルールを使ってリファクタリングしてみた例です。

-先ほどのgulpタスクの例では、既にモジュール化された処理を`pipe`で繋げただけであるため、
+先ほどのgulpタスクの例では、既にモジュール化された処理を`pipe`で繋げただけで、
 それぞれの処理がどのように実装されているかはよく分かりませんでした。
-BufferはStringと相互変換が可能であるため、多くのgulpプラグインと呼ばれるものは、`gulpPrefixer`と`prefixBuffer`にあたる部分だけを実装しています。
+BufferはStringと相互変換が可能なので、多くのgulpプラグインと呼ばれるものは、`gulpPrefixer`と`prefixBuffer`にあたる部分だけを実装しています。
-gulpではプラグインが持つ機能は1つ(単機能)であること推奨しています。
+gulpではプラグインが持つ機能は1つ(単機能)とすることを推奨しています。
-`jQuery.fn`の実装を見てみると、実態は`jQuery.prototype`であるため実際にprototype拡張していることがわかります。
+`jQuery.fn`の実装を見てみると、実態は`jQuery.prototype`なので、prototype拡張していることがわかります。
-単純なprototype拡張であると言えるので、利点はJavaScriptのprototypeと同様です。
+単純なprototype拡張なので、利点はJavaScriptのprototypeと同様です。
-まだNode.jsで使われているCommonJSやES6 Modulesといったものがなかった時代に作られた仕組みであるため、
+まだNode.jsで使われているCommonJSやES6 Modulesなどがなかった時代に作られた仕組みなので、

他にいい代替表現など書き方の指摘を募集しています。

また、テキストから解析する部分を別途ライブラリとして切り出しているので、これはそもそも"である調"なのか?という問題などがありましたらIssueを立ててください。

イマイチ明確な基準がわかっていないため、false positiveにならないように限定しています。

(本当はtextlint-rule-no-mix*ed*-dearu-desumasuの方がESLint的なルール名として正しい…)