Patch title: Release 85 bulk changes
Abstract:
File: /pliant/protocol/http/export.pli
Key:
    Removed line
    Added line
module "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"
module "/pliant/admin/file.pli"
module "/pliant/admin/execute.pli"
module "server.pli"
module "/pliant/protocol/http/style/common.pli"
module "/pliant/protocol/http/style/default.style"
module "/pliant/protocol/http/client.pli"

constant htmldoc (file_query "embedded:/usr/bin/htmldoc" standard)=defined
constant html2ps (file_query "embedded:/usr/bin/html2ps" standard)=defined


function html_to_postscript html page options ps -> status
  arg Str html ; arg HtmlPage page ; arg Str options ps ; arg ExtendedStatus status
  if htmldoc
    var Str temp := replace file_temporary+"/" "file:/" "embedded:/"
    (var Stream s) open html in+safe
    (var Stream d) open temp+"pliant.html" out+safe+mkdir
    while not s:atend
      var Str l := s readline
      while (l eparse any:(var Str head) "<img src=[dq]" any:(var Str url) "[dq]" any:(var Str tail))
        var Str id := url (url search_last "/" -1)+1 url:len
        if (url 0 1)="/"
          if (file_copy url temp+id)=failure
            file_copy "http://localhost"+url temp+id
        else
          console "unsupported image " url eol
        l := head+"<IMG src=[dq]"+file_os_name:(replace temp "embedded:/" "file:/")+id+"[dq]"+tail
      d writeline l
    s close ; d close
    file_copy temp+"pliant.html" "file:/tmp/pliant.html"
    var Str extra := ""
    var Int margin := options option "margin" Int
    var Int left_margin := options option "left_margin" Int
    var Int top_margin := options option "top_margin" Int
    var Int right_margin := options option "right_margin" Int
    var Int bottom_margin := options option "bottom_margin" Int
    var Int font_size := options option "font_size" Int 
    if margin=defined or (left_margin=defined and top_margin=defined and right_margin=defined and bottom_margin=defined)
      extra := " --top "+string:(shunt top_margin=defined top_margin margin)+"mm --bottom "+string:(shunt bottom_margin=defined bottom_margin margin)+"mm --left "+string:(shunt left_margin=defined left_margin margin)+"mm --right "+string:(shunt right_margin=defined right_margin margin)+"mm"
    var Int err := execute "/usr/bin/htmldoc -t ps1"+extra+" --continuous --bodycolor white --fontsize "+string:font_size+" --size 210x297mm -" input temp+"pliant.html" output ps error "device:/null" root "embedded:/" path "embedded:/"
    file_tree_delete temp
    if err=0
      return success
    # if (execute "/usr/bin/htmldoc -t ps1 --continuous -" input html output ps root "embedded:/" path "embedded:/")=0
    #   return success
  if html2ps
    if (execute "/usr/bin/html2ps -b http://"+page:http_request:site_name+page:http_request:url_path input html output ps error "device:/null" root "embedded:/" path "embedded:/")=0
      return success
  if htmldoc or html2ps
    status := failure "Failed to convert HTML to PostScript"
  else
    status := failure "Cannot convert from HTML to PostScript since none of htmldoc or html2ps utlity is available"


method p begin_end_hook_prototype fun
  arg_rw HtmlPage p ; arg Function fun
  indirect

method page export_dynamic_page pagename options where -> status
  arg_rw HtmlPage page ; arg Str pagename options where ; arg ExtendedStatus status
  var Str ext := where (where search_last "." where:len) where:len
  var CBool direct := not (where parse "printer:" any) and ext<>".ps" and not (options option "postscript")
  var Str html := shunt direct where file_temporary
  var Link:Stream s :> new Stream
  s open html out+safe
  var Link:HtmlPage subpage :> new HtmlPage
  var Str encoding := page:http_request answer_encoding
  page:http_request answer_encoding := ""
  subpage bind page:http_request
  page:http_request answer_encoding := encoding
  subpage read_only_mode := true
  subpage read_only true
  subpage options := options
  subpage http_stream :> s
  subpage begin_html_page
  subpage begin_end_hook_prototype subpage:begin_hook
  status := subpage execute_dynamic_page pagename
  subpage end_html_page
  subpage begin_end_hook_prototype subpage:end_hook
  subpage unbind page:http_request
  if s:close=failure
    file_delete html
    return failure:"Failed to write HTML file"
  if direct
    return success
  var Str ext := where (where search_last "." where:len) where:len
  if (where parse "printer:" any:(var Str queue))
    var Str ps := replace (replace file_temporary "file:/" "embedded:/") ".tmp" ".ps"
    status := html_to_postscript html page options ps
    if status=success
      if (execute "/usr/bin/lpr"+(shunt queue<>"" " -P"+queue "")+" "+file_os_name:(replace ps "embedded:/" "file:/") root "embedded:/" path "embedded:/")<>0
        status := failure "Failed to add job to print queue "+queue 
    file_delete ps
  eif ext=".ps" or (options option "postscript")
    var Str ps := file_temporary
    status := html_to_postscript html page options ps
    if status=success
      if (file_copy ps where)=failure
        status := failure "Failed to store PostScript output in "+where
    file_delete ps
  file_delete html

method page export_dynamic_page pagename where -> status
  arg_rw HtmlPage page ; arg Str pagename where ; arg ExtendedStatus status
  status := page export_dynamic_page pagename "light_view" where

export '. export_dynamic_page'