bri 0.4.4 → 1.0.0.pre.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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