Update 2024-12-26 14:23 OpenBSD/amd64-t14
This commit is contained in:
131
.bin/blog
Executable file
131
.bin/blog
Executable file
@@ -0,0 +1,131 @@
|
||||
#!/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
|
||||
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() {
|
||||
echo "Enter Post Title"
|
||||
echo -n ": "
|
||||
read _title
|
||||
if [ -n "$_title" ]
|
||||
then
|
||||
# Welcome to my awful filename generator / sanitizer.
|
||||
# Improvements are welcome!
|
||||
_filename=$(echo "$_title" \
|
||||
| tr -d '?!%$:\\' \
|
||||
| tr ' ./' '_' \
|
||||
| tr -s '_' \
|
||||
| tr '[:upper:]' '[:lower:]' \
|
||||
| sed 's/_$//g;s/^_//g')
|
||||
fi
|
||||
if [ -n "$_filename" ]
|
||||
then
|
||||
echo "Creating content/posts/$_filename.md"
|
||||
echo -n "Ok? [Y/n]"
|
||||
read _ok
|
||||
case "$_ok" in
|
||||
[nN]) return ;;
|
||||
esac
|
||||
hugo new content --editor=vim content/posts/$_filename.md
|
||||
else
|
||||
echo "No title entered. Returning to menu."
|
||||
sleep 1
|
||||
fi
|
||||
exit 0
|
||||
}
|
||||
_edit_entry() {
|
||||
unset _quitmenu
|
||||
while [ -z "$_quitmenu" ]
|
||||
do
|
||||
clear
|
||||
_f="${_newname:-$1}"
|
||||
echo
|
||||
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
|
||||
[eE]) vim "$_f" ;;
|
||||
[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]) return ;;
|
||||
esac
|
||||
_newname="content/posts/$_newname"
|
||||
mv -vf "$_f" "$_newname"
|
||||
;;
|
||||
*) _quitmenu=1 ;;
|
||||
[qQ]) _quitmenu=1 ;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
case "$_selection" in
|
||||
new) _new ;;
|
||||
---) ;;
|
||||
deploy-test) make update ;;
|
||||
deploy-prod) make prod ;;
|
||||
new) _new ;;
|
||||
quit) _quit=1; echo "Good bye." ;;
|
||||
*) [ -n "$_selection" ] \
|
||||
&& _edit_entry "$_selection" \
|
||||
|| _quit=1 ;;
|
||||
esac
|
||||
done
|
||||
Reference in New Issue
Block a user