Sha256: df6073117e7a7e756fb6f8bb419a7ad069b3a80ee055715ebb424480e0bd6862

Contents?: true

Size: 1.67 KB

Versions: 3

Compression:

Stored size: 1.67 KB

Contents

# George Moschovitis  <gm@navel.gr>
# (c) 2005 Navel, all rights reserved.
# $Id$

module N

# = XmlBuilderMixin
#
# 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)
					self << ' />'
				end
			end
		end_eval

		self.send(tag, *args, &block)
	end

	def start_tag(tag, attributes = nil)
		unless attributes
			self << "<#{tag}>"
		else
			self << "<#{tag}"
			for name, value in attributes
				if value
					self << %| #{name}="#{value}"|
				else
					self << %| #{name}="1"|
				end
			end
			self << ">"
		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

# = XmlString
#
# A String extension with XML generation
# functionality.

class XmlString < String
	include N::XmlBuilderMixin
end

# = XmlBuilder
#
# 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

3 entries across 3 versions & 1 rubygems

Version Path
nitro-0.8.0 lib/nitro/builders/xml.rb
nitro-0.9.3 lib/nitro/builders/xml.rb
nitro-0.9.5 lib/nitro/builders/xml.rb