textlintで過去のブログの文章をチェックしてみました。

https://textlint.github.io/

textlintのセットアップ

http://neos21.hatenablog.com/entry/2017/11/05/080000

セットアップはこちらのブログ記事を参考にさせてもらい、npm i --save-devでこのブログのプロジェクトにモジュールを追加しました。

textlintには、デフォルトでは1つもチェックルールが入っておらず、必要な物を自分で追加していくスタイルです。
textlint-rule-preset-ja-technical-writingという技術文書向けの複数のルールをまとめたルールプリセットがあって、それを使うと20個以上のチェックが一発でインストールできて便利でした。 package.jsonのdevDependenciesの部分を抜粋して貼っておきますが、textlint-rule-preset-ja-spacingもルールプリセットですので、実際はかなりの数のルールを使用していることになります。

  "devDependencies": {
    "@textlint-ja/textlint-rule-no-insert-dropping-sa": "^1.0.1",
    "textlint": "^11.2.3",
    "textlint-filter-rule-whitelist": "^2.0.0",
    "textlint-rule-ja-hiragana-fukushi": "^1.0.3",
    "textlint-rule-ja-hiragana-hojodoushi": "^1.0.4",
    "textlint-rule-ja-no-redundant-expression": "^3.0.1",
    "textlint-rule-ja-unnatural-alphabet": "^2.0.1",
    "textlint-rule-joyo-kanji": "0.0.1",
    "textlint-rule-no-dead-link": "^4.4.1",
    "textlint-rule-no-renyo-chushi": "0.0.2",
    "textlint-rule-one-white-space-between-zenkaku-and-hankaku-eiji": "^1.1.0",
    "textlint-rule-preset-ja-spacing": "^2.0.1",
    "textlint-rule-preset-ja-technical-writing": "^3.1.2",
    "textlint-rule-spellcheck-tech-word": "^5.0.0"
  }

.textlintrcの作成

先ほどのブログで紹介されていたファイルをベースに少しカスタマイズしたファイルを作成してプロジェクトのルートに配置します。
※半角の%はHugoのショートコードとして解釈されてしまうので全角に置き換えています。

{
  "filters": {
    "whitelist": {
      // HugoのFront MatterとShort Codeを無視する
      "allow": [
        "/^{{%[\\s\\S]*?%}}/m"
      ]
    }
  },
  "rules": {
    // 技術文書向けの textlint ルールプリセット
    "preset-ja-technical-writing": {
      // 1文の長さ
      "sentence-length": {
        max: 150
      },
      // 1文中のカンマ
      "max-comma": {
        max: 6
      },
      // 1文中の読点
      "max-ten": {
        max: 3
      },
      // 連続できる最大の漢字長 : 固有名詞は allow オプションに記述して回避できる
      "max-kanji-continuous-len": {
        max: 5,
        allow: [
          "証明書生成時",
          "建設的相互作用",
          "開発環境構築",
          "人類史上最高"
        ]
      },
      // 「ですます調」、「である調」を統一する
      "no-mix-dearu-desumasu": {
        // 見出しは自動
        "preferInHeader": "",
        // 本文はですます調
        "preferInBody": "ですます",
        // 箇条書きはである調
        "preferInList": "である",
        // 文末以外のチェックをしない
        "strict": false
      },
      "ja-no-mixed-period": {
        // 文末の句点記号に「。」を使う
        "periodMark": "。"
      },
      // 二重否定は使用しない
      "no-double-negative-ja": true,
      // ら抜き言葉を使用しない
      "no-dropping-the-ra": true,
      // 逆接の接続助詞「が」を連続して使用しない
      "no-doubled-conjunctive-particle-ga": true,
      // 同じ接続詞を連続して使用しない
      "no-doubled-conjunction": true,
      // 同じ助詞を連続して使用しない
      "no-doubled-joshi": {
        "min_interval": 1
      },
      // UTF8-MAC 濁点を使用しない
      "no-nfd": true,
      // 感嘆符「!!??」を使用を禁止する
      "no-exclamation-question-mark": false,
      // 半角カナを使用しない
      "no-hankaku-kana": true,
      // 弱い日本語表現の利用を使用しない
      "ja-no-weak-phrase": true,
      // 同一の単語を間違えて連続しているのをチェックする
      "ja-no-successive-word": true,
      // よくある日本語の誤用をチェックする
      "ja-no-abusage": true
    },
    // 日本語周りにおけるスペースの有無を決定する textlint ルールプリセット
    "preset-ja-spacing": {
      // カタカナ語間は中黒または半角スペースを用いて区切る
      "ja-nakaguro-or-halfwidth-space-between-katakana": true,
      // かっこの外側、内側ともにスペースを入れない
      "ja-no-space-around-parentheses": true,
      // 全角文字どうしの間にスペースを入れない
      "ja-no-space-between-full-width": true,
      // 半角文字と全角文字の間にスペースを入れるかどうか
      "ja-space-between-half-and-full-width": {
        "space": "never"
      },
      // 文末に感嘆符を使用し、後に別の文が続く場合は、直後に全角スペースを挿入する
      "ja-space-after-exclamation": true,
      // 文末に疑問符を使用し、後に別の文が続く場合は、直後に全角スペースを挿入する
      "ja-space-after-question": true,
      // インラインコードの前後が日本語である場合に半角スペースを入れるか
      "ja-space-around-code": false
    },
    // サ抜き、サ入れ表現の誤用
    "@textlint-ja/textlint-rule-no-insert-dropping-sa": true,
    // 漢字よりもひらがなで表記したほうが読みやすい副詞
    "ja-hiragana-fukushi": true,
    // 漢字よりもひらがなで表記したほうが読みやすい補助動詞を指摘する
    "ja-hiragana-hojodoushi": true,
    // 冗長な表現を禁止する
    "ja-no-redundant-expression": true,
    // 不自然なアルファベットを検知する
    "ja-unnatural-alphabet": true,
    // 常用漢字を使っているか
    "joyo-kanji": false,
    // 連用中止法を検知する
    "no-renyo-chushi": true,
    // 全角文字と半角英字の間に半角スペース、ただし次の全角文字 [、。「 」(){}【】『』] の前後には不要
    "one-white-space-between-zenkaku-and-hankaku-eiji": false,
    // リンク切れ検出
    "no-dead-link": {
      "checkRelative": true,
      "baseURI": null,
      "ignore": ["http://localhost*"],
      "preferGET": [],
      "ignoreRedirects": false
    },
    // Tech Wordのスペルチェック
    "spellcheck-tech-word": true
  }
}

HugoのFront Matter対策

HugoのFront Matterが1文の文字数チェックに引っかかってしまうので、textlint-filter-rule-whitelistを使用して除外するようにしました。

  "filters": {
    "whitelist": {
      // HugoのFront MatterとShort Codeを無視する
      "allow": [
        "/^{{%[\\s\\S]*?%}}/m"
      ]
    }
  },
  • Font Matterの例
+++
thumbnail = "images/netlify-response-header/title.png"
tags = ["Netlify", "HSTS", "CDN"]
categories = ["技術メモ"]
date = "2019-03-04T13:35:42+09:00"
title = "Netlifyで任意のレスポンスヘッダーを返却する"
description = "Netlifyで任意のレスポンスヘッダーを返却する"
+++

Visual Studio Codeにvscode-textlintプラグインをインストールする

プラグインを入れると、書いているそばから文章をチェックしてくれるので便利です。

文章をチェックして直していく

色々引っかかりましたが代表的なものを挙げます。

  • textlint-rule-ja-no-weak-phrase

「だと思う」「かもしれない」のような弱い表現をチェックしてくれます。これはかなり引っかかりました。言い切れないようなことは書くべきでないということですね。

  • textlint-rule-ja-no-successive-word

これは単純なミスですが、同じ言葉が連続しているのをチェックしてくれます。これも数カ所ありました。

  • textlint-rule-ja-no-redundant-expression

冗長で周りくどい言い回しをチェックしてくれます。「することができる」は「できる」で良い。これも結構引っかかりました。

  • textlint-rule-spellcheck-tech-word

技術用語が正しいかチェックしてくれます。JavaScriptやXcodeなどは大文字と小文字を間違えやすいので助かります。

  • textlint-rule-max-ten

文章中に、「、」が3つまでかのチェック。自分の文章は無駄に点を打ってましたね。そういう文章は得てして1文が長いのでそれも同時に見直しました。

  • textlint-rule-no-doubled-joshi

同じ助詞が連続しているかのチェック。これも結構多かった。

  • textlint-rule-joyo-kanji

常用漢字を使っているのチェックですが、これは厳しすぎて無効にしました。「々」などが使えないのは痛かったので。

おわりに

textlintでチェックすることにより、自分の文章の変な癖に気づいたり色々学びがありました。