Class: Erector::Output
- Inherits:
-
Object
- Object
- Erector::Output
- Defined in:
- lib/erector/output.rb
Constant Summary collapse
- SPACES_PER_INDENT =
2
Instance Attribute Summary collapse
-
#indentation ⇒ Object
readonly
Returns the value of attribute indentation.
-
#max_length ⇒ Object
readonly
Returns the value of attribute max_length.
-
#prettyprint ⇒ Object
readonly
Returns the value of attribute prettyprint.
-
#widgets ⇒ Object
readonly
Returns the value of attribute widgets.
Instance Method Summary collapse
- #<<(s) ⇒ Object
-
#append_newline ⇒ Object
always append a newline, regardless of prettyprint setting todo: test.
- #at_line_start? ⇒ Boolean
- #buffer ⇒ Object
- #indent ⇒ Object
-
#initialize(options = {}) ⇒ Output
constructor
A new instance of Output.
- #mark ⇒ Object
- #newline ⇒ Object
-
#placeholder ⇒ Object
Inserts a blank string into the output stream and returns a pointer to it.
- #rewind(pos = @mark) ⇒ Object
- #to_a ⇒ Object
- #to_s ⇒ Object
- #undent ⇒ Object
Constructor Details
#initialize(options = {}) ⇒ Output
Returns a new instance of Output.
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# File 'lib/erector/output.rb', line 9 def initialize( = {}) @prettyprint = .fetch(:prettyprint, AbstractWidget.prettyprint_default) @indentation = .fetch(:indentation, 0) @current_line_length = 0 @max_length = [:max_length] = [] @get_buffer = if [:buffer] and [:buffer].respond_to? :call [:buffer] elsif [:buffer] lambda { [:buffer] } else buffer = [] lambda { buffer } end end |
Instance Attribute Details
#indentation ⇒ Object (readonly)
Returns the value of attribute indentation.
7 8 9 |
# File 'lib/erector/output.rb', line 7 def indentation @indentation end |
#max_length ⇒ Object (readonly)
Returns the value of attribute max_length.
7 8 9 |
# File 'lib/erector/output.rb', line 7 def max_length @max_length end |
#prettyprint ⇒ Object (readonly)
Returns the value of attribute prettyprint.
7 8 9 |
# File 'lib/erector/output.rb', line 7 def prettyprint @prettyprint end |
#widgets ⇒ Object (readonly)
Returns the value of attribute widgets.
7 8 9 |
# File 'lib/erector/output.rb', line 7 def end |
Instance Method Details
#<<(s) ⇒ Object
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# 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 ⇒ Object
always append a newline, regardless of prettyprint setting todo: test
96 97 98 99 |
# File 'lib/erector/output.rb', line 96 def append_newline buffer << "\n" @current_line_length = 0 end |
#at_line_start? ⇒ Boolean
82 83 84 |
# File 'lib/erector/output.rb', line 82 def at_line_start? @current_line_length == 0 end |
#buffer ⇒ Object
26 27 28 |
# File 'lib/erector/output.rb', line 26 def buffer @get_buffer.call end |
#indent ⇒ Object
86 87 88 |
# File 'lib/erector/output.rb', line 86 def indent @indentation += 1 if prettyprint end |
#mark ⇒ Object
101 102 103 |
# File 'lib/erector/output.rb', line 101 def mark @mark = buffer.size end |
#newline ⇒ Object
76 77 78 79 80 |
# File 'lib/erector/output.rb', line 76 def newline if prettyprint append_newline end end |
#placeholder ⇒ Object
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.
62 63 64 65 66 |
# File 'lib/erector/output.rb', line 62 def placeholder s = "" buffer << s s end |
#rewind(pos = @mark) ⇒ Object
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
# 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 ⇒ Object
72 73 74 |
# File 'lib/erector/output.rb', line 72 def to_a buffer.kind_of?(Array) ? buffer : [buffer] end |
#to_s ⇒ Object
68 69 70 |
# File 'lib/erector/output.rb', line 68 def to_s (buffer.kind_of?(String) ? buffer : buffer.join).html_safe end |
#undent ⇒ Object
90 91 92 |
# File 'lib/erector/output.rb', line 90 def undent @indentation -= 1 if prettyprint end |