rdoc 3.1 → 6.3.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rdoc might be problematic. Click here for more details.

Files changed (247) 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 +129 -0
  11. data/RI.rdoc +57 -0
  12. data/Rakefile +84 -81
  13. data/TODO.rdoc +59 -0
  14. data/bin/console +7 -0
  15. data/bin/setup +6 -0
  16. data/{bin → exe}/rdoc +11 -2
  17. data/exe/ri +12 -0
  18. data/lib/rdoc/alias.rb +1 -2
  19. data/lib/rdoc/anon_class.rb +3 -2
  20. data/lib/rdoc/any_method.rb +234 -40
  21. data/lib/rdoc/attr.rb +79 -11
  22. data/lib/rdoc/class_module.rb +443 -71
  23. data/lib/rdoc/code_object.rb +216 -20
  24. data/lib/rdoc/code_objects.rb +4 -21
  25. data/lib/rdoc/comment.rb +250 -0
  26. data/lib/rdoc/constant.rb +110 -9
  27. data/lib/rdoc/context/section.rb +232 -0
  28. data/lib/rdoc/context.rb +392 -172
  29. data/lib/rdoc/cross_reference.rb +202 -0
  30. data/lib/rdoc/encoding.rb +83 -28
  31. data/lib/rdoc/erb_partial.rb +19 -0
  32. data/lib/rdoc/erbio.rb +8 -3
  33. data/lib/rdoc/extend.rb +10 -0
  34. data/lib/rdoc/generator/darkfish.rb +507 -84
  35. data/lib/rdoc/generator/json_index.rb +300 -0
  36. data/lib/rdoc/generator/markup.rb +27 -74
  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 +8 -62
  42. data/lib/rdoc/generator/template/darkfish/_footer.rhtml +5 -0
  43. data/lib/rdoc/generator/template/darkfish/_head.rhtml +22 -0
  44. data/lib/rdoc/generator/template/darkfish/_sidebar_VCS_info.rhtml +19 -0
  45. data/lib/rdoc/generator/template/darkfish/_sidebar_classes.rhtml +9 -0
  46. data/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml +15 -0
  47. data/lib/rdoc/generator/template/darkfish/_sidebar_in_files.rhtml +9 -0
  48. data/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml +15 -0
  49. data/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml +15 -0
  50. data/lib/rdoc/generator/template/darkfish/_sidebar_methods.rhtml +12 -0
  51. data/lib/rdoc/generator/template/darkfish/_sidebar_navigation.rhtml +11 -0
  52. data/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml +12 -0
  53. data/lib/rdoc/generator/template/darkfish/_sidebar_parent.rhtml +11 -0
  54. data/lib/rdoc/generator/template/darkfish/_sidebar_search.rhtml +14 -0
  55. data/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml +11 -0
  56. data/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml +18 -0
  57. data/lib/rdoc/generator/template/darkfish/class.rhtml +172 -0
  58. data/lib/rdoc/generator/template/darkfish/css/fonts.css +167 -0
  59. data/lib/rdoc/generator/template/darkfish/css/rdoc.css +639 -0
  60. data/lib/rdoc/generator/template/darkfish/fonts/Lato-Light.ttf +0 -0
  61. data/lib/rdoc/generator/template/darkfish/fonts/Lato-LightItalic.ttf +0 -0
  62. data/lib/rdoc/generator/template/darkfish/fonts/Lato-Regular.ttf +0 -0
  63. data/lib/rdoc/generator/template/darkfish/fonts/Lato-RegularItalic.ttf +0 -0
  64. data/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Bold.ttf +0 -0
  65. data/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Regular.ttf +0 -0
  66. data/lib/rdoc/generator/template/darkfish/images/add.png +0 -0
  67. data/lib/rdoc/generator/template/darkfish/images/arrow_up.png +0 -0
  68. data/lib/rdoc/generator/template/darkfish/images/delete.png +0 -0
  69. data/lib/rdoc/generator/template/darkfish/images/tag_blue.png +0 -0
  70. data/lib/rdoc/generator/template/darkfish/images/transparent.png +0 -0
  71. data/lib/rdoc/generator/template/darkfish/index.rhtml +18 -60
  72. data/lib/rdoc/generator/template/darkfish/js/darkfish.js +51 -83
  73. data/lib/rdoc/generator/template/darkfish/js/search.js +110 -0
  74. data/lib/rdoc/generator/template/darkfish/page.rhtml +18 -0
  75. data/lib/rdoc/generator/template/darkfish/servlet_not_found.rhtml +18 -0
  76. data/lib/rdoc/generator/template/darkfish/servlet_root.rhtml +62 -0
  77. data/lib/rdoc/generator/template/darkfish/table_of_contents.rhtml +58 -0
  78. data/lib/rdoc/generator/template/json_index/.document +1 -0
  79. data/lib/rdoc/generator/template/json_index/js/navigation.js +105 -0
  80. data/lib/rdoc/generator/template/json_index/js/searcher.js +229 -0
  81. data/lib/rdoc/generator.rb +24 -13
  82. data/lib/rdoc/ghost_method.rb +1 -2
  83. data/lib/rdoc/i18n/locale.rb +102 -0
  84. data/lib/rdoc/i18n/text.rb +126 -0
  85. data/lib/rdoc/i18n.rb +10 -0
  86. data/lib/rdoc/include.rb +5 -95
  87. data/lib/rdoc/known_classes.rb +5 -2
  88. data/lib/rdoc/markdown/entities.rb +2132 -0
  89. data/lib/rdoc/markdown/literals.kpeg +23 -0
  90. data/lib/rdoc/markdown/literals.rb +416 -0
  91. data/lib/rdoc/markdown.kpeg +1237 -0
  92. data/lib/rdoc/markdown.rb +16684 -0
  93. data/lib/rdoc/markup/attr_changer.rb +23 -0
  94. data/lib/rdoc/markup/attr_span.rb +36 -0
  95. data/lib/rdoc/markup/attribute_manager.rb +135 -62
  96. data/lib/rdoc/markup/attributes.rb +71 -0
  97. data/lib/rdoc/markup/blank_line.rb +1 -0
  98. data/lib/rdoc/markup/block_quote.rb +15 -0
  99. data/lib/rdoc/markup/document.rb +96 -9
  100. data/lib/rdoc/markup/formatter.rb +138 -25
  101. data/lib/rdoc/markup/hard_break.rb +32 -0
  102. data/lib/rdoc/markup/heading.rb +61 -2
  103. data/lib/rdoc/markup/include.rb +43 -0
  104. data/lib/rdoc/markup/indented_paragraph.rb +48 -0
  105. data/lib/rdoc/markup/list.rb +25 -4
  106. data/lib/rdoc/markup/list_item.rb +18 -4
  107. data/lib/rdoc/markup/paragraph.rb +15 -0
  108. data/lib/rdoc/markup/parser.rb +180 -88
  109. data/lib/rdoc/markup/pre_process.rb +183 -38
  110. data/lib/rdoc/markup/raw.rb +6 -5
  111. data/lib/rdoc/markup/regexp_handling.rb +41 -0
  112. data/lib/rdoc/markup/rule.rb +1 -0
  113. data/lib/rdoc/markup/table.rb +47 -0
  114. data/lib/rdoc/markup/to_ansi.rb +17 -7
  115. data/lib/rdoc/markup/to_bs.rb +5 -8
  116. data/lib/rdoc/markup/to_html.rb +238 -137
  117. data/lib/rdoc/markup/to_html_crossref.rb +125 -152
  118. data/lib/rdoc/markup/to_html_snippet.rb +285 -0
  119. data/lib/rdoc/markup/to_joined_paragraph.rb +47 -0
  120. data/lib/rdoc/markup/to_label.rb +75 -0
  121. data/lib/rdoc/markup/to_markdown.rb +192 -0
  122. data/lib/rdoc/markup/to_rdoc.rb +85 -15
  123. data/lib/rdoc/markup/to_table_of_contents.rb +89 -0
  124. data/lib/rdoc/markup/to_test.rb +2 -4
  125. data/lib/rdoc/markup/to_tt_only.rb +121 -0
  126. data/lib/rdoc/markup/verbatim.rb +39 -0
  127. data/lib/rdoc/markup.rb +388 -110
  128. data/lib/rdoc/meta_method.rb +1 -2
  129. data/lib/rdoc/method_attr.rb +87 -21
  130. data/lib/rdoc/mixin.rb +121 -0
  131. data/lib/rdoc/normal_class.rb +39 -10
  132. data/lib/rdoc/normal_module.rb +22 -7
  133. data/lib/rdoc/options.rb +613 -73
  134. data/lib/rdoc/parser/c.rb +621 -287
  135. data/lib/rdoc/parser/changelog.rb +335 -0
  136. data/lib/rdoc/parser/markdown.rb +24 -0
  137. data/lib/rdoc/parser/rd.rb +23 -0
  138. data/lib/rdoc/parser/ripper_state_lex.rb +590 -0
  139. data/lib/rdoc/parser/ruby.rb +1368 -762
  140. data/lib/rdoc/parser/ruby_tools.rb +42 -35
  141. data/lib/rdoc/parser/simple.rb +23 -11
  142. data/lib/rdoc/parser/text.rb +12 -0
  143. data/lib/rdoc/parser.rb +162 -89
  144. data/lib/rdoc/rd/block_parser.rb +1056 -0
  145. data/lib/rdoc/rd/block_parser.ry +639 -0
  146. data/lib/rdoc/rd/inline.rb +72 -0
  147. data/lib/rdoc/rd/inline_parser.rb +1208 -0
  148. data/lib/rdoc/rd/inline_parser.ry +593 -0
  149. data/lib/rdoc/rd.rb +100 -0
  150. data/lib/rdoc/rdoc.rb +208 -115
  151. data/lib/rdoc/require.rb +1 -2
  152. data/lib/rdoc/ri/driver.rb +734 -239
  153. data/lib/rdoc/ri/formatter.rb +1 -0
  154. data/lib/rdoc/ri/paths.rb +91 -48
  155. data/lib/rdoc/ri/store.rb +3 -261
  156. data/lib/rdoc/ri/task.rb +71 -0
  157. data/lib/rdoc/ri.rb +5 -2
  158. data/lib/rdoc/rubygems_hook.rb +246 -0
  159. data/lib/rdoc/servlet.rb +451 -0
  160. data/lib/rdoc/single_class.rb +14 -2
  161. data/lib/rdoc/stats/normal.rb +19 -12
  162. data/lib/rdoc/stats/quiet.rb +1 -0
  163. data/lib/rdoc/stats/verbose.rb +1 -0
  164. data/lib/rdoc/stats.rb +262 -104
  165. data/lib/rdoc/store.rb +979 -0
  166. data/lib/rdoc/task.rb +84 -44
  167. data/lib/rdoc/text.rb +117 -72
  168. data/lib/rdoc/token_stream.rb +73 -4
  169. data/lib/rdoc/tom_doc.rb +263 -0
  170. data/lib/rdoc/top_level.rb +111 -261
  171. data/lib/rdoc/version.rb +8 -0
  172. data/lib/rdoc.rb +127 -64
  173. data/man/ri.1 +247 -0
  174. data/rdoc.gemspec +249 -0
  175. metadata +171 -291
  176. data/.autotest +0 -16
  177. data/.document +0 -5
  178. data/History.txt +0 -594
  179. data/LICENSE.txt +0 -57
  180. data/Manifest.txt +0 -158
  181. data/README.txt +0 -45
  182. data/RI.txt +0 -58
  183. data/bin/ri +0 -5
  184. data/lib/rdoc/gauntlet.rb +0 -52
  185. data/lib/rdoc/generator/template/darkfish/classpage.rhtml +0 -296
  186. data/lib/rdoc/generator/template/darkfish/filepage.rhtml +0 -124
  187. data/lib/rdoc/generator/template/darkfish/js/jquery.js +0 -32
  188. data/lib/rdoc/generator/template/darkfish/js/quicksearch.js +0 -114
  189. data/lib/rdoc/generator/template/darkfish/js/thickbox-compressed.js +0 -10
  190. data/lib/rdoc/generator/template/darkfish/rdoc.css +0 -706
  191. data/lib/rdoc/markup/formatter_test_case.rb +0 -689
  192. data/lib/rdoc/markup/inline.rb +0 -137
  193. data/lib/rdoc/markup/text_formatter_test_case.rb +0 -116
  194. data/lib/rdoc/ruby_lex.rb +0 -1291
  195. data/lib/rdoc/ruby_token.rb +0 -416
  196. data/test/README +0 -1
  197. data/test/binary.dat +0 -0
  198. data/test/hidden.zip.txt +0 -1
  199. data/test/test.ja.rdoc +0 -10
  200. data/test/test.ja.txt +0 -8
  201. data/test/test.txt +0 -1
  202. data/test/test_attribute_manager.rb +0 -120
  203. data/test/test_rdoc_alias.rb +0 -13
  204. data/test/test_rdoc_any_method.rb +0 -126
  205. data/test/test_rdoc_attr.rb +0 -61
  206. data/test/test_rdoc_class_module.rb +0 -233
  207. data/test/test_rdoc_code_object.rb +0 -165
  208. data/test/test_rdoc_constant.rb +0 -15
  209. data/test/test_rdoc_context.rb +0 -370
  210. data/test/test_rdoc_encoding.rb +0 -166
  211. data/test/test_rdoc_generator_darkfish.rb +0 -119
  212. data/test/test_rdoc_generator_ri.rb +0 -76
  213. data/test/test_rdoc_include.rb +0 -96
  214. data/test/test_rdoc_markup.rb +0 -37
  215. data/test/test_rdoc_markup_attribute_manager.rb +0 -240
  216. data/test/test_rdoc_markup_document.rb +0 -51
  217. data/test/test_rdoc_markup_paragraph.rb +0 -9
  218. data/test/test_rdoc_markup_parser.rb +0 -1395
  219. data/test/test_rdoc_markup_pre_process.rb +0 -185
  220. data/test/test_rdoc_markup_raw.rb +0 -27
  221. data/test/test_rdoc_markup_to_ansi.rb +0 -328
  222. data/test/test_rdoc_markup_to_bs.rb +0 -341
  223. data/test/test_rdoc_markup_to_html.rb +0 -335
  224. data/test/test_rdoc_markup_to_html_crossref.rb +0 -169
  225. data/test/test_rdoc_markup_to_rdoc.rb +0 -327
  226. data/test/test_rdoc_method_attr.rb +0 -122
  227. data/test/test_rdoc_normal_class.rb +0 -17
  228. data/test/test_rdoc_normal_module.rb +0 -31
  229. data/test/test_rdoc_options.rb +0 -342
  230. data/test/test_rdoc_parser.rb +0 -83
  231. data/test/test_rdoc_parser_c.rb +0 -912
  232. data/test/test_rdoc_parser_ruby.rb +0 -1754
  233. data/test/test_rdoc_parser_simple.rb +0 -99
  234. data/test/test_rdoc_rdoc.rb +0 -164
  235. data/test/test_rdoc_require.rb +0 -25
  236. data/test/test_rdoc_ri_driver.rb +0 -846
  237. data/test/test_rdoc_ri_paths.rb +0 -43
  238. data/test/test_rdoc_ri_store.rb +0 -352
  239. data/test/test_rdoc_ruby_lex.rb +0 -23
  240. data/test/test_rdoc_stats.rb +0 -38
  241. data/test/test_rdoc_task.rb +0 -92
  242. data/test/test_rdoc_text.rb +0 -251
  243. data/test/test_rdoc_top_level.rb +0 -120
  244. data/test/xref_data.rb +0 -62
  245. data/test/xref_test_case.rb +0 -61
  246. data.tar.gz.sig +0 -3
  247. metadata.gz.sig +0 -0
@@ -1,5 +1,5 @@
1
+ # frozen_string_literal: true
1
2
  require 'strscan'
2
- require 'rdoc/text'
3
3
 
4
4
  ##
5
5
  # A recursive-descent parser for RDoc markup.
@@ -9,8 +9,9 @@ require 'rdoc/text'
9
9
  # RDoc::Markup::ToHTML.
10
10
  #
11
11
  # The parser only handles the block-level constructs Paragraph, List,
12
- # ListItem, Heading, Verbatim, BlankLine and Rule. Inline markup such as
13
- # <tt>\+blah\+</tt> is handled separately by RDoc::Markup::AttributeManager.
12
+ # ListItem, Heading, Verbatim, BlankLine, Rule and BlockQuote.
13
+ # Inline markup such as <tt>\+blah\+</tt> is handled separately by
14
+ # RDoc::Markup::AttributeManager.
14
15
  #
15
16
  # To see what markup the Parser implements read RDoc. To see how to use
16
17
  # RDoc markup to format text in your program read RDoc::Markup.
@@ -52,7 +53,9 @@ class RDoc::Markup::Parser
52
53
  attr_reader :tokens
53
54
 
54
55
  ##
55
- # Parses +str+ into a Document
56
+ # Parses +str+ into a Document.
57
+ #
58
+ # Use RDoc::Markup#parse instead of this method.
56
59
 
57
60
  def self.parse str
58
61
  parser = new
@@ -74,23 +77,29 @@ class RDoc::Markup::Parser
74
77
  # Creates a new Parser. See also ::parse
75
78
 
76
79
  def initialize
77
- @tokens = []
78
- @current_token = nil
79
- @debug = false
80
-
81
- @line = 0
82
- @line_pos = 0
80
+ @binary_input = nil
81
+ @current_token = nil
82
+ @debug = false
83
+ @s = nil
84
+ @tokens = []
83
85
  end
84
86
 
85
87
  ##
86
88
  # Builds a Heading of +level+
87
89
 
88
90
  def build_heading level
89
- _, text, = get # TEXT
90
- heading = RDoc::Markup::Heading.new level, text
91
- skip :NEWLINE
92
-
93
- heading
91
+ type, text, = get
92
+
93
+ text = case type
94
+ when :TEXT then
95
+ skip :NEWLINE
96
+ text
97
+ else
98
+ unget
99
+ ''
100
+ end
101
+
102
+ RDoc::Markup::Heading.new level, text
94
103
  end
95
104
 
96
105
  ##
@@ -100,13 +109,13 @@ class RDoc::Markup::Parser
100
109
  p :list_start => margin if @debug
101
110
 
102
111
  list = RDoc::Markup::List.new
112
+ label = nil
103
113
 
104
114
  until @tokens.empty? do
105
115
  type, data, column, = get
106
116
 
107
117
  case type
108
- when :BULLET, :LABEL, :LALPHA, :NOTE, :NUMBER, :UALPHA then
109
-
118
+ when *LIST_TOKENS then
110
119
  if column < margin || (list.type && list.type != type) then
111
120
  unget
112
121
  break
@@ -117,6 +126,8 @@ class RDoc::Markup::Parser
117
126
 
118
127
  case type
119
128
  when :NOTE, :LABEL then
129
+ label = [] unless label
130
+
120
131
  if peek_type == :NEWLINE then
121
132
  # description not on the same line as LABEL/NOTE
122
133
  # skip the trailing newline & any blank lines below
@@ -139,32 +150,35 @@ class RDoc::Markup::Parser
139
150
  # In all cases, we have an empty description.
140
151
  # In the last case only, we continue.
141
152
  if peek_type.nil? || column < margin then
142
- empty = 1
153
+ empty = true
143
154
  elsif column == margin then
144
155
  case peek_type
145
156
  when type
146
- empty = 2 # continue
157
+ empty = :continue
147
158
  when *LIST_TOKENS
148
- empty = 1
159
+ empty = true
149
160
  else
150
- empty = 0
161
+ empty = false
151
162
  end
152
163
  else
153
- empty = 0
164
+ empty = false
154
165
  end
155
166
 
156
- if empty > 0 then
157
- item = RDoc::Markup::ListItem.new(data)
158
- item << RDoc::Markup::BlankLine.new
159
- list << item
160
- break if empty == 1
161
- next
167
+ if empty then
168
+ label << data
169
+ next if empty == :continue
170
+ break
162
171
  end
163
172
  end
164
173
  else
165
174
  data = nil
166
175
  end
167
176
 
177
+ if label then
178
+ data = label << data
179
+ label = nil
180
+ end
181
+
168
182
  list_item = RDoc::Markup::ListItem.new data
169
183
  parse list_item, column
170
184
  list << list_item
@@ -177,7 +191,13 @@ class RDoc::Markup::Parser
177
191
 
178
192
  p :list_end => margin if @debug
179
193
 
180
- return nil if list.empty?
194
+ if list.empty? then
195
+ return nil unless label
196
+ return nil unless [:LABEL, :NOTE].include? list.type
197
+
198
+ list_item = RDoc::Markup::ListItem.new label, RDoc::Markup::BlankLine.new
199
+ list << list_item
200
+ end
181
201
 
182
202
  list
183
203
  end
@@ -193,15 +213,20 @@ class RDoc::Markup::Parser
193
213
  until @tokens.empty? do
194
214
  type, data, column, = get
195
215
 
196
- if type == :TEXT && column == margin then
216
+ if type == :TEXT and column == margin then
197
217
  paragraph << data
198
- skip :NEWLINE
218
+
219
+ break if peek_token.first == :BREAK
220
+
221
+ data << ' ' if skip :NEWLINE
199
222
  else
200
223
  unget
201
224
  break
202
225
  end
203
226
  end
204
227
 
228
+ paragraph.parts.last.sub!(/ \z/, '') # cleanup
229
+
205
230
  p :paragraph_end => margin if @debug
206
231
 
207
232
  paragraph
@@ -221,7 +246,7 @@ class RDoc::Markup::Parser
221
246
 
222
247
  min_indent = nil
223
248
  generate_leading_spaces = true
224
- line = ''
249
+ line = ''.dup
225
250
 
226
251
  until @tokens.empty? do
227
252
  type, data, column, = get
@@ -229,7 +254,7 @@ class RDoc::Markup::Parser
229
254
  if type == :NEWLINE then
230
255
  line << data
231
256
  verbatim << line
232
- line = ''
257
+ line = ''.dup
233
258
  generate_leading_spaces = true
234
259
  next
235
260
  end
@@ -260,7 +285,7 @@ class RDoc::Markup::Parser
260
285
  peek_column ||= column + width
261
286
  indent = peek_column - column - width
262
287
  line << ' ' * indent
263
- when :TEXT then
288
+ when :BREAK, :TEXT then
264
289
  line << data
265
290
  else # *LIST_TOKENS
266
291
  list_marker = case type
@@ -314,14 +339,19 @@ class RDoc::Markup::Parser
314
339
  until @tokens.empty? do
315
340
  type, data, column, = get
316
341
 
317
- if type == :NEWLINE then
342
+ case type
343
+ when :BREAK then
344
+ parent << RDoc::Markup::BlankLine.new
345
+ skip :NEWLINE, false
346
+ next
347
+ when :NEWLINE then
318
348
  # trailing newlines are skipped below, so this is a blank line
319
349
  parent << RDoc::Markup::BlankLine.new
320
350
  skip :NEWLINE, false
321
351
  next
322
352
  end
323
353
 
324
- # indentation change: break or verbattim
354
+ # indentation change: break or verbatim
325
355
  if column < indent then
326
356
  unget
327
357
  break
@@ -340,7 +370,18 @@ class RDoc::Markup::Parser
340
370
  skip :NEWLINE
341
371
  when :TEXT then
342
372
  unget
343
- parent << build_paragraph(indent)
373
+ parse_text parent, indent
374
+ when :BLOCKQUOTE then
375
+ type, _, column = get
376
+ if type == :NEWLINE
377
+ type, _, column = get
378
+ end
379
+ unget if type
380
+ bq = RDoc::Markup::BlockQuote.new
381
+ p :blockquote_start => [data, column] if @debug
382
+ parse bq, column
383
+ p :blockquote_end => indent if @debug
384
+ parent << bq
344
385
  when *LIST_TOKENS then
345
386
  unget
346
387
  parent << build_list(indent)
@@ -356,6 +397,13 @@ class RDoc::Markup::Parser
356
397
 
357
398
  end
358
399
 
400
+ ##
401
+ # Small hook that is overridden by RDoc::TomDoc
402
+
403
+ def parse_text parent, indent # :nodoc:
404
+ parent << build_paragraph(indent)
405
+ end
406
+
359
407
  ##
360
408
  # Returns the next token on the stream without modifying the stream
361
409
 
@@ -365,6 +413,55 @@ class RDoc::Markup::Parser
365
413
  token
366
414
  end
367
415
 
416
+ ##
417
+ # A simple wrapper of StringScanner that is aware of the current column and lineno
418
+
419
+ class MyStringScanner
420
+ def initialize(input)
421
+ @line = @column = 0
422
+ @s = StringScanner.new input
423
+ end
424
+
425
+ def scan(re)
426
+ ret = @s.scan(re)
427
+ @column += ret.length if ret
428
+ ret
429
+ end
430
+
431
+ def unscan(s)
432
+ @s.pos -= s.bytesize
433
+ @column -= s.length
434
+ end
435
+
436
+ def pos
437
+ [@column, @line]
438
+ end
439
+
440
+ def newline!
441
+ @column = 0
442
+ @line += 1
443
+ end
444
+
445
+ def eos?
446
+ @s.eos?
447
+ end
448
+
449
+ def matched
450
+ @s.matched
451
+ end
452
+
453
+ def [](i)
454
+ @s[i]
455
+ end
456
+ end
457
+
458
+ ##
459
+ # Creates the StringScanner
460
+
461
+ def setup_scanner input
462
+ @s = MyStringScanner.new input
463
+ end
464
+
368
465
  ##
369
466
  # Skips the next token if its type is +token_type+.
370
467
  #
@@ -382,52 +479,54 @@ class RDoc::Markup::Parser
382
479
  # Turns text +input+ into a stream of tokens
383
480
 
384
481
  def tokenize input
385
- s = StringScanner.new input
386
-
387
- @line = 0
388
- @line_pos = 0
482
+ setup_scanner input
389
483
 
390
- until s.eos? do
391
- pos = s.pos
484
+ until @s.eos? do
485
+ pos = @s.pos
392
486
 
393
487
  # leading spaces will be reflected by the column of the next token
394
488
  # the only thing we loose are trailing spaces at the end of the file
395
- next if s.scan(/ +/)
489
+ next if @s.scan(/ +/)
396
490
 
397
491
  # note: after BULLET, LABEL, etc.,
398
492
  # indent will be the column of the next non-newline token
399
493
 
400
494
  @tokens << case
401
495
  # [CR]LF => :NEWLINE
402
- when s.scan(/\r?\n/) then
403
- token = [:NEWLINE, s.matched, *token_pos(pos)]
404
- @line_pos = s.pos
405
- @line += 1
496
+ when @s.scan(/\r?\n/) then
497
+ token = [:NEWLINE, @s.matched, *pos]
498
+ @s.newline!
406
499
  token
407
500
  # === text => :HEADER then :TEXT
408
- when s.scan(/(=+)\s*/) then
409
- level = s[1].length
410
- level = 6 if level > 6
411
- @tokens << [:HEADER, level, *token_pos(pos)]
412
- pos = s.pos
413
- s.scan(/.*/)
414
- [:TEXT, s.matched.sub(/\r$/, ''), *token_pos(pos)]
501
+ when @s.scan(/(=+)(\s*)/) then
502
+ level = @s[1].length
503
+ header = [:HEADER, level, *pos]
504
+
505
+ if @s[2] =~ /^\r?\n/ then
506
+ @s.unscan(@s[2])
507
+ header
508
+ else
509
+ pos = @s.pos
510
+ @s.scan(/.*/)
511
+ @tokens << header
512
+ [:TEXT, @s.matched.sub(/\r$/, ''), *pos]
513
+ end
415
514
  # --- (at least 3) and nothing else on the line => :RULE
416
- when s.scan(/(-{3,}) *$/) then
417
- [:RULE, s[1].length - 2, *token_pos(pos)]
515
+ when @s.scan(/(-{3,}) *\r?$/) then
516
+ [:RULE, @s[1].length - 2, *pos]
418
517
  # * or - followed by white space and text => :BULLET
419
- when s.scan(/([*-]) +(\S)/) then
420
- s.pos -= s[2].bytesize # unget \S
421
- [:BULLET, s[1], *token_pos(pos)]
518
+ when @s.scan(/([*-]) +(\S)/) then
519
+ @s.unscan(@s[2])
520
+ [:BULLET, @s[1], *pos]
422
521
  # A. text, a. text, 12. text => :UALPHA, :LALPHA, :NUMBER
423
- when s.scan(/([a-z]|\d+)\. +(\S)/i) then
522
+ when @s.scan(/([a-z]|\d+)\. +(\S)/i) then
424
523
  # FIXME if tab(s), the column will be wrong
425
524
  # either support tabs everywhere by first expanding them to
426
525
  # spaces, or assume that they will have been replaced
427
526
  # before (and provide a check for that at least in debug
428
527
  # mode)
429
- list_label = s[1]
430
- s.pos -= s[2].bytesize # unget \S
528
+ list_label = @s[1]
529
+ @s.unscan(@s[2])
431
530
  list_type =
432
531
  case list_label
433
532
  when /[a-z]/ then :LALPHA
@@ -436,29 +535,33 @@ class RDoc::Markup::Parser
436
535
  else
437
536
  raise ParseError, "BUG token #{list_label}"
438
537
  end
439
- [list_type, list_label, *token_pos(pos)]
538
+ [list_type, list_label, *pos]
440
539
  # [text] followed by spaces or end of line => :LABEL
441
- when s.scan(/\[(.*?)\]( +|$)/) then
442
- [:LABEL, s[1], *token_pos(pos)]
540
+ when @s.scan(/\[(.*?)\]( +|\r?$)/) then
541
+ [:LABEL, @s[1], *pos]
443
542
  # text:: followed by spaces or end of line => :NOTE
444
- when s.scan(/(.*?)::( +|$)/) then
445
- [:NOTE, s[1], *token_pos(pos)]
543
+ when @s.scan(/(.*?)::( +|\r?$)/) then
544
+ [:NOTE, @s[1], *pos]
545
+ # >>> followed by end of line => :BLOCKQUOTE
546
+ when @s.scan(/>>> *(\w+)?$/) then
547
+ [:BLOCKQUOTE, @s[1], *pos]
446
548
  # anything else: :TEXT
447
- else s.scan(/.*/)
448
- [:TEXT, s.matched.sub(/\r$/, ''), *token_pos(pos)]
549
+ else
550
+ @s.scan(/(.*?)( )?\r?$/)
551
+ token = [:TEXT, @s[1], *pos]
552
+
553
+ if @s[2] then
554
+ @tokens << token
555
+ [:BREAK, @s[2], pos[0] + @s[1].length, pos[1]]
556
+ else
557
+ token
558
+ end
449
559
  end
450
560
  end
451
561
 
452
562
  self
453
563
  end
454
564
 
455
- ##
456
- # Calculates the column and line of the current token based on +offset+.
457
-
458
- def token_pos offset
459
- [offset - @line_pos, @line]
460
- end
461
-
462
565
  ##
463
566
  # Returns the current token to the token stream
464
567
 
@@ -470,14 +573,3 @@ class RDoc::Markup::Parser
470
573
  end
471
574
 
472
575
  end
473
-
474
- require 'rdoc/markup/blank_line'
475
- require 'rdoc/markup/document'
476
- require 'rdoc/markup/heading'
477
- require 'rdoc/markup/list'
478
- require 'rdoc/markup/list_item'
479
- require 'rdoc/markup/raw'
480
- require 'rdoc/markup/paragraph'
481
- require 'rdoc/markup/rule'
482
- require 'rdoc/markup/verbatim'
483
-