Closed6

CIでMarkdownの文字数を数える

f_subalf_subal

書籍執筆などで、Pull Request のたびにリポジトリ内の markdown の文字数を数えてコメントしてくれるやつがあると良さそうだと思った。

最終的に以下のようなコメントを PR 上にしてくれるやつを目指す。

1182 src/まえがき.md
17060 src/第1章.md
29882 src/第2章.md
Total characters: 48124
f_subalf_subal

Markdown の文字数は難しい。#--- を文字数に含めない工夫が必要になる。

日本語の文字数だけでも難しいが、そこまで厳密さは求めない(句読点は数える?絵文字は?などなど)。いったん wc -m 程度で考える。

一番簡単に済ますなら Pandoc で以下のように前処理すれば良い?

$ pandoc --strip-comments -t plain "$file" | wc -m
f_subalf_subal

面倒なので ChatGPT に書かす。

以下のような GitHub Actions workflow の yaml を書いてください

目的:
1. リポジトリ内の markdown ファイルごとの文字数をカウントする
2. 1 で出した合計文字数を計算する
3. 1 と 2 の内容を Pull Request にコメントする

手順:
- リポジトリ内の markdown を検索し、文字数をカウントしやすいように pandoc に通す
- wc -m コマンドでファイルごとの文字数と、全ファイルの合計文字数を両方出す
- peter-evans/create-or-update-comment を使用して PR にコメントする

するとこれが来た。

name: Count Characters

on:
  pull_request:
    types:
      - opened
      - synchronize

jobs:
  count-characters:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: 3.x

      - name: Install dependencies
        run: pip install pandoc

      - name: Count characters
        run: |
          total=0
          for file in $(find . -name "*.md"); do
            count=$(pandoc "$file" | wc -m)
            echo "$count $file"
            total=$((total + count))
          done
          echo "Total characters: $total"

      - name: Comment on Pull Request
        uses: peter-evans/create-or-update-comment@v1
        with:
          issue-number: ${{ github.event.pull_request.number }}
          body: |
            Character count:

            ```
            ${{ steps.count-characters.outputs.run }}
            ```
f_subalf_subal

まぁまぁいい感じだが pip で入れる意味がわからないので直してもらう。

Python を使わずに pandoc をインストールしてほしいです
name: Count Characters

on:
  pull_request:
    types:
      - opened
      - synchronize

jobs:
  count-characters:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Install Pandoc
        run: |
          sudo apt-get update
          sudo apt-get -y install pandoc

      - name: Count characters
        run: |
          total=0
          for file in $(find . -name "*.md"); do
            count=$(pandoc "$file" | wc -m)
            echo "$count $file"
            total=$((total + count))
          done
          echo "Total characters: $total"

      - name: Comment on Pull Request
        uses: peter-evans/create-or-update-comment@v1
        with:
          issue-number: ${{ github.event.pull_request.number }}
          body: |
            Character count:

            ```
            ${{ steps.count-characters.outputs.run }}
            ```

まぁ良いだろう。

f_subalf_subal

あとはここを手直しする

total=0
for file in $(find . -name "*.md"); do
  count=$(pandoc "$file" | wc -m)
  echo "$count $file"
  total=$((total + count))
done
echo "Total characters: $total"

pandoc の叩き方を変える。

total=0
for file in $(find . -name "*.md"); do
- count=$(pandoc "$file" | wc -m)
+ count=$(pandoc --strip-comments -t plain "$file" | wc -m)
  echo "$count $file"
  total=$((total + count))
done
echo "Total characters: $total"

あとは for の中身をプロジェクトに応じて変える

total=0
- for file in $(find . -name "*.md"); do
+ for file in $(git ls-files "src/*.md"); do
  count=$(pandoc --strip-comments -t plain "$file" | wc -m)
  echo "$count $file"
  total=$((total + count))
done
echo "Total characters: $total"
f_subalf_subal

書籍執筆だとファイル名に日本語を含めたくなるケースもあるので、以下も有効にしておく

      - name: Count characters
        run: |
+         git config --global core.quotepath false

          total=0
          for file in $(git ls-files "src/*.md"); do
            count=$(pandoc --strip-comments -t plain "$file" | wc -m)
            echo "$count $file"
            total=$((total + count))
          done
          echo "Total characters: $total"
このスクラップは2023/07/19にクローズされました