Class: Haml::Buffer
- Defined in:
- lib/haml/buffer.rb
Overview
This class is used only internally. It holds the buffer of XHTML that is eventually output by Haml::Engine’s to_html method. It’s called from within the precompiled code, and helps reduce the amount of processing done within instance_eval’d code.
Constant Summary
Constants included from Util
Constants included from Helpers
Instance Attribute Summary collapse
-
#active ⇒ Object
writeonly
See #active?.
-
#buffer ⇒ Object
The string that holds the compiled XHTML.
-
#options ⇒ Object
The options hash passed in from Haml::Engine.
-
#upper ⇒ Object
The Buffer for the enclosing Haml document.
Class Method Summary collapse
Instance Method Summary collapse
-
#active? ⇒ Boolean
True if this buffer is currently being used to render a Haml template.
- #adjust_tabs(tab_change) ⇒ Object
-
#html4? ⇒ Boolean
True if the format is HTML4.
-
#html5? ⇒ Boolean
True if the format is HTML5.
-
#html? ⇒ Boolean
True if the format is any flavor of HTML.
-
#initialize(upper = nil, options = {}) ⇒ Buffer
constructor
Creates a new 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 adds it to the buffer.
- #push_text(text, tab_change, dont_tab_up) ⇒ Object
-
#tabulation ⇒ Object
Gets the current tabulation of the document.
-
#tabulation=(val) ⇒ Object
Sets the current tabulation of the document.
-
#toplevel? ⇒ Boolean
True if this buffer is a top-level template, as opposed to a nested partial.
-
#xhtml? ⇒ Boolean
True if the format is XHTML.
Methods included from Util
#def_static_method, #enum_with_index, #has?, #map_hash, #map_keys, #map_vals, #powerset, #ruby1_8?, #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
Creates a new buffer.
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/haml/buffer.rb', line 70 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) ⇒ Object (writeonly)
See #active?
23 24 25 |
# File 'lib/haml/buffer.rb', line 23 def active=(value) @active = value end |
#buffer ⇒ Object
The string that holds the compiled XHTML. This is aliased as _erbout for compatibility with ERB-specific code.
12 13 14 |
# File 'lib/haml/buffer.rb', line 12 def buffer @buffer end |
#options ⇒ Object
The options hash passed in from Haml::Engine.
15 16 17 |
# File 'lib/haml/buffer.rb', line 15 def @options end |
#upper ⇒ Object
The 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?).
20 21 22 |
# File 'lib/haml/buffer.rb', line 20 def upper @upper end |
Class Method Details
.merge_attrs(to, from) ⇒ Object
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 |
# File 'lib/haml/buffer.rb', line 196 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
True if this buffer is currently being used to render a Haml template. However, this returns false if a subtemplate is being rendered, even if it’s a subtemplate of this buffer’s template.
54 55 56 |
# File 'lib/haml/buffer.rb', line 54 def active? @active end |
#adjust_tabs(tab_change) ⇒ Object
99 100 101 |
# File 'lib/haml/buffer.rb', line 99 def adjust_tabs(tab_change) @real_tabs += tab_change end |
#html4? ⇒ Boolean
True if the format is HTML4
36 37 38 |
# File 'lib/haml/buffer.rb', line 36 def html4? @options[:format] == :html4 end |
#html5? ⇒ Boolean
True if the format is HTML5
41 42 43 |
# File 'lib/haml/buffer.rb', line 41 def html5? @options[:format] == :html5 end |
#html? ⇒ Boolean
True if the format is any flavor of HTML
31 32 33 |
# File 'lib/haml/buffer.rb', line 31 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 adds it to the buffer.
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 |
# File 'lib/haml/buffer.rb', line 165 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
86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/haml/buffer.rb', line 86 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 |
#tabulation ⇒ Object
Gets the current tabulation of the document.
59 60 61 |
# File 'lib/haml/buffer.rb', line 59 def tabulation @real_tabs + @tabulation end |
#tabulation=(val) ⇒ Object
Sets the current tabulation of the document.
64 65 66 67 |
# File 'lib/haml/buffer.rb', line 64 def tabulation=(val) val = val - @real_tabs @tabulation = val > -1 ? val : 0 end |
#toplevel? ⇒ Boolean
True if this buffer is a top-level template, as opposed to a nested partial.
47 48 49 |
# File 'lib/haml/buffer.rb', line 47 def toplevel? upper.nil? end |
#xhtml? ⇒ Boolean
True if the format is XHTML
26 27 28 |
# File 'lib/haml/buffer.rb', line 26 def xhtml? not html? end |