Class: Bri::Renderer
- Inherits:
-
Object
- Object
- Bri::Renderer
- Defined in:
- lib/bri/renderer.rb
Constant Summary collapse
- INDENT =
' ' * 2
Instance Method Summary collapse
- #extract_text(element, width) ⇒ Object
- #indent(text) ⇒ Object
-
#initialize ⇒ Renderer
constructor
A new instance of Renderer.
- #printable_length(text) ⇒ Object
- #render(element, width = Bri.width) ⇒ Object
- #replace_markup(text) ⇒ Object
- #wrap_row(physical_row, width) ⇒ Object
- #wrap_to_width(styled_text, width) ⇒ Object
Constructor Details
#initialize ⇒ Renderer
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 |