diff --git a/plugins/available/jekyll.plugin.bash b/plugins/available/jekyll.plugin.bash index c340c432..7fef0065 100644 --- a/plugins/available/jekyll.plugin.bash +++ b/plugins/available/jekyll.plugin.bash @@ -1,367 +1,317 @@ +# shellcheck shell=bash cite about-plugin about-plugin 'manage your jekyll site' -editpost() { - about 'edit a post' - param '1: site directory' - group 'jekyll' +function editpost() { + about 'edit a post' + param '1: site directory' + group 'jekyll' - unset SITE - if [ -z "$1" ] - then - echo "Error: no site specified." - echo "The site is the name of the directory your project is in." - return 1 - fi + local SITE site POST DATE TITLE POSTS TMPFILE POST_TO_EDIT + local -i COUNTER + if [[ -z "${1:-}" ]]; then + echo "Error: no site specified." + echo "The site is the name of the directory your project is in." + return 1 + fi - for site in ${SITES[@]} - do - if [ "${site##*/}" = "$1" ] - then - SITE=$site - break - fi - done + for site in "${SITES[@]:-}"; do + if [[ "${site##*/}" == "$1" ]]; then + SITE="${site}" + break + fi + done - if [ -z "$SITE" ] - then - echo "No such site." - return 1 - fi + if [[ -z "${SITE:-}" ]]; then + echo "No such site." + return 1 + fi - builtin cd "$SITE/_posts" + builtin cd "${SITE}/_posts" || return - COUNTER=1 - NUMBER="$RANDOM" - TMPFILE="/tmp/editpost-$NUMBER" + COUNTER=1 + TMPFILE="/tmp/editpost-$RANDOM" - for POST in * - do - DATE=`echo $POST | grep -oE "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}"` - TITLE=`cat $POST | grep -oE "title: (.+)"` - TITLE=`echo $TITLE | sed 's/title: //'` - echo "$COUNTER) $DATE $TITLE" >> "$TMPFILE" - POSTS[$COUNTER]=$POST - COUNTER=`expr $COUNTER + 1` - done - less $TMPFILE - read -p "Number of post to edit: " POST_TO_EDIT - if [ -z "$JEKYLL_EDITOR" ] - then - nano "${POSTS[$POST_TO_EDIT]}" - else - "$JEKYLL_EDITOR" "${POSTS[$POST_TO_EDIT]}" - fi + for POST in *; do + DATE="$(echo "${POST}" | grep -oE "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}")" + TITLE="$(grep -oE "title: (.+)" < "${POST}")" + TITLE="${TITLE/title: /}" + echo "${COUNTER}) ${DATE} ${TITLE}" >> "${TMPFILE}" + POSTS[COUNTER]="$POST" + COUNTER="$((COUNTER + 1))" + done + less "${TMPFILE}" + read -rp "Number of post to edit: " POST_TO_EDIT + "${JEKYLL_EDITOR:-${VISUAL:-${EDITOR:-${ALTERNATE_EDITOR:-nano}}}}" "${POSTS[$POST_TO_EDIT]}" } -newpost() { - about 'create a new post' - param '1: site directory' - group 'jekyll' +function newpost() { + about 'create a new post' + param '1: site directory' + group 'jekyll' - unset SITE - if [ -z "$1" ] - then - echo "Error: no site specified." - echo "The site is the name of the directory your project is in." - return 1 - fi + local SITE site FNAME_POST_TITLE FNAME YAML_DATE + local JEKYLL_FORMATTING FNAME_DATE OPTIONS OPTION POST_TYPE POST_TITLE + if [ -z "$1" ]; then + echo "Error: no site specified." + echo "The site is the name of the directory your project is in." + return 1 + fi - if [ -z "$SITE" ] - then - echo "No such site." - return 1 - fi + if [ -z "$SITE" ]; then + echo "No such site." + return 1 + fi - loc=0 + loc=0 - for site in ${SITES[@]} - do - if [ "${site##*/}" = "$1" ] - then - SITE=$site - JEKYLL_FORMATTING=${MARKUPS[$loc]} - break - fi - loc=$(($loc+1)) - done + for site in "${SITES[@]}"; do + if [ "${site##*/}" = "$1" ]; then + SITE=$site + JEKYLL_FORMATTING=${MARKUPS[$loc]} + break + fi + loc=$((loc + 1)) + done - # 'builtin cd' into the local jekyll root + # 'builtin cd' into the local jekyll root - builtin cd "$SITE/_posts" + builtin cd "${SITE}/_posts" || return - # Get the date for the new post's filename + # Get the date for the new post's filename - FNAME_DATE=$(date "+%Y-%m-%d") + FNAME_DATE="$(date "+%Y-%m-%d")" - # If the user is using markdown or textile formatting, let them choose what type of post they want. Sort of like Tumblr. + # If the user is using markdown or textile formatting, let them choose what type of post they want. Sort of like Tumblr. - OPTIONS="Text Quote Image Audio Video Link" + OPTIONS=('Text' 'Quote' 'Image' 'Audio' 'Video' 'Link') - if [ $JEKYLL_FORMATTING = "markdown" -o $JEKYLL_FORMATTING = "textile" ] - then - select OPTION in $OPTIONS - do - if [[ $OPTION = "Text" ]] - then - POST_TYPE="Text" - break - fi + if [[ $JEKYLL_FORMATTING == "markdown" || $JEKYLL_FORMATTING == "textile" ]]; then + select OPTION in "${OPTIONS[@]}"; do + if [[ $OPTION = "Text" ]]; then + POST_TYPE="Text" + break + fi - if [[ $OPTION = "Quote" ]] - then - POST_TYPE="Quote" - break - fi + if [[ $OPTION = "Quote" ]]; then + POST_TYPE="Quote" + break + fi - if [[ $OPTION = "Image" ]] - then - POST_TYPE="Image" - break - fi + if [[ $OPTION = "Image" ]]; then + POST_TYPE="Image" + break + fi - if [[ $OPTION = "Audio" ]] - then - POST_TYPE="Audio" - break - fi + if [[ $OPTION = "Audio" ]]; then + POST_TYPE="Audio" + break + fi - if [[ $OPTION = "Video" ]] - then - POST_TYPE="Video" - break - fi + if [[ $OPTION = "Video" ]]; then + POST_TYPE="Video" + break + fi - if [[ $OPTION = "Link" ]] - then - POST_TYPE="Link" - break - fi - done - fi + if [[ $OPTION = "Link" ]]; then + POST_TYPE="Link" + break + fi + done + fi - # Get the title for the new post + # Get the title for the new post - read -p "Enter title of the new post: " POST_TITLE + read -rp "Enter title of the new post: " POST_TITLE - # Convert the spaces in the title to hyphens for use in the filename + # Convert the spaces in the title to hyphens for use in the filename - FNAME_POST_TITLE=`echo $POST_TITLE | tr ' ' "-"` + FNAME_POST_TITLE="${POST_TITLE/ /-}" - # Now, put it all together for the full filename + # Now, put it all together for the full filename - FNAME="$FNAME_DATE-$FNAME_POST_TITLE.$JEKYLL_FORMATTING" + FNAME="$FNAME_DATE-$FNAME_POST_TITLE.$JEKYLL_FORMATTING" - # And, finally, create the actual post file. But we're not done yet... + # And, finally, create the actual post file. But we're not done yet... + # Write a little stuff to the file for the YAML Front Matter - touch "$FNAME" + echo "---" >> "${FNAME}" - # Write a little stuff to the file for the YAML Front Matter + # Now we have to get the date, again. But this time for in the header (YAML Front Matter) of + # the file - echo "---" >> $FNAME + YAML_DATE="$(date "+%B %d %Y %X")" - # Now we have to get the date, again. But this time for in the header (YAML Front Matter) of - # the file + # Echo the YAML Formatted date to the post file - YAML_DATE=$(date "+%B %d %Y %X") + echo "date: $YAML_DATE" >> "${FNAME}" - # Echo the YAML Formatted date to the post file + # Echo the original post title to the YAML Front Matter header - echo "date: $YAML_DATE" >> $FNAME + echo "title: $POST_TITLE" >> "${FNAME}" - # Echo the original post title to the YAML Front Matter header + # And, now, echo the "post" layout to the YAML Front Matter header - echo "title: $POST_TITLE" >> $FNAME + echo "layout: post" >> "${FNAME}" - # And, now, echo the "post" layout to the YAML Front Matter header + # Close the YAML Front Matter Header - echo "layout: post" >> $FNAME + echo "---" >> "${FNAME}" + echo >> "${FNAME}" - # Close the YAML Front Matter Header + # Generate template text based on the post type - echo "---" >> $FNAME - echo >> $FNAME + if [[ $JEKYLL_FORMATTING == "markdown" ]]; then + if [[ $POST_TYPE == "Text" ]]; then + true + fi - # Generate template text based on the post type + if [[ $POST_TYPE == "Quote" ]]; then + echo "> Quote" >> "${FNAME}" + echo >> "${FNAME}" + echo "— Author" >> "${FNAME}" + fi - if [[ $JEKYLL_FORMATTING = "markdown" ]] - then - if [[ $POST_TYPE = "Text" ]] - then - true - fi + if [[ $POST_TYPE == "Image" ]]; then + echo "![Alternate Text](/path/to/image/or/url)" >> "${FNAME}" + fi - if [[ $POST_TYPE = "Quote" ]] - then - echo "> Quote" >> $FNAME - echo >> $FNAME - echo "— Author" >> $FNAME - fi + if [[ $POST_TYPE == "Audio" ]]; then + echo "" >> "${FNAME}" + fi - if [[ $POST_TYPE = "Image" ]] - then - echo "![Alternate Text](/path/to/image/or/url)" >> $FNAME - fi + if [[ $POST_TYPE == "Video" ]]; then + echo "" >> "${FNAME}" + fi - if [[ $POST_TYPE = "Audio" ]] - then - echo "" >> $FNAME - fi + if [[ $POST_TYPE == "Link" ]]; then + echo "[link][1]" >> "${FNAME}" + echo >> "${FNAME}" + echo "> Quote" >> "${FNAME}" + echo >> "${FNAME}" + echo "[1]: url" >> "${FNAME}" + fi + fi - if [[ $POST_TYPE = "Video" ]] - then - echo "" >> $FNAME - fi + if [[ $JEKYLL_FORMATTING == "textile" ]]; then + if [[ $POST_TYPE == "Text" ]]; then + true + fi - if [[ $POST_TYPE = "Link" ]] - then - echo "[link][1]" >> $FNAME - echo >> $FNAME - echo "> Quote" >> $FNAME - echo >> $FNAME - echo "[1]: url" >> $FNAME - fi - fi + if [[ $POST_TYPE == "Quote" ]]; then + echo "bq. Quote" >> "${FNAME}" + echo >> "${FNAME}" + echo "— Author" >> "${FNAME}" + fi - if [[ $JEKYLL_FORMATTING = "textile" ]] - then - if [[ $POST_TYPE = "Text" ]] - then - true - fi + if [[ $POST_TYPE == "Image" ]]; then + echo "!url(alt text)" >> "${FNAME}" + fi - if [[ $POST_TYPE = "Quote" ]] - then - echo "bq. Quote" >> $FNAME - echo >> $FNAME - echo "— Author" >> $FNAME - fi + if [[ $POST_TYPE == "Audio" ]]; then + echo "" >> "${FNAME}" + fi - if [[ $POST_TYPE = "Image" ]] - then - echo "!url(alt text)" >> $FNAME - fi + if [[ $POST_TYPE == "Video" ]]; then + echo "" >> "${FNAME}" + fi - if [[ $POST_TYPE = "Audio" ]] - then - echo "" >> $FNAME - fi + if [[ $POST_TYPE == "Link" ]]; then + echo "\"Site\":url" >> "${FNAME}" + echo >> "${FNAME}" + echo "bq. Quote" >> "${FNAME}" + fi + fi - if [[ $POST_TYPE = "Video" ]] - then - echo "" >> $FNAME - fi + # Open the file in your favorite editor - if [[ $POST_TYPE = "Link" ]] - then - echo "\"Site\":url" >> $FNAME - echo >> $FNAME - echo "bq. Quote" >> $FNAME - fi - fi - - # Open the file in your favorite editor - - "$JEKYLL_EDITOR" $FNAME + "${JEKYLL_EDITOR:-${VISUAL:-${EDITOR:-${ALTERNATE_EDITOR:-nano}}}}" "${FNAME}" } function testsite() { - about 'launches local jekyll server' - param '1: site directory' - group 'jekyll' + about 'launches local jekyll server' + param '1: site directory' + group 'jekyll' - unset SITE - if [ -z "$1" ] - then - echo "Error: no site specified." - echo "The site is the name of the directory your project is in." - return 1 - fi + local SITE site + if [[ -z "${1:-}" ]]; then + echo "Error: no site specified." + echo "The site is the name of the directory your project is in." + return 1 + fi - for site in ${SITES[@]} - do - if [ "${site##*/}" = "$1" ] - then - SITE=$site - break - fi - done + for site in "${SITES[@]}"; do + if [[ "${site##*/}" == "$1" ]]; then + SITE="$site" + break + fi + done - if [ -z "$SITE" ] - then - echo "No such site." - return 1 - fi + if [[ -z "${SITE}" ]]; then + echo "No such site." + return 1 + fi - builtin cd $SITE - jekyll --server --auto + builtin cd "${SITE}" || return + jekyll --server --auto } function buildsite() { - about 'builds site' - param '1: site directory' - group 'jekyll' + about 'builds site' + param '1: site directory' + group 'jekyll' - unset SITE - if [ -z "$1" ] - then - echo "Error: no site specified." - echo "The site is the name of the directory your project is in." - return 1 - fi + local SITE site + if [[ -z "${1:-}" ]]; then + echo "Error: no site specified." + echo "The site is the name of the directory your project is in." + return 1 + fi - for site in ${SITES[@]} - do - if [ "${site##*/}" = "$1" ] - then - SITE=$site - break - fi - done + for site in "${SITES[@]}"; do + if [[ "${site##*/}" == "$1" ]]; then + SITE="$site" + break + fi + done - if [ -z "$SITE" ] - then - echo "No such site." - return 1 - fi + if [[ -z "${SITE}" ]]; then + echo "No such site." + return 1 + fi - builtin cd $SITE - rm -rf _site - jekyll --no-server + builtin cd "${SITE}" || return + rm -rf _site + jekyll --no-server } function deploysite() { - about 'rsyncs site to remote host' - param '1: site directory' - group 'jekyll' + about 'rsyncs site to remote host' + param '1: site directory' + group 'jekyll' - unset SITE - if [ -z "$1" ] - then - echo "Error: no site specified." - echo "The site is the name of the directory your project is in." - return 1 - fi + local SITE site REMOTE + local -i loc=0 + if [[ -z "${1:-}" ]]; then + echo "Error: no site specified." + echo "The site is the name of the directory your project is in." + return 1 + fi - loc=0 + for site in "${SITES[@]}"; do + if [ "${site##*/}" == "$1" ]; then + SITE="$site" + REMOTE="${REMOTES[loc]}" + break + fi + loc=$((loc + 1)) + done - for site in ${SITES[@]} - do - if [ "${site##*/}" = "$1" ] - then - SITE=$site - REMOTE=${REMOTES[$loc]} - break - fi - loc=$(($loc+1)) - done + if [[ -z "${SITE}" ]]; then + echo "No such site." + return 1 + fi - if [ -z "$SITE" ] - then - echo "No such site." - return 1 - fi - - builtin cd $SITE - rsync -rz $REMOTE + builtin cd "${SITE}" || return + rsync -rz "${REMOTE?}" }