Class: Wunderbar::SpacedMarkup

Inherits:
Builder::XmlMarkup
  • Object
show all
Defined in:
lib/wunderbar/builder.rb

Overview

XmlMarkup handles indentation of elements beautifully, this class extends that support to text, data, and spacing between elements

Instance Method Summary collapse

Instance Method Details

#_nested_structures(*args) ⇒ Object



63
64
65
66
67
68
69
70
# File 'lib/wunderbar/builder.rb', line 63

def _nested_structures(*args)
  pending_newline = @pending_newline
  @pending_newline = false
  @first_tag = true
  super
  @first_tag = @pending_margin = false
  @pending_newline = pending_newline
end

#disable_indentation!(&block) ⇒ Object



39
40
41
42
43
44
45
46
# File 'lib/wunderbar/builder.rb', line 39

def disable_indentation!(&block)
  indent, level, pending_newline, pending_margin = 
    indentation_state! [0, 0, @pending_newline, @pending_margin]
  text! " "*indent*level
  block.call
ensure
  indentation_state! [indent, level, pending_newline, pending_margin]
end

#indentation_state!(new_state = nil) ⇒ Object



48
49
50
51
52
53
54
55
# File 'lib/wunderbar/builder.rb', line 48

def indentation_state! new_state=nil
  result = [@indent, @level, @pending_newline, @pending_margin]
  if new_state
    text! "\n" if @indent == 0 and new_state.first > 0
    @indent, @level, @pending_newline, @pending_margin = new_state
  end
  result
end

#indented_data!(data, pre = nil, post = nil, &block) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/wunderbar/builder.rb', line 9

def indented_data!(data, pre=nil, post=nil, &block)
  return if data.strip.length == 0

  self << pre + target!.pop if pre

  if @indent > 0
    data = data.sub(/\n\s*\Z/, '').sub(/\A\s*\n/, '')

    unindent = data.sub(/s+\Z/,'').scan(/^ *\S/).map(&:length).min || 1

    before  = ::Regexp.new('^'.ljust(unindent))
    after   =  " " * (@level * @indent)
    data.gsub! before, after

    _newline if @pending_newline and not @first_tag
    @pending_newline = @pending_margin
    @first_tag = @pending_margin = false
  end

  if block
    block.call(data)
  else
    self << data
  end

  _newline unless data =~ /\n\Z/

  self << post if post
end

#indented_text!(text) ⇒ Object



5
6
7
# File 'lib/wunderbar/builder.rb', line 5

def indented_text!(text)
  indented_data!(text) {|data| text! data}
end

#margin!Object



57
58
59
60
61
# File 'lib/wunderbar/builder.rb', line 57

def margin!
  _newline unless @first_tag
  @pending_newline = false
  @pending_margin = true
end

#tag!(sym, *args, &block) ⇒ Object



72
73
74
75
76
77
# File 'lib/wunderbar/builder.rb', line 72

def tag!(sym, *args, &block)
  _newline if @pending_newline
  @pending_newline = @pending_margin
  @first_tag = @pending_margin = false
  super
end