bri 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/bri.rb +6 -1
- data/lib/bri/match/base.rb +2 -39
- data/lib/bri/match/method.rb +1 -1
- data/lib/bri/renderer.rb +108 -0
- data/lib/bri/templates.rb +1 -3
- metadata +3 -2
data/lib/bri.rb
CHANGED
@@ -3,6 +3,7 @@ require 'erb'
|
|
3
3
|
require 'term/ansicolor'
|
4
4
|
|
5
5
|
|
6
|
+
require 'bri/renderer'
|
6
7
|
require 'bri/mall'
|
7
8
|
require 'bri/matcher'
|
8
9
|
require 'bri/templates'
|
@@ -48,7 +49,11 @@ module Bri
|
|
48
49
|
end
|
49
50
|
|
50
51
|
def self.width
|
51
|
-
@@width
|
52
|
+
return @@width if defined?( @@width )
|
53
|
+
base_width = ENV['COLUMNS'].to_i
|
54
|
+
base_width = 80 if base_width == 0
|
55
|
+
|
56
|
+
@@width ||= [ base_width - 8, 1 ].max
|
52
57
|
end
|
53
58
|
|
54
59
|
def self.width=( width )
|
data/lib/bri/match/base.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Bri
|
2
2
|
module Match
|
3
3
|
class Base
|
4
|
+
@@renderer = Bri::Renderer.new
|
4
5
|
def to_s
|
5
6
|
ERB.new( self.class.const_get( :TEMPLATE ), nil, '<>' ).
|
6
7
|
result( binding )
|
@@ -8,45 +9,7 @@ module Bri
|
|
8
9
|
|
9
10
|
private
|
10
11
|
def build_description( source )
|
11
|
-
|
12
|
-
source.each do |element|
|
13
|
-
case element
|
14
|
-
when RDoc::Markup::Paragraph
|
15
|
-
result << reflow( element.text )
|
16
|
-
when RDoc::Markup::BlankLine
|
17
|
-
result << ""
|
18
|
-
when RDoc::Markup::Rule
|
19
|
-
result << "-" * Bri.width
|
20
|
-
when RDoc::Markup::Verbatim
|
21
|
-
result << element.text
|
22
|
-
when RDoc::Markup::Heading
|
23
|
-
result << ' ' * element.level + element.text
|
24
|
-
when RDoc::Markup::ListItem
|
25
|
-
result << "#{element.label} #{build_description( element.parts ).join}"
|
26
|
-
when RDoc::Markup::List
|
27
|
-
case element.type
|
28
|
-
when :NOTE, :LABEL
|
29
|
-
result << "Note:"
|
30
|
-
result << build_description( element.items ).join( "\n" )
|
31
|
-
when :NUMBER
|
32
|
-
result << "Numbered List:"
|
33
|
-
result << build_description( element.items ).join( "\n" )
|
34
|
-
when :BULLET
|
35
|
-
#FIXME: Add bullet symbol to each item
|
36
|
-
result << "Bulletet List:"
|
37
|
-
result << build_description( element.items ).join( "\n" )
|
38
|
-
else
|
39
|
-
raise "Don't know how to handle list type #{element.type}: #{element.inspect}"
|
40
|
-
end
|
41
|
-
else
|
42
|
-
raise "Don't know how to handle type #{element.class}: #{element.inspect}"
|
43
|
-
end
|
44
|
-
end
|
45
|
-
result
|
46
|
-
end
|
47
|
-
|
48
|
-
def reflow( text, width = Bri.width )
|
49
|
-
array_to_width( text.split( /\s+/ ), width, " ", 1 )
|
12
|
+
source.collect { |element| @@renderer.render element }
|
50
13
|
end
|
51
14
|
end
|
52
15
|
end
|
data/lib/bri/match/method.rb
CHANGED
@@ -8,7 +8,7 @@ module Bri
|
|
8
8
|
|
9
9
|
def initialize( rdoc_method )
|
10
10
|
@full_name = rdoc_method.full_name
|
11
|
-
@call_syntaxes = rdoc_method.
|
11
|
+
@call_syntaxes = rdoc_method.arglists.split( "\n" ).
|
12
12
|
map { |e| " " + e }.
|
13
13
|
join( "\n" ) + "\n" rescue ''
|
14
14
|
@description_paragraphs = build_description( rdoc_method.comment.parts )
|
data/lib/bri/renderer.rb
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'strscan'
|
2
|
+
|
3
|
+
module Bri
|
4
|
+
class Renderer
|
5
|
+
INDENT = ' ' * 2
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
end
|
9
|
+
|
10
|
+
def render( element, width = Bri.width )
|
11
|
+
text = extract_text( element, width )
|
12
|
+
styled_text = replace_markup( text )
|
13
|
+
element.kind_of?( RDoc::Markup::Verbatim ) ?
|
14
|
+
wrapped_text = styled_text :
|
15
|
+
wrapped_text = wrap_to_width( styled_text, width )
|
16
|
+
indent( wrapped_text )
|
17
|
+
end
|
18
|
+
|
19
|
+
def extract_text( element, width )
|
20
|
+
text = case element
|
21
|
+
when RDoc::Markup::Paragraph
|
22
|
+
element.text
|
23
|
+
when RDoc::Markup::BlankLine
|
24
|
+
""
|
25
|
+
when RDoc::Markup::Rule
|
26
|
+
"-" * width
|
27
|
+
when RDoc::Markup::Verbatim
|
28
|
+
element.text
|
29
|
+
when RDoc::Markup::Heading
|
30
|
+
"<h>#{element.text}</h>"
|
31
|
+
when RDoc::Markup::ListItem
|
32
|
+
element.label.to_s + element.parts.collect { |part| extract_text part, width }.join
|
33
|
+
when RDoc::Markup::List
|
34
|
+
prefix = case element.type
|
35
|
+
when :NOTE, :LABEL then "Note:\n"
|
36
|
+
when :NUMBER then "Numbered List:\n"
|
37
|
+
when :BULLET then "Bulletet List:\n"
|
38
|
+
else
|
39
|
+
raise "Don't know how to handle list type #{element.type}: #{element.inspect}"
|
40
|
+
end
|
41
|
+
prefix + element.items.collect { |item| extract_text item, width }.join
|
42
|
+
else
|
43
|
+
raise "Don't know how to handle type #{element.class}: #{element.inspect}"
|
44
|
+
end
|
45
|
+
text + "\n"
|
46
|
+
end
|
47
|
+
|
48
|
+
def replace_markup( text )
|
49
|
+
text.gsub!( "<tt>", Term::ANSIColor::cyan )
|
50
|
+
text.gsub!( "</tt>", Term::ANSIColor::reset )
|
51
|
+
|
52
|
+
text.gsub!( "<code>", Term::ANSIColor::cyan )
|
53
|
+
text.gsub!( "</code>", Term::ANSIColor::reset )
|
54
|
+
|
55
|
+
text.gsub!( "<h>", Term::ANSIColor::green )
|
56
|
+
text.gsub!( "</h>", Term::ANSIColor::reset )
|
57
|
+
|
58
|
+
text.gsub!( /(^|\s)\+(.*?)\+/,
|
59
|
+
"\\1#{Term::ANSIColor::yellow}\\2#{Term::ANSIColor::reset}" )
|
60
|
+
text.gsub!( /(^|\s)_(.*?)_/,
|
61
|
+
"\\1#{Term::ANSIColor::yellow}\\2#{Term::ANSIColor::reset}" )
|
62
|
+
text
|
63
|
+
end
|
64
|
+
|
65
|
+
def printable_length( text )
|
66
|
+
embedded_ansi_codes = text.scan( Term::ANSIColor::COLORED_REGEXP )
|
67
|
+
if embedded_ansi_codes.empty?
|
68
|
+
text.length
|
69
|
+
else
|
70
|
+
text.length - embedded_ansi_codes.reduce( 0 ) { |total, code| code.length + total }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def wrap_to_width( styled_text, width )
|
75
|
+
styled_text.split( "\n" ).collect { |row| wrap_row row, width }.join
|
76
|
+
end
|
77
|
+
|
78
|
+
def wrap_row( physical_row, width )
|
79
|
+
output_text = ''
|
80
|
+
logical_row = ''
|
81
|
+
printable_row_length = 0
|
82
|
+
|
83
|
+
scanner = StringScanner.new( physical_row )
|
84
|
+
|
85
|
+
while( !scanner.eos? )
|
86
|
+
token = scanner.scan( /\S+/ ).to_s
|
87
|
+
printable_token_length = printable_length( token )
|
88
|
+
|
89
|
+
if printable_token_length + printable_row_length > width
|
90
|
+
output_text << logical_row << "\n"
|
91
|
+
logical_row = ''
|
92
|
+
printable_row_length = 0
|
93
|
+
end
|
94
|
+
logical_row << token
|
95
|
+
printable_row_length += printable_token_length
|
96
|
+
|
97
|
+
token = scanner.scan( /\s*/ ).to_s
|
98
|
+
logical_row << token
|
99
|
+
printable_row_length += token.length
|
100
|
+
end
|
101
|
+
output_text << logical_row << "\n"
|
102
|
+
end
|
103
|
+
|
104
|
+
def indent( text )
|
105
|
+
text.split( "\n" ).collect { |row| "#{INDENT}#{row}" }.join("\n" )
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
data/lib/bri/templates.rb
CHANGED
@@ -13,9 +13,7 @@ module Bri
|
|
13
13
|
<% if description_paragraphs.empty? %>
|
14
14
|
(no description...)
|
15
15
|
<% else %>
|
16
|
-
|
17
|
-
<%= array_to_width( paragraph.split( /\s+/ ), Bri.width, " ") %>
|
18
|
-
<% end %>
|
16
|
+
<%= description_paragraphs.join("\n" ) %>
|
19
17
|
<% end %>
|
20
18
|
|
21
19
|
<%= hrule %>
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 3
|
9
|
+
version: 0.1.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Sven Riedel
|
@@ -73,6 +73,7 @@ files:
|
|
73
73
|
- lib/bri/search/class_method.rb
|
74
74
|
- lib/bri/search/instance_method.rb
|
75
75
|
- lib/bri/templates.rb
|
76
|
+
- lib/bri/renderer.rb
|
76
77
|
- spec/spec_helper.rb
|
77
78
|
- spec/lib/bri/mall_spec.rb
|
78
79
|
- spec/lib/bri/matcher_spec.rb
|