class XML::DOM::Builder

Class XML::DOM::Builder (XML::SimpleTreeBuilder)

superclass

XML::Parser

Attributes

createCDATASection[RW]
createEntityReference[RW]

Public Class Methods

default(data) click to toggle source
# File lib/xml/dom/builder.rb, line 79
def self.default(data); defaultHandler(data); end
new(level = 0, *args) click to toggle source

Class Methods

Calls superclass method
# File lib/xml/dom/builder.rb, line 54
def self.new(level = 0, *args)
  document = Document.new
  ret = super(*args)
  external = false
  external = true if args[0].is_a?(SimpleTreeBuilder)
  ret.__initialize__(level, document, external)
  ret
end

Public Instance Methods

__initialize__(level, document, external) click to toggle source

Constructor

parser = XML::SimpleTreeBuilder.new(level)
  level: 0 -- ignore default events (defualt)
         1 -- catch default events and create the Comment,
              the EntityReference, the XML declaration (as PI) and
              the non-DOM-compliant DocumentType nodes.
# File lib/xml/dom/builder.rb, line 69
def __initialize__(level, document, external)
  @tree = nil
  @level = level
  @document = document
  @external = external
  @createCDATASection = false
  @createEntityReference = false
  if @level > 0
    @createCDATASection = true
    @createEntityReference = true
    def self.default(data); defaultHandler(data); end
  end
end
cdataConverter(str) click to toggle source
# File lib/xml/dom/builder.rb, line 103
def cdataConverter(str)
  str
end
character(data) click to toggle source
# File lib/xml/dom/builder.rb, line 166
def character(data)
  @cdata_buf << data
 end
comment(data) click to toggle source
# File lib/xml/dom/builder.rb, line 220
def comment(data)
  text
  comment = @document.createComment(cdataConverter(data))
  ## Comment should not be converted
  @current.appendChild(comment)
end
defaultHandler(data) click to toggle source
# File lib/xml/dom/builder.rb, line 227
    def defaultHandler(data)
      if data =~ /^\&(.+);$/
        eref = @document.createEntityReference(nameConverter($1))
        @current.appendChild(eref)
      elsif data =~ /^<\?xml\s*([\s\S]*)\?>$/
        ## XML declaration should not be a PI.
        pi = @document.createProcessingInstruction("xml",
                                       cdataConverter($1))
        @current.appendChild(pi)
      elsif @inDocDecl == 0 && data =~ /^<\!DOCTYPE$/
        @inDocDecl = 1
        @inDecl = 0
        @idRest = 0
        @extID = nil
      elsif @inDocDecl == 1
        if data == "["
          @inDocDecl = 2
        elsif data == ">"
          if !@extID.nil?
##            @current.nodeValue = @extID
          end
          @inDocDecl = 0
##          @current = @current.parentNode
        elsif data == "SYSTEM"
          @idRest = 1
          @extID = data
        elsif data == "PUBLIC"
          @idRest = 2
          @extID = data
        elsif data !~ /^\s+$/
          if @idRest > 0
            ## SysID or PubID
            @extID <<= " " + data
            @idRest -= 1
          else
            ## Root Element Type
            docType = data
##            doctype = DocumentType.new(nameConverter(docType))
##            @current.appendChild(doctype)
##            @current = doctype
          end
        end
      elsif @inDocDecl == 2
        if @inDecl == 0
          if data == "]"
            @inDocDecl = 1
          elsif data =~ /^<\!/
            @decl = data
            @inDecl = 1
          elsif data =~ /^%(.+);$/
            ## PERef
##            cdata = @document.createTextNode(nameConverter(data))
##            @current.appendChild(cdata)
          else
            ## WHITESPCAE
          end
        else ## inDecl == 1
          if data == ">"
            @decl <<= data
            @inDecl = 0
            ## Markup Decl
##            cdata = @document.createTextNode(cdataConverter(@decl))
            ## Markup decl should not be converted
##            @current.appendChild(cdata)
          elsif data =~ /^\s+$/
            ## WHITESPACE
            @decl << " "
          else
            @decl << data
          end
        end
      else
        ## maybe WHITESPACE
##        cdata = @document.createTextNode(cdataConverter(data))
##        @current.appendChild(cdata)
      end
    end
endCdata() click to toggle source
# File lib/xml/dom/builder.rb, line 212
def endCdata
  return unless @createCDATASection
  cdata = @document.createCDATASection(cdataConverter(@cdata_buf))
  @current.appendChild(cdata)
  @cdata_buf = ''
  @cdata_f = false
end
endElement(name) click to toggle source
# File lib/xml/dom/builder.rb, line 161
def endElement(name)
  text
  @current = @current.parentNode
end
externalEntityRef(context, base, systemId, publicId) click to toggle source
# File lib/xml/dom/builder.rb, line 178
def externalEntityRef(context, base, systemId, publicId)
  text
  tree = nil
  if @parse_ext
    extp = self.class.new(@level, self, context)
    extp.setBase(base) if base
    file = systemId
    if systemId !~ /^\/|^\.|^http:|^ftp:/ && !base.nil?
      file = base + systemId
    end
    begin
      tree = extp.parse(open(file).read, @parse_ext)
    rescue XML::ParserError
      raise XML::ParserError.new("#{systemId}(#{extp.line}): #{$!}")
    rescue Errno::ENOENT
      raise Errno::ENOENT.new("#{$!}")
    end
    extp.done
  end
  if @createEntityReference
    entref = @document.createEntityReference(nameConverter(context))
    @current.appendChild(entref)
    entref.appendChild(tree) if tree
  else
    @current.appendChild(tree) if tree
  end
end
nameConverter(str) click to toggle source

Methods

# File lib/xml/dom/builder.rb, line 92
def nameConverter(str)
  str
end
parse(xml, parse_ext = false) click to toggle source

Methods

Calls superclass method
# File lib/xml/dom/builder.rb, line 123
def parse(xml, parse_ext = false)
  if @external
    @tree = @document.createDocumentFragment
  else
    @tree = @document
  end
  @parse_ext = parse_ext
  @current = @tree
  @inDocDecl = 0
  @decl = ""
  @inDecl = 0
  @idRest = 0
  @extID = nil
  @cdata_f = false
  @cdata_buf = ''
  super(xml)
  @tree
end
processingInstruction(name, data) click to toggle source
# File lib/xml/dom/builder.rb, line 170
def processingInstruction(name, data)
  text
  pi = @document.createProcessingInstruction(nameConverter(name),
                                             cdataConverter(data))
  ## PI data should not be converted
  @current.appendChild(pi)
end
startCdata() click to toggle source
# File lib/xml/dom/builder.rb, line 206
def startCdata
  return unless @createCDATASection
  text
  @cdata_f = true
end
startElement(name, data) click to toggle source
# File lib/xml/dom/builder.rb, line 149
def startElement(name, data)
  text
  elem = @document.createElement(nameConverter(name))
  data.each do |key, value|
    attr = @document.createAttribute(nameConverter(key))
    attr.appendChild(@document.createTextNode(cdataConverter(value)))
    elem.setAttributeNode(attr)
  end
  @current.appendChild(elem)
  @current = elem
end
text() click to toggle source
# File lib/xml/dom/builder.rb, line 142
def text
  return if @cdata_buf == ''
  textnode = @document.createTextNode(cdataConverter(@cdata_buf))
  @current.appendChild(textnode)
  @cdata_buf = ''
end