#!/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." 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 fi } setup_temp_dir() { # Check if 'temp' already exists mkdir "${BASE_PATH}/temp" } 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' } 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 } add_header_and_footer_to_index() { # Add header cat $BASE_PATH/header.html | head -n -1 | cat - $1 > $BASE_PATH/temp/temp.html # For the index page, remove the last line of the header (date published) # 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'. for index in $(seq 0 `expr "${#meta_key[@]}" - 1`); do sed -i "s/[\$][\$]${meta_key[$index]}[\$][\$]/${meta_value[index]}/g" $1 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} rm $BASE_PATH/temp/* add_header_and_footer $path_for_output replace_vars $path_for_output #Uses 'meta_key' and 'meta_value' arrays unset metadata meta_key meta_value done } gen_sorted_file_list() { # Generate a list of the HTMl files, sorted by when they were last modified (read from the contents of the HTML file) files=$(find $BASE_PATH/output -name "*.html") echo "$files" > $BASE_PATH/temp/file_listing.txt # Write file list to a temp file for file in $files; do date_mod+=$(cat "$file" | grep "date-published" | awk -F'[<>]' '{print $3}' \ | cut -d' ' -f '1,2' --complement | tr -d "," | awk '{print $2" "$1" "$3}' \ | date -f - +"%s") # Explanation: # Line 1 extracts the published date from the HTML file # Line 2 re-arranges this information, and converts it into DD MM YY format # Line 3 converts this into a UNIX timestamp date_mod+=$'\n' done date_mod=$(echo "$date_mod" | head -n -1) # Remove last (empty) line from variable echo "$date_mod" > $BASE_PATH/temp/date_mod.txt # Write the corresponding 'date modified' timestamps to a temp file paste $BASE_PATH/temp/file_listing.txt $BASE_PATH/temp/date_mod.txt > $BASE_PATH/temp/new_file_list.txt # Combine file list and date modified into a single file sorted_file_list=$(sort -k 2 $BASE_PATH/temp/new_file_list.txt) # Sort the data in the file, and store it into a variable sorted_file_list=$(echo "$sorted_file_list" | awk '{print $1}') # Store only the first column (the file path) in the variable } gen_index_page() { # Generate an index page (site map) that includes links to the other pages index_file_html="