Closed6
CIでMarkdownの文字数を数える
書籍執筆などで、Pull Request のたびにリポジトリ内の markdown の文字数を数えてコメントしてくれるやつがあると良さそうだと思った。
最終的に以下のようなコメントを PR 上にしてくれるやつを目指す。
1182 src/まえがき.md
17060 src/第1章.md
29882 src/第2章.md
Total characters: 48124
Markdown の文字数は難しい。#
や ---
を文字数に含めない工夫が必要になる。
日本語の文字数だけでも難しいが、そこまで厳密さは求めない(句読点は数える?絵文字は?などなど)。いったん wc -m
程度で考える。
一番簡単に済ますなら Pandoc で以下のように前処理すれば良い?
$ pandoc --strip-comments -t plain "$file" | wc -m
面倒なので 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 }}
```
まぁまぁいい感じだが 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 }}
```
まぁ良いだろう。
あとはここを手直しする
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"
書籍執筆だとファイル名に日本語を含めたくなるケースもあるので、以下も有効にしておく
- 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にクローズされました