module XML

Public Class Methods

analyze_elem(elem) click to toggle source
# File lib/xml-dsl/compile.rb, line 37
def self.analyze_elem elem
  [elem[0], get_elem_part(elem, Hash), get_elem_part(elem, [Array, String])]
end
brackets(tag) click to toggle source
# File lib/xml-dsl/compile.rb, line 33
def self.brackets tag
  '<' + tag + '>'
end
compile_attrs(attrs) click to toggle source
# File lib/xml-dsl/compile.rb, line 27
def self.compile_attrs attrs
  attrs.map do |name, value|
    "#{name}=#{value.to_s.encode(xml: :attr)}"
  end.join ' '
end
compile_elems(elems) click to toggle source
# File lib/xml-dsl/compile.rb, line 14
def self.compile_elems elems
  elems.map do |elem|
    tagged(*analyze_elem(elem))
  end.join
end
from_array(array, format: true) click to toggle source
# File lib/xml-dsl/compile.rb, line 6
def self.from_array array, format: true
  xml = compile_elems(array)

  return xml if not format

  Nokogiri::XML(xml, &:noblanks).to_xml(indent: 4, &:no_declaration)
end
get_elem_part(elem, classes) click to toggle source
# File lib/xml-dsl/compile.rb, line 41
def self.get_elem_part elem, classes
  raise "Error: An array longer than 3 representing an element is detected.: \
         #{elem}" if elem.length > 3

  classes = [classes] if classes.is_a? Class
  in_classes = lambda { |x| classes.map{ |klass| x.is_a? klass }.any? }

  if in_classes.call elem[1]
    elem[1]
  elsif in_classes.call elem[2]
    elem[2]
  else
    classes[0].new
  end
end
tagged(tag, attrs, body) click to toggle source
# File lib/xml-dsl/compile.rb, line 20
def self.tagged tag, attrs, body
  tag = tag.to_s
  brackets(tag + (attrs.length > 0 ? ' ' + compile_attrs(attrs) : '')) \
      + (body.is_a?(String) ? body : compile_elems(body)) \
      + brackets('/' + tag)
end