Patch title: Release 92 bulk changes
Abstract:
File: /appli/browser/xml.pli
Key:
    Removed line
    Added line
   
module "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"
module "document.pli"
module "/pliant/util/encoding/xml_parser.pli"


type DocumentParser
  field Pointer:Document document
  field CBool lowercase <- false

XmlParser maybe DocumentParser

method parser is_raw_tag tag -> c
  oarg_rw XmlParser parser ; arg Str tag ; arg CBool c
  c := tag="script"

method parser new_text text -> ptr
  oarg_rw DocumentParser parser ; arg Str text ; arg Address ptr
  var Pointer:DocumentNode n :> parser:document create_node generate_id ""
  n attribute "" := text
  ptr := addressof n

method parser new_tag tag -> ptr
  oarg_rw DocumentParser parser ; arg Str tag ; arg Address ptr
  var Pointer:DocumentNode n :> parser:document create_node generate_id (shunt parser:lowercase lower:tag tag)
  ptr := addressof n

method parser set_tag_attribute tag attribute value
  oarg_rw DocumentParser parser ; arg Address tag ; arg Str attribute value
  var Pointer:DocumentNode n :> tag map DocumentNode
  n attribute (shunt parser:lowercase lower:attribute attribute) := value

method parser bind tag parent
  oarg_rw DocumentParser parser ; arg Address tag parent
  parser:document stick (tag map DocumentNode) stick_tail (parent map DocumentNode)


#-------------------------------------------------------------------------


method document load stream options
  arg_rw Document document ; arg_rw Stream stream ; arg Str options
  Document destroy_instance addressof:document ; Document build_instance addressof:document
  var Link:DocumentParser parser :> new DocumentParser
  parser document :> document
  parser lowercase := options option "lowercase"
  parser parse stream (addressof document:root)

method document load filename options -> status
  arg_rw Document document ; arg Str filename options ; arg Status status
  (var Stream s) open filename options in+safe
  document load s options
  status := shunt s=success success failure


method n save s xml
  arg DocumentNode n ; arg_rw Stream s ; arg CBool xml
  if n:tag<>""
    s writechars "<"+n:tag
    n first_attribute (var Str attr) (var Str value)
    while attr<>""
      s writechars " "+attr+"=[dq]"+value+"[dq]"
      n next_attribute (var Str attr) (var Str value)
    if xml and not (exists n:first)
      s writechars " /"
    s writechars ">"
    if (exists n:first) and (n:first attribute "")<>"" and not (exists n:first:first) and not (exists n:first:next)
      s writeline (n:first attribute "")+"</"+n:tag+">"
    else
      s writeline ""
      var Pointer:DocumentNode c :> n first
      while exists:c
        c save s xml
        c :> c next
      if (exists n:first)
        s writeline "</"+n:tag+">"
  else
    # text tag
    if (n attribute "")<>""
      s writeline (n attribute "")
    # root tag
    each sub n
      sub save s xml

method doc save stream options
  arg Document doc ; arg_rw Stream stream ; arg Str options
  doc:root save stream (options option "xml")
  
method doc save filename options -> status
  arg Document doc ; arg Str filename options ; arg Status status
  (var Stream s) open filename options out+safe
  doc:root save s (options option "xml")
  status := shunt s=success success failure


export '. load' '. save'