#! /usr/bin/gawk -f
# Last edited on 2008-02-04 18:24:53 by stolfi

BEGIN{
  usage = ( ARGV[0] " [ -v title=STRING ] < INDEXFILE > INDEXPAGE" );
  abort = -1;
  
  # Reads from stdin a list of lines of the form KEY IMGDIR,
  # sorted by KEY. Assigns an integer page number PAGE to each
  # distinct KEY.  Then writes to stdout a master HTML index with 
  # all keys, and creates two files for each PAGE:
  #
  #   "htitle/PAGE" with the corresponding KEY, and
  #   "entries/PAGE" with the corresponding IMGDIRs, one per line.
  #
  # In the "htitle/PAGE" file, the KEY has its braces removed,
  # "_" replaced by " ", and the characters <"'> quoted as in HTML.
  
  if (title == "") 
    { title = "Image index"; }
  else
    { title = iso_to_html(title); }
  
  pg = 0;
  okey = "";
  
  # Print header:
  printf "<html>\n";
  printf "<head>\n";
  printf "<title>%s</title>", title;
  printf "</head>\n";
  printf "<body bgcolor=\"#ffffff\">\n";
  printf "\n";
  printf "<h1>%s</h1>", title;
  printf "\n";
  printf "<ul>\n";
}

(abort >= 0) { exit abort; }

/^[ \011]*([#]|$)/ { next; }

/./{
  if (NF != 2) { data_error(("bad format")); }
  key = $1; 
  img = $2;
  if(key != okey)
    { if (pg > 0) { close(entryfile); }
      pg++; pg = sprintf("%05d",pg);
      entryfile = ("entries/" pg); 
      titlefile = ("htitle/" pg); 
      okey = key;
      pgtitle = key; 
      gsub(/[{}]/, "", pgtitle);
      gsub(/[_]/, " ", pgtitle);
      pgtitle = iso_to_html(pgtitle);
      printf "  <li> <a href=\"index-%s.html\">%s</a>\n", pg, pgtitle;
      printf "%s\n", pgtitle > titlefile;
      close(titlefile);
    }
  printf "%s/p.png\n", img > entryfile;
}
  
END{
  if (abort >= 0) { exit abort; }
  if (pg > 0) { close(entryfile); }
  printf "</ul>\n";
  printf "</body>\n";
  printf "</html>\n";
  close("/dev/stdout");
}

function iso_to_html(str)
{
  gsub(/&/,      "\\&amp;", str);     # "\\&#;"
  gsub(/"/,      "\\&quot;", str);    # "\\&#;"
  gsub(/</,      "\\&lt;", str);      # "\\&#;"
  gsub(/>/,      "\\&gt;", str);      # "\\&#;"
  return str;
}

function data_error(f,n,msg)
{ 
  printf "line %d: %s\n", FNR, msg > "/dev/stderr";
  abort = 1;
  exit 1
}