Module: Erector::Element
- Included in:
- AbstractWidget
- Defined in:
- lib/erector/element.rb
Instance Method Summary collapse
-
#_element(tag_name, *args, &block) ⇒ Object
moved to Promise # Emits an open tag, comprising ‘<’, tag name, optional attributes, and ‘>’ def open_tag(promise) output.newline if newliney?(promise._tag_name) && !output.at_line_start? output << promise._open_tag output.indent end.
- #_empty_element(tag_name, attributes = {}) ⇒ Object
-
#element(*args, &block) ⇒ Object
Internal method used to emit an HTML/XML element, including an open tag, attributes (optional, via the default hash), contents (also optional), and close tag.
-
#empty_element(*args, &block) ⇒ Object
Internal method used to emit a self-closing HTML/XML element, including a tag name and optional attributes (passed in via the default hash).
Instance Method Details
#_element(tag_name, *args, &block) ⇒ Object
moved to Promise # Emits an open tag, comprising ‘<’, tag name, optional attributes, and ‘>’ def open_tag(promise)
output.newline if newliney?(promise._tag_name) && !output.at_line_start?
output << promise._open_tag
output.indent
end
# Emits a close tag, consisting of ‘<’, ‘/’, tag name, and ‘>’ def close_tag(promise)
output.undent
output << promise._close_tag
if newliney?(promise._tag_name)
output.newline
end
end
def inside_tag value, block
if block
block.call
else
text value
end
end
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/erector/element.rb', line 67 def _element(tag_name, *args, &block) if args.length > 2 raise ArgumentError, "too many args" end attributes, value = nil, nil arg0 = args[0] if arg0.is_a?(Hash) attributes = arg0 else value = arg0 arg1 = args[1] if arg1.is_a?(Hash) attributes = arg1 end end if block && value raise ArgumentError, "You can't pass both a block and a value to #{tag_name} -- please choose one." end attributes ||= {} promise = if !value.nil? Promise.new(output, tag_name, attributes, false, newliney?(tag_name)) do if value.is_a? AbstractWidget value else text value end end elsif block Promise.new(output, tag_name, attributes, false, newliney?(tag_name), &block) else Promise.new(output, tag_name, attributes, false, newliney?(tag_name)) end promise._render promise end |
#_empty_element(tag_name, attributes = {}) ⇒ Object
105 106 107 108 109 |
# File 'lib/erector/element.rb', line 105 def _empty_element(tag_name, attributes={}) promise = Promise.new(output, tag_name, attributes, true, newliney?(tag_name)) promise._render promise end |
#element(*args, &block) ⇒ Object
Internal method used to emit an HTML/XML element, including an open tag, attributes (optional, via the default hash), contents (also optional), and close tag.
Using the arcane powers of Ruby, there are magic methods that call element
for all the standard HTML tags, like a
, body
, p
, and so forth. Look at the source of erector/html.rb for the full list. Unfortunately, this big mojo confuses rdoc, so we can’t see each method in this rdoc page, but trust us, they’re there.
When calling one of these magic methods, put attributes in the default hash. If there is a string parameter, then it is used as the contents. If there is a block, then it is executed (yielded), and the string parameter is ignored. The block will usually be in the scope of the child widget, which means it has access to all the methods of Widget, which will eventually end up appending text to the output
string. See how elegant it is? Not confusing at all if you don’t think about it.
25 26 27 |
# File 'lib/erector/element.rb', line 25 def element(*args, &block) _element(*args, &block) end |
#empty_element(*args, &block) ⇒ Object
Internal method used to emit a self-closing HTML/XML element, including a tag name and optional attributes (passed in via the default hash).
Using the arcane powers of Ruby, there are magic methods that call empty_element
for all the standard HTML tags, like img
, br
, and so forth. Look at the source of #self_closing_tags for the full list. Unfortunately, this big mojo confuses rdoc, so we can’t see each method in this rdoc page, but trust us, they’re there.
38 39 40 |
# File 'lib/erector/element.rb', line 38 def empty_element(*args, &block) _empty_element(*args, &block) end |