class Erector::Output
Constants
- SPACES_PER_INDENT
Attributes
indentation[R]
max_length[R]
prettyprint[R]
widgets[R]
Public Class Methods
new(options = {})
click to toggle source
# File lib/erector/output.rb, line 9 def initialize(options = {}) @prettyprint = options.fetch(:prettyprint, AbstractWidget.prettyprint_default) @indentation = options.fetch(:indentation, 0) @current_line_length = 0 @max_length = options[:max_length] @widgets = [] @get_buffer = if options[:buffer] and options[:buffer].respond_to? :call options[:buffer] elsif options[:buffer] lambda { options[:buffer] } else buffer = [] lambda { buffer } end end
Public Instance Methods
<<(s)
click to toggle source
# File lib/erector/output.rb, line 30 def <<(s) s = s.to_s append_indentation if @max_length && s.length + @current_line_length > @max_length leading_spaces = s =~ /^( +)/ ? $1.size : 0 trailing_spaces = s =~ /( +)$/ ? $1.size : 0 append(" " * leading_spaces) need_space = false words = s.split(/ /) words.each do |word| if (need_space ? 1 : 0) + word.length > space_left append_newline append_indentation need_space = false end append(" ") if need_space append(word) need_space = true end append(" " * trailing_spaces) else append(s) end self end
append_newline()
click to toggle source
always append a newline, regardless of prettyprint setting
todo: test
# File lib/erector/output.rb, line 96 def append_newline buffer << "\n" @current_line_length = 0 end
at_line_start?()
click to toggle source
# File lib/erector/output.rb, line 82 def at_line_start? @current_line_length == 0 end
buffer()
click to toggle source
# File lib/erector/output.rb, line 26 def buffer @get_buffer.call end
indent()
click to toggle source
# File lib/erector/output.rb, line 86 def indent @indentation += 1 if prettyprint end
mark()
click to toggle source
# File lib/erector/output.rb, line 101 def mark @mark = buffer.size end
newline()
click to toggle source
# File lib/erector/output.rb, line 76 def newline if prettyprint append_newline end end
placeholder()
click to toggle source
Inserts a blank string into the output stream and returns a pointer to it. If the caller holds on to this pointer, she can later go back and insert text earlier in the stream. This is used for, e.g., inserting stuff inside the HEAD element that is not known until after the entire page renders.
# File lib/erector/output.rb, line 62 def placeholder s = "" buffer << s s end
rewind(pos = @mark)
click to toggle source
# File lib/erector/output.rb, line 105 def rewind pos = @mark if buffer.kind_of?(Array) buffer.slice!(pos..-1) elsif (Object.const_defined?(:ActiveSupport) and buffer.kind_of?(ActiveSupport::SafeBuffer)) # monkey patch to get around SafeBuffer's well-meaning paranoia # see http://yehudakatz.com/2010/02/01/safebuffers-and-rails-3-0/ # and http://weblog.rubyonrails.org/2011/6/8/potential-xss-vulnerability-in-ruby-on-rails-applications String.instance_method(:slice!).bind(buffer).call(pos..-1) elsif buffer.kind_of?(String) buffer.slice!(pos..-1) else raise "Don't know how to rewind a #{buffer.class}" end end
to_a()
click to toggle source
# File lib/erector/output.rb, line 72 def to_a buffer.kind_of?(Array) ? buffer : [buffer] end
to_s()
click to toggle source
# File lib/erector/output.rb, line 68 def to_s (buffer.kind_of?(String) ? buffer : buffer.join).html_safe end
undent()
click to toggle source
# File lib/erector/output.rb, line 90 def undent @indentation -= 1 if prettyprint end
Protected Instance Methods
append(s)
click to toggle source
# File lib/erector/output.rb, line 124 def append(s) buffer << s @current_line_length += s.length end
append_indentation()
click to toggle source
# File lib/erector/output.rb, line 133 def append_indentation if prettyprint and at_line_start? spaces = " " * ([@indentation, 0].max * SPACES_PER_INDENT) buffer << spaces @current_line_length += spaces.length end end
space_left()
click to toggle source
# File lib/erector/output.rb, line 129 def space_left @max_length - @current_line_length end