Sha256: 8e3cdd761695776a7e8671a6d9e5658bfe67a6a43a8ec367139d6887f0e0e123
Contents?: true
Size: 1.69 KB
Versions: 6
Compression:
Stored size: 1.69 KB
Contents
# George Moschovitis <gm@navel.gr> # (c) 2005 Navel, all rights reserved. # $Id$ module N # A helper mixin for programmatically building XML # blocks. module XmlBuilderMixin def method_missing(tag, *args, &block) self.class.module_eval <<-"end_eval", __FILE__, __LINE__ def #{tag}(*args) attrs = args.last.is_a?(Hash) ? args.pop : nil if block_given? start_tag('#{tag}', attrs) yield end_tag('#{tag}') elsif (!args.empty?) start_tag('#{tag}', attrs) self << args.first end_tag('#{tag}') else start_tag('#{tag}', attrs, false) self << ' />' end end end_eval self.send(tag, *args, &block) end def start_tag(tag, attributes = nil, close = true) unless attributes if close self << "<#{tag}>" else self << "<#{tag}" end else self << "<#{tag}" for name, value in attributes if value self << %| #{name}="#{value}"| else self << %| #{name}="1"| end end self << ">" if close end return self end def end_tag(tag) self << "</#{tag}>" return self end def text(str) self << str return self end def comment(str) self << "<!-- #{str} -->" return self end end # A String extension with XML generation # functionality. class XmlString < String include N::XmlBuilderMixin end # A class that encapsulats the XML generation # functionality. Utilizes duck typing to redirect # output to a target buffer. class XmlBuilder include N::XmlBuilderMixin # The target receives the generated xml, # should respond_to :<< attr_accessor :target def initialize(target = '') @target = target end def << (str) @target << str end def to_s @target.to_s end end end
Version data entries
6 entries across 6 versions & 1 rubygems