Open6

Zennの連携リポジトリにtextlintで文章校正を自動化する

hirotakahirotaka

textlint本体をインストールします。

npm install --save-dev textlint

ルールをインストール。

 npm install --save-dev textlint-rule-preset-jtf-style textlint-rule-preset-ja-technical-writing 

設定ファイルを下記の通りにします。

.textlintrc.js
// 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,
    },
  },
};

hirotakahirotaka

コミット時に自動で実行されるのですが、修正して確認したい場合に、コミットせずに確認できるように必要なスクリプト類をscriptsに追加します。

package.json
"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に追加します。

.gitignore
+ .textlintcache
hirotakahirotaka

表記揺れなどを防ぐために、prhというツールのtextlintのプラグインをインストールします。

npm install --save-dev textlint-rule-prh

設定ファイルにルールの設定を追加します。

.textlintrc.js
  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

詳しい書き方は次のサイトを参考にしてください。

https://github.com/prh/prh

hirotakahirotaka

どうしても、特定の文章はチェックをオフにしたい場合があります。その時のためのルールを追加します。

npm install --save-dev textlint-filter-rule-comments

設定に追加します。

.textlintrc.js
     },
     prh: { rulePaths: ["./prh.yml"] },
   },
+  filters: {
+    comments: true,
+  },
 };

zennの場合、アコーディオン(トグル)があるのですが、その記述が以下の様になっています。

:::details タイトル

これだと、日本語と半角アルファベットの間にスペースをいれないというルールに引っかかってしまうので、下記の記述にしておきます。

<!-- textlint-disable -->
:::details ファイル全体
<!-- textlint-enable -->
hirotakahirotaka

コミット時にtextlintを実行するようにします。

必要なパッケージをインストールします。

npm install --save-dev husky lint-staged

Git hooksを有効にします。

npx husky install

installをした後に自動的にGit hooksを有効にするために、package.jsonに次のscriptsに追加します。

package.json
{
  "scripts": {
    "prepare": "husky install",
    "lint-staged": "lint-staged"
  }
}
npx husky add .husky/pre-commit "npm run lint-staged"
package.json
+  "lint-staged": {
+    "*.md": [
+      "textlint --cache --fix",
+      "textlint --cache",
+    ]
+  },

書き方が冗長などですが、最初のtextlintの呼び出しで、自動で直せる物は修正して、もう一度チェックします。チェックが通らないとコミットできないようにしています。

hirotakahirotaka
.github/workflows/lint.yml
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 }}