February 5, 2016

'hugo new'を便利にするスクリプト

Categories: 技術 | Tags: #Hugo #Shell


hugo new post/hogehoge.mdと入力すると、content/post/hogehoge.mdとファイルが生成されますが、
これだと少し記事の管理が不便なので、

  • 毎回post/と付けるのを省きたい
  • markdownファイル名の前に日付を付けたい
  • 生成したあと、markdownのファイル名がtitle要素に含まれてしまうので、これをslug要素に移動させたい


の2点を解消するスクリプトを書いてみました。

ちなみに、default.mdは以下のようにしてあります。

+++
date = "now()"
slug = ""
title = ""
categories = ["未分類"]
tags = ["", "", ""]
+++

まず、

  • 毎回post/と付けるのを省きたい
  • markdownファイル名の前に日付を付けたい

ですが、スクリプトの引数で、markdownのファイル名を受け取って、以下のようにfile_nameを定義して、
これをhugo newに渡します。

slug="$1"
file_name="post/$(date +"%Y-%m-%d")-${slug}.md"
hugo new "$file_name"

これで、content/post/2016-02-05-hogehoge.md
のように記事が生成されます。

次に、

  • 生成したあと、markdownのファイル名がtitle要素に含まれてしまうので、これをslug要素に移動させたい

ですが、記事生成後に、sedコマンドで、

  • title = “@@@@” を title = “” に置換する
  • slug = “” を、 slug = “$slug” に置換する($slugはスクリプトで受け取ったファイル名)

を行います。”$file_path”を作って、sedに渡します。

file_path="content/$file_name"
sed -i '' 's/title = \".*\"/title = \"\"/g' "$file_path"
sed -i '' "s/slug = \".*\"/slug = \"$slug\"/g" "$file_path"

これで、毎回titleにファイル名が入ってしまうのを防いで、slugにファイル名を入れることが出来ました。

最終的なスクリプトファイルは以下のようになります。

#!/bin/bash
set -u

usage() {
  echo "Usage : $0 [-w] [title_name]" 1>&2
}

main () {
  cd $(cd $(dirname $0) && pwd)
  OPEN_EDITOR=0
  for ARG; do
    case "$ARG" in
      -*)
      while getopts w OPT "$ARG"; do
        case "$OPT" in
          w) OPEN_EDITOR=1;;
          *) usage; exit 1;;
        esac
      done
      ;;
    esac
  done

  shift $(expr $OPTIND - 1)
  [ $# -ne 1 ] && usage && exit 1

  slug="$1"
  file_name="post/$(date +"%Y-%m-%d")-${slug}.md"
  file_path="content/$file_name"
  if [ ! -e "$file_path" ]; then
    hugo new "$file_name"
    sed -i '' 's/title = \".*\"/title = \"\"/g' "$file_path"
    sed -i '' "s/slug = \".*\"/slug = \"$slug\"/g" "$file_path"
  else
    echo "$file_name already exists."
  fi

  [ $OPEN_EDITOR -eq 1 ] && atom "$file_path"

}
main "[email protected]"

”-w”をつけた時は、エディタ(Atom)で開いてすぐ編集できるようにしています。


written by sgr-ksmt