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

Version Path
nitro-0.10.0 lib/nitro/builders/xml.rb
nitro-0.11.0 lib/nitro/builders/xml.rb
nitro-0.12.0 lib/nitro/builders/xml.rb
nitro-0.13.0 lib/nitro/builders/xml.rb
nitro-0.14.0 lib/nitro/builders/xml.rb
nitro-0.15.0 lib/nitro/builders/xml.rb