1o0 Project

Hugoの記事作成をちょっと楽にして、スラグを英訳するシェルスクリプトを書いた

2022-12-17

はじめに

Hugoでブログを書き始めた。

記事を書きだすにも色々と考えなくっちゃいけないことがあって面倒だと思った。

なので、ちょっとだけ楽ができるようにシェルスクリプトを書いて、ぷち自動化を図ることにした。

その手順のメモ。

やりたいこと

sh new.shとターミナルに打ち込んだら、こんな動作をさせたい。

暫定版

もっと綺麗に書けるだろう…というのは置いておいて、素直にやりたいことをシェルスクリプトに書き出していったらこうなった。

#!/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環境でほんとうに動くのか、とかあるけれども、とりあえず自分の環境でやりたいことができたので、これで満足。

不満が出てきたら、その時はまた手直しすることにしよう。