Class: Haml::Buffer
- Defined in:
- lib/haml/buffer.rb
Overview
This class is used only internally. It holds the buffer of HTML that is eventually output as the resulting document. It’s called from within the precompiled code, and helps reduce the amount of processing done within ‘instance_eval`ed code.
Constant Summary
Constants included from Util
Constants included from Helpers
Instance Attribute Summary collapse
- #active ⇒ Boolean writeonly
-
#buffer ⇒ String
The string that holds the compiled HTML.
-
#capture_position ⇒ Fixnum?
nil if there’s no capture_haml block running, and the position at which it’s beginning the capture if there is one.
-
#options ⇒ Hash<String, Object>
The options hash passed in from Engine.
-
#upper ⇒ Buffer
The Buffer for the enclosing Haml document.
Class Method Summary collapse
-
.merge_attrs(to, from) ⇒ Hash<String, String>
Merges two attribute hashes.
Instance Method Summary collapse
-
#active? ⇒ Boolean
Whether or not this buffer is currently being used to render a Haml template.
-
#adjust_tabs(tab_change) ⇒ Object
Modifies the indentation of the document.
-
#html4? ⇒ Boolean
Whether or not the format is HTML4.
-
#html5? ⇒ Boolean
Whether or not the format is HTML5.
-
#html? ⇒ Boolean
Whether or not the format is any flavor of HTML.
-
#initialize(upper = nil, options = {}) ⇒ Buffer
constructor
A new instance of Buffer.
-
#open_tag(name, self_closing, try_one_line, preserve_tag, escape_html, class_id, nuke_outer_whitespace, nuke_inner_whitespace, obj_ref, content, *attributes_hashes) ⇒ Object
Takes the various information about the opening tag for an element, formats it, and appends it to the buffer.
-
#push_text(text, tab_change, dont_tab_up) ⇒ Object
Appends text to the buffer, properly tabulated.
-
#rstrip! ⇒ Object
Remove the whitespace from the right side of the buffer string.
-
#tabulation ⇒ Fixnum
The current indentation level of the document.
-
#tabulation=(val) ⇒ Object
Sets the current tabulation of the document.
-
#toplevel? ⇒ Boolean
Whether or not this buffer is a top-level template, as opposed to a nested partial.
-
#xhtml? ⇒ Boolean
Whether or not the format is XHTML.
Methods included from Util
#def_static_method, #enum_with_index, #has?, #map_hash, #map_keys, #map_vals, #merge_adjacent_strings, #powerset, #ruby1_8?, #scope, #static_method_name, #to_hash
Methods included from Helpers
action_view?, #block_is_haml?, #capture_haml, #escape_once, #find_and_preserve, #haml_concat, #haml_indent, #haml_tag, #html_attrs, #html_escape, #init_haml_helpers, #is_haml?, #list_of, #non_haml, #precede, #preserve, #puts, #succeed, #surround, #tab_down, #tab_up
Methods included from Helpers::ActionViewExtensions
Constructor Details
#initialize(upper = nil, options = {}) ⇒ Buffer
Returns a new instance of Buffer.
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'lib/haml/buffer.rb', line 90 def initialize(upper = nil, = {}) @active = true @upper = upper @options = { :attr_wrapper => "'", :ugly => false, :format => :xhtml }.merge @buffer = "" @tabulation = 0 # The number of tabs that Engine thinks we should have # @real_tabs + @tabulation is the number of tabs actually output @real_tabs = 0 end |
Instance Attribute Details
#active=(value) ⇒ Boolean (writeonly)
37 38 39 |
# File 'lib/haml/buffer.rb', line 37 def active=(value) @active = value end |
#buffer ⇒ String
The string that holds the compiled HTML. This is aliased as ‘_erbout` for compatibility with ERB-specific code.
14 15 16 |
# File 'lib/haml/buffer.rb', line 14 def buffer @buffer end |
#capture_position ⇒ Fixnum?
nil if there’s no capture_haml block running, and the position at which it’s beginning the capture if there is one.
33 34 35 |
# File 'lib/haml/buffer.rb', line 33 def capture_position @capture_position end |
#options ⇒ Hash<String, Object>
The options hash passed in from Engine.
20 21 22 |
# File 'lib/haml/buffer.rb', line 20 def @options end |
#upper ⇒ Buffer
The Haml::Buffer for the enclosing Haml document. This is set for partials and similar sorts of nested templates. It’s ‘nil` at the top level (see #toplevel?).
27 28 29 |
# File 'lib/haml/buffer.rb', line 27 def upper @upper end |
Class Method Details
.merge_attrs(to, from) ⇒ Hash<String, String>
Merges two attribute hashes. This is the same as ‘to.merge!(from)`, except that it merges id and class attributes.
ids are concatenated with ‘“_”`, and classes are concatenated with `“ ”`.
Destructively modifies both ‘to` and `from`.
250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 |
# File 'lib/haml/buffer.rb', line 250 def self.merge_attrs(to, from) if to['id'] && from['id'] to['id'] << '_' << from.delete('id') elsif to['id'] || from['id'] from['id'] ||= to['id'] end if to['class'] && from['class'] # Make sure we don't duplicate class names from['class'] = (from['class'].split(' ') | to['class'].split(' ')).join(' ') elsif to['class'] || from['class'] from['class'] ||= to['class'] end to.merge!(from) end |
Instance Method Details
#active? ⇒ Boolean
Whether or not this buffer is currently being used to render a Haml template. Returns ‘false` if a subtemplate is being rendered, even if it’s a subtemplate of this buffer’s template.
70 71 72 |
# File 'lib/haml/buffer.rb', line 70 def active? @active end |
#adjust_tabs(tab_change) ⇒ Object
Modifies the indentation of the document.
130 131 132 |
# File 'lib/haml/buffer.rb', line 130 def adjust_tabs(tab_change) @real_tabs += tab_change end |
#html4? ⇒ Boolean
Returns Whether or not the format is HTML4.
50 51 52 |
# File 'lib/haml/buffer.rb', line 50 def html4? @options[:format] == :html4 end |
#html5? ⇒ Boolean
Returns Whether or not the format is HTML5.
55 56 57 |
# File 'lib/haml/buffer.rb', line 55 def html5? @options[:format] == :html5 end |
#html? ⇒ Boolean
Returns Whether or not the format is any flavor of HTML.
45 46 47 |
# File 'lib/haml/buffer.rb', line 45 def html? html4? or html5? end |
#open_tag(name, self_closing, try_one_line, preserve_tag, escape_html, class_id, nuke_outer_whitespace, nuke_inner_whitespace, obj_ref, content, *attributes_hashes) ⇒ Object
Takes the various information about the opening tag for an element, formats it, and appends it to the buffer.
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 |
# File 'lib/haml/buffer.rb', line 196 def open_tag(name, self_closing, try_one_line, preserve_tag, escape_html, class_id, nuke_outer_whitespace, nuke_inner_whitespace, obj_ref, content, *attributes_hashes) tabulation = @real_tabs attributes = class_id attributes_hashes.each do |old| self.class.merge_attrs(attributes, to_hash(old.map {|k, v| [k.to_s, v]})) end self.class.merge_attrs(attributes, parse_object_ref(obj_ref)) if obj_ref if self_closing && xhtml? str = " />" + (nuke_outer_whitespace ? "" : "\n") else str = ">" + ((if self_closing && html? nuke_outer_whitespace else try_one_line || preserve_tag || nuke_inner_whitespace end) ? "" : "\n") end attributes = Precompiler.build_attributes(html?, @options[:attr_wrapper], attributes) @buffer << "#{nuke_outer_whitespace || @options[:ugly] ? '' : tabs(tabulation)}<#{name}#{attributes}#{str}" if content @buffer << "#{content}</#{name}>" << (nuke_outer_whitespace ? "" : "\n") return end @real_tabs += 1 unless self_closing || nuke_inner_whitespace end |
#push_text(text, tab_change, dont_tab_up) ⇒ Object
Appends text to the buffer, properly tabulated. Also modifies the document’s indentation.
113 114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/haml/buffer.rb', line 113 def push_text(text, tab_change, dont_tab_up) if @tabulation > 0 # Have to push every line in by the extra user set tabulation. # Don't push lines with just whitespace, though, # because that screws up precompiled indentation. text.gsub!(/^(?!\s+$)/m, tabs) text.sub!(tabs, '') if dont_tab_up end @buffer << text @real_tabs += tab_change end |
#rstrip! ⇒ Object
Remove the whitespace from the right side of the buffer string. Doesn’t do anything if we’re at the beginning of a capture_haml block.
229 230 231 232 233 234 235 236 |
# File 'lib/haml/buffer.rb', line 229 def rstrip! if capture_position.nil? buffer.rstrip! return end buffer << buffer.slice!(capture_position..-1).rstrip end |
#tabulation ⇒ Fixnum
Returns The current indentation level of the document.
75 76 77 |
# File 'lib/haml/buffer.rb', line 75 def tabulation @real_tabs + @tabulation end |
#tabulation=(val) ⇒ Object
Sets the current tabulation of the document.
82 83 84 85 |
# File 'lib/haml/buffer.rb', line 82 def tabulation=(val) val = val - @real_tabs @tabulation = val > -1 ? val : 0 end |
#toplevel? ⇒ Boolean
Returns Whether or not this buffer is a top-level template, as opposed to a nested partial.
61 62 63 |
# File 'lib/haml/buffer.rb', line 61 def toplevel? upper.nil? end |
#xhtml? ⇒ Boolean
Returns Whether or not the format is XHTML.
40 41 42 |
# File 'lib/haml/buffer.rb', line 40 def xhtml? not html? end |