Patch title: Release 91 bulk changes
Abstract:
File: /appli/document/xml.pli
Key:
    Removed line
    Added line
module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"
module "document.pli"
module "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 Link: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_tail (tag map DocumentNode) (parent map DocumentNode)


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


method document load stream options
  arg_rw Document document ; arg_rw Stream stream ; arg Str options
  # FIXME: clear the 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 Document n ; arg_rw Stream s ; arg CBool xml
  if n:tag<>""
    s writechars "<"+n:tag
    n first_attr (var Str attr) (var Str value)
    while attr<>""
      s writechars " "+attr+"=[dq]"+value+"[dq]"
      n next_attr (var Str attr) (var Str value)
    if xml and not (exists n:first)
      s writechars " /"
    s writechars ">"
    if (exists n:first) and n:first:text<>"" and not (exists n:first:next)
      s writeline n:first:text+"</"+n:tag+">"
    else
      s writeline ""
      var Pointer:Document c :> n first
      while exists:c
        c save s xml
        c :> c next
      if (exists n:first)
        s writeline "</"+n:tag+">"
  eif n:text<>""
    s writeline n:text
  else
    var Pointer:Document c :> n first
    while exists:c
      c save s xml
      c :> c next

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


export '. load' '. save'