You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

143 lines
4.4 KiB
Bash

10 months ago
#!/bin/bash
BASE_PATH="/home/aadhavan/Programming/Bash/sitegen"
check_for_dirs() {
if [ ! -d "${BASE_PATH}/source" ]; then
echo "ERROR: 'source' folder does not exist. Your content is sourced from this folder."
10 months ago
exit
fi
if [ -d "${BASE_PATH}/temp" ]; then
echo "ERROR: You have an existing 'temp' folder. Please delete this folder, and run the script again."
exit
fi
if [ ! -f "${BASE_PATH}/header.html" ]; then
echo "ERROR: You do not have a header.html file. This file is used as a global header. Please create this file, and run the script again."
exit
fi
if [ ! -f "${BASE_PATH}/footer.html" ]; then
echo "ERROR: You do not have a footer.html file. This file is used as a global footer. Please create this file, and run the script again."
exit
10 months ago
fi
}
setup_temp_dir() {
# Check if 'temp' already exists
mkdir "${BASE_PATH}/temp"
10 months ago
}
setup_output_dir() {
rm -r "${BASE_PATH}/output" # Delete existing 'output' directory
cp -r "${BASE_PATH}/source" "${BASE_PATH}/output" #Copy directory structure from 'source' to 'output'
10 months ago
}
del_files_in_output() {
find $BASE_PATH/output -type f -name "*.md" -delete #Delete all .md files (which were copied over from 'source') in 'output'
}
read_metadata() {
# Read the metadata from the top of a .md file into a string
metadata=$(awk 'BEGIN{RS = "\n\n"} {print $0}; {exit}' $1) # Reads from the .md file until a double-newline is encountered
}
convert_to_array() {
# Converts the metadata into two arrays: one with the key, and the other with the value
readarray -t meta_key < <(echo -e "$1" | awk -F: '{print $1}')
readarray -t meta_value < <(echo -e "$1" | awk -F: '{st = index($0,":"); values = substr($0,st+1); print values}' | cut -c 2-)
}
add_date_to_array() {
meta_key+=("date")
meta_value+=("$(date -r $1 +'%b %d, %Y')")
}
add_header_and_footer() {
# Add header
cat $BASE_PATH/header.html | cat - $1 > $BASE_PATH/temp/temp.html
# Add footer
echo >> $BASE_PATH/temp/temp.html
cat $BASE_PATH/footer.html >> $BASE_PATH/temp/temp.html
# Move temp file to original location
mv $BASE_PATH/temp/temp.html $1
}
replace_vars() {
# Loop through 'meta_key' array, search for all occurences of the values in the HTML doc, and replace them with corresponding values in 'meta_value'.
10 months ago
for index in $(seq 0 `expr "${#meta_key[@]}" - 1`); do
sed -i "s/[\$][\$]${meta_key[$index]}[\$][\$]/${meta_value[index]}/g" $1
10 months ago
done
}
md_to_html() {
# Convert .md files from 'source' and place them into the correct locations into 'output'
files=$(find $BASE_PATH/source -name "*.md")
for file in $files; do
read_metadata $file # Sets the 'metadata' variable
convert_to_array "$metadata" #Sets the 'meta_key' and 'meta_value' arrays
add_date_to_array "$file" #Uses 'meta_key' and 'meta_value' arrays
# Copy file to temp dir and strip metadata
cp $file $BASE_PATH/temp/
let num_lines=$(echo $metadata | wc -l)+1
sed -i "1,${num_lines}d" $BASE_PATH/temp/`basename $file`
# Construct path for output file
path_for_output=$(realpath --relative-to="${BASE_PATH}/source" $file)
path_for_output="${BASE_PATH}/output/${path_for_output}"
path_for_output="$(dirname $path_for_output)/$(basename $path_for_output .md).html"
# Convert the file, and place the output in the correct location
pandoc -f markdown $BASE_PATH/temp/`basename $file` > ${path_for_output}
10 months ago
rm $BASE_PATH/temp/*
add_header_and_footer $path_for_output
replace_vars $path_for_output #Uses 'meta_key' and 'meta_value' arrays
10 months ago
unset metadata meta_key meta_value
done
}
gen_index_page() { # Generate an index page (site map) that includes links to the other pages
files=$(find $BASE_PATH/output -name "*.html")
for file in $files; do
title=$(cat $file | grep "<title>" | head -n 1 | awk -F'[<>]' '{print $3}') # Find the title of the web page
suffix=" - Two More Cents"
title=${title%"$suffix"} # Remove the website name from it
pub_date=$(cat $file | grep "date-published" | head -n 1 | awk -F'[<>]' '{print $3}') # Find the date published
prefix="Published on " # Find date published of webpage
pub_date=${pub_date#"$prefix"} # Remove the prefix from it
pub_date=${awk "{print $1 $3}" "$pub_date"} # Extract the month and year
echo "$title $pub_date"
file_path=$(realpath --relative-to="${BASE_PATH}/output" $file)
done
}
clean_up() {
rm -r ${BASE_PATH}/temp
}
10 months ago
check_for_dirs
setup_temp_dir
setup_output_dir
del_files_in_output
md_to_html
gen_index_page
clean_up