83 lines
5.4 KiB
Bash
Executable File
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>—<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>—<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 – <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
|