lb/lb

83 lines
5.4 KiB
Bash
Executable File

#!/bin/bash
name="Rick"
webdir="$PWD"
website="https://r1k.tilde.institute/" # Keep a trailing slash.
css="../style.css"
blogfile="$(date +%Y).html"
indexfile="blogindex.html"
rssfile="rss.xml"
archivefile="$webdir/blog/.htaccess"
[ -z "$EDITOR" ] && EDITOR="nvim"
[ ! -d "$webdir/blog/.drafts" ] &&
read -erp "Initialize blog in $webdir?" ask &&
if [ "$ask" = "y" ]; then
printf "Initializing blog system...\\n"
mkdir -pv "$webdir/blog/.drafts" || printf "Error. Do you have write permissions in this directory?\\n"
echo "Options +Indexes" > "$archivefile"
else
exit
fi
newpost() { read -erp "Give a title for your post:
" title
echo "$title" | grep -q "\"" && printf "Double quotation marks (\") are not allowed in entry titles.\\n" && exit
url="$(echo "$title" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g")"
echo "AddDescription \"$title\" \"$url.html\"" >> "$archivefile"|| { echo "Error: Is $archivefile writeable?"; exit; }
( [ -f "$webdir/blog/.drafts/$url.html" ] || [ -f "$webdir/blog/$url.html" ] ) && echo "There is already an existing draft or post of that same name/URL." && exit
$EDITOR "$webdir/blog/.drafts/$url.html" ;}
listandReturn() {
printf "Listing contents of %s\\n" "$1"
case "$(ls "$1" | wc -l)" in
0) echo "There's nothing to $2." && exit 1 ;;
1) number=1 && printf "There's only one entry to %s.\\nDefaulting selection to %s\\n" "$2" "$(ls -rc "$1" | awk -F '/' '{print $NF}')" ;;
*) ls -rc "$1" | awk -F '/' '{print $NF}' | nl
read -erp "Pick an entry by number to $2, or press Ctrl-C to cancel. " number ;;
esac
chosen="$(ls -rc "$1" | nl | grep -w " $number" | awk '{print $2}')"
basefile="$(basename "$chosen")" && base="${basefile%.*}"
}
publish() { \
delete draft
htaccessentry=$(grep "$basefile" "$archivefile")
realname="$(echo "$htaccessentry" | cut -d'"' -f2)"
rssdate="$(grep "$basefile" blog/.htaccess | sed "s/.*\.html\"* *#*//g" | tr -d '\n')"
[ -z "$rssdate" ] && rssdate="$(LC_TIME=en_US date '+%a, %d %b %Y %H:%M:%S %z')" # RSS date formats must comply with standards to validate.
webdate="$(date '+%a, %d %b %Y %H:%M:%S %z')" # But this visible date you can set to any format.
tmpdir=$(mktemp -d)
printf "<!DOCTYPE html>\\n<html lang=\"en\">\\n<head>\\n<title>%s</title>\\n<link rel='stylesheet' type='text/css' href='%s'>\\n<meta charset='utf-8'/>\\n</head>\\n<body>\\n<h1>%s</h1>\\n<small>[<a href='%s#%s'>link</a>&mdash;<a href='%s'>standalone</a>]</small>\\n%s\\n<footer>by <strong><a href='%s'>%s</a></strong></footer>\\n</body>\\n\\n</html>" "$realname" "$css" "$realname" "../$blogfile" "$base" "$basefile" "$(cat "$webdir/blog/.drafts/$basefile")" "$website" "$name" > "$webdir/blog/$basefile"
printf "\\n<item>\\n<title>%s</title>\\n<guid>%s%s#%s</guid>\\n<pubDate>%s</pubDate>\\n<description><![CDATA[\\n%s\\n]]></description>\\n</item>\\n\\n" "$realname" "$website" "$blogfile" "$base" "$rssdate" "$(cat "$webdir/blog/.drafts/$basefile")" > "$tmpdir/rss"
printf "<div class='entry'>\\n<h2 id='%s'>%s</h2>\\n<small>[<a href='#%s'>link</a>&mdash;<a href='%s'>standalone</a>]</small>\\n%s\\n<small>%s</small>\\n</div>\\n" "$base" "$realname" "$base" "blog/$basefile" "$(cat "$webdir/blog/.drafts/$basefile")" "$webdate" > "$tmpdir/html"
printf "<li>%s &ndash; <a href=\"blog/%s\">%s</a></li>\\n" "$(date '+%Y %b %d')" "$basefile" "$realname" > "$tmpdir/index"
sed -i "/<!-- LB -->/r $tmpdir/html" "$blogfile"
sed -i "/<!-- LB -->/r $tmpdir/rss" "$rssfile"
sed -i "/<!-- LB -->/r $tmpdir/index" "$indexfile"
sed -i "/ \"$base.html\"/d" "$archivefile"
echo "AddDescription \"$realname\" \"$basefile\" #$rssdate" >> "$archivefile"
rm -f "$webdir/blog/.drafts/$chosen"
}
confirm() { read -erp "Really $1 \"$base\"? (y/N) " choice && echo "$choice" | grep -qi "^y$" || exit 1 ;}
delete() { \
sed -i "/<item/{:a;N;/<\\/item>/!ba};/#$base<\\/guid/d" "$rssfile"
sed -i "/<div class='entry'>/{:a;N;/<\\/div>/!ba};/id='$base'/d" "$blogfile"
sed -i "/<li>.*<a href=\"blog\\/$base.html\">/d" "$indexfile"
rm -f "$webdir/blog/$basefile" && [[ "$1" != "draft" ]] && printf "Old blog entry removed.\\n";}
revise() { awk '/^<small>\[/{flag=1;next}/<footer>/{flag=0}flag' "$webdir/blog/$chosen" > "$webdir/blog/.drafts/$basefile"
"$EDITOR" "$webdir/blog/.drafts/$basefile"
printf "Revision stored in blog/.drafts. Publish as normal entry when desired.\\n" ;}
case "$1" in
n*) newpost ;;
e*) listandReturn "$webdir"/blog/.drafts/ edit && "$EDITOR" "$webdir/blog/.drafts/$chosen" ;;
p*) listandReturn "$webdir"/blog/.drafts/ publish && publish ;;
t*) listandReturn "$webdir"/blog/.drafts/ trash && confirm trash && rm -f "$webdir/blog/.drafts/$chosen" && sed -i "/ \"$base.html\"/d" "$archivefile" ; printf "Draft deleted.\\n" ;;
d*) listandReturn "$webdir"/blog/ delete && confirm delete && delete && sed -i "/ \"$base.html\"/d" "$archivefile" ;;
r*) listandReturn "$webdir"/blog/ revise && revise ;;
*) printf "lb blog system by Luke Smith <luke@lukesmith.xyz>\\nUsage:\\n lb n:\\tnew draft\\n lb e:\\tedit draft\\n lb p:\\tpublish/finalize draft\\n lb r:\\trevise published entry\\n lb t:\\tdiscard draft\\n lb d:\\tdelete published entry\\n\\nBe sure to have the following pattern added to your RSS feed, blog file and blog index:\\n\\n<!-- LB -->\\n\\nNew content will be added directly below that sequence. This is required.\\nSee https://github.com/LukeSmithxyz/lb for more.\\n" ;;
esac