ys memos

Blog

Gatsbyブログで新しいポストを生成するスクリプト作った


bash

2021/05/13


Gatsby+Typescriptでブログを開設したのだが,新しいポストを簡単に生成する方法がほしくなりました.

チラッと探したところ,ブログを生成する方法ばかりがヒットし,単体のポストを生成する方法が見当たりませんでした.

なので,いつか公式のPost生成コマンドを見つけるその日までの続きとして,簡単なシェルスクリプトを作りました.



まずは,作成したコード(シェルスクリプト)全文を記載する.

「スニペットだけくれよ!」という方はこちらを使ってほしい.

create_content.sh
#!/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に書き換えたいなと思っています(が,詳しくないので時間がかかりそうです).


関連タグを探す