lb/lb

91 lines
4.5 KiB
Bash
Executable File

#!/usr/bin/env sh
# Set your personal data here:
rssfile="rss.xml"
blogfile="2018.html"
website="https://lukesmith.xyz/"
indexfile="blogindex.html"
stylesheet="..\/style.css" # Characters should be escaped for this variable.
author="<a href=\"$website\">Luke Smith<\/a>"
dir=$(pwd)
draftdir="$dir"/blog/.drafts
blogdir="$dir"/blog
# Set vi if $EDITOR not set
[ -z $EDITOR ] && EDITOR="vi";
# See other variables defined later, such as `header` and `webdate` for more customizability.
getHelp() { \
echo -e "This system will take the blog entries you write and add them into the RSS file and HTML file of your choosing. Set which files to use by editing the 'lb' file directly and changing the variables at the top.\n"
echo -e "To fully prepare these files, add the following line to both files where you want the content to be added:\n"
echo -e "<!-- LB -->\n"
echo -e "Usage: 'new': create new draft; 'finalize': finish draft and add it to the RSS and HTML page; 'delete': delete a finished page.\n"
echo -e "As you finalize posts, they will be appended in the appropriate format below that line.\n"
echo -e "Blog posts will be stored in 'blog/' and drafts will be in 'blog/.drafts/'. To delete drafts, you only need delete their .html files directly, but use the 'lb delete' command to remove finalized posts since they appear in three places."
}
listandReturn() { \
echo "Listing contents of $1."
ls -rc $1 | awk -F '/' '{print $NF}' | nl
read -rp "Pick an entry by number to $2, or press ctrl-c to cancel. " number
chosen=$(ls -rc $1 | nl | grep -w "$number" | awk '{print $2}')
}
getTitle() { \
echo "Post will be stored as draft in $draftdir until finalized."
read -rp "Give a title for your post: " title
url=$(echo "$title" | tr -d '[:punct:]' | tr " " "-" | tr '[:upper:]' '[:lower:]')
grep "$url" "$blogfile" &>/dev/null && lbdupnum=1 && while [ grep "$url" "$blogfile" ]; do lbdupnum=$((lbdupnum+1)); done
[ ! -z ${lbdupnum+x} ] && url="$url"-"$lbdupnum"
return 0
}
postNew() { \
mkdir -p "$draftdir"
echo -e "<h2 id='$url'>$title</h2>\n<small>[<a href=\"$blogfile#$url\">link</a>&mdash;<a href=\"blog/$url.html\">standalone</a>]</small>\n\n<++>" >> "$draftdir"/$url.html && $EDITOR "$draftdir"/$url.html
}
finalize() { \
url=$(grep -o "<h2 id='\(.\)*'>" "$draftdir"/"$chosen" | cut -d "'" -f2)
title=$(grep -o "<h2 id='\(.\)*h2>" "$draftdir"/"$chosen" | sed -e 's/<[^>]*>//g')
echo "AddDescription \"$title\" $chosen" >> "$blogdir"/.htaccess
rssdate=$(date '+%a, %d %b %Y %H:%M:%S %z')
webdate=$(date '+%a, %d %b %Y %H:%M:%S %z')
listformat='<li>'$(date '+%Y %b %d')' &ndash; <a href="blog/'$url'.html">'$title'</a></li>'
tmpdir=$(mktemp -d)
echo -e "\n<item>\n<title>$title</title>\n<guid>$website$blogfile#$url</guid>\n<pubDate>$rssdate</pubDate>\n<description><![CDATA[\n$(awk 'a==1;/^$/{a=1}' "$draftdir"/"$chosen")\n]]></description>\n</item>\n"> $tmpdir/rss.xml
echo -e "\n<div class=\"entry\">\n$(cat "$draftdir"/"$chosen")\n<small>$webdate</small>\n</div>\n" > $tmpdir/html.html
sed -i "/<!-- LB -->/r $tmpdir/html.html" $blogfile
sed -i "/<!-- LB -->/r $tmpdir/rss.xml" $rssfile
sed -i "/<!-- LB -->/a $listformat" $indexfile
header="<html>\n<head>\n<title>$title<\/title>\n<link rel='stylesheet' type='text\/css' href='$stylesheet'>\n<meta charset='utf-8'\/>\n<\/head>\n<body>"
footer="<\/body>\n<footer>by <strong>$author<\/strong><\/footer>\n<\/html>"
sed "s/href=\"/href=\"..\//g;s/\.\.\/http/http/g;0,/^/s//$header/;0,/<h2 id=/s//<h1 id=/;0,/h2>/s//h1>/;\$a$footer" "$draftdir"/"$chosen" > "$blogdir"/"$chosen"
rm "$draftdir"/"$chosen"
}
delete() { \
base=$(basename $(echo "$chosen" | cut -f1 -d'.'))
read -rp "Really delete \"$base\"? (y/N) " choice
[[ $choice =~ [Yy] ]] || exit
sed -i "/<item/{:a;N;/<\/item>/!ba};/#$base<\/guid/d" $rssfile && echo "Entry removed from RSS feed file."
sed -i "/<div/{:a;N;/<\/div>/!ba};/id='$base'/d" $blogfile && echo "HTML code removed from blogfile."
sed -i "/<li>.*<a href=\"blog\/$base.html\">/d" $indexfile && echo "Index file entry removed."
rm "$chosen" && echo "Blog post deleted from directories."
}
discard() { \
base=$(echo "$chosen" | cut -f1 -d'.')
read -rp "Really discard \"$(basename $chosen)\"? (y/N) " choice
[[ $choice =~ [Yy] ]] || exit
rm "$chosen" && echo "Blog draft discarded."
}
case "$1" in
new) getTitle && postNew ;;
discard) listandReturn "$draftdir/*.html" discard && discard ;;
finalize) listandReturn "$draftdir" finalize && finalize ;;
delete) listandReturn "$blogdir/*.html" delete && delete ;;
edit) listandReturn "$draftdir/*.html" edit && vim "$chosen" ;;
*) getHelp ;;
esac