gitlab-rdoc 6.3.2

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 (196) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTING.rdoc +220 -0
  3. data/CVE-2013-0256.rdoc +49 -0
  4. data/ExampleMarkdown.md +37 -0
  5. data/ExampleRDoc.rdoc +208 -0
  6. data/Gemfile +12 -0
  7. data/History.rdoc +1666 -0
  8. data/LEGAL.rdoc +50 -0
  9. data/LICENSE.rdoc +57 -0
  10. data/README.rdoc +133 -0
  11. data/RI.rdoc +57 -0
  12. data/Rakefile +101 -0
  13. data/TODO.rdoc +59 -0
  14. data/bin/console +7 -0
  15. data/bin/setup +6 -0
  16. data/exe/rdoc +44 -0
  17. data/exe/ri +12 -0
  18. data/lib/rdoc/alias.rb +112 -0
  19. data/lib/rdoc/anon_class.rb +11 -0
  20. data/lib/rdoc/any_method.rb +361 -0
  21. data/lib/rdoc/attr.rb +176 -0
  22. data/lib/rdoc/class_module.rb +802 -0
  23. data/lib/rdoc/code_object.rb +421 -0
  24. data/lib/rdoc/code_objects.rb +6 -0
  25. data/lib/rdoc/comment.rb +250 -0
  26. data/lib/rdoc/constant.rb +187 -0
  27. data/lib/rdoc/context/section.rb +232 -0
  28. data/lib/rdoc/context.rb +1266 -0
  29. data/lib/rdoc/cross_reference.rb +202 -0
  30. data/lib/rdoc/encoding.rb +136 -0
  31. data/lib/rdoc/erb_partial.rb +19 -0
  32. data/lib/rdoc/erbio.rb +42 -0
  33. data/lib/rdoc/extend.rb +10 -0
  34. data/lib/rdoc/generator/darkfish.rb +790 -0
  35. data/lib/rdoc/generator/json_index.rb +300 -0
  36. data/lib/rdoc/generator/markup.rb +160 -0
  37. data/lib/rdoc/generator/pot/message_extractor.rb +68 -0
  38. data/lib/rdoc/generator/pot/po.rb +84 -0
  39. data/lib/rdoc/generator/pot/po_entry.rb +141 -0
  40. data/lib/rdoc/generator/pot.rb +98 -0
  41. data/lib/rdoc/generator/ri.rb +31 -0
  42. data/lib/rdoc/generator/template/darkfish/.document +0 -0
  43. data/lib/rdoc/generator/template/darkfish/_footer.rhtml +5 -0
  44. data/lib/rdoc/generator/template/darkfish/_head.rhtml +22 -0
  45. data/lib/rdoc/generator/template/darkfish/_sidebar_VCS_info.rhtml +19 -0
  46. data/lib/rdoc/generator/template/darkfish/_sidebar_classes.rhtml +9 -0
  47. data/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml +15 -0
  48. data/lib/rdoc/generator/template/darkfish/_sidebar_in_files.rhtml +9 -0
  49. data/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml +15 -0
  50. data/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml +15 -0
  51. data/lib/rdoc/generator/template/darkfish/_sidebar_methods.rhtml +12 -0
  52. data/lib/rdoc/generator/template/darkfish/_sidebar_navigation.rhtml +11 -0
  53. data/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml +12 -0
  54. data/lib/rdoc/generator/template/darkfish/_sidebar_parent.rhtml +11 -0
  55. data/lib/rdoc/generator/template/darkfish/_sidebar_search.rhtml +14 -0
  56. data/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml +11 -0
  57. data/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml +18 -0
  58. data/lib/rdoc/generator/template/darkfish/class.rhtml +172 -0
  59. data/lib/rdoc/generator/template/darkfish/css/fonts.css +167 -0
  60. data/lib/rdoc/generator/template/darkfish/css/rdoc.css +639 -0
  61. data/lib/rdoc/generator/template/darkfish/fonts/Lato-Light.ttf +0 -0
  62. data/lib/rdoc/generator/template/darkfish/fonts/Lato-LightItalic.ttf +0 -0
  63. data/lib/rdoc/generator/template/darkfish/fonts/Lato-Regular.ttf +0 -0
  64. data/lib/rdoc/generator/template/darkfish/fonts/Lato-RegularItalic.ttf +0 -0
  65. data/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Bold.ttf +0 -0
  66. data/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Regular.ttf +0 -0
  67. data/lib/rdoc/generator/template/darkfish/images/add.png +0 -0
  68. data/lib/rdoc/generator/template/darkfish/images/arrow_up.png +0 -0
  69. data/lib/rdoc/generator/template/darkfish/images/brick.png +0 -0
  70. data/lib/rdoc/generator/template/darkfish/images/brick_link.png +0 -0
  71. data/lib/rdoc/generator/template/darkfish/images/bug.png +0 -0
  72. data/lib/rdoc/generator/template/darkfish/images/bullet_black.png +0 -0
  73. data/lib/rdoc/generator/template/darkfish/images/bullet_toggle_minus.png +0 -0
  74. data/lib/rdoc/generator/template/darkfish/images/bullet_toggle_plus.png +0 -0
  75. data/lib/rdoc/generator/template/darkfish/images/date.png +0 -0
  76. data/lib/rdoc/generator/template/darkfish/images/delete.png +0 -0
  77. data/lib/rdoc/generator/template/darkfish/images/find.png +0 -0
  78. data/lib/rdoc/generator/template/darkfish/images/loadingAnimation.gif +0 -0
  79. data/lib/rdoc/generator/template/darkfish/images/macFFBgHack.png +0 -0
  80. data/lib/rdoc/generator/template/darkfish/images/package.png +0 -0
  81. data/lib/rdoc/generator/template/darkfish/images/page_green.png +0 -0
  82. data/lib/rdoc/generator/template/darkfish/images/page_white_text.png +0 -0
  83. data/lib/rdoc/generator/template/darkfish/images/page_white_width.png +0 -0
  84. data/lib/rdoc/generator/template/darkfish/images/plugin.png +0 -0
  85. data/lib/rdoc/generator/template/darkfish/images/ruby.png +0 -0
  86. data/lib/rdoc/generator/template/darkfish/images/tag_blue.png +0 -0
  87. data/lib/rdoc/generator/template/darkfish/images/tag_green.png +0 -0
  88. data/lib/rdoc/generator/template/darkfish/images/transparent.png +0 -0
  89. data/lib/rdoc/generator/template/darkfish/images/wrench.png +0 -0
  90. data/lib/rdoc/generator/template/darkfish/images/wrench_orange.png +0 -0
  91. data/lib/rdoc/generator/template/darkfish/images/zoom.png +0 -0
  92. data/lib/rdoc/generator/template/darkfish/index.rhtml +22 -0
  93. data/lib/rdoc/generator/template/darkfish/js/darkfish.js +84 -0
  94. data/lib/rdoc/generator/template/darkfish/js/search.js +110 -0
  95. data/lib/rdoc/generator/template/darkfish/page.rhtml +18 -0
  96. data/lib/rdoc/generator/template/darkfish/servlet_not_found.rhtml +18 -0
  97. data/lib/rdoc/generator/template/darkfish/servlet_root.rhtml +62 -0
  98. data/lib/rdoc/generator/template/darkfish/table_of_contents.rhtml +58 -0
  99. data/lib/rdoc/generator/template/json_index/.document +1 -0
  100. data/lib/rdoc/generator/template/json_index/js/navigation.js +105 -0
  101. data/lib/rdoc/generator/template/json_index/js/searcher.js +229 -0
  102. data/lib/rdoc/generator.rb +51 -0
  103. data/lib/rdoc/ghost_method.rb +7 -0
  104. data/lib/rdoc/i18n/locale.rb +102 -0
  105. data/lib/rdoc/i18n/text.rb +126 -0
  106. data/lib/rdoc/i18n.rb +10 -0
  107. data/lib/rdoc/include.rb +10 -0
  108. data/lib/rdoc/known_classes.rb +73 -0
  109. data/lib/rdoc/markdown/entities.rb +2132 -0
  110. data/lib/rdoc/markdown/literals.kpeg +23 -0
  111. data/lib/rdoc/markdown/literals.rb +417 -0
  112. data/lib/rdoc/markdown.kpeg +1237 -0
  113. data/lib/rdoc/markdown.rb +16685 -0
  114. data/lib/rdoc/markup/attr_changer.rb +23 -0
  115. data/lib/rdoc/markup/attr_span.rb +36 -0
  116. data/lib/rdoc/markup/attribute_manager.rb +409 -0
  117. data/lib/rdoc/markup/attributes.rb +71 -0
  118. data/lib/rdoc/markup/blank_line.rb +28 -0
  119. data/lib/rdoc/markup/block_quote.rb +15 -0
  120. data/lib/rdoc/markup/document.rb +165 -0
  121. data/lib/rdoc/markup/formatter.rb +266 -0
  122. data/lib/rdoc/markup/hard_break.rb +32 -0
  123. data/lib/rdoc/markup/heading.rb +79 -0
  124. data/lib/rdoc/markup/include.rb +43 -0
  125. data/lib/rdoc/markup/indented_paragraph.rb +48 -0
  126. data/lib/rdoc/markup/list.rb +102 -0
  127. data/lib/rdoc/markup/list_item.rb +100 -0
  128. data/lib/rdoc/markup/paragraph.rb +29 -0
  129. data/lib/rdoc/markup/parser.rb +575 -0
  130. data/lib/rdoc/markup/pre_process.rb +296 -0
  131. data/lib/rdoc/markup/raw.rb +70 -0
  132. data/lib/rdoc/markup/regexp_handling.rb +41 -0
  133. data/lib/rdoc/markup/rule.rb +21 -0
  134. data/lib/rdoc/markup/table.rb +47 -0
  135. data/lib/rdoc/markup/to_ansi.rb +94 -0
  136. data/lib/rdoc/markup/to_bs.rb +77 -0
  137. data/lib/rdoc/markup/to_html.rb +444 -0
  138. data/lib/rdoc/markup/to_html_crossref.rb +176 -0
  139. data/lib/rdoc/markup/to_html_snippet.rb +285 -0
  140. data/lib/rdoc/markup/to_joined_paragraph.rb +47 -0
  141. data/lib/rdoc/markup/to_label.rb +75 -0
  142. data/lib/rdoc/markup/to_markdown.rb +192 -0
  143. data/lib/rdoc/markup/to_rdoc.rb +362 -0
  144. data/lib/rdoc/markup/to_table_of_contents.rb +89 -0
  145. data/lib/rdoc/markup/to_test.rb +70 -0
  146. data/lib/rdoc/markup/to_tt_only.rb +121 -0
  147. data/lib/rdoc/markup/verbatim.rb +84 -0
  148. data/lib/rdoc/markup.rb +867 -0
  149. data/lib/rdoc/meta_method.rb +7 -0
  150. data/lib/rdoc/method_attr.rb +419 -0
  151. data/lib/rdoc/mixin.rb +121 -0
  152. data/lib/rdoc/normal_class.rb +93 -0
  153. data/lib/rdoc/normal_module.rb +74 -0
  154. data/lib/rdoc/options.rb +1285 -0
  155. data/lib/rdoc/parser/c.rb +1225 -0
  156. data/lib/rdoc/parser/changelog.rb +335 -0
  157. data/lib/rdoc/parser/markdown.rb +24 -0
  158. data/lib/rdoc/parser/rd.rb +23 -0
  159. data/lib/rdoc/parser/ripper_state_lex.rb +590 -0
  160. data/lib/rdoc/parser/ruby.rb +2327 -0
  161. data/lib/rdoc/parser/ruby_tools.rb +167 -0
  162. data/lib/rdoc/parser/simple.rb +61 -0
  163. data/lib/rdoc/parser/text.rb +12 -0
  164. data/lib/rdoc/parser.rb +277 -0
  165. data/lib/rdoc/rd/block_parser.rb +1056 -0
  166. data/lib/rdoc/rd/block_parser.ry +639 -0
  167. data/lib/rdoc/rd/inline.rb +72 -0
  168. data/lib/rdoc/rd/inline_parser.rb +1208 -0
  169. data/lib/rdoc/rd/inline_parser.ry +593 -0
  170. data/lib/rdoc/rd.rb +100 -0
  171. data/lib/rdoc/rdoc.rb +579 -0
  172. data/lib/rdoc/require.rb +52 -0
  173. data/lib/rdoc/ri/driver.rb +1572 -0
  174. data/lib/rdoc/ri/formatter.rb +6 -0
  175. data/lib/rdoc/ri/paths.rb +171 -0
  176. data/lib/rdoc/ri/store.rb +7 -0
  177. data/lib/rdoc/ri/task.rb +71 -0
  178. data/lib/rdoc/ri.rb +21 -0
  179. data/lib/rdoc/rubygems_hook.rb +246 -0
  180. data/lib/rdoc/servlet.rb +451 -0
  181. data/lib/rdoc/single_class.rb +26 -0
  182. data/lib/rdoc/stats/normal.rb +58 -0
  183. data/lib/rdoc/stats/quiet.rb +60 -0
  184. data/lib/rdoc/stats/verbose.rb +46 -0
  185. data/lib/rdoc/stats.rb +462 -0
  186. data/lib/rdoc/store.rb +979 -0
  187. data/lib/rdoc/task.rb +329 -0
  188. data/lib/rdoc/text.rb +304 -0
  189. data/lib/rdoc/token_stream.rb +119 -0
  190. data/lib/rdoc/tom_doc.rb +263 -0
  191. data/lib/rdoc/top_level.rb +289 -0
  192. data/lib/rdoc/version.rb +8 -0
  193. data/lib/rdoc.rb +201 -0
  194. data/man/ri.1 +247 -0
  195. data/rdoc.gemspec +249 -0
  196. metadata +279 -0
@@ -0,0 +1,167 @@
1
+ # frozen_string_literal: true
2
+ ##
3
+ # Collection of methods for writing parsers
4
+
5
+ module RDoc::Parser::RubyTools
6
+
7
+ ##
8
+ # Adds a token listener +obj+, but you should probably use token_listener
9
+
10
+ def add_token_listener(obj)
11
+ @token_listeners ||= []
12
+ @token_listeners << obj
13
+ end
14
+
15
+ ##
16
+ # Fetches the next token from the scanner
17
+
18
+ def get_tk
19
+ tk = nil
20
+
21
+ if @tokens.empty? then
22
+ if @scanner_point >= @scanner.size
23
+ return nil
24
+ else
25
+ tk = @scanner[@scanner_point]
26
+ @scanner_point += 1
27
+ @read.push tk[:text]
28
+ end
29
+ else
30
+ @read.push @unget_read.shift
31
+ tk = @tokens.shift
32
+ end
33
+
34
+ if tk == nil || :on___end__ == tk[:kind]
35
+ tk = nil
36
+ end
37
+
38
+ return nil unless tk
39
+
40
+ # inform any listeners of our shiny new token
41
+ @token_listeners.each do |obj|
42
+ obj.add_token(tk)
43
+ end if @token_listeners
44
+
45
+ tk
46
+ end
47
+
48
+ ##
49
+ # Reads and returns all tokens up to one of +tokens+. Leaves the matched
50
+ # token in the token list.
51
+
52
+ def get_tk_until(*tokens)
53
+ read = []
54
+
55
+ loop do
56
+ tk = get_tk
57
+
58
+ case tk
59
+ when *tokens then
60
+ unget_tk tk
61
+ break
62
+ end
63
+
64
+ read << tk
65
+ end
66
+
67
+ read
68
+ end
69
+
70
+ ##
71
+ # Retrieves a String representation of the read tokens
72
+
73
+ def get_tkread
74
+ read = @read.join("")
75
+ @read = []
76
+ read
77
+ end
78
+
79
+ ##
80
+ # Peek equivalent for get_tkread
81
+
82
+ def peek_read
83
+ @read.join('')
84
+ end
85
+
86
+ ##
87
+ # Peek at the next token, but don't remove it from the stream
88
+
89
+ def peek_tk
90
+ unget_tk(tk = get_tk)
91
+ tk
92
+ end
93
+
94
+ ##
95
+ # Removes the token listener +obj+
96
+
97
+ def remove_token_listener(obj)
98
+ @token_listeners.delete(obj)
99
+ end
100
+
101
+ ##
102
+ # Resets the tools
103
+
104
+ def reset
105
+ @read = []
106
+ @tokens = []
107
+ @unget_read = []
108
+ @nest = 0
109
+ @scanner_point = 0
110
+ end
111
+
112
+ ##
113
+ # Skips whitespace tokens including newlines
114
+
115
+ def skip_tkspace
116
+ tokens = []
117
+
118
+ while (tk = get_tk) and (:on_sp == tk[:kind] or :on_nl == tk[:kind] or :on_ignored_nl == tk[:kind]) do
119
+ tokens.push(tk)
120
+ end
121
+
122
+ unget_tk(tk)
123
+ tokens
124
+ end
125
+
126
+ ##
127
+ # Skips whitespace tokens excluding newlines
128
+
129
+ def skip_tkspace_without_nl
130
+ tokens = []
131
+
132
+ while (tk = get_tk) and :on_sp == tk[:kind] do
133
+ tokens.push(tk)
134
+ end
135
+
136
+ unget_tk(tk)
137
+ tokens
138
+ end
139
+
140
+ ##
141
+ # Has +obj+ listen to tokens
142
+
143
+ def token_listener(obj)
144
+ add_token_listener obj
145
+ yield
146
+ ensure
147
+ remove_token_listener obj
148
+ end
149
+
150
+ ##
151
+ # Returns +tk+ to the scanner
152
+
153
+ def unget_tk(tk)
154
+ @tokens.unshift tk
155
+ @unget_read.unshift @read.pop
156
+
157
+ # Remove this token from any listeners
158
+ @token_listeners.each do |obj|
159
+ obj.pop_token
160
+ end if @token_listeners
161
+
162
+ nil
163
+ end
164
+
165
+ end
166
+
167
+
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+ ##
3
+ # Parse a non-source file. We basically take the whole thing as one big
4
+ # comment.
5
+
6
+ class RDoc::Parser::Simple < RDoc::Parser
7
+
8
+ include RDoc::Parser::Text
9
+
10
+ parse_files_matching(//)
11
+
12
+ attr_reader :content # :nodoc:
13
+
14
+ ##
15
+ # Prepare to parse a plain file
16
+
17
+ def initialize(top_level, file_name, content, options, stats)
18
+ super
19
+
20
+ preprocess = RDoc::Markup::PreProcess.new @file_name, @options.rdoc_include
21
+
22
+ @content = preprocess.handle @content, @top_level
23
+ end
24
+
25
+ ##
26
+ # Extract the file contents and attach them to the TopLevel as a comment
27
+
28
+ def scan
29
+ comment = remove_coding_comment @content
30
+ comment = remove_private_comment comment
31
+
32
+ comment = RDoc::Comment.new comment, @top_level
33
+
34
+ @top_level.comment = comment
35
+ @top_level
36
+ end
37
+
38
+ ##
39
+ # Removes the encoding magic comment from +text+
40
+
41
+ def remove_coding_comment text
42
+ text.sub(/\A# .*coding[=:].*$/, '')
43
+ end
44
+
45
+ ##
46
+ # Removes private comments.
47
+ #
48
+ # Unlike RDoc::Comment#remove_private this implementation only looks for two
49
+ # dashes at the beginning of the line. Three or more dashes are considered
50
+ # to be a rule and ignored.
51
+
52
+ def remove_private_comment comment
53
+ # Workaround for gsub encoding for Ruby 1.9.2 and earlier
54
+ empty = ''
55
+ empty = RDoc::Encoding.change_encoding empty, comment.encoding
56
+
57
+ comment = comment.gsub(%r%^--\n.*?^\+\+\n?%m, empty)
58
+ comment.sub(%r%^--\n.*%m, empty)
59
+ end
60
+
61
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+ ##
3
+ # Indicates this parser is text and doesn't contain code constructs.
4
+ #
5
+ # Include this module in a RDoc::Parser subclass to make it show up as a file,
6
+ # not as part of a class or module.
7
+ #--
8
+ # This is not named File to avoid overriding ::File
9
+
10
+ module RDoc::Parser::Text
11
+ end
12
+
@@ -0,0 +1,277 @@
1
+ # -*- coding: us-ascii -*-
2
+ # frozen_string_literal: true
3
+
4
+ ##
5
+ # A parser is simple a class that subclasses RDoc::Parser and implements #scan
6
+ # to fill in an RDoc::TopLevel with parsed data.
7
+ #
8
+ # The initialize method takes an RDoc::TopLevel to fill with parsed content,
9
+ # the name of the file to be parsed, the content of the file, an RDoc::Options
10
+ # object and an RDoc::Stats object to inform the user of parsed items. The
11
+ # scan method is then called to parse the file and must return the
12
+ # RDoc::TopLevel object. By calling super these items will be set for you.
13
+ #
14
+ # In order to be used by RDoc the parser needs to register the file extensions
15
+ # it can parse. Use ::parse_files_matching to register extensions.
16
+ #
17
+ # require 'rdoc'
18
+ #
19
+ # class RDoc::Parser::Xyz < RDoc::Parser
20
+ # parse_files_matching /\.xyz$/
21
+ #
22
+ # def initialize top_level, file_name, content, options, stats
23
+ # super
24
+ #
25
+ # # extra initialization if needed
26
+ # end
27
+ #
28
+ # def scan
29
+ # # parse file and fill in @top_level
30
+ # end
31
+ # end
32
+
33
+ class RDoc::Parser
34
+
35
+ @parsers = []
36
+
37
+ class << self
38
+
39
+ ##
40
+ # An Array of arrays that maps file extension (or name) regular
41
+ # expressions to parser classes that will parse matching filenames.
42
+ #
43
+ # Use parse_files_matching to register a parser's file extensions.
44
+
45
+ attr_reader :parsers
46
+
47
+ end
48
+
49
+ ##
50
+ # The name of the file being parsed
51
+
52
+ attr_reader :file_name
53
+
54
+ ##
55
+ # Alias an extension to another extension. After this call, files ending
56
+ # "new_ext" will be parsed using the same parser as "old_ext"
57
+
58
+ def self.alias_extension(old_ext, new_ext)
59
+ old_ext = old_ext.sub(/^\.(.*)/, '\1')
60
+ new_ext = new_ext.sub(/^\.(.*)/, '\1')
61
+
62
+ parser = can_parse_by_name "xxx.#{old_ext}"
63
+ return false unless parser
64
+
65
+ RDoc::Parser.parsers.unshift [/\.#{new_ext}$/, parser]
66
+
67
+ true
68
+ end
69
+
70
+ ##
71
+ # Determines if the file is a "binary" file which basically means it has
72
+ # content that an RDoc parser shouldn't try to consume.
73
+
74
+ def self.binary?(file)
75
+ return false if file =~ /\.(rdoc|txt)$/
76
+
77
+ s = File.read(file, 1024) or return false
78
+
79
+ return true if s[0, 2] == Marshal.dump('')[0, 2] or s.index("\x00")
80
+
81
+ mode = 'r:utf-8' # default source encoding has been changed to utf-8
82
+ s.sub!(/\A#!.*\n/, '') # assume shebang line isn't longer than 1024.
83
+ encoding = s[/^\s*\#\s*(?:-\*-\s*)?(?:en)?coding:\s*([^\s;]+?)(?:-\*-|[\s;])/, 1]
84
+ mode = "rb:#{encoding}" if encoding
85
+ s = File.open(file, mode) {|f| f.gets(nil, 1024)}
86
+
87
+ not s.valid_encoding?
88
+ end
89
+
90
+ ##
91
+ # Checks if +file+ is a zip file in disguise. Signatures from
92
+ # http://www.garykessler.net/library/file_sigs.html
93
+
94
+ def self.zip? file
95
+ zip_signature = File.read file, 4
96
+
97
+ zip_signature == "PK\x03\x04" or
98
+ zip_signature == "PK\x05\x06" or
99
+ zip_signature == "PK\x07\x08"
100
+ rescue
101
+ false
102
+ end
103
+
104
+ ##
105
+ # Return a parser that can handle a particular extension
106
+
107
+ def self.can_parse file_name
108
+ parser = can_parse_by_name file_name
109
+
110
+ # HACK Selenium hides a jar file using a .txt extension
111
+ return if parser == RDoc::Parser::Simple and zip? file_name
112
+
113
+ parser
114
+ end
115
+
116
+ ##
117
+ # Returns a parser that can handle the extension for +file_name+. This does
118
+ # not depend upon the file being readable.
119
+
120
+ def self.can_parse_by_name file_name
121
+ _, parser = RDoc::Parser.parsers.find { |regexp,| regexp =~ file_name }
122
+
123
+ # The default parser must not parse binary files
124
+ ext_name = File.extname file_name
125
+ return parser if ext_name.empty?
126
+
127
+ if parser == RDoc::Parser::Simple and ext_name !~ /txt|rdoc/ then
128
+ case check_modeline file_name
129
+ when nil, 'rdoc' then # continue
130
+ else return nil
131
+ end
132
+ end
133
+
134
+ parser
135
+ rescue Errno::EACCES
136
+ end
137
+
138
+ ##
139
+ # Returns the file type from the modeline in +file_name+
140
+
141
+ def self.check_modeline file_name
142
+ line = File.open file_name do |io|
143
+ io.gets
144
+ end
145
+
146
+ /-\*-\s*(.*?\S)\s*-\*-/ =~ line
147
+
148
+ return nil unless type = $1
149
+
150
+ if /;/ =~ type then
151
+ return nil unless /(?:\s|\A)mode:\s*([^\s;]+)/i =~ type
152
+ type = $1
153
+ end
154
+
155
+ return nil if /coding:/i =~ type
156
+
157
+ type.downcase
158
+ rescue ArgumentError
159
+ rescue Encoding::InvalidByteSequenceError # invalid byte sequence
160
+
161
+ end
162
+
163
+ ##
164
+ # Finds and instantiates the correct parser for the given +file_name+ and
165
+ # +content+.
166
+
167
+ def self.for top_level, file_name, content, options, stats
168
+ return if binary? file_name
169
+
170
+ parser = use_markup content
171
+
172
+ unless parser then
173
+ parse_name = file_name
174
+
175
+ # If no extension, look for shebang
176
+ if file_name !~ /\.\w+$/ && content =~ %r{\A#!(.+)} then
177
+ shebang = $1
178
+ case shebang
179
+ when %r{env\s+ruby}, %r{/ruby}
180
+ parse_name = 'dummy.rb'
181
+ end
182
+ end
183
+
184
+ parser = can_parse parse_name
185
+ end
186
+
187
+ return unless parser
188
+
189
+ content = remove_modeline content
190
+
191
+ parser.new top_level, file_name, content, options, stats
192
+ rescue SystemCallError
193
+ nil
194
+ end
195
+
196
+ ##
197
+ # Record which file types this parser can understand.
198
+ #
199
+ # It is ok to call this multiple times.
200
+
201
+ def self.parse_files_matching(regexp)
202
+ RDoc::Parser.parsers.unshift [regexp, self]
203
+ end
204
+
205
+ ##
206
+ # Removes an emacs-style modeline from the first line of the document
207
+
208
+ def self.remove_modeline content
209
+ content.sub(/\A.*-\*-\s*(.*?\S)\s*-\*-.*\r?\n/, '')
210
+ end
211
+
212
+ ##
213
+ # If there is a <tt>markup: parser_name</tt> comment at the front of the
214
+ # file, use it to determine the parser. For example:
215
+ #
216
+ # # markup: rdoc
217
+ # # Class comment can go here
218
+ #
219
+ # class C
220
+ # end
221
+ #
222
+ # The comment should appear as the first line of the +content+.
223
+ #
224
+ # If the content contains a shebang or editor modeline the comment may
225
+ # appear on the second or third line.
226
+ #
227
+ # Any comment style may be used to hide the markup comment.
228
+
229
+ def self.use_markup content
230
+ markup = content.lines.first(3).grep(/markup:\s+(\w+)/) { $1 }.first
231
+
232
+ return unless markup
233
+
234
+ # TODO Ruby should be returned only when the filename is correct
235
+ return RDoc::Parser::Ruby if %w[tomdoc markdown].include? markup
236
+
237
+ markup = Regexp.escape markup
238
+
239
+ _, selected = RDoc::Parser.parsers.find do |_, parser|
240
+ /^#{markup}$/i =~ parser.name.sub(/.*:/, '')
241
+ end
242
+
243
+ selected
244
+ end
245
+
246
+ ##
247
+ # Creates a new Parser storing +top_level+, +file_name+, +content+,
248
+ # +options+ and +stats+ in instance variables. In +@preprocess+ an
249
+ # RDoc::Markup::PreProcess object is created which allows processing of
250
+ # directives.
251
+
252
+ def initialize top_level, file_name, content, options, stats
253
+ @top_level = top_level
254
+ @top_level.parser = self.class
255
+ @store = @top_level.store
256
+
257
+ @file_name = file_name
258
+ @content = content
259
+ @options = options
260
+ @stats = stats
261
+
262
+ @preprocess = RDoc::Markup::PreProcess.new @file_name, @options.rdoc_include
263
+ @preprocess.options = @options
264
+ end
265
+
266
+ autoload :RubyTools, 'rdoc/parser/ruby_tools'
267
+ autoload :Text, 'rdoc/parser/text'
268
+
269
+ end
270
+
271
+ # simple must come first in order to show up last in the parsers list
272
+ require_relative 'parser/simple'
273
+ require_relative 'parser/c'
274
+ require_relative 'parser/changelog'
275
+ require_relative 'parser/markdown'
276
+ require_relative 'parser/rd'
277
+ require_relative 'parser/ruby'