#!/bin/sh # hugo cli frontend # needs: sh, fzf, grep, cat, cut tr, date (bsd date...), hugo, vim # deployments are handled using a Makefile (bring your own...) cd "$HOME/blog" # extra options appended to the menu _extra="--- deploy-test * Test Deployment deploy-prod * Prod Deployment maintenance * Maintenance Mode new * New Post quit * Quit Main Menu" # main loop while [ -z "$_quit" ] do # parse csv, build and show list _selection=$(hugo list all \ | grep -Ev ^path\|_index \ | while read _line do # csv fields: # 1: path # 2: slug # 3: title # 4: date # 5: expiryDate # 6: publishDate # 7: draft # 8: permalink # 9: kind # 10: section _file="$(echo $_line | cut -d"," -f1)" _title="$(echo $_line | cut -d"," -f3)" _draft=$(echo $_line | cut -d"," -f7) _draft_fmt=$([ "$_draft" == "true" ] && echo "(draft)") _date="$(echo $_line | cut -d"," -f4)" _date_fmt=$(date -f "%Y-%m-%dT%H:%M:%S" -j "$_date" +"%Y-%m-%d %H:%M") echo "$_file * $_date_fmt | $_title $_draft_fmt" done | (sort -t" " -k 2; echo "$_extra") \ | fzf -e --tac +s --with-nth 2.. \ | cut -d" " -f1) ### functions _new() { unset _newquit while [ -z "$_newquit" ] do unset _newtitle unset _filename echo "Enter Post Title" echo -n ": " read _newtitle if [ -n "$_newtitle" ] then # Welcome to my awful filename generator / sanitizer. # Improvements are welcome! _filename=$(echo "$_newtitle" \ | tr -d '?!%$:\\' \ | tr ' ./' '_' \ | tr -s '_' \ | tr '[:upper:]' '[:lower:]' \ | sed 's/_$//g;s/^_//g') fi if [ -n "$_filename" ] then echo "Creating:" echo "File: content/posts/$_filename.md" echo "Title: $_newtitle" echo -n "Ok? [Y/n]: " read _ok case "$_ok" in [nN]) ;; *) hugo new content --editor=vim "content/posts/$_filename.md" _newquit=1 ;; esac else echo "No title entered. Returning to menu." _newquit=1 sleep 1 fi done } _edit_entry() { unset _quitmenu while [ -z "$_quitmenu" ] do clear _f="${_newname:-$1}" echo "--- $_f:" echo head -15 "$_f" echo "---" echo echo "Filename: $(basename "$_f")" echo "Options: [E]dit, [D]elete, [R]ename, [T]oggle draft, [Q]uit Edit Menu" echo -n ": " read _opt case $_opt in [dD]) mkdir -p .trash; mv -f "$_f" .trash/ _quitmenu=1 ;; [qQ]) return ;; [tT]) grep -qE '^draft.*=.*false' "$_f" \ && sed -i 's/^draft.*=.*false/draft = true/' "$_f" \ || sed -i 's/^draft.*=.*true/draft = false/' "$_f" ;; [rR]) echo "old: $(basename "$_f")" echo -n "new: " read _newname; echo -n "ok? [Y/n]: " read _ok case "$_ok" in [nN]) unset _newname ;; *) _newname="content/posts/$_newname" mv -vf "$_f" "$_newname" ;; esac ;; *) vim "$_f" ;; [qQ]) _quitmenu=1 ;; esac done } case "$_selection" in new) _new ;; ---) ;; deploy-test) make update ;; deploy-prod) make prod ;; maintenance) make maintenance ;; quit) _quit=1; echo "Good bye." ;; *) [ -n "$_selection" ] \ && _edit_entry "$_selection" \ || _quit=1 ;; esac done