//
// Copyright (c) 2008, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
//    7 Nov 08  Brian Frank  Creation
//

**
** XNode is the base class for [XElem] and [XText].
**
@Js abstract class XNode
{

  **
  ** Return the node type enum.  Note that XElem always
  ** returns `elem`, but that during pull parsing XParser
  ** will return `elemStart` and `elemEnd`.
  **
  abstract XNodeType nodeType()

  **
  ** Get the root document node or null if this node is
  ** not mounted under a XDoc instance.
  **
  XDoc? doc()
  {
    for (XNode? x := this; x != null; x = x.parent)
      if (x is XDoc) return x
    return null
  }

  **
  ** Get the parent of this node or null if unmounted.
  **
  XNode? parent { internal set }

  **
  ** Conveniece to [write] to an in-memory string.
  **
  Str writeToStr()
  {
    s := StrBuf()
    write(s.out)
    return s.toStr
  }

  **
  ** Write this node to the output stream.
  **
  abstract Void write(OutStream out)

}

**************************************************************************
** XNodeType
**************************************************************************

**
** Enumerates the type of [XNode] and current node of [XParser].
**
@Js enum class XNodeType
{
  ** Document node type by [XDoc.nodeType]
  doc,

  ** Element node type returned by [XElem.nodeType]
  elem,

  ** Text node type returned by [XText.nodeType]
  text,

  ** Processing instruction node type returned by [XPi.nodeType]
  pi,

  ** Start of element used by XParser when pull parsing.
  elemStart,

  ** End of element used by XParser when pull parsing.
  elemEnd
}