Class Builder::XmlBase
In: vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb
Parent: BlankSlate

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

Methods

<<   method_missing   new   nil?   tag!   text!  

Public Class methods

Create an XML markup builder.

out:Object receiving the markup. out must respond to <<.
indent:Number of spaces used for indentation (0 implies no indentation and no line breaks).
initial:Level of initial indentation.

[Source]

    # File vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb, line 22
22:     def initialize(indent=0, initial=0)
23:       @indent = indent
24:       @level  = initial
25:     end

Public Instance methods

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.

[Source]

    # File vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb, line 97
97:     def <<(text)
98:       _text(text)
99:     end

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.

[Source]

    # File vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb, line 37
37:     def method_missing(sym, *args, &block)
38:       text = nil
39:       attrs = nil
40:       sym = "#{sym}:#{args.shift}" if args.first.kind_of?(Symbol)
41:       args.each do |arg|
42:         case arg
43:         when Hash
44:           attrs ||= {}
45:           attrs.merge!(arg)
46:         else
47:           text ||= ''
48:           text << arg.to_s
49:         end
50:       end
51:       if block
52:         unless text.nil?
53:           raise ArgumentError, "XmlMarkup cannot mix a text argument with a block"
54:         end
55:         _indent
56:         _start_tag(sym, attrs)
57:         _newline
58:         _nested_structures(block)
59:         _indent
60:         _end_tag(sym)
61:         _newline
62:       elsif text.nil?
63:         _indent
64:         _start_tag(sym, attrs, true)
65:         _newline
66:       else
67:         _indent
68:         _start_tag(sym, attrs)
69:         text! text
70:         _end_tag(sym)
71:         _newline
72:       end
73:       @target
74:     end

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).

[Source]

     # File vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb, line 107
107:     def nil?
108:       false
109:     end

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

[Source]

    # File vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb, line 30
30:     def tag!(sym, *args, &block)
31:       method_missing(sym.to_sym, *args, &block)
32:     end

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

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

[Source]

    # File vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb, line 80
80:     def text!(text)
81:       _text(_escape(text))
82:     end

[Validate]