日本語って難しいですね。
Table of Contents
textlint
今までこのブログは日本語として伝わりにくい表現や表記揺れをあまり意識してなかったのですが、色々あってちゃんとした技術情報の発信のためには正しい日本語を使うことも大切なんだなと感じたこの頃です。
ただ、私は日本語をいい加減に学んでしまっているため自分の書いた文章が正しいのかどうかわからないのである程度自動で校正してくれるツールを探したところtextlintというツールがあることを知りました。
textlintとは、JavaScriptで書かれたオープンソースのテキスト改行ユーティリティで文章をあらかじめ定義したルールに基づいて校正してくれます。
このブログはTypeScript製なのでnpmでtextlintを入れてしまえば良さそうです。
SmartHRさんがプリセットを公開していて、これがかなり便利なので基本的にばこちらを使っていきます。
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で設定します。
次のような設定にしました。
{
"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-periodのallowPeriodMarksに「、」や「↓」を追加してます。
また、可愛らしい表現を心がけるため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へ次のようなスクリプトを仕込んであげれば簡単に校正ができるようになります。
"scripts": {
"textlint": "npx textlint \"src/content/*.md\"",
"textlint:fix": "npx textlint --fix \"src/content/*.md\""
},
CIに乗せる
CIに乗せるときに便利なのがreviewdogです。
ほぼこちらのブログを参考にパイプラインを作りました。ありがとうございます。
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を使って良いブログライフを!