Class: Builder::XmlBase

Inherits:
BlankSlate show all
Defined in:
lib/action_view/vendor/builder/xmlbase.rb

Overview

XmlBase is a base class for building XML builders. See Builder::XmlMarkup and Builder::XmlEvents for examples.

Direct Known Subclasses

XmlMarkup

Instance Method Summary collapse

Methods inherited from BlankSlate

hide

Constructor Details

#initialize(indent = 0, initial = 0) ⇒ XmlBase

Create an XML markup builder.

out

Object receiving the markup.1 out must respond to <<.

indent

Number of spaces used for indentation (0 implies no indentation and no line breaks).

initial

Level of initial indentation.


23
24
25
26
# File 'lib/action_view/vendor/builder/xmlbase.rb', line 23

def initialize(indent=0, initial=0)
  @indent = indent
  @level  = initial
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(sym, *args, &block) ⇒ Object

Create XML markup based on the name of the method. This method is never invoked directly, but is called for each markup method in the markup block.


38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/action_view/vendor/builder/xmlbase.rb', line 38

def method_missing(sym, *args, &block)
  text = nil
  attrs = nil
  sym = "#{sym}:#{args.shift}" if args.first.kind_of?(Symbol)
  args.each do |arg|
	case arg
	when Hash
	  attrs ||= {}
	  attrs.merge!(arg)
	else
	  text ||= ''
	  text << arg.to_s
	end
  end
  if block
	unless text.nil?
	  raise ArgumentError, "XmlMarkup cannot mix a text argument with a block"
	end
	_capture_outer_self(block) if @self.nil?
	_indent
	_start_tag(sym, attrs)
	_newline
	_nested_structures(block)
	_indent
	_end_tag(sym)
	_newline
  elsif text.nil?
	_indent
	_start_tag(sym, attrs, true)
	_newline
  else
	_indent
	_start_tag(sym, attrs)
	text! text
	_end_tag(sym)
	_newline
  end
  @target
end

Instance Method Details

#<<(text) ⇒ Object

Append text to the output target without escaping any markup. May be used within the markup brackets as:

builder.p { |x| x << "<br/>HI" }   #=>  <p><br/>HI</p>

This is useful when using non-builder enabled software that generates strings. Just insert the string directly into the builder without changing the inserted markup.

It is also useful for stacking builder objects. Builders only use << to append to the target, so by supporting this method/operation builders can use other builders as their targets.


99
100
101
# File 'lib/action_view/vendor/builder/xmlbase.rb', line 99

def <<(text)
  _text(text)
end

#nil?Boolean

For some reason, nil? is sent to the XmlMarkup object. If nil? is not defined and method_missing is invoked, some strange kind of recursion happens. Since nil? won't ever be an XML tag, it is pretty safe to define it here. (Note: this is an example of cargo cult programming, cf. fishbowl.pastiche.org/2004/10/13/cargo_cult_programming).

Returns:

  • (Boolean)

109
110
111
# File 'lib/action_view/vendor/builder/xmlbase.rb', line 109

def nil?
  false
end

#tag!(sym, *args, &block) ⇒ Object

Create a tag named sym. Other than the first argument which is the tag name, the arguements are the same as the tags implemented via method_missing.


31
32
33
# File 'lib/action_view/vendor/builder/xmlbase.rb', line 31

def tag!(sym, *args, &block)
  self.__send__(sym, *args, &block)
end

#text!(text) ⇒ Object

Append text to the output target. Escape any markup. May be used within the markup brackets as:

builder.p { br; text! "HI" }   #=>  <p><br/>HI</p>

82
83
84
# File 'lib/action_view/vendor/builder/xmlbase.rb', line 82

def text!(text)
  _text(_escape(text))
end