Zennの連携リポジトリにtextlintで文章校正を自動化する
textlint本体をインストールします。
npm install --save-dev textlint
ルールをインストール。
npm install --save-dev textlint-rule-preset-jtf-style textlint-rule-preset-ja-technical-writing
設定ファイルを下記の通りにします。
// Collection of textlint rule
// https://github.com/textlint/textlint/wiki/Collection-of-textlint-rule
module.exports = {
plugins: {
"@textlint/markdown": {
extensions: [".md"],
},
},
rules: {
"preset-ja-technical-writing": true,
"preset-jtf-style": {
"2.1.6.カタカナの長音": true,
"2.2.1.ひらがなと漢字の使い分け": true,
},
},
};
コミット時に自動で実行されるのですが、修正して確認したい場合に、コミットせずに確認できるように必要なスクリプト類をscripts
に追加します。
"scripts": {
"lint:text": "textlint --cache $(git diff main --name-only) -f pretty-error",
"lint:text:fix": "textlint --cache $(git diff main --name-only) --fix",
"lint:text:full": "textlint --cache README.md \"articles/**/*.md\" -f pretty-error",
"lint:text:full:fix": "textlint --cache README.md \"articles/**/*.md\" --fix"
},
エラーの箇所が特定しやすいように-f pretty-error
をオプションに追加しています。
ステージのファイルを対象にチェックする場合は以下を実行します。自動で修正するにはfixを付加します。
npm run lint:text
npm run lint:text:fix
コミット済みのファイルも対象にチェックをかけたい場合はそれぞれ下記を実行します。
npm run lint:text:full
npm run lint:text:full:fix
スクリプトを実行すると、キャッシュが生成されます。キャッシュはリポジトリに含まなくてもいいので、.gitignore
に追加します。
+ .textlintcache
表記揺れなどを防ぐために、prhというツールのtextlintのプラグインをインストールします。
npm install --save-dev textlint-rule-prh
設定ファイルにルールの設定を追加します。
rules: {
"preset-ja-technical-writing": true,
"preset-jtf-style": {
"2.1.6.カタカナの長音": true,
"2.2.1.ひらがなと漢字の使い分け": true,
},
+ prh: { rulePaths: ["./prh.yml"] },
},
下記の様な内容でprh.yml
というファイルを作成します。
version: 1
rules:
- expected: Next.js
pattern:
- nextjs
- next.js
- expected: Zenn
pattern:
- zenn
詳しい書き方は次のサイトを参考にしてください。
どうしても、特定の文章はチェックをオフにしたい場合があります。その時のためのルールを追加します。
npm install --save-dev textlint-filter-rule-comments
設定に追加します。
},
prh: { rulePaths: ["./prh.yml"] },
},
+ filters: {
+ comments: true,
+ },
};
zennの場合、アコーディオン(トグル)があるのですが、その記述が以下の様になっています。
:::details タイトル
これだと、日本語と半角アルファベットの間にスペースをいれないというルールに引っかかってしまうので、下記の記述にしておきます。
<!-- textlint-disable -->
:::details ファイル全体
<!-- textlint-enable -->
コミット時にtextlintを実行するようにします。
必要なパッケージをインストールします。
npm install --save-dev husky lint-staged
Git hooksを有効にします。
npx husky install
installをした後に自動的にGit hooksを有効にするために、package.jsonに次のscripts
に追加します。
{
"scripts": {
"prepare": "husky install",
"lint-staged": "lint-staged"
}
}
npx husky add .husky/pre-commit "npm run lint-staged"
+ "lint-staged": {
+ "*.md": [
+ "textlint --cache --fix",
+ "textlint --cache",
+ ]
+ },
書き方が冗長などですが、最初のtextlintの呼び出しで、自動で直せる物は修正して、もう一度チェックします。チェックが通らないとコミットできないようにしています。
name: Lint
on:
- pull_request
jobs:
textlint:
strategy:
matrix:
os:
- ubuntu-latest
node-version:
- 14.x
runs-on: ${{ matrix.os }}
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2.3.0
with:
node-version: ${{ matrix.node-version }}
- name: Get the number of processors currently available
id: processors
run: echo "::set-output name=number::$(getconf _NPROCESSORS_ONLN)"
- name: Cache node modules
uses: actions/cache@v2
env:
cache-name: cache-node-modules
with:
path: ~/.npm
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: Setup reviewdog
run: |
mkdir -p $HOME/bin && curl -sfL https://raw.githubusercontent.com/reviewdog/reviewdog/master/install.sh | sh -s -- -b $HOME/bin
echo "$HOME/bin" >> $GITHUB_PATH
echo "$(go env GOPATH)/bin" >> $GITHUB_PATH # for Go projects
- name: Install dependencies
run: npm install
env:
CHILD_CONCURRENCY: ${{ steps.processors.outputs.number }}
NETWORK_CONCURRENCY: ${{ steps.processors.outputs.number }}
- name: textlint
run: npm run lint:text:full -- ${FILES} -f checkstyle --experimental --parallel --max-concurrency ${{ steps.processors.outputs.number }} | reviewdog -f=checkstyle -name="textlint" -reporter=github-pr-review -level=${LEVEL}
env:
FILES: README.md articles/**/*.md
LEVEL: error
REVIEWDOG_GITHUB_API_TOKEN: ${{ github.token }}