#!/bin/bash
#< Script to format shell code redirection and ampersand into HTML entities

BASENAME="/usr/bin/basename"
CAT="/bin/cat"
CP="/bin/cp"
DATE="/bin/date"
ECHO="/bin/echo"
MV="/bin/mv"
RM="/bin/rm"
SED="/usr/bin/sed"

BACKUP_DIR="/var/tmp/html_backup"
THIS_PROG=$( ${BASENAME} $0 )
TMP_DIR="/tmp"

print_error() {
   ${ECHO} "Error: $@" >&2
}

print_usage() {
   {
      ${ECHO} "Usage: ${THIS_PROG} file_1 [file_2..[file_n]]"
   } >&2
}

check_input_file() {
   if [ ! -e "${INPUT_FILE}" ]; then
      print_error "Input file ${INPUT_FILE} does not exist"
      exit 1
   fi
   if [ "${INPUT_FILE##*.}" != "html" ]; then
      print_error "Filename ${INPUT_FILE} does not end in .html - is this an HTML file?"
      exit 1
   fi
}

check_backup_directory() {
   if [ ! -d "${BACKUP_DIR}" ]; then
      print_error "Backup directory ${BACKUP_DIR} does not exist"
      exit 1
   elif [ ! -w "${BACKUP_DIR}" ]; then
      print_error "Backup directory ${BACKUP_DIR} is not writable"
      exit 1
   fi
}

create_backup() {
   FILENAME=$( ${BASENAME} "${INPUT_FILE}" )
   TIMESTAMP=$( ${DATE} +%Y%m%d-%H%M )
   SUFFIX="${TIMESTAMP}.$$"
   BACKUP_FILE="${BACKUP_DIR}/${FILENAME}.${SUFFIX}"
   ${CP} ${INPUT_FILE} "${BACKUP_FILE}"
   ${ECHO} "Backup created: ${BACKUP_FILE}"
}

process_file() {
   FILENAME=$( ${BASENAME} "${INPUT_FILE}" )
   TMP_FILE="${TMP_DIR}/${FILENAME}.working" 
   HEADER_FILE="${TMP_DIR}/${FILENAME}.header"
   FOOTER_FILE="${TMP_DIR}/${FILENAME}.footer"
   BODY_FILE="${TMP_DIR}/${FILENAME}.body"
   REBUILT_FILE="${TMP_DIR}/${FILENAME}.rebuilt"
   ${SED} -n '1,2 p' ${INPUT_FILE} > ${HEADER_FILE}
   ${SED} -n '$ p' ${INPUT_FILE} > ${FOOTER_FILE}
   ${SED} -e '1,2 d' -e '$ d' ${INPUT_FILE} > ${BODY_FILE}
   ${SED} 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g;' ${BODY_FILE} > "${TMP_FILE}"
   ${CAT} ${HEADER_FILE} ${TMP_FILE} ${FOOTER_FILE} > ${REBUILT_FILE}
   ${MV} ${REBUILT_FILE} ${INPUT_FILE}
   ${RM} -f ${TMP_DIR}/${FILENAME}.{working,header,footer,body}
}

if [ "$#" -lt "1" -o "$1" = "-h" ]; then
   print_usage
   exit 1
fi

check_backup_directory

while [ "$#" -ge "1" ]; do
   INPUT_FILE=$1
   check_input_file
   create_backup
   process_file
   shift
done 

exit 0