この記事は1751文字約5分で読めます

日本語って難しいですね。

Table of Contents

textlint

今までこのブログは日本語として伝わりにくい表現や表記揺れをあまり意識してなかったのですが、色々あってちゃんとした技術情報の発信のためには正しい日本語を使うことも大切なんだなと感じたこの頃です。

ただ、私は日本語をいい加減に学んでしまっているため自分の書いた文章が正しいのかどうかわからないのである程度自動で校正してくれるツールを探したところtextlintというツールがあることを知りました。

textlintとは、JavaScriptで書かれたオープンソースのテキスト改行ユーティリティで文章をあらかじめ定義したルールに基づいて校正してくれます。

このブログはTypeScript製なのでnpmでtextlintを入れてしまえば良さそうです。

SmartHRさんがプリセットを公開していて、これがかなり便利なので基本的にばこちらを使っていきます。

npm
npm install --save-dev textlint textlint-filter-rule-allowlist textlint-filter-rule-comments textlint-rule-aws-spellcheck textlint-rule-preset-smarthr textlint-rule-prh textlint-rule-terminology textlint-rule-no-hoso-kinshi-yogo textlint-rule-ja-no-inappropriate-words textlint-rule-no-mixed-zenkaku-and-hankaku-alphabet textlint-rule-no-start-duplicated-conjunction

textlintの設定は .textlintrcで設定します。

次のような設定にしました。

.textlintrc
{
  "rules": {
    "preset-smarthr": {
      "sentence-length": false,
      "ja-no-mixed-period": {
        "periodMark": "。",
        "allowPeriodMarks": [
          "、",
          ".",
          ",",
          "↓",
          "?",
          "・",
          "`",
          "…"
        ],
        "allowEmojiAtEnd": true
      }
    },
    "prh": {
      "rulePaths": [
        "dict/prh_tubone_blog.yml"
      ]
    },
    "no-start-duplicated-conjunction": {
      "interval": 2
    },
    "no-mixed-zenkaku-and-hankaku-alphabet": true,
    "no-hoso-kinshi-yogo": true,
    "ja-no-inappropriate-words": true,
    "terminology": {
      "defaultTerms": true,
      "skip": ["Blockquote"]
    },
    "@textlint-rule/no-duplicate-abbr": true
  },
  "filters": {
    "comments": true,
    "allowlist": {
      "allowlistConfigPaths": ["./textlint-allow-list.yml"]
    }
  }
}

基本的にはtextlint-rule-preset-smarthrをベースに校正を実施します。

ただし本ブログの構成上、文章途中コード文章文末までという構成が多いためja-no-mixed-periodallowPeriodMarksに「、」や「↓」を追加してます。

また、可愛らしい表現を心がけるためallowEmojiAtEndを許可にして💦のような絵文字で文末を締めくくることができるようにしてます。(よってサロゲートペアの未使用チェックのtextlintは使用してません。クレームが来たら使用することにします。)

そのほか細かいルールとしては、

  • prhを使って表記揺れをチェックします。基本はSmartHRのプリセットで押さえてますが、独自の表記揺れをYAMLで定義し設定してます。
  • no-start-duplicated-conjunctionを使って、接続語の連続をチェックします。「また〜また〜」みたいなやつです。
  • no-mixed-zenkaku-and-hankaku-alphabetを使って全角のアルファベットを禁止にしてます。
  • no-hoso-kinshi-yogoを使って放送禁止用語をチェックしてます。結構引っ掛かりますので、allowlistと組み合わせて使ってます。
  • ja-no-inappropriate-wordsを使って不適切表現をチェックしてます。
  • terminologyを使って技術用語の表記ミスを防いでます。(Node.jsと書くべきところをnode.jsと書いている、など。)
  • @textlint-rule/no-duplicate-abbrを使って同じ意味の重複語をチェックしてます。頭痛が痛い、みたいなやつです。

を使ってます。

また、filterを利用していて、

  • コメントでルールの無効化を許可。
  • allowlistで(主に放送禁止用語の)許可をしてます。 許可リストはこちら、品がないですね。

npm scriptへ次のようなスクリプトを仕込んであげれば簡単に校正ができるようになります。

package.json
  "scripts": {
    "textlint": "npx textlint \"src/content/*.md\"",
    "textlint:fix": "npx textlint --fix \"src/content/*.md\""
  },

CIに乗せる

CIに乗せるときに便利なのがreviewdogです。

ほぼこちらのブログを参考にパイプラインを作りました。ありがとうございます。

previewDeploy.yml
  textlint:
    name: textlint
    runs-on: ubuntu-latest

    steps:
      - uses: reviewdog/action-setup@v1
        with:
          reviewdog_version: latest
      - uses: actions/setup-node@v2
      - uses: actions/checkout@v2
      - name: Cache
        uses: actions/cache@v2
        with:
          path: |
            ~/.cache
            ~/.npm
            node_modules
            .cache
            public
          key: ${{ runner.os }}-build-${{ env.cache-version }}-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-build-${{ env.cache-version }}-${{ hashFiles('**/package-lock.json') }}
            ${{ runner.os }}-build-
            ${{ runner.os }}-
      - name: Install dependencies
        run: npm install
      - name: Execute textlint for article
        run: npx textlint -f checkstyle "src/content/*.md" >> .textlint.log
      - name: Run reviewdog
        if: failure()
        env:
          REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          cat .textlint.log | reviewdog -f=checkstyle -name="textlint" -reporter="github-pr-review"

これで、ブログ記事を書いてPRを出すことでPRコメントで校正を実施してくれるようになりました。

校正コメント

追加の改善

GitHub Actionsでno-hoso-kinshi-yogoを使うと、辞書ファイルを提供しているhttp://monoroch.net/kinshi/へのアクセスが同一IPから集中するためか504 BadGatewayが出て正しく辞書ファイルを読み込むことができなくなってましたのでforkして参照先URLを変更のうえ利用してます。

辞書ファイルをレポジトリ内に抱えてしまう実装なのでちょっと微妙な実装ですが、権利帰属をREADMEに明記したので良しとしました...🙏

結論

textlintを使って良いブログライフを!

tubone24にラーメンを食べさせよう!

ぽちっとな↓

Buy me a ramen

 Related Posts

hatena bookmark