Class: Bri::Renderer

Inherits:
Object
  • Object
show all
Defined in:
lib/bri/renderer.rb

Constant Summary collapse

INDENT =
' ' * 2

Instance Method Summary collapse

Constructor Details

#initializeRenderer

Returns a new instance of Renderer.



7
8
# File 'lib/bri/renderer.rb', line 7

def initialize
end

Instance Method Details

#extract_text(element, width) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/bri/renderer.rb', line 39

def extract_text( element, width )
  text = case element
           when RDoc::Markup::Paragraph 
             element.text
           when RDoc::Markup::BlankLine
             ""
           when RDoc::Markup::Rule
             "-" * width
           when RDoc::Markup::Verbatim
             element.text
           when RDoc::Markup::Heading
             "<h>#{element.text}</h>" 
           when RDoc::Markup::ListItem
             element.label.to_s + element.parts.collect { |part| extract_text part, width }.join
           else  
             raise "Don't know how to handle type #{element.class}: #{element.inspect}"
         end
  text + "\n"
end

#indent(text) ⇒ Object



110
111
112
# File 'lib/bri/renderer.rb', line 110

def indent( text )
  text.split( "\n" ).collect { |row| "#{INDENT}#{row}" }.join("\n" )
end

#printable_length(text) ⇒ Object



76
77
78
# File 'lib/bri/renderer.rb', line 76

def printable_length( text )
  Term::ANSIColor.uncolored( text ).length
end

#render(element, width = Bri.width) ⇒ Object



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/bri/renderer.rb', line 10

def render( element, width = Bri.width )
  case element
    when RDoc::Markup::Verbatim 
      text = extract_text( element, width )
      styled_text = replace_markup( text )
      indent( styled_text )

    when RDoc::Markup::List
      item_width = width - INDENT.length
      rendered_items = element.items.collect { |item| render item, item_width }
      rendered_items.map! { |item| item.gsub( /\n/, "\n#{INDENT}" ) }
      case element.type
        when :BULLET 
          rendered_items.map! { |item| ' *' + item }
        when :NUMBER
          i = 0
          rendered_items.map! { |item| i+=1; sprintf "%d.%s", i, item }
      end

      rendered_items.join( "\n\n" ) + "\n"

    else
      text = extract_text( element, width )
      styled_text = replace_markup( text )
      wrapped_text = wrap_to_width( styled_text, width )
      indent( wrapped_text )
  end
end

#replace_markup(text) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/bri/renderer.rb', line 59

def replace_markup( text )
  text.gsub!( "<tt>", Term::ANSIColor::cyan )
  text.gsub!( "</tt>", Term::ANSIColor::reset )

  text.gsub!( "<code>", Term::ANSIColor::cyan )
  text.gsub!( "</code>", Term::ANSIColor::reset )

  text.gsub!( "<h>", Term::ANSIColor::green )
  text.gsub!( "</h>", Term::ANSIColor::reset )

  text.gsub!( /(^|\s)\+(.*?)\+/, 
              "\\1#{Term::ANSIColor::yellow}\\2#{Term::ANSIColor::reset}" )
  text.gsub!( /(^|\s)_(.*?)_/, 
              "\\1#{Term::ANSIColor::yellow}\\2#{Term::ANSIColor::reset}" )
  text
end

#wrap_row(physical_row, width) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/bri/renderer.rb', line 84

def wrap_row( physical_row, width )
  output_text = ''
  logical_row = ''
  printable_row_length = 0

  scanner = StringScanner.new( physical_row )

  while( !scanner.eos? ) 
    token = scanner.scan( /\S+/ ).to_s
    printable_token_length = printable_length( token )

    if printable_token_length + printable_row_length > width
      output_text << logical_row << "\n"
      logical_row = ''
      printable_row_length = 0
    end
    logical_row << token
    printable_row_length += printable_token_length

    token = scanner.scan( /\s*/ ).to_s
    logical_row << token
    printable_row_length += token.length
  end
  output_text << logical_row << "\n"
end

#wrap_to_width(styled_text, width) ⇒ Object



80
81
82
# File 'lib/bri/renderer.rb', line 80

def wrap_to_width( styled_text, width )
  styled_text.split( "\n" ).collect { |row| wrap_row row, width }.join
end