XmlBase is a base class for building XML builders. See Builder::XmlMarkup and Builder::XmlEvents for examples.
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. |
| encoding: | When encoding and $KCODE are set to ‘utf-8’ characters aren‘t converted to character entities in the output stream. |
[ show source ]
# File lib/builder/xmlbase.rb, line 24
24: def initialize(indent=0, initial=0, encoding='utf-8')
25: @indent = indent
26: @level = initial
27: @encoding = encoding.downcase
28: end
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.
[ show source ]
# File lib/builder/xmlbase.rb, line 100
100: def <<(text)
101: _text(text)
102: 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.
[ show source ]
# File lib/builder/xmlbase.rb, line 40
40: def method_missing(sym, *args, &block)
41: text = nil
42: attrs = nil
43: sym = "#{sym}:#{args.shift}" if args.first.kind_of?(Symbol)
44: args.each do |arg|
45: case arg
46: when Hash
47: attrs ||= {}
48: attrs.merge!(arg)
49: else
50: text ||= ''
51: text << arg.to_s
52: end
53: end
54: if block
55: unless text.nil?
56: raise ArgumentError, "XmlMarkup cannot mix a text argument with a block"
57: end
58: _indent
59: _start_tag(sym, attrs)
60: _newline
61: _nested_structures(block)
62: _indent
63: _end_tag(sym)
64: _newline
65: elsif text.nil?
66: _indent
67: _start_tag(sym, attrs, true)
68: _newline
69: else
70: _indent
71: _start_tag(sym, attrs)
72: text! text
73: _end_tag(sym)
74: _newline
75: end
76: @target
77: 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).
[ show source ]
# File lib/builder/xmlbase.rb, line 110
110: def nil?
111: false
112: 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.
[ show source ]
# File lib/builder/xmlbase.rb, line 33
33: def tag!(sym, *args, &block)
34: method_missing(sym.to_sym, *args, &block)
35: 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>
[ show source ]
# File lib/builder/xmlbase.rb, line 83
83: def text!(text)
84: _text(_escape(text))
85: end