bri 0.4.4 → 1.0.0.pre.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/TODO +2 -3
  3. data/bin/bri +21 -7
  4. data/lib/bri.rb +18 -15
  5. data/lib/bri/mall.rb +12 -14
  6. data/lib/bri/match/base.rb +1 -1
  7. data/lib/bri/match/class.rb +5 -1
  8. data/lib/bri/match/method.rb +2 -1
  9. data/lib/bri/renderer.rb +28 -188
  10. data/lib/bri/renderer/blank_line.rb +9 -0
  11. data/lib/bri/renderer/default.rb +27 -0
  12. data/lib/bri/renderer/document.rb +11 -0
  13. data/lib/bri/renderer/heading.rb +9 -0
  14. data/lib/bri/renderer/list.rb +24 -0
  15. data/lib/bri/renderer/list/base.rb +18 -0
  16. data/lib/bri/renderer/list/bullet.rb +15 -0
  17. data/lib/bri/renderer/list/labeled.rb +15 -0
  18. data/lib/bri/renderer/list/lower_lettered.rb +18 -0
  19. data/lib/bri/renderer/list/note.rb +15 -0
  20. data/lib/bri/renderer/list/numbered.rb +18 -0
  21. data/lib/bri/renderer/list/upper_lettered.rb +18 -0
  22. data/lib/bri/renderer/list_item.rb +24 -0
  23. data/lib/bri/renderer/paragraph.rb +11 -0
  24. data/lib/bri/renderer/result.rb +73 -0
  25. data/lib/bri/renderer/rule.rb +9 -0
  26. data/lib/bri/renderer/verbatim.rb +14 -0
  27. data/lib/bri/search/class.rb +3 -1
  28. data/lib/bri/search/method.rb +3 -3
  29. data/lib/bri/templates.rb +7 -38
  30. data/lib/bri/text_formatting_utils.rb +92 -0
  31. metadata +19 -12
  32. data/spec/bri_dummy_spec_class.rb +0 -132
  33. data/spec/lib/bri/mall_spec.rb +0 -38
  34. data/spec/lib/bri/match/class_spec.rb +0 -125
  35. data/spec/lib/bri/match/method_spec.rb +0 -112
  36. data/spec/lib/bri/matcher_spec.rb +0 -70
  37. data/spec/lib/bri/renderer_spec.rb +0 -338
  38. data/spec/lib/bri/search/class_method_spec.rb +0 -172
  39. data/spec/lib/bri/search/class_spec.rb +0 -66
  40. data/spec/lib/bri/search/instance_method_spec.rb +0 -173
  41. data/spec/lib/bri/search/method_spec.rb +0 -41
  42. data/spec/spec_helper.rb +0 -22
@@ -0,0 +1,27 @@
1
+ module Bri
2
+ module Renderer
3
+ class Default
4
+ include ::Bri::TextFormattingUtils
5
+
6
+ attr_reader :element
7
+
8
+ def initialize( element )
9
+ @element = element
10
+ end
11
+
12
+ def render( width = Bri.width )
13
+ text = extract_text( width )
14
+
15
+ if text.empty?
16
+ nil
17
+ else
18
+ ::Bri::Renderer::Result.new( text, width )
19
+ end
20
+ end
21
+
22
+ def extract_text( width, conserve_newslines = false )
23
+ raise "Don't know how to handle type #{element.class}: #{element.inspect}"
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,11 @@
1
+ module Bri
2
+ module Renderer
3
+ class Document < Default
4
+ def extract_text( width, conserve_newlines = false )
5
+ element.parts.
6
+ map { |part| ::Bri::Renderer.new( part ).extract_text( width, conserve_newlines ) }.
7
+ join
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ module Bri
2
+ module Renderer
3
+ class Heading < Default
4
+ def extract_text( width, conserve_newlines = false )
5
+ "<h>#{element.text.chomp}</h>"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,24 @@
1
+ module Bri
2
+ module Renderer
3
+ class List < Default
4
+ def self.new( element )
5
+ case element.type
6
+ when :BULLET then ::Bri::Renderer::List::Bullet.new( element )
7
+ when :NUMBER then ::Bri::Renderer::List::Numbered.new( element )
8
+ when :LALPHA then ::Bri::Renderer::List::LowerLettered.new( element )
9
+ when :UALPHA then ::Bri::Renderer::List::UpperLettered.new( element )
10
+ when :LABEL then ::Bri::Renderer::List::Labeled.new( element )
11
+ when :NOTE then ::Bri::Renderer::List::Note.new( element )
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ require_relative 'list/base'
19
+ require_relative 'list/bullet'
20
+ require_relative 'list/numbered'
21
+ require_relative 'list/lower_lettered'
22
+ require_relative 'list/upper_lettered'
23
+ require_relative 'list/labeled'
24
+ require_relative 'list/note'
@@ -0,0 +1,18 @@
1
+ module Bri
2
+ module Renderer
3
+ class List
4
+ class Base < ::Bri::Renderer::Default
5
+ def extract_text( width, conserve_newlines = false )
6
+ item_width = width - max_bullet_width
7
+ rendered_items = element.items.each_with_index.
8
+ map do |item, index|
9
+ bullet = next_bullet( item )
10
+ ::Bri::Renderer.new( item ).text( item_width, bullet )
11
+ end
12
+
13
+ rendered_items.join
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,15 @@
1
+ module Bri
2
+ module Renderer
3
+ class List
4
+ class Bullet < Base
5
+ def max_bullet_width
6
+ 3
7
+ end
8
+
9
+ def next_bullet( item )
10
+ '* '
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Bri
2
+ module Renderer
3
+ class List
4
+ class Labeled < Base
5
+ def max_bullet_width
6
+ @max_bullet_width ||= element.items.map(&:label).map(&:size).max
7
+ end
8
+
9
+ def next_bullet( item )
10
+ "#{item.label.first}: "
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,18 @@
1
+ module Bri
2
+ module Renderer
3
+ class List
4
+ class LowerLettered < Base
5
+ def max_bullet_width
6
+ @max_bullet_width ||= ( Math.log10( element.items.size ) / Math.log10( 26 ) ).ceil + 3
7
+ end
8
+
9
+ def next_bullet( item )
10
+ @current_bullet ||= 'a'
11
+ result = "#{@current_bullet}. "
12
+ @current_bullet.succ!
13
+ result
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,15 @@
1
+ module Bri
2
+ module Renderer
3
+ class List
4
+ class Note < Base
5
+ def max_bullet_width
6
+ @max_bullet_width ||= element.items.flat_map(&:label).map(&:size).max
7
+ end
8
+
9
+ def next_bullet( item )
10
+ "#{item.label.first}:" + " " * (max_bullet_width - item.label.first.size + 1)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,18 @@
1
+ module Bri
2
+ module Renderer
3
+ class List
4
+ class Numbered < Base
5
+ def next_bullet( item )
6
+ @current_bullet ||= '1'
7
+ result = "#{@current_bullet}. "
8
+ @current_bullet.succ!
9
+ result
10
+ end
11
+
12
+ def max_bullet_width
13
+ @max_bullet_width ||= Math.log10( element.items.size ).ceil + 3
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module Bri
2
+ module Renderer
3
+ class List
4
+ class UpperLettered < Base
5
+ def max_bullet_width
6
+ @max_bullet_width ||= ( Math.log10( element.items.size ) / Math.log10( 26 ) ).ceil + 3
7
+ end
8
+
9
+ def next_bullet( item )
10
+ @current_bullet ||= 'A'
11
+ result = "#{@current_bullet}. "
12
+ @current_bullet.succ!
13
+ result
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,24 @@
1
+ module Bri
2
+ module Renderer
3
+ class ListItem < Default
4
+ def text( total_width, bullet )
5
+ element.parts.map.with_index do |part, index|
6
+ part_is_list = part.is_a?(RDoc::Markup::List)
7
+ first_line_indent = ( part_is_list || index > 0 ) ? bullet.size : 0
8
+ following_line_indent = bullet.size
9
+
10
+ text = ::Bri::Renderer.new( part ).extract_text( total_width, true )
11
+ text.prepend( bullet ) if index == 0 && !part_is_list
12
+ lines = text.lines
13
+
14
+ result = indent( lines.first, indent_depth: first_line_indent )
15
+ lines.drop( 1 ).each do |line|
16
+ result << indent( line, indent_depth: following_line_indent )
17
+ end
18
+
19
+ result
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,11 @@
1
+ module Bri
2
+ module Renderer
3
+ class Paragraph < Default
4
+ def extract_text( width, conserve_newlines = false )
5
+ join_char = conserve_newlines ? "\n" : " "
6
+ intermediate = element.parts.map(&:strip).join( join_char )
7
+ wrap_to_width( intermediate, width )
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,73 @@
1
+ module Bri
2
+ module Renderer
3
+ class Result
4
+ include ::Bri::TextFormattingUtils
5
+
6
+ Color = ::Term::ANSIColor
7
+
8
+ attr_reader :input, :width
9
+
10
+ def initialize(input, width )
11
+ @input = input
12
+ @width = width
13
+ end
14
+
15
+ def output
16
+ return @output if instance_variable_defined?( :@output )
17
+
18
+ @output = replace_markup( input ).
19
+ then { |styled_text| width ? wrap_to_width( styled_text, width ) : styled_text }.
20
+ then { |wrapped_text| indent( wrapped_text ) }
21
+ end
22
+
23
+ def concat( other )
24
+ output.concat( other.output )
25
+ end
26
+
27
+ private
28
+
29
+ def replace_markup( text )
30
+ text.gsub!( /(?<!\\)<(?:tt|code)>/, Color.cyan )
31
+ text.gsub!( /(?<!\\)<\/(?:tt|code)>/, Color.reset )
32
+
33
+ text.gsub!( /(?<!\\)<b>/, Color.bold )
34
+ text.gsub!( /(?<!\\)<\/b>/, Color.reset )
35
+
36
+ text.gsub!( /(?<!\\)<(?:em|i)>/, Color.yellow )
37
+ text.gsub!( /(?<!\\)<\/(?:em|i)>/, Color.reset )
38
+
39
+ text.gsub!( "<h>", Color.green )
40
+ text.gsub!( "</h>", Color.reset )
41
+
42
+ text.gsub!( "\\<", "<" )
43
+
44
+ text.gsub!( /(#\s*=>)(.*)/,
45
+ "#{Color.dark}\\1#{Color.reset}#{Color.bold}\\2#{Color.reset}" )
46
+
47
+ text.gsub!( /(^|\s)\*(.*?[a-zA-Z0-9]+.*?)\*/,
48
+ "\\1#{Color.bold}\\2#{Color.reset}" )
49
+ text.gsub!( /(^|\s)\+(.*?[a-zA-Z0-9]+.*?)\+/,
50
+ "\\1#{Color.cyan}\\2#{Color.reset}" )
51
+ text.gsub!( /(^|\s)_(.*?[a-zA-Z0-9]+.*?)_/,
52
+ "\\1#{Color.yellow}\\2#{Color.reset}" )
53
+
54
+ text.gsub!( %r{\b((?:https?|ftp)://[-\w.?%&=/]+)\b},
55
+ "#{Color.underline}\\1#{Color.reset}" )
56
+
57
+ text.gsub!( %r{\b(mailto:[-\w.%]+@[-\w.]+)\b},
58
+ "#{Color.underline}\\1#{Color.reset}" )
59
+
60
+ text.gsub!( %r{\b((?<!:\/\/)www.[-\w.?%&=]+)\b},
61
+ "#{Color.underline}\\1#{Color.reset}" )
62
+
63
+ text.gsub!( %r{\blink:(.*?)(\s|$)},
64
+ "#{Color.underline}\\1#{Color.reset}\\2" )
65
+
66
+ text.gsub!( %r{\{(.*?)\}\[(.*?)\]}m, "\\1 (\\2)" )
67
+ text.gsub!( %r{\[(#{Regexp.escape( Color.underline )}.*?#{Regexp.escape( Color.reset )})\]},
68
+ " (\\1)" )
69
+ text
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,9 @@
1
+ module Bri
2
+ module Renderer
3
+ class Rule < Default
4
+ def extract_text( width, conserve_newlines = false )
5
+ "#{"-" * width}\n"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+ module Bri
2
+ module Renderer
3
+ class Verbatim < Default
4
+ def render( width = Bri.width )
5
+ text = ::Bri::Renderer.new( element ).extract_text( width )
6
+ ::Bri::Renderer::Result.new( "#{text}\n", nil )
7
+ end
8
+
9
+ def extract_text( width, conserve_newlines = false )
10
+ element.parts.map { |part| indent(part) }.join + "\n"
11
+ end
12
+ end
13
+ end
14
+ end
@@ -3,7 +3,9 @@ module Bri
3
3
  class Class < Base
4
4
  def search( type = :fully_qualified )
5
5
  # NOTE: classes are only searched as fully qualified for the time being
6
- Bri::Mall.instance.stores.select { |s| s.module_names.include?( @term ) }.each do |store|
6
+ Bri::Mall.stores.
7
+ select { |s| s.module_names.include?( @term ) }.
8
+ each do |store|
7
9
  @matches << Bri::Match::Class.new( store.load_class( @term ), store )
8
10
  end
9
11
  end
@@ -31,7 +31,7 @@ module Bri
31
31
  end
32
32
 
33
33
  def store_for_method
34
- Bri::Mall.instance.stores.detect do |store|
34
+ Bri::Mall.stores.detect do |store|
35
35
  store_methods( store ).has_key?( @class_term ) &&
36
36
  store_methods( store )[@class_term].include?( @method_term )
37
37
  end
@@ -54,7 +54,7 @@ module Bri
54
54
 
55
55
 
56
56
  def partially_qualified_search
57
- Bri::Mall.instance.stores.each do |store|
57
+ Bri::Mall.stores.each do |store|
58
58
  classes_with_method( store, @method_term ).each do |klass|
59
59
  match_data = method_rdoc( store, klass, @method_term )
60
60
  next unless match_data
@@ -74,7 +74,7 @@ module Bri
74
74
  end
75
75
 
76
76
  def unqualified_search_worker( method_re )
77
- Bri::Mall.instance.stores.each do |store|
77
+ Bri::Mall.stores.each do |store|
78
78
  candidates_from_method_re( store, method_re ).each do |klass, methods|
79
79
  methods.each do |method|
80
80
  match_data = method_rdoc( store, klass, method )
@@ -1,9 +1,7 @@
1
1
  module Bri
2
2
  module Templates
3
- RULE_CHARACTER = '-'.freeze
4
-
5
3
  MULTIPLE_CHOICES =<<-EOT
6
- <%= Bri::Templates::Helpers.hrule( "Multiple choices:" ) %>
4
+ <%= hrule( "Multiple choices:" ) %>
7
5
 
8
6
  <%= qualified_methods.sort.join("\n") %>
9
7
 
@@ -24,38 +22,32 @@ module Bri
24
22
 
25
23
  <% if !includes.empty? %>
26
24
  <%= section_header( "Includes:" ) %>
27
- <%= Bri::Renderer.wrap_list( includes.sort ) %>
28
-
25
+ <%= wrap_list( includes.sort ) %>
29
26
 
30
27
  <% end %>
31
28
  <% if !extends.empty? %>
32
29
  <%= section_header( "Extends:" ) %>
33
- <%= Bri::Renderer.wrap_list( extends.sort ) %>
34
-
30
+ <%= wrap_list( extends.sort ) %>
35
31
 
36
32
  <% end %>
37
33
  <% if !constants.empty? %>
38
34
  <%= section_header( "Constants:" ) %>
39
- <%= Bri::Renderer.wrap_list( constants.sort ) %>
40
-
35
+ <%= wrap_list( constants.sort ) %>
41
36
 
42
37
  <% end %>
43
38
  <% if !class_methods.empty? %>
44
39
  <%= section_header( "Class methods:" ) %>
45
- <%= Bri::Renderer.wrap_list( class_methods.sort ) %>
46
-
40
+ <%= wrap_list( class_methods.sort ) %>
47
41
 
48
42
  <% end %>
49
43
  <% if !instance_methods.empty? %>
50
44
  <%= section_header( "Instance methods:" ) %>
51
- <%= Bri::Renderer.wrap_list( instance_methods.sort ) %>
52
-
45
+ <%= wrap_list( instance_methods.sort ) %>
53
46
 
54
47
  <% end %>
55
48
  <% if !attributes.empty? %>
56
49
  <%= section_header( "Attributes:" ) %>
57
- <%= Bri::Renderer.wrap_list( attributes.sort ) %>
58
-
50
+ <%= wrap_list( attributes.sort ) %>
59
51
 
60
52
  <% end %>
61
53
  EOT
@@ -73,28 +65,5 @@ module Bri
73
65
  <% end %>
74
66
 
75
67
  EOT
76
-
77
- module Helpers
78
- def hrule( text = '', width = Bri.width )
79
- text.prepend( " " ) unless text.empty?
80
-
81
- rule_length = width - text.length
82
- rule_length = 1 if rule_length < 1
83
-
84
- rule = RULE_CHARACTER * rule_length
85
- "#{rule}#{Term::ANSIColor::bold( text )}\n"
86
- end
87
- module_function :hrule
88
-
89
- def print_origin( origin_text, width = Bri.width )
90
- return unless origin_text
91
- "(#{origin_text})".rjust( width )
92
- end
93
-
94
- def section_header( text )
95
- "#{Term::ANSIColor.green}#{Term::ANSIColor.underline}#{text}#{Term::ANSIColor.reset}\n"
96
- end
97
- module_function :section_header
98
- end
99
68
  end
100
69
  end