packages feed

HaRe-0.6: tools/web/pfe.cgi

#! /bin/bash

PATH=$PATH:/usr/local/bin; export PATH # For gunzip on church...
bin=/home/users/hallgren/cgi
AUTOHEADER=no
. $bin/cgistart.sh

datefmt=${datefmt-"+%b %d"}

### Locations ##################################################################
self_url=pfe.cgi
#modulesourcefiles=hi/modules # old
modulesourcefiles=hi/ModuleSourceFiles.txt # new
revgraph=hi/ModuleGraphRev.txt
htmldir=hi/html
ifacedir=hi/iface
### Functions ##################################################################

modulelink() {
  link "$self_url?$1" "${2-$1}"
}

plainsrclink() {
  echo "${2-Plain source file}:"
  link "$1" "$1"
  wrap small " (`filedate "$datefmt" "$1"`)"
}

cvsloglink() {
  if [ -x cvs.cgi ]; then
    link "cvs.cgi?$1" "cvs log"
  fi
}

optdoclink() {
  doc="${1%.hs}.doc"
  if [ -n "$manpage_url" ] && [ -r "$doc" ] ; then
    sep="<p>Related manual pages: "
    grep '^\$Doc ' <$doc | while read doc manentry rest ; do
     echo "$sep"
     link "${manpage_url}$manentry.html" "$manentry"
     sep=", "
    done
  fi
}

optifacelink() {
 if [ -r "$1" ] ; then
   echo_n "$2"
   link "$1" "Interface"
   echo_n "$3"
   if [ -n "$4" ] ; then
     wrap small " (`filedate "$datefmt" "$1"`)"
   fi
 fi
}

generated() {
  if [ "$1" = "$3" ] ; then
    plainsrclink "$1" "Plain source file for $2"
    p
  else 
    wrap code "$1"
    echo "is actually generated by $2 from"
    wrap code `link "$3" "$3"`
    echo "which is shown below."
  fi
}

plainfile() {
  grep "^$1 " $modulesourcefiles | awk '{print $2}'
}

importedby() {
  m="$1"
  if [ -r $revgraph ] ; then
    grep "^$m " <$revgraph | { read this imports && {
      echo "$m is imported"
      sep="by:"
      for i in $imports ; do
	echo "$sep"
        modulelink "$i"
	sep=","
      done
      echo "."
      p
    }
    }
  else
    echo "Don't know who imports this module."
    p
  fi
}

uptodatecheck() {
  gen="$1" # existing generated file
  src="$2" # maybe missing source file
  if [ -r "$src" ] && [ "$src" -nt "$gen" ] ; then
    echo "Warning: the plain source file is newer than the generated HTML version shown below!"
  fi
}
showsourcefile() {
m="$1"
hm=`echo "$m" | sed 's%/%-%g'`
h="$htmldir/$hm.html"
hgz="$h.gz"
#pfe all2html "$m" >/dev/null
f=`plainfile "$m"`
d=""
if [ -r "$h" ] || [ -r "$hgz" ] ; then
  if [ -r "$f" ] ; then
    plainsrclink "$f"
    optifacelink "$ifacedir/$hm.hs" "<br>" " (experimental)" d
    optdoclink "$f"
    #br;cvsloglink "$f"
    p;importedby "$m"
  else
    echo "The plain source file for module $m is not available."
  fi
  if [ -r "$h" ] ; then
    uptodatecheck "$h" "$f"
    cat "$h"
    d="`filedate "$datefmt" "$h"`"
  elif [ -r "$hgz" ] ; then
    uptodatecheck "$hgz" "$f"
    gunzip <"$hgz"
    d="`filedate "$datefmt" "$hgz"`"
  fi
else
  echo "The source file for module $m is not available."
fi
hr
link "$self_url" Index
p
[ -n "$d" ] && {
  begin small
   echo "(HTML for this module was generated on $d."
   link "//www.cse.ogi.edu/~hallgren/h2h.html" "About the conversion tool"
   echo ".)"
}
}

showsubdirs() {
  h2 Subdirectories
  begin ol
  p="*/"
  [ -n "$1" ] && p="$1*/"
  for d in $p ; do
    li; link "$self_url?$d" $d; nl
  done
  end
}

adddir() {
  while read m d f ; do
    [ -n "$f" ] || { f="$d"; d="."; }
    echo "$m" "$d" "$f"
  done
}

buggymoduleroot() {
  if [ -n "$related" ] ; then
    echo "$1" | sed "s/\($related\)\$//"
  else
    echo "$1"
  fi
}

moduleroot() {
  case "$1" in
    *BaseStruct) echo "${1%BaseStruct}" ;;
    *RecPretty) echo "${1%RecPretty}" ;;
    *Base) echo "${1%Base}" ;;
    *Maps) echo "${1%Maps}" ;;
    *Pretty) echo "${1%Pretty}" ;;
    *Struct) echo "${1%Struct}" ;;
    *Util) echo "${1%Util}" ;;
    *Rec) echo "${1%Rec}" ;;
    *MT) echo "${1%T}" ;;
    *) echo "$1"
  esac
}

showstructureindex() {
  grep " $1" <$modulesourcefiles | sed 's%/\([^/]*\)$% \1%' |
    adddir | sort -f -k 2 | {
    files=""
    d0=""
    m0=""
    while read m d f; do
      h="$htmldir/$m.html"
      path="$d/$f"
      if [ -r "$path" ] ; then
	case "$path" in
	  hi/libs/*Libraries/*) ;; # exclude Prelude & standard libraries
	  *) if [ "$d" != "$d0" ] ; then
	       nl
	       [ -z "$d0" ] || end
	       nl
	       desc=""
               if [ -r titles ] ; then
		 escd=`echo "$d" | sed 's/\./\\\\./g'`
                 desc="`sed -n "s%^$escd \(.*\)\$%\1%p" <titles`"
                 #echo "($escd)" | cat -v
               fi
	       [ -z "$desc" ] || desc="- $desc"
	       if [ -r "$d/README.html" ] ; then
	         h="Directory `link $d $d` $desc"
	       else
	         h="Directory $d $desc"
               fi
	       begin h4 "id=\"$d\""; echo_n "$h"; end
	       nl
	       d0="$d"
               begin ol
             fi
             m1=`moduleroot "$m"`
	     if [ "$m1" = "$m0" ] ; then
               echo ","
             else
	       m0="$m1"
               nl; li
             fi
             modulelink "$m" # ; echo "($f)"
	     optifacelink "$ifacedir/$m.hs" " (" ")"
	     files="$files $path"
	esac
      fi
    done
    [ -z "$d0" ] || end
    nl
    filedate "$datefmt" $files
  }
}

showmoduleindex() {
  #pfe >/dev/null
  #h2 "Modules"
  grep " $1" <$modulesourcefiles | sort | {
    begin ol
    files=""
    while read m f; do
      h="$htmldir/$m.html"
      if [ -r "$f" ] ; then
	case "$f" in
	  hi/libs/*Libraries/*) ;; # exclude Prelude & standard libraries
	  *) li; modulelink "$m"
	     #echo "($f)"
	     nl
	     files="$files $f"
	esac
      fi
    done
    end
    filedate "$datefmt" $files
  }
}

showindex() {
  files="$modulesourcefiles"
  [ -r index_inc.html ] && files="$files index_inc.html"
  [ -r index_footer.html ] && files="$files index_footer.html"
  [ -r cgiconfig.sh ] && files="$files cgiconfig.sh"
  modtime="`TZ=GMT LANG=C filedate '+%a, %d %b %Y %T %Z' $files`"

  echo "Last-Modified: $modtime"
  pagestart "${maintitle-Haskell Files}"

  #showsubdirs "$@"
  [ -r index_inc.html ] && cat index_inc.html
  #showmoduleindex "$@"
  showstructureindex "$@"
  [ -r index_footer.html ] && cat index_footer.html
}

### Main #######################################################################

if [ -n "$QUERY_STRING" ]; then
  contents_url="$self_url";
  parent_url="$self_url";parent="Module List"
  eval f="$*"
  pagestart "$f"
  #if [ -d "$f" ] ; then
  #  showindex "$1"
  #  show
  #else
    showsourcefile "$f"
  #fi
else
  showindex
fi

pageend