class Rsxml::Visitor::BuildRsxmlVisitor

Constants

OPTS

The :style option specifies how the Rsxml is to be produced

:xml style is with compact <tt>"prefix:local_part"</tt> Strings for QNames, and namespace declaration attributes
:exploded style is with <tt>[local_part, prefix, uri]</tt> triples for QNames, and no namespace declaration attributes

Attributes

cursor_stack[R]
element_transformer[R]
opts[R]
sexp[R]

Public Class Methods

new(opts=nil, &element_transformer) click to toggle source
# File lib/rsxml/visitor.rb, line 53
def initialize(opts=nil, &element_transformer)
  @opts = Util.check_opts(OPTS, opts) 
  @cursor_stack = []
  @element_transformer = element_transformer
end

Public Instance Methods

compact_attr_names(attrs) click to toggle source
# File lib/rsxml/visitor.rb, line 65
def compact_attr_names(attrs)
  Hash[attrs.map{|qname,value| [compact_qname(qname), value]}]
end
compact_qname(qname) click to toggle source
# File lib/rsxml/visitor.rb, line 59
def compact_qname(qname)
  local_part, prefix, uri = qname

  [prefix, local_part].map{|s| (!s || s.empty?) ? nil : s}.compact.join(":")
end
element(context, element_name, attrs, ns_decls) { || ... } click to toggle source
# File lib/rsxml/visitor.rb, line 69
def element(context, element_name, attrs, ns_decls)

  element_name, attrs = element_transformer.call(context, element_name, attrs) if element_transformer

  opts[:style] ||= :exploded
  if opts[:style] == :xml
    element_name = compact_qname(element_name)
    attrs = compact_attr_names(attrs)
    ns_attrs = Namespace.namespace_attributes(ns_decls)
    attrs = attrs.merge(ns_attrs)
  end
  
  el = [element_name, (attrs if attrs.size>0)].compact

  if !cursor_stack.last
    @sexp = el
  else
    cursor_stack.last << el
  end
  cursor_stack.push(el)

  begin
    yield
  ensure
    cursor_stack.pop
  end
end
text(context, text) click to toggle source
# File lib/rsxml/visitor.rb, line 97
def text(context, text)
  cursor_stack.last << text
end