XRB SourceXRB

module XRB

Nested

Definitions

def self.Reference(path = '', **parameters)

Generate a URI from a path and user parameters. The path may contain a #fragment or ?query=parameters.

Implementation

def self.Reference(path = '', **parameters)
	base, fragment = path.split('#', 2)
	path, query_string = base.split('?', 2)
	
	if query_string
		query = Query.parse(Buffer.new(query_string))
	else
		query = {}
	end
	
	query.update(parameters)
	
	Reference.new(path, query, fragment: fragment)
end

Tag

This represents an individual SGML tag, e.g. , or , with attributes. Attribute values must be escaped.

Implementation

Tag = Struct.new(:name, :closed, :attributes) do
	include XRB::Markup
	
	def self.split(qualified_name)
		if i = qualified_name.index(':')
			return qualified_name.slice(0...i), qualified_name.slice(i+1..-1)
		else
			return nil, qualified_name
		end
	end
	
	def self.closed(name, attributes = {})
		self.new(name, true, attributes)
	end
	
	def self.opened(name, attributes = {})
		self.new(name, false, attributes)
	end
	
	def [] key
		attributes[key]
	end
	
	alias to_hash attributes
	
	def to_s(content = nil)
		self.class.format_tag(name, attributes, content || !closed)
	end
	
	alias to_str to_s
	
	def self_closed?
		closed
	end
	
	def write_opening_tag(buffer)
		buffer << '<' << name
		
		self.class.append_attributes(buffer, attributes, nil)
		
		if self_closed?
			buffer << '/>'
		else
			buffer << '>'
		end
	end
	
	def write_closing_tag(buffer)
		buffer << '</' << name << '>'
	end
	
	def write(buffer, content = nil)
		self.class.append_tag(buffer, name, attributes, content || !closed)
	end
	
	def self.format_tag(name, attributes, content)
		buffer = String.new.force_encoding(name.encoding)
		
		self.append_tag(buffer, name, attributes, content)
		
		return buffer
	end
	
	def self.append_tag(buffer, name, attributes, content)
		buffer << '<' << name.to_s
		
		self.append_attributes(buffer, attributes, nil)
		
		if !content
			buffer << '/>'
		else
			buffer << '>'
			unless content == true
				Markup.append(buffer, content)
			end
			buffer << '</' << name.to_s << '>'
		end
		
		return nil
	end
	
	# Convert a set of attributes into a string suitable for use within a <tag>.
	def self.append_attributes(buffer, attributes, prefix)
		attributes.each do |key, value|
			next unless value
			
			attribute_key = prefix ? "#{prefix}-#{key}" : key
			
			case value
			when Hash
				self.append_attributes(buffer, value, attribute_key)
			when Array
				value.each do |attribute|
					raise TypeError, "expected array of key-value pairs" unless attribute.is_a?(Array) and attribute.size == 2
					
					self.append_attributes(buffer, [attribute], attribute_key)
				end
			when TrueClass
				buffer << ' ' << attribute_key.to_s
			else
				buffer << ' ' << attribute_key.to_s << '="'
				Markup.append(buffer, value)
				buffer << '"'
			end
		end
		
		return nil
	end
end

OUT = :_out

The output variable that will be used in templates:

def self.URI(path = '', parameters = nil)

Generate a URI from a path and user parameters. The path may contain a #fragment or ?query=parameters.

Implementation

def self.URI(path = '', parameters = nil)
	base, fragment = path.split('#', 2)
	path, query_string = base.split('?', 2)
	
	URI.new(path, query_string, fragment, parameters)
end