Hugoの記事作成をちょっと楽にして、スラグを英訳するシェルスクリプトを書いた
2022-12-17はじめに
Hugoでブログを書き始めた。
記事を書きだすにも色々と考えなくっちゃいけないことがあって面倒だと思った。
なので、ちょっとだけ楽ができるようにシェルスクリプトを書いて、ぷち自動化を図ることにした。
その手順のメモ。
やりたいこと
sh new.sh
とターミナルに打ち込んだら、こんな動作をさせたい。
- 引数なしにスクリプトを起動したら、マイクロブログ用のテンプレートを出してくる。
- 引数1つなら、それをファイル名として、拡張子
.md
をつけて、ブログ用のディレクトリに配置する。 - 引数2つなら、第1引数をセクション名に、第2引数を上のようにして、適切なディレクトリに配置する。
- ファイル名を英訳して、slugに挿入する。
- 新規作成した記事
.md
をそのままVSCodeで開く。 - 何も編集しなかったら、記事
.md
は削除する。
暫定版
もっと綺麗に書けるだろう…というのは置いておいて、素直にやりたいことをシェルスクリプトに書き出していったらこうなった。
#!/bin/sh
FILENAME=""
SECTION=""
CURRENT=`pwd`
YEAR=`date "+%Y"`
MONTH=`date "+%m"`
if [ "$#" -eq 0 ]; then
echo "ログファイルをつくります。"
FILENAME=`date "+%Y%m%d%H%M%S"`
SECTION="logs/status"
elif [ -z "$1" ]; then
echo "空白の引数があります。"
exit 1
elif [ "$#" -eq 1 ]; then
FILENAME=$1
SECTION="blog/${YEAR}/${MONTH}"
elif [ -z "$2" ]; then
echo "空白の引数があります。"
exit 1
elif [ "$#" -eq 2 ]; then
FILENAME=$2
SECTION=$1
else
echo "引数が多すぎます。"
exit 1
fi
hugo new "${SECTION}/${FILENAME}.md"
FILE="${CURRENT}/content/${SECTION}/${FILENAME}.md"
if [ "$SECTION" != "logs/status" ]; then
SLUG=`trans -b ja=en ${FILENAME}`
sed -i "" -e "s/stringToBeReplaced/${SLUG// /-}/g" $FILE
fi
BEFORE=`wc -c ${FILE}`
code $FILE -w
AFTER=`wc -c ${FILE}`
if [ "$BEFORE" = "$AFTER" ]; then
echo "更新なし"
rm $FILE
fi
archetypes のfrontmatterには以下の記述を挿入しておく。
slug: "stringToBeReplaced-{{- $ID -}}"
手順
まず、使うであろう変数を書き出す。
FILENAME=""
SECTION=""
CURRENT=`pwd`
YEAR=`date "+%Y"`
MONTH=`date "+%m"`
次に、コマンドライン引数の数で分岐させる処理を書く。
if [ "$#" -eq 0 ]; then
echo "ログファイルをつくります。"
FILENAME=`date "+%Y%m%d%H%M%S"`
SECTION="logs/status"
elif [ -z "$1" ]; then
echo "空白の引数があります。"
exit 1
elif [ "$#" -eq 1 ]; then
FILENAME=$1
SECTION="blog/${YEAR}/${MONTH}"
elif [ -z "$2" ]; then
echo "空白の引数があります。"
exit 1
elif [ "$#" -eq 2 ]; then
FILENAME=$2
SECTION=$1
else
echo "引数が多すぎます。"
exit 1
fi
引数が3つ以上だった場合と、引数があっても空白だった場合には終了させている。
関数化したら良いようにも思ったが、とりあえずベタ打ちした。
Hugoの記事を生成し、もし、引数0の場合でなかったら、frontmatter内のstringToBeReplaced
を英訳したファイル名で置換する処理を下記のように書いた。
hugo new "${SECTION}/${FILENAME}.md"
FILE="${CURRENT}/content/${SECTION}/${FILENAME}.md"
if [ "$SECTION" != "logs/status" ]; then
SLUG=`trans -b ja=en ${FILENAME}`
sed -i "" -e "s/stringToBeReplaced/${SLUG// /-}/g" $FILE
fi
trans
コマンドはTranslate Shellを利用している。macOSならbrew install translate-shell
で導入できる。
ファイルの前後のサイズを取得して、VSCodeで編集されているかを判定する処理はこんな感じにした。
BEFORE=`wc -c ${FILE}`
code $FILE -w
AFTER=`wc -c ${FILE}`
if [ "$BEFORE" = "$AFTER" ]; then
echo "更新なし"
rm $FILE
fi
おわりに
これ、スクリプト言語で書いたら…とか、頭に#!/bin/sh
とつけているけど、bashとかzshでないsh環境でほんとうに動くのか、とかあるけれども、とりあえず自分の環境でやりたいことができたので、これで満足。
不満が出てきたら、その時はまた手直しすることにしよう。