class Nokogiri::Streaming::Reader

Public Class Methods

new(source, encoding: 'utf-8') click to toggle source
# File lib/nokogiri/streaming/reader.rb, line 10
def initialize(source, encoding: 'utf-8')
  @source = IOWrapper.new(source)
  @parser = Nokogiri::XML::SAX::Parser.new(self, encoding)
  @stack = []
  @end_triggers = {}
  @start_triggers = {}
end

Public Instance Methods

cdata_block(string) click to toggle source
# File lib/nokogiri/streaming/reader.rb, line 103
def cdata_block(string)
  if @current
    @current.add_child(@current.document.create_cdata(string))
  end
end
characters(string) click to toggle source
# File lib/nokogiri/streaming/reader.rb, line 97
def characters(string)
  if @current
    @current.add_child(string)
  end
end
current_path() click to toggle source
# File lib/nokogiri/streaming/reader.rb, line 30
def current_path
  if @stack.any?
    '/' + @stack.join('/')
  else
    ''
  end
end
end_document() click to toggle source
# File lib/nokogiri/streaming/reader.rb, line 49
def end_document
end
end_element(name) click to toggle source
# File lib/nokogiri/streaming/reader.rb, line 80
def end_element(name)
  path = current_path

  @stack.pop

  element = @current
  if @current
    @current = @current.parent
  end

  if (triggers = @end_triggers[path])
    triggers.each do |proc|
      proc.call(element)
    end
  end
end
error(message) click to toggle source

The following methods are SAX callbacks from Nokogiri.

# File lib/nokogiri/streaming/reader.rb, line 42
def error(message)
  if @source.exception
    raise @source.exception
  end
  raise ParseError.new(message)
end
on(path, &block) click to toggle source
# File lib/nokogiri/streaming/reader.rb, line 22
def on(path, &block)
  (@end_triggers[path] ||= []).push(block)
end
on_start(path, &block) click to toggle source
# File lib/nokogiri/streaming/reader.rb, line 26
def on_start(path, &block)
  (@start_triggers[path] ||= []).push(block)
end
run() click to toggle source
# File lib/nokogiri/streaming/reader.rb, line 18
def run
  @parser.parse(@source)
end
start_element(name, attrs = []) click to toggle source
# File lib/nokogiri/streaming/reader.rb, line 52
def start_element(name, attrs = [])
  if @current
    element = @current.document.create_element(name)
    attrs.each do |attrname, value|
      element[attrname] = value
    end
    @current.add_child(element)
    @current = element
  elsif @end_triggers.include?(current_path + '/' + name)
    fragment = Nokogiri::XML::DocumentFragment.new(Nokogiri::XML::Document.new)
    element = fragment.document.create_element(name)
    attrs.each do |attrname, value|
      element[attrname] = value
    end
    @current = element
  elsif (triggers = @start_triggers[current_path + '/' + name])
    fragment = Nokogiri::XML::DocumentFragment.new(Nokogiri::XML::Document.new)
    element = fragment.document.create_element(name)
    attrs.each do |attrname, value|
      element[attrname] = value
    end
    triggers.each do |proc|
      proc.call(element)
    end
  end
  @stack.push(name)
end