#!/bin/sh
#
# $Id: checkrdf,v 1.60 2003/03/03 11:29:26 obraun Exp $
# $Unsane: projects/checkrdf/checkrdf,v 1.11 2005/05/29 19:27:39 lizard Exp $
#

VERSION=39.125
PREFIX=%%PREFIX%%

fetch-rdf-files () {
  if which fetch >/dev/null 2>&1 ; then
    FETCH_CMD="fetch -T 60 -q -o "
  elif which wget >/dev/null 2>&1 ; then
    FETCH_CMD="wget -T 60 -t 1 -O "
  else
    echo "error: fetch(1) not found; wget(1) not found"
    exit 1
  fi
  i=0
  cd ${RDFFILESDIR} && rm -f *
  for rdf in ${RDFFILES} ; do
    if [ ${DEBUG} -eq 0 ] ; then
      ${FETCH_CMD} ${i}.rdf ${rdf} >/dev/null 2>&1
    else
      ${FETCH_CMD} ${i}.rdf ${rdf}
    fi
    i=${i}0
  done
}

# Function to download ${RDFFILES} and process them.
hs-checkrdf () {
  rm ${OUTFILE} && touch ${OUTFILE}
  if [ -f ${OUTFILE}.raw ] ; then rm ${OUTFILE}.raw ; fi
  for rdffile in ${RDFFILESDIR}/* ; do
     if [ ${DEBUG} -eq 0 ]
     then ${PREFIX}/bin/checkrdf.bin +RTS -H${HEAPSIZE} -RTS ${rdffile} << EOF >/dev/null 2>&1
            RDFDIR=${RDFDIR}
            OUTFILE=${OUTFILE}.raw
            STATEFILE=${STATEFILE}
            PENDINGFILE=${PENDINGFILE}
            PENDINGFLAGFILE=${PENDINGFLAGFILE}
EOF
     else ${PREFIX}/bin/checkrdf.bin +RTS -H${HEAPSIZE} -RTS ${rdffile} << EOF
            RDFDIR=${RDFDIR}
            OUTFILE=${OUTFILE}.raw
            STATEFILE=${STATEFILE}
            PENDINGFILE=${PENDINGFILE}
            PENDINGFLAGFILE=${PENDINGFLAGFILE}
EOF
          if [ ${?} -ne 0 ]
          then cat ${RDFFILESDIR}/${rdffile} | mail -s "RDF error: ${rdffile}" ${USER}
          fi
     fi
  done
  newnews_action
}

# Function to process only the pending file.
hs-showpending () {
  rm ${OUTFILE} && touch ${OUTFILE}
  if [ -f ${OUTFILE}.raw ] ; then rm ${OUTFILE}.raw ; fi
  if [ ${DEBUG} -eq 0 ]
  then ${PREFIX}/bin/checkrdf.bin +RTS -H${HEAPSIZE} -RTS << EOF >/dev/null 2>&1
         RDFDIR=${RDFDIR}
         OUTFILE=${OUTFILE}.raw
         STATEFILE=${STATEFILE}
         PENDINGFILE=${PENDINGFILE}
         PENDINGFLAGFILE=${PENDINGFLAGFILE}
EOF
  else ${PREFIX}/bin/checkrdf.bin +RTS -H${HEAPSIZE} -RTS << EOF
         RDFDIR=${RDFDIR}
         OUTFILE=${OUTFILE}.raw
         STATEFILE=${STATEFILE}
         PENDINGFILE=${PENDINGFILE}
         PENDINGFLAGFILE=${PENDINGFLAGFILE}
EOF
  fi
  newnews_action
}

# Check if there were news and trigger actions.
newnews_action () {
  if [ -f ${OUTFILE}.raw ] && [ ! -f ${PENDINGFLAGFILE} ]
  then newnews
       generate-html
       generate-tail
  fi
}

# Execute ${NEWNEWS_CMD} and append ${NEWNEWS_MARKER}.
newnews () {
  if [ ! -z "${NEWNEWS_CMD}"  ] && [ ! "${NEWNEWS_CMD}" = "NONE" ]
  then ${NEWNEWS_CMD}
  fi
  if [ ! -z "${NEWNEWS_MARKER}"  ] && [ ! "${NEWNEWS_MARKER}" = "NONE" ]
  then echo "<hr>" >> ${OUTFILE}
       echo "<span class=\"marker\">${NEWNEWS_MARKER}</span>" >> ${OUTFILE}
       echo "<br><br>" >> ${OUTFILE}
  fi
  if [ ! -z ${NEWNEWS_RE} ] && \
     [ ! -z "${NEWNEWS_CMD_RE}"  ] && [ ! "${NEWNEWS_CMD_RE}" = "NONE" ]
  then grep -q ${GREP_ARGS} ${NEWNEWS_RE} ${OUTFILE}.raw
       if [ ${?} -eq 0 ]
       then ${NEWNEWS_CMD_RE}
       fi
  fi
  cat ${OUTFILE}.raw >> ${OUTFILE}
}

# Generate a new HTML file.
generate-html () {
  mv ${OUT_HTML}.raw ${OUT_HTML}.tmp
  if [ -f ${OUTFILE} ]
  then cat ${OUTFILE} > ${OUT_HTML}.raw
  fi
  cat ${OUT_HTML}.tmp >> ${OUT_HTML}.raw
  cat > ${OUT_HTML} << EOF
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
       "DTD/xhtml1-transitional.dtd">
<html>
<head>
${XTRA_HTMLHEADER}
<title>CHECKRDF ${DATE}</title>
<link rel="stylesheet" type="text/css" href="${CSS_FILE}">
</head>
<body>
${XTRA_HTML_TOP}
<!-- MARKER FOR BACKUP DATE -->
EOF
  cat ${OUT_HTML}.raw >> ${OUT_HTML}
  cat >> ${OUT_HTML} << EOF
${XTRA_HTML_BOTTOM}
</body>
</html>
EOF
  rm ${OUT_HTML}.tmp
}

# Generate a new text file for use with tail.
generate-tail () {
        sed -e "\
          s/<span class=\"newstitletext\">/%%HL_TITLE%%/g ; \
          s/<span class=\"newsitemtext\">/%%HL_ITEM%%/g ; \
          s/<span class=\"marker\">/%%HL_MARKER%%/g ; \
          /^</d ; \
          /^-->/d ; \
          s/<[^>]*>//g ; \
          s/&quot;/\"/g ; \
          s/&amp;/&/g ; \
          s/&lt;/</g ; \
          s/&gt;/</g ; \
          " < ${OUTFILE} >> ${OUT_TAIL}
}

# Check for some files and directories on start-up
# and create maybe them.
start-up-check () {
  if [ ! -d ${RDFDIR} ]
  then mkdir ${RDFDIR}
  fi
  if [ ! -d ${RDFFILESDIR} ]
  then mkdir ${RDFFILESDIR}
  fi
  if [ ! -f ${OUTFILE} ]
  then touch ${OUTFILE}
  fi
  if [ ! -f ${OUT_HTML} ]
  then touch ${OUT_HTML}
  fi
  if [ ! -f ${OUT_HTML}.raw ]
  then touch ${OUT_HTML}.raw
  fi
  if [ ! -f ${OUT_TAIL} ]
  then touch ${OUT_TAIL}
  fi
  if [ ! -f ${PENDINGFILE} ]
  then echo "[]" > ${PENDINGFILE}
  fi
}

backup () {
  echo "Backup current output."
  if [ ! ${BACKUP_HTML_NAME}  = "NONE" ]
  then sed "s|^<!-- MARKER FOR BACKUP DATE -->$|<hr><span class=\"marker\">END $(date)</span><hr>|" < ${OUT_HTML} > ${BACKUP_HTML_NAME}
  fi
  if [ ! ${BACKUP_TEXT_NAME}  = "NONE" ]
  then cp ${OUT_TAIL} ${BACKUP_TEXT_NAME}
      echo "%%HL_MARKER%%END $(date)" >> ${BACKUP_TEXT_NAME}
  fi
}

delete () {
  echo "Deleting current output."
  echo "" > ${OUT_HTML}.raw
  echo "" > ${OUT_TAIL}
  echo "<hr>" > ${OUTFILE}
  echo "<span class=\"marker\">START  $(date)</span>" >> ${OUTFILE}
}

# File in config files, at least one of them must exist
# and all variables have to be defined.
if  [ -f ${PREFIX}/etc/checkrdf.rc ]
then . ${PREFIX}/etc/checkrdf.rc
fi
if   [ -f ${HOME}/.checkrdf.rc ]
then . ${HOME}/.checkrdf.rc
fi
if [ -f ${HOME}/.rdf/rc ]
then . ${HOME}/.rdf/rc
fi

# Main part. Only the very first opt will be evaluated.
while getopts f:abcBdFPptwumsSVh i
do
  # Metadata files
  OUTFILE=${RDFDIR}/out
  LOCKFILE=${RDFDIR}/lock
  STATEFILE=${RDFDIR}/state
  PENDINGFILE=${RDFDIR}/pending
  PENDINGFLAGFILE=${RDFDIR}/pendingflag
  RDFFILESDIR=${RDFDIR}/files
  case $i
  in
    f)
       # Load another config file.
       if  [ -f ${OPTARG} ]
       then . ${OPTARG}
       else echo "Error: cannot load ${OPTARG}"
            exit 1
       fi ;;
    d)
       # Delete both out files.
       start-up-check
       delete
       generate-tail
       generate-html
       exit 0 ;;
    b)
       # Backup both out files.
       start-up-check
       backup
       exit 0 ;;
    B)
       # Backup and delete both out files.
       start-up-check
       backup
       delete
       generate-tail
       generate-html
       exit 0 ;;
    a)
       # Switch to append-mode.
       start-up-check
       if [ -f ${PENDINGFLAGFILE} ]
       then echo "Switching to append-mode."
            rm ${PENDINGFLAGFILE}
            echo "<hr>" > ${OUTFILE}
            echo "<span class=\"marker\">APPEND  ${DATE}</span>" >> ${OUTFILE}
            generate-tail
            generate-html
       else echo "Already in append-mode."
       fi
       exit 0 ;;
    p)
       # Switch to pending-mode.
       start-up-check
       if [ -f ${PENDINGFLAGFILE} ]
       then echo "Already in pending-mode."
       else echo "Switching to pending-mode."
            touch ${PENDINGFLAGFILE}
            echo "<hr>" > ${OUTFILE}
            echo "<span class=\"marker\">PENDING ${DATE}</span>" >> ${OUTFILE}
            generate-tail
            generate-html
       fi
       exit 0 ;;
    c)
       # switch mode
       start-up-check
       if [ -f ${PENDINGFLAGFILE} ]
       then echo "Switching to append-mode."
            rm ${PENDINGFLAGFILE}
            echo "<hr>" > ${OUTFILE}
            echo "<span class=\"marker\">APPEND  ${DATE}</span>" >> ${OUTFILE}
       else echo "Switching to pending-mode."
            touch ${PENDINGFLAGFILE}
            echo "<hr>" > ${OUTFILE}
            echo "<span class=\"marker\">PENDING ${DATE}</span>" >> ${OUTFILE}
       fi
       generate-tail
       generate-html
       exit 0 ;;
    m)
       # Set a marker.
       start-up-check
       echo "Setting marker."
       echo "<hr>" > ${OUTFILE}
       echo "<span class=\"marker\">MARKED  ${DATE}</span>" >> ${OUTFILE}
       generate-tail
       generate-html
       exit 0 ;;
    t)
       # Fire up tail. First calculate highlighting.
       start-up-check
       if [ ! -z ${FG_TITLE}   ] && [ ! ${FG_TITLE}  = "NONE" ]
       then HL_TITLE="[3${FG_TITLE}m"
       fi
       if [ ! -z ${BG_TITLE}   ] && [ ! ${BG_TITLE}  = "NONE" ]
       then HL_TITLE="${HL_TITLE}[4${BG_TITLE}m"
       fi
       if [ ! -z ${ATT_TITLE}  ] && [ ! ${ATT_TITLE} = "NONE" ]
       then HL_TITLE="${HL_TITLE}[${ATT_TITLE}m"
       fi
       if [ ! -z ${FG_ITEM}    ] && [ ! ${FG_ITEM}   = "NONE" ]
       then HL_ITEM="[3${FG_ITEM}m"
       fi
       if [ ! -z ${BG_ITEM}    ] && [ ! ${BG_ITEM}   = "NONE" ]
       then HL_ITEM="${HL_ITEM}[4${BG_ITEM}m"
       fi
       if [ ! -z ${ATT_ITEM}   ] && [ ! ${ATT_ITEM}  = "NONE" ]
       then HL_ITEM="${HL_ITEM}[${ATT_ITEM}m"
       fi
       if [ ! -z ${FG_MARKER}  ] && [ ! ${FG_MARKER} = "NONE" ]
       then HL_MARKER="[3${FG_MARKER}m"
       fi
       if [ ! -z ${BG_MARKER}  ] && [ ! ${BG_MARKER} = "NONE"  ]
       then HL_MARKER="${HL_MARKER}[4${BG_MARKER}m"
       fi
       if [ ! -z ${ATT_MARKER} ] && [ ! ${ATT_MARKER} = "NONE" ]
       then HL_MARKER="${HL_MARKER}[${ATT_MARKER}m"
       fi
       HL_RESET="[0m[22m[24m[25m[27m[29m"

       exec tail -n 100 -f ${OUT_TAIL} | \
        sed -e "\
          s/%%HL_TITLE%%\(.\{0,${TXT_WIDTH}\}\).*/${HL_TITLE}\1${HL_RESET}/g ; \
          s/%%HL_ITEM%%\(.\{0,${TXT_WIDTH}\}\).*/${HL_ITEM}\1${HL_RESET}/g ; \
          s/%%HL_MARKER%%\(.\{0,${TXT_WIDTH}\}\).*/${HL_MARKER}\1${HL_RESET}/g ; \
          " ;;
    w)
       # Fire up ${HTML_VIEWER}
       start-up-check
       exec ${HTML_VIEWER} ${OUT_HTML} ;;
    s)
       # Append contents of the pending file only.
       start-up-check
       if [ -f ${LOCKFILE} ]
       then echo "Exiting due to existing lockfile"
            exit 3
       fi

       echo $$ > ${LOCKFILE}

       if [ -f ${PENDINGFLAGFILE} ]
       then rm ${PENDINGFLAGFILE}
            PENDING_MODE=0
       fi

       hs-showpending

       if [ ${PENDING_MODE} ]
       then touch ${PENDINGFLAGFILE}
            if [ -f ${OUTFILE}.raw ]
            then echo "<hr>" > ${OUTFILE}
                 echo "<span class=\"marker\">PENDING ${DATE}</span>" >> ${OUTFILE}
            fi
            generate-tail
            generate-html
       fi

       rm -f ${LOCKFILE}
       exit 0 ;;
    S)
       # Append contents of the pending file and switch to append-mode.
       start-up-check
       if [ -f ${LOCKFILE} ]
       then echo "Exiting due to existing lockfile"
            exit 3
       fi

       echo $$ > ${LOCKFILE}

       if [ -f ${PENDINGFLAGFILE} ]
       then echo "Switching to append-mode."
            rm ${PENDINGFLAGFILE}
            echo "<hr>" > ${OUTFILE}
            echo "<span class=\"marker\">APPEND  ${DATE}</span>" >> ${OUTFILE}
       else echo "Already in append-mode."
       fi

       hs-showpending

       rm -f ${LOCKFILE}
       exit 0 ;;
    F)
       # Download rdfs and append contents to out-files or pending-file.
       start-up-check
       if [ -f ${LOCKFILE} ]
       then echo "Exiting due to existing lockfile"
            exit 3
       fi

       echo $$ > ${LOCKFILE}

       fetch-rdf-files

       rm -f ${LOCKFILE}
       exit 0 ;;
    P)
       # Download rdfs and append contents to out-files or pending-file.
       start-up-check
       if [ -f ${LOCKFILE} ]
       then echo "Exiting due to existing lockfile"
            exit 3
       fi

       echo $$ > ${LOCKFILE}

       hs-checkrdf

       rm -f ${LOCKFILE}
       exit 0 ;;
    u)
       # Download rdfs and append contents to out-files or pending-file.
       start-up-check
       if [ -f ${LOCKFILE} ]
       then echo "Exiting due to existing lockfile"
            exit 3
       fi

       echo $$ > ${LOCKFILE}

       fetch-rdf-files
       hs-checkrdf

       rm -f ${LOCKFILE}
       exit 0 ;;
    h)
       # Display help.
       echo ""
       echo "Usage: checkrdf [-f <configfile>] option"
       echo ""
       echo "You have to use exactly one of the following options:"
       echo ""
       echo "  -a  to switch to append-mode"
       echo "  -p  to switch to pending-mode"
       echo "  -c  to switch mode"
       echo "  -m  to set marker"
       echo "  -t  to view output in tail-mode"
       echo '  -w  to view output in ${HTML_VIEWER}'
       echo "  -b  to backup the current output"
       echo "  -d  to delete the current output"
       echo "  -B  to backup and delete the current output"
       echo "  -s  to show pending news immediately"
       echo "  -S  -s and -a"
       echo "  -F  to fetch the rdf files"
       echo "  -P  to process the pre-fetched rdf files"
       echo "  -u  -F and -P"
       echo "  -V  to show version"
       echo ""
       exit 0 ;;
    V)
       # Show version.
       echo "This is checkrdf version" ${VERSION}
       exit 0 ;;
  esac
done

echo "Usage: checkrdf [-f <filename>] option"
echo "Type checkrdf -h for more information."

exit 1

# 42-23/x
# vim:tw=9999:
