144 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/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
 |