2021/05/13
はじめに
Gatsby+Typescriptでブログを開設したのだが,新しいポストを簡単に生成する方法がほしくなりました.
チラッと探したところ,ブログを生成する方法ばかりがヒットし,単体のポストを生成する方法が見当たりませんでした.
なので,いつか公式のPost生成コマンドを見つけるその日までの続きとして,簡単なシェルスクリプトを作りました.
本文
コード全文
まずは,作成したコード(シェルスクリプト)全文を記載する.
「スニペットだけくれよ!」という方はこちらを使ってほしい.
#!/usr/bin/env bash
contentname=$1
contentdir="content/blog/${contentname}"
if [ -d "${contentdir}" ]; then
echo "[WARNING] dir already exists: \`${contentdir}\`"
else
mkdir $contentdir
fi
contentpath="${contentdir}/index.md"
if [ -f ${contentpath} ]; then
echo "[ERROR] file already exists: \`${contentpath}\`"
exit 1 # Guard overwritting
fi
echo "---
title: \"${contentname}\"
date: \"$(date '+%Y-%m-%dT%H:%M:%S')\"
description: \"\"
tags: []
---
" > ${contentpath}
# if you use this script in vscode integrated terminal and open file.
# uncomment following line!
# code -r ${contentpath}
解説
まずは,コマンドライン引数からhttps://xxx/<post-name>
の<post-name>
部分を受け取り,
それをcontentname
という変数に格納する.
同時に,コンテンツのMarkdownや画像などを配置するためのディレクトリ名になるものを変数化する.
contentname=$1
contentdir="content/blog/${contentname}"
ディレクトリがすでに存在するとmkdir
がエラー終了するので,すでに存在するかどうかをチェックしてあげる.
存在する場合は警告のようなものを表示し,存在しない場合は新しいポストを配置するディレクトリを生成する.
if [ -d "${contentdir}" ]; then
echo "[WARNING] dir already exists: \`${contentdir}\`"
else
mkdir $contentdir
fi
ここまではディレクトリが存在してもしなくてもスクリプトは処理される.
ここからだが,テンプレートの生成にリダイレクトを使うので,ファイルが存在すると上書きしてしまう.
なので,ファイル.../index.md
が存在する場合はエラー修了にした.
それらしい出力と共にエラー終了する.
contentpath="${contentdir}/index.md"
if [ -f ${contentpath} ]; then
echo "[ERROR] file already exists: \`${contentpath}\`"
exit 1 # Guard overwritting
fi
最後に,リダイレクトを使ってMarkdownのテンプレートを生成する.
title
はコマンドライン引数を用い,date
は YYYY-MM-DDTHH:MM:SS の形式で記録する.
HTMLに残るのは YYYY-MM-DDまでなのだが,HH:MM:SSを書いておかないと,同じ日に複数のポストを生成した際に時間順ではなく名前順に並んでしまうため,それを避けるために時間まで入力しておく.
description
はオプションだが,入力しておくと,Post一覧での表示文を制御できる.
tags
は,今後機能として追加していきたい.
echo "---
title: \"${contentname}\"
date: $(date '+%Y-%m-%dT%H:%M:%S')
description: \"\"
tags: []
---
" > ${contentpath}
もしVSCodeのIntegrated Terminalでコマンド実行してそのまま編集する場合は, 以下が便利である.
code -r ${contentpath}
おわりに
よかったら活用してください.
Nodejsに書き換えたいなと思っています(が,詳しくないので時間がかかりそうです).