#!/bin/bash
blogdir="arachnida_blog"
imgdir="assets/img"
datafile="../doc/data.txt"
drafts="drafts"
template="../doc/templates/template.html"
index_template="../doc/templates/index-template.html"
index_tag_template="../doc/templates/index-tag-template.html"
rss_template="../doc/templates/rss-template.xml"
rss_file="~/Doc/programming/website/arachnida_blog/rss/rss.xml"
# Colored Output
RED='\033[0;31m'
GREEN='\033[0;32m'
RESET='\033[0m'
# Update
function update () {
#printf 'Updating: arachnida.blog\n' | dzen2 -bg white -fg black -p 2 -x -375 -y 50 -w 275 -h 50
rsync -uvrp --delete-after "$blogdir" root@"$DOMAIN":"$REMOTE_LOCATION"
printf "\n\n${GREEN}Website has been updated.${RESET}\n\n"
}
# Pick an entry
function listitem () {
printf "\nContents of %s:\n" "$1"
case "$(ls --hide "img" "$1" | wc -l)" in
0) printf "${RED}No drafts made yet.\n\n${GREEN}Redirecting...${RESET}\n\n" && blog ;;
1) number=1 && printf "Only one draft available.\n" ;;
*) ls -rc --hide "img" "$1" | awk -F '/' '{print $NF}' | sed 's/\.html$//' | nl # edited
printf "\nPick and entry by number to %s" "$2: " | sed 's/blog_//g' && read number
esac
entry="$(ls --hide "img" -rc "$1" | nl | grep -w " $number" | awk '{print $2}')"
basefile="$(basename "$entry")" && base="${basefile%.*}"
}
# Confirm a choice
function confirm () { read -p "Really $1 \"$base\"? (y/N) " choice && echo "$choice" | grep -qi "^y$" || exit 1; }
# Create a new blog draft
function blog_draft () {
read -e -p "Give your post a title: " title
max=0
while [ $max == 0 ]; do
read -e -p "Enter a description (50 words limit): " description
[ $(echo "$description" | wc -w) -ge "50" ] && echo "Description must be less than 50 words." || max=1
done
read -e -r -p "Input an image to reflect your post: " img
while [ ! -e $img ]; do
read -e -r -p "$img does not exist. Please try another path: " img
done
url="$(echo "$title" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g")"
( [ -f "$drafts"/$url.html ] || [ -f "$blogdir/blog/$url.html" ] ) &&
printf "\nThere is already an existing draft or post with the same title.\n\n Redirecting...\n\n" && blog
$EDITOR "$drafts"/$url.html
# Select tags
tags=("informative" "care" "rant" "breeding-report" "off-topic" "seller-review")
tagged=()
menu() {
clear
echo "Choose a tag(s):"
for i in ${!tags[@]}; do
printf "%3d%s) %s\n" $((i+1)) "${choices[i]:- }" "${tags[i]}"
done
if [[ "$msg" ]]; then echo "$msg"; fi
}
prompt="Check an option (again to uncheck, ENTER when done): "
while menu && read -rp "$prompt" num && [[ "$num" ]]; do
[[ "$num" != *[![:digit:]]* ]] &&
(( num > 0 && num <= ${#tags[@]} )) ||
{ msg="Invalid option: $num"; continue; }
((num--))#; msg="${tags[num]} was ${choices[num]:+un}checked"
[[ "${choices[num]}" ]] && choices[num]="" || choices[num]="+"
done
for i in ${!tags[@]}; do
[[ "${choices[i]}" ]] && { tagged+=(${tags[i]^}); }
done
TAGS=$(printf "%s, " "${tagged[@]}")
# image handling
img=$(echo "$img" | cut -f 1 -d '.' >&1)
if [[ -e "$drafts"/img/$img.jpg || -e "$blogdir"/assets/img/blog/$img.jpg ]] ; then
i="2"
while [[ -e "$drafts"/img/$img-$i.jpg || -e "$blogdir"/assets/img/blog/$img-$i.jpg ]]; do ((i++)); done
mv "$img.jpg" "$img-$i.jpg" && cp "$img-$i.jpg" "$drafts"/img/ && mv "$img-$i.jpg" "$img.jpg"
img="$img-$i.jpg"
else
cp "$img.jpg" "$drafts"/img/
img="$img.jpg"
fi
printf "Post: %s\nTitle: %s\nDescription: %s\nImage: %s\nTags:\n" "$url" "$title" "$description" "$img" | cat - "$datafile" | sponge "$datafile"
sed -i "5s/$/ ${TAGS}\n/" "$datafile"
printf "\n${GREEN}Post was saved as a draft: Publish when you are ready to do so.${RESET}\n\n"
}
# Edit a blog draft. Either title, description, content, or index image
function edit_draft () {
title() {
read -e -r -p "Enter a new title: " title
url="$(echo "$title" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g")"
old_url="$(echo $(basename "$basefile" ".html" | sed 's/ /-/g'))"
old_title="$(awk "/Post: $old_url/{getline; print}" "$datafile" | sed 's/^[^:]*: //')"
( [ -f "$drafts"/$url.html ] || [ -f "$blogdir/blog/$url.html" ] ) &&
printf "\nThere is already an existing draft or post with the same title.\n\n Redirecting...\n\n" && title
mv $drafts/$entry $drafts/$url.html
sed -i "s/Post: $old_url/Post: $url/g" "$datafile"
sed -i "s/Title: $old_title/Title: $title/g" "$datafile"
printf "\n${GREEN}Title has been updated.${RESET}\n\n"
}
descr() {
max=0
while [ $max == 0 ]; do
read -e -p "Enter a new description (50 words limit): " descript
[ $(echo "$descript" | wc -w) -ge "50" ] && echo "Description must be less than 50 words." || max=1
done
sed -i "/Post: $(basename "$basefile" ".html")/{n;s/.*/Description: $descript/}" "$datafile"
sed -i "/Description: $descript/{n;d;}" "$datafile"
printf "\n${GREEN}Description has been updated.${RESET}\n\n"
}
con() { listitem "$drafts" edit && "$EDITOR" "$drafts"/$entry && printf "\nPost's content has been updated.\n\n"; }
image() {
entry="$(basename "$entry" ".html")"
read -e -r -p "Enter the path to a new image: " img
while [ ! -e "$img" ]; do
read -e -r -p "$img does not exist. Please try another path: " img
done
img=$(echo "$img" | cut -f 1 -d '.' >&1)
old_img="$(cat "$datafile" | sed -n "/Post: "$entry"/{n;n;n; p}" | sed 's/^[^:]*: //')"
if [[ -e "$drafts"/img/$img.jpg || -e "$blogdir"/assets/img/blog/$img.jpg ]] ; then
i="2"
while [[ -e "$drafts"/img/$img-$i.jpg || -e "$blogdir"/assets/img/blog/$img-$i.jpg ]]; do ((i++)); done
mv "$img.jpg" "$img-$i.jpg" && cp "$img-$i.jpg" "$drafts"/img/
else cp "$img.jpg" "$imgdir"/blog/
fi
rm "$drafts"/img/$old_img
sed -i "s/Image: $old_img/Image: $img.jpg/g" "$datafile"
printf "\n${GREEN}Index image has been updated.${RESET}\n\n"
}
printf "\nEditing %s:\nUsage:\n\tt = Title\n\td = Description\n\tc = Content\n\ti = Image\n\n" "$entry"
read -p "How would you like proceed? " cmd
case "$cmd" in
t) title ;;
d) descr ;;
c) con ;;
i) image ;;
*) printf "Exiting..\n\n" && exit 1 ;;
esac
}
# Delete a draft
function del_draft () {
printf "${RED}Deleting $entry.${RESET}\n" && rm -f "$drafts"/$entry
sed -i "/Post: $(basename "$entry" ".html")/,+5d" "$datafile"
}
# Delete a public post
function blog_pub_del () {
title="$(basename $basefile .html | sed 's/-/ /g')"
post='\'
blog_post='\'
sed -i -n '/'"$blog_post"'/{x;d;};1h;1!{x;p;};${x;p;}' "$blogdir"/blog.html
sed -i -e '/'"$blog_post"'/,+4d' "$blogdir"/blog.html
sed -i "/Post: $(basename "$entry" ".html")/,+5d" "$datafile"
sed -i '//,//p' "$blogdir"/index.html | wc -l)"
printf "$(cat "$index_tag_template")\n" "$basefile" "$img" "$img" "$basefile" "$title" "$webdate" "$description" "$basefile" > "$tmpdir/tagindex"
for i in "${tagsArr[@]}"; do
case ${i} in
"Informative")
printf "$i\n" | sed "s/^.*$/