Class: Haml::Buffer

Inherits:
Object show all
Includes:
Helpers, Util
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

Util::RUBY_VERSION

Constants included from Helpers

Helpers::HTML_ESCAPE

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

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

#page_class

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, options = {})
  @active = true
  @upper = upper
  @options = {
    :attr_wrapper => "'",
    :ugly => false,
    :format => :xhtml
  }.merge options
  @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

#bufferObject

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

#optionsObject

The options hash passed in from Haml::Engine.



15
16
17
# File 'lib/haml/buffer.rb', line 15

def options
  @options
end

#upperObject

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.

Returns:

  • (Boolean)


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

Returns:

  • (Boolean)


36
37
38
# File 'lib/haml/buffer.rb', line 36

def html4?
  @options[:format] == :html4
end

#html5?Boolean

True if the format is HTML5

Returns:

  • (Boolean)


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

Returns:

  • (Boolean)


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

#tabulationObject

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.

Returns:

  • (Boolean)


47
48
49
# File 'lib/haml/buffer.rb', line 47

def toplevel?
  upper.nil?
end

#xhtml?Boolean

True if the format is XHTML

Returns:

  • (Boolean)


26
27
28
# File 'lib/haml/buffer.rb', line 26

def xhtml?
  not html?
end