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
@@ -0,0 +1,1237 @@
1
+ %% name = RDoc::Markdown
2
+
3
+ %% header {
4
+ # coding: UTF-8
5
+ # frozen_string_literal: true
6
+ # :markup: markdown
7
+
8
+ ##
9
+ # RDoc::Markdown as described by the [markdown syntax][syntax].
10
+ #
11
+ # To choose Markdown as your only default format see
12
+ # RDoc::Options@Saved+Options for instructions on setting up a `.doc_options`
13
+ # file to store your project default.
14
+ #
15
+ # ## Usage
16
+ #
17
+ # Here is a brief example of using this parse to read a markdown file by hand.
18
+ #
19
+ # data = File.read("README.md")
20
+ # formatter = RDoc::Markup::ToHtml.new(RDoc::Options.new, nil)
21
+ # html = RDoc::Markdown.parse(data).accept(formatter)
22
+ #
23
+ # # do something with html
24
+ #
25
+ # ## Extensions
26
+ #
27
+ # The following markdown extensions are supported by the parser, but not all
28
+ # are used in RDoc output by default.
29
+ #
30
+ # ### RDoc
31
+ #
32
+ # The RDoc Markdown parser has the following built-in behaviors that cannot be
33
+ # disabled.
34
+ #
35
+ # Underscores embedded in words are never interpreted as emphasis. (While the
36
+ # [markdown dingus][dingus] emphasizes in-word underscores, neither the
37
+ # Markdown syntax nor MarkdownTest mention this behavior.)
38
+ #
39
+ # For HTML output, RDoc always auto-links bare URLs.
40
+ #
41
+ # ### Break on Newline
42
+ #
43
+ # The break_on_newline extension converts all newlines into hard line breaks
44
+ # as in [Github Flavored Markdown][GFM]. This extension is disabled by
45
+ # default.
46
+ #
47
+ # ### CSS
48
+ #
49
+ # The #css extension enables CSS blocks to be included in the output, but they
50
+ # are not used for any built-in RDoc output format. This extension is disabled
51
+ # by default.
52
+ #
53
+ # Example:
54
+ #
55
+ # <style type="text/css">
56
+ # h1 { font-size: 3em }
57
+ # </style>
58
+ #
59
+ # ### Definition Lists
60
+ #
61
+ # The definition_lists extension allows definition lists using the [PHP
62
+ # Markdown Extra syntax][PHPE], but only one label and definition are supported
63
+ # at this time. This extension is enabled by default.
64
+ #
65
+ # Example:
66
+ #
67
+ # ```
68
+ # cat
69
+ # : A small furry mammal
70
+ # that seems to sleep a lot
71
+ #
72
+ # ant
73
+ # : A little insect that is known
74
+ # to enjoy picnics
75
+ #
76
+ # ```
77
+ #
78
+ # Produces:
79
+ #
80
+ # cat
81
+ # : A small furry mammal
82
+ # that seems to sleep a lot
83
+ #
84
+ # ant
85
+ # : A little insect that is known
86
+ # to enjoy picnics
87
+ #
88
+ # ### Strike
89
+ #
90
+ # Example:
91
+ #
92
+ # ```
93
+ # This is ~~striked~~.
94
+ # ```
95
+ #
96
+ # Produces:
97
+ #
98
+ # This is ~~striked~~.
99
+ #
100
+ # ### Github
101
+ #
102
+ # The #github extension enables a partial set of [Github Flavored Markdown]
103
+ # [GFM]. This extension is enabled by default.
104
+ #
105
+ # Supported github extensions include:
106
+ #
107
+ # #### Fenced code blocks
108
+ #
109
+ # Use ` ``` ` around a block of code instead of indenting it four spaces.
110
+ #
111
+ # #### Syntax highlighting
112
+ #
113
+ # Use ` ``` ruby ` as the start of a code fence to add syntax highlighting.
114
+ # (Currently only `ruby` syntax is supported).
115
+ #
116
+ # ### HTML
117
+ #
118
+ # Enables raw HTML to be included in the output. This extension is enabled by
119
+ # default.
120
+ #
121
+ # Example:
122
+ #
123
+ # <table>
124
+ # ...
125
+ # </table>
126
+ #
127
+ # ### Notes
128
+ #
129
+ # The #notes extension enables footnote support. This extension is enabled by
130
+ # default.
131
+ #
132
+ # Example:
133
+ #
134
+ # Here is some text[^1] including an inline footnote ^[for short footnotes]
135
+ #
136
+ # ...
137
+ #
138
+ # [^1]: With the footnote text down at the bottom
139
+ #
140
+ # Produces:
141
+ #
142
+ # Here is some text[^1] including an inline footnote ^[for short footnotes]
143
+ #
144
+ # [^1]: With the footnote text down at the bottom
145
+ #
146
+ # ## Limitations
147
+ #
148
+ # * Link titles are not used
149
+ # * Footnotes are collapsed into a single paragraph
150
+ #
151
+ # ## Author
152
+ #
153
+ # This markdown parser is a port to kpeg from [peg-markdown][pegmarkdown] by
154
+ # John MacFarlane.
155
+ #
156
+ # It is used under the MIT license:
157
+ #
158
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
159
+ # of this software and associated documentation files (the "Software"), to deal
160
+ # in the Software without restriction, including without limitation the rights
161
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
162
+ # copies of the Software, and to permit persons to whom the Software is
163
+ # furnished to do so, subject to the following conditions:
164
+ #
165
+ # The above copyright notice and this permission notice shall be included in
166
+ # all copies or substantial portions of the Software.
167
+ #
168
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
169
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
170
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
171
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
172
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
173
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
174
+ # THE SOFTWARE.
175
+ #
176
+ # The port to kpeg was performed by Eric Hodel and Evan Phoenix
177
+ #
178
+ # [dingus]: http://daringfireball.net/projects/markdown/dingus
179
+ # [GFM]: https://github.github.com/gfm/
180
+ # [pegmarkdown]: https://github.com/jgm/peg-markdown
181
+ # [PHPE]: http://michelf.com/projects/php-markdown/extra/#def-list
182
+ # [syntax]: http://daringfireball.net/projects/markdown/syntax
183
+ #--
184
+ # Last updated to jgm/peg-markdown commit 8f8fc22ef0
185
+
186
+ }
187
+
188
+ %% {
189
+
190
+ require 'rdoc'
191
+ require 'rdoc/markup/to_joined_paragraph'
192
+ require 'rdoc/markdown/entities'
193
+
194
+ require 'rdoc/markdown/literals'
195
+
196
+ ##
197
+ # Supported extensions
198
+
199
+ EXTENSIONS = []
200
+
201
+ ##
202
+ # Extensions enabled by default
203
+
204
+ DEFAULT_EXTENSIONS = [
205
+ :definition_lists,
206
+ :github,
207
+ :html,
208
+ :notes,
209
+ :strike,
210
+ ]
211
+
212
+ # :section: Extensions
213
+
214
+ ##
215
+ # Creates extension methods for the `name` extension to enable and disable
216
+ # the extension and to query if they are active.
217
+
218
+ def self.extension name
219
+ EXTENSIONS << name
220
+
221
+ define_method "#{name}?" do
222
+ extension? name
223
+ end
224
+
225
+ define_method "#{name}=" do |enable|
226
+ extension name, enable
227
+ end
228
+ end
229
+
230
+ ##
231
+ # Converts all newlines into hard breaks
232
+
233
+ extension :break_on_newline
234
+
235
+ ##
236
+ # Allow style blocks
237
+
238
+ extension :css
239
+
240
+ ##
241
+ # Allow PHP Markdown Extras style definition lists
242
+
243
+ extension :definition_lists
244
+
245
+ ##
246
+ # Allow Github Flavored Markdown
247
+
248
+ extension :github
249
+
250
+ ##
251
+ # Allow HTML
252
+
253
+ extension :html
254
+
255
+ ##
256
+ # Enables the notes extension
257
+
258
+ extension :notes
259
+
260
+ ##
261
+ # Enables the strike extension
262
+
263
+ extension :strike
264
+
265
+ # :section:
266
+
267
+ ##
268
+ # Parses the `markdown` document into an RDoc::Document using the default
269
+ # extensions.
270
+
271
+ def self.parse markdown
272
+ parser = new
273
+
274
+ parser.parse markdown
275
+ end
276
+
277
+ # TODO remove when kpeg 0.10 is released
278
+ alias orig_initialize initialize # :nodoc:
279
+
280
+ ##
281
+ # Creates a new markdown parser that enables the given +extensions+.
282
+
283
+ def initialize extensions = DEFAULT_EXTENSIONS, debug = false
284
+ @debug = debug
285
+ @formatter = RDoc::Markup::ToJoinedParagraph.new
286
+ @extensions = extensions
287
+
288
+ @references = nil
289
+ @unlinked_references = nil
290
+
291
+ @footnotes = nil
292
+ @note_order = nil
293
+ end
294
+
295
+ ##
296
+ # Wraps `text` in emphasis for rdoc inline formatting
297
+
298
+ def emphasis text
299
+ if text =~ /\A[a-z\d.\/]+\z/i then
300
+ "_#{text}_"
301
+ else
302
+ "<em>#{text}</em>"
303
+ end
304
+ end
305
+
306
+ ##
307
+ # :category: Extensions
308
+ #
309
+ # Is the extension `name` enabled?
310
+
311
+ def extension? name
312
+ @extensions.include? name
313
+ end
314
+
315
+ ##
316
+ # :category: Extensions
317
+ #
318
+ # Enables or disables the extension with `name`
319
+
320
+ def extension name, enable
321
+ if enable then
322
+ @extensions |= [name]
323
+ else
324
+ @extensions -= [name]
325
+ end
326
+ end
327
+
328
+ ##
329
+ # Parses `text` in a clone of this parser. This is used for handling nested
330
+ # lists the same way as markdown_parser.
331
+
332
+ def inner_parse text # :nodoc:
333
+ parser = clone
334
+
335
+ parser.setup_parser text, @debug
336
+
337
+ parser.peg_parse
338
+
339
+ doc = parser.result
340
+
341
+ doc.accept @formatter
342
+
343
+ doc.parts
344
+ end
345
+
346
+ ##
347
+ # Finds a link reference for `label` and creates a new link to it with
348
+ # `content` as the link text. If `label` was not encountered in the
349
+ # reference-gathering parser pass the label and content are reconstructed
350
+ # with the linking `text` (usually whitespace).
351
+
352
+ def link_to content, label = content, text = nil
353
+ raise ParseError, 'enable notes extension' if
354
+ content.start_with? '^' and label.equal? content
355
+
356
+ if ref = @references[label] then
357
+ "{#{content}}[#{ref}]"
358
+ elsif label.equal? content then
359
+ "[#{content}]#{text}"
360
+ else
361
+ "[#{content}]#{text}[#{label}]"
362
+ end
363
+ end
364
+
365
+ ##
366
+ # Creates an RDoc::Markup::ListItem by parsing the `unparsed` content from
367
+ # the first parsing pass.
368
+
369
+ def list_item_from unparsed
370
+ parsed = inner_parse unparsed.join
371
+ RDoc::Markup::ListItem.new nil, *parsed
372
+ end
373
+
374
+ ##
375
+ # Stores `label` as a note and fills in previously unknown note references.
376
+
377
+ def note label
378
+ #foottext = "rdoc-label:foottext-#{label}:footmark-#{label}"
379
+
380
+ #ref.replace foottext if ref = @unlinked_notes.delete(label)
381
+
382
+ @notes[label] = foottext
383
+
384
+ #"{^1}[rdoc-label:footmark-#{label}:foottext-#{label}] "
385
+ end
386
+
387
+ ##
388
+ # Creates a new link for the footnote `reference` and adds the reference to
389
+ # the note order list for proper display at the end of the document.
390
+
391
+ def note_for ref
392
+ @note_order << ref
393
+
394
+ label = @note_order.length
395
+
396
+ "{*#{label}}[rdoc-label:foottext-#{label}:footmark-#{label}]"
397
+ end
398
+
399
+ ##
400
+ # The internal kpeg parse method
401
+
402
+ alias peg_parse parse # :nodoc:
403
+
404
+ ##
405
+ # Creates an RDoc::Markup::Paragraph from `parts` and including
406
+ # extension-specific behavior
407
+
408
+ def paragraph parts
409
+ parts = parts.map do |part|
410
+ if "\n" == part then
411
+ RDoc::Markup::HardBreak.new
412
+ else
413
+ part
414
+ end
415
+ end if break_on_newline?
416
+
417
+ RDoc::Markup::Paragraph.new(*parts)
418
+ end
419
+
420
+ ##
421
+ # Parses `markdown` into an RDoc::Document
422
+
423
+ def parse markdown
424
+ @references = {}
425
+ @unlinked_references = {}
426
+
427
+ markdown += "\n\n"
428
+
429
+ setup_parser markdown, @debug
430
+ peg_parse 'References'
431
+
432
+ if notes? then
433
+ @footnotes = {}
434
+
435
+ setup_parser markdown, @debug
436
+ peg_parse 'Notes'
437
+
438
+ # using note_order on the first pass would be a bug
439
+ @note_order = []
440
+ end
441
+
442
+ setup_parser markdown, @debug
443
+ peg_parse
444
+
445
+ doc = result
446
+
447
+ if notes? and not @footnotes.empty? then
448
+ doc << RDoc::Markup::Rule.new(1)
449
+
450
+ @note_order.each_with_index do |ref, index|
451
+ label = index + 1
452
+ note = @footnotes[ref]
453
+
454
+ link = "{^#{label}}[rdoc-label:footmark-#{label}:foottext-#{label}] "
455
+ note.parts.unshift link
456
+
457
+ doc << note
458
+ end
459
+ end
460
+
461
+ doc.accept @formatter
462
+
463
+ doc
464
+ end
465
+
466
+ ##
467
+ # Stores `label` as a reference to `link` and fills in previously unknown
468
+ # link references.
469
+
470
+ def reference label, link
471
+ if ref = @unlinked_references.delete(label) then
472
+ ref.replace link
473
+ end
474
+
475
+ @references[label] = link
476
+ end
477
+
478
+ ##
479
+ # Wraps `text` in strong markup for rdoc inline formatting
480
+
481
+ def strong text
482
+ if text =~ /\A[a-z\d.\/-]+\z/i then
483
+ "*#{text}*"
484
+ else
485
+ "<b>#{text}</b>"
486
+ end
487
+ end
488
+
489
+ ##
490
+ # Wraps `text` in strike markup for rdoc inline formatting
491
+
492
+ def strike text
493
+ if text =~ /\A[a-z\d.\/-]+\z/i then
494
+ "~#{text}~"
495
+ else
496
+ "<s>#{text}</s>"
497
+ end
498
+ end
499
+ }
500
+
501
+ root = Doc
502
+
503
+ Doc = BOM? Block*:a { RDoc::Markup::Document.new(*a.compact) }
504
+
505
+ Block = @BlankLine*
506
+ ( BlockQuote
507
+ | Verbatim
508
+ | CodeFence
509
+ | Table
510
+ | Note
511
+ | Reference
512
+ | HorizontalRule
513
+ | Heading
514
+ | OrderedList
515
+ | BulletList
516
+ | DefinitionList
517
+ | HtmlBlock
518
+ | StyleBlock
519
+ | Para
520
+ | Plain )
521
+
522
+ Para = @NonindentSpace Inlines:a @BlankLine+
523
+ { paragraph a }
524
+
525
+ Plain = Inlines:a
526
+ { paragraph a }
527
+
528
+ AtxInline = !@Newline !(@Sp /#*/ @Sp @Newline) Inline
529
+
530
+ AtxStart = < /\#{1,6}/ >
531
+ { text.length }
532
+
533
+ AtxHeading = AtxStart:s @Sp AtxInline+:a (@Sp /#*/ @Sp)? @Newline
534
+ { RDoc::Markup::Heading.new(s, a.join) }
535
+
536
+ SetextHeading = SetextHeading1 | SetextHeading2
537
+
538
+ SetextBottom1 = /={1,}/ @Newline
539
+
540
+ SetextBottom2 = /-{1,}/ @Newline
541
+
542
+ SetextHeading1 = &(@RawLine SetextBottom1)
543
+ @StartList:a ( !@Endline Inline:b { a << b } )+ @Sp @Newline
544
+ SetextBottom1
545
+ { RDoc::Markup::Heading.new(1, a.join) }
546
+
547
+ SetextHeading2 = &(@RawLine SetextBottom2)
548
+ @StartList:a ( !@Endline Inline:b { a << b })+ @Sp @Newline
549
+ SetextBottom2
550
+ { RDoc::Markup::Heading.new(2, a.join) }
551
+
552
+ Heading = SetextHeading | AtxHeading
553
+
554
+ BlockQuote = BlockQuoteRaw:a
555
+ { RDoc::Markup::BlockQuote.new(*a) }
556
+
557
+ BlockQuoteRaw = @StartList:a
558
+ (( ">" " "? Line:l { a << l } )
559
+ ( !">" !@BlankLine Line:c { a << c } )*
560
+ ( @BlankLine:n { a << n } )*
561
+ )+
562
+ { inner_parse a.join }
563
+
564
+ NonblankIndentedLine = !@BlankLine IndentedLine
565
+
566
+ VerbatimChunk = @BlankLine*:a
567
+ NonblankIndentedLine+:b
568
+ { a.concat b }
569
+
570
+ Verbatim = VerbatimChunk+:a
571
+ { RDoc::Markup::Verbatim.new(*a.flatten) }
572
+
573
+ HorizontalRule = @NonindentSpace
574
+ ( "*" @Sp "*" @Sp "*" (@Sp "*")*
575
+ | "-" @Sp "-" @Sp "-" (@Sp "-")*
576
+ | "_" @Sp "_" @Sp "_" (@Sp "_")*)
577
+ @Sp @Newline @BlankLine+
578
+ { RDoc::Markup::Rule.new 1 }
579
+
580
+ Bullet = !HorizontalRule @NonindentSpace /[+*-]/ @Spacechar+
581
+
582
+ BulletList = &Bullet (ListTight | ListLoose):a
583
+ { RDoc::Markup::List.new(:BULLET, *a) }
584
+
585
+ ListTight = ListItemTight+:a
586
+ @BlankLine* !(Bullet | Enumerator)
587
+ { a }
588
+
589
+ ListLoose = @StartList:a
590
+ ( ListItem:b @BlankLine* { a << b } )+
591
+ { a }
592
+
593
+ ListItem = ( Bullet | Enumerator )
594
+ @StartList:a
595
+ ListBlock:b { a << b }
596
+ ( ListContinuationBlock:c { a.push(*c) } )*
597
+ { list_item_from a }
598
+
599
+ ListItemTight =
600
+ ( Bullet | Enumerator )
601
+ ListBlock:a
602
+ ( !@BlankLine
603
+ ListContinuationBlock:b { a.push(*b) } )*
604
+ !ListContinuationBlock
605
+ { list_item_from a }
606
+
607
+ ListBlock = !@BlankLine Line:a
608
+ ListBlockLine*:c
609
+ { [a, *c] }
610
+
611
+ ListContinuationBlock = @StartList:a
612
+ ( @BlankLine*
613
+ { a << "\n" } )
614
+ ( Indent
615
+ ListBlock:b { a.concat b } )+
616
+ { a }
617
+
618
+ Enumerator = @NonindentSpace [0-9]+ "." @Spacechar+
619
+
620
+ OrderedList = &Enumerator (ListTight | ListLoose):a
621
+ { RDoc::Markup::List.new(:NUMBER, *a) }
622
+
623
+ ListBlockLine = !@BlankLine
624
+ !( Indent? (Bullet | Enumerator) )
625
+ !HorizontalRule
626
+ OptionallyIndentedLine
627
+
628
+ # Parsers for different kinds of block-level HTML content.
629
+ # This is repetitive due to constraints of PEG grammar.
630
+
631
+ HtmlOpenAnchor = "<" Spnl ("a" | "A") Spnl HtmlAttribute* ">"
632
+ HtmlCloseAnchor = "<" Spnl "/" ("a" | "A") Spnl ">"
633
+ HtmlAnchor = HtmlOpenAnchor (HtmlAnchor | !HtmlCloseAnchor .)* HtmlCloseAnchor
634
+
635
+ HtmlBlockOpenAddress = "<" Spnl ("address" | "ADDRESS") Spnl HtmlAttribute* ">"
636
+ HtmlBlockCloseAddress = "<" Spnl "/" ("address" | "ADDRESS") Spnl ">"
637
+ HtmlBlockAddress = HtmlBlockOpenAddress (HtmlBlockAddress | !HtmlBlockCloseAddress .)* HtmlBlockCloseAddress
638
+
639
+ HtmlBlockOpenBlockquote = "<" Spnl ("blockquote" | "BLOCKQUOTE") Spnl HtmlAttribute* ">"
640
+ HtmlBlockCloseBlockquote = "<" Spnl "/" ("blockquote" | "BLOCKQUOTE") Spnl ">"
641
+ HtmlBlockBlockquote = HtmlBlockOpenBlockquote (HtmlBlockBlockquote | !HtmlBlockCloseBlockquote .)* HtmlBlockCloseBlockquote
642
+
643
+ HtmlBlockOpenCenter = "<" Spnl ("center" | "CENTER") Spnl HtmlAttribute* ">"
644
+ HtmlBlockCloseCenter = "<" Spnl "/" ("center" | "CENTER") Spnl ">"
645
+ HtmlBlockCenter = HtmlBlockOpenCenter (HtmlBlockCenter | !HtmlBlockCloseCenter .)* HtmlBlockCloseCenter
646
+
647
+ HtmlBlockOpenDir = "<" Spnl ("dir" | "DIR") Spnl HtmlAttribute* ">"
648
+ HtmlBlockCloseDir = "<" Spnl "/" ("dir" | "DIR") Spnl ">"
649
+ HtmlBlockDir = HtmlBlockOpenDir (HtmlBlockDir | !HtmlBlockCloseDir .)* HtmlBlockCloseDir
650
+
651
+ HtmlBlockOpenDiv = "<" Spnl ("div" | "DIV") Spnl HtmlAttribute* ">"
652
+ HtmlBlockCloseDiv = "<" Spnl "/" ("div" | "DIV") Spnl ">"
653
+ HtmlBlockDiv = HtmlBlockOpenDiv (HtmlBlockDiv | !HtmlBlockCloseDiv .)* HtmlBlockCloseDiv
654
+
655
+ HtmlBlockOpenDl = "<" Spnl ("dl" | "DL") Spnl HtmlAttribute* ">"
656
+ HtmlBlockCloseDl = "<" Spnl "/" ("dl" | "DL") Spnl ">"
657
+ HtmlBlockDl = HtmlBlockOpenDl (HtmlBlockDl | !HtmlBlockCloseDl .)* HtmlBlockCloseDl
658
+
659
+ HtmlBlockOpenFieldset = "<" Spnl ("fieldset" | "FIELDSET") Spnl HtmlAttribute* ">"
660
+ HtmlBlockCloseFieldset = "<" Spnl "/" ("fieldset" | "FIELDSET") Spnl ">"
661
+ HtmlBlockFieldset = HtmlBlockOpenFieldset (HtmlBlockFieldset | !HtmlBlockCloseFieldset .)* HtmlBlockCloseFieldset
662
+
663
+ HtmlBlockOpenForm = "<" Spnl ("form" | "FORM") Spnl HtmlAttribute* ">"
664
+ HtmlBlockCloseForm = "<" Spnl "/" ("form" | "FORM") Spnl ">"
665
+ HtmlBlockForm = HtmlBlockOpenForm (HtmlBlockForm | !HtmlBlockCloseForm .)* HtmlBlockCloseForm
666
+
667
+ HtmlBlockOpenH1 = "<" Spnl ("h1" | "H1") Spnl HtmlAttribute* ">"
668
+ HtmlBlockCloseH1 = "<" Spnl "/" ("h1" | "H1") Spnl ">"
669
+ HtmlBlockH1 = HtmlBlockOpenH1 (HtmlBlockH1 | !HtmlBlockCloseH1 .)* HtmlBlockCloseH1
670
+
671
+ HtmlBlockOpenH2 = "<" Spnl ("h2" | "H2") Spnl HtmlAttribute* ">"
672
+ HtmlBlockCloseH2 = "<" Spnl "/" ("h2" | "H2") Spnl ">"
673
+ HtmlBlockH2 = HtmlBlockOpenH2 (HtmlBlockH2 | !HtmlBlockCloseH2 .)* HtmlBlockCloseH2
674
+
675
+ HtmlBlockOpenH3 = "<" Spnl ("h3" | "H3") Spnl HtmlAttribute* ">"
676
+ HtmlBlockCloseH3 = "<" Spnl "/" ("h3" | "H3") Spnl ">"
677
+ HtmlBlockH3 = HtmlBlockOpenH3 (HtmlBlockH3 | !HtmlBlockCloseH3 .)* HtmlBlockCloseH3
678
+
679
+ HtmlBlockOpenH4 = "<" Spnl ("h4" | "H4") Spnl HtmlAttribute* ">"
680
+ HtmlBlockCloseH4 = "<" Spnl "/" ("h4" | "H4") Spnl ">"
681
+ HtmlBlockH4 = HtmlBlockOpenH4 (HtmlBlockH4 | !HtmlBlockCloseH4 .)* HtmlBlockCloseH4
682
+
683
+ HtmlBlockOpenH5 = "<" Spnl ("h5" | "H5") Spnl HtmlAttribute* ">"
684
+ HtmlBlockCloseH5 = "<" Spnl "/" ("h5" | "H5") Spnl ">"
685
+ HtmlBlockH5 = HtmlBlockOpenH5 (HtmlBlockH5 | !HtmlBlockCloseH5 .)* HtmlBlockCloseH5
686
+
687
+ HtmlBlockOpenH6 = "<" Spnl ("h6" | "H6") Spnl HtmlAttribute* ">"
688
+ HtmlBlockCloseH6 = "<" Spnl "/" ("h6" | "H6") Spnl ">"
689
+ HtmlBlockH6 = HtmlBlockOpenH6 (HtmlBlockH6 | !HtmlBlockCloseH6 .)* HtmlBlockCloseH6
690
+
691
+ HtmlBlockOpenMenu = "<" Spnl ("menu" | "MENU") Spnl HtmlAttribute* ">"
692
+ HtmlBlockCloseMenu = "<" Spnl "/" ("menu" | "MENU") Spnl ">"
693
+ HtmlBlockMenu = HtmlBlockOpenMenu (HtmlBlockMenu | !HtmlBlockCloseMenu .)* HtmlBlockCloseMenu
694
+
695
+ HtmlBlockOpenNoframes = "<" Spnl ("noframes" | "NOFRAMES") Spnl HtmlAttribute* ">"
696
+ HtmlBlockCloseNoframes = "<" Spnl "/" ("noframes" | "NOFRAMES") Spnl ">"
697
+ HtmlBlockNoframes = HtmlBlockOpenNoframes (HtmlBlockNoframes | !HtmlBlockCloseNoframes .)* HtmlBlockCloseNoframes
698
+
699
+ HtmlBlockOpenNoscript = "<" Spnl ("noscript" | "NOSCRIPT") Spnl HtmlAttribute* ">"
700
+ HtmlBlockCloseNoscript = "<" Spnl "/" ("noscript" | "NOSCRIPT") Spnl ">"
701
+ HtmlBlockNoscript = HtmlBlockOpenNoscript (HtmlBlockNoscript | !HtmlBlockCloseNoscript .)* HtmlBlockCloseNoscript
702
+
703
+ HtmlBlockOpenOl = "<" Spnl ("ol" | "OL") Spnl HtmlAttribute* ">"
704
+ HtmlBlockCloseOl = "<" Spnl "/" ("ol" | "OL") Spnl ">"
705
+ HtmlBlockOl = HtmlBlockOpenOl (HtmlBlockOl | !HtmlBlockCloseOl .)* HtmlBlockCloseOl
706
+
707
+ HtmlBlockOpenP = "<" Spnl ("p" | "P") Spnl HtmlAttribute* ">"
708
+ HtmlBlockCloseP = "<" Spnl "/" ("p" | "P") Spnl ">"
709
+ HtmlBlockP = HtmlBlockOpenP (HtmlBlockP | !HtmlBlockCloseP .)* HtmlBlockCloseP
710
+
711
+ HtmlBlockOpenPre = "<" Spnl ("pre" | "PRE") Spnl HtmlAttribute* ">"
712
+ HtmlBlockClosePre = "<" Spnl "/" ("pre" | "PRE") Spnl ">"
713
+ HtmlBlockPre = HtmlBlockOpenPre (HtmlBlockPre | !HtmlBlockClosePre .)* HtmlBlockClosePre
714
+
715
+ HtmlBlockOpenTable = "<" Spnl ("table" | "TABLE") Spnl HtmlAttribute* ">"
716
+ HtmlBlockCloseTable = "<" Spnl "/" ("table" | "TABLE") Spnl ">"
717
+ HtmlBlockTable = HtmlBlockOpenTable (HtmlBlockTable | !HtmlBlockCloseTable .)* HtmlBlockCloseTable
718
+
719
+ HtmlBlockOpenUl = "<" Spnl ("ul" | "UL") Spnl HtmlAttribute* ">"
720
+ HtmlBlockCloseUl = "<" Spnl "/" ("ul" | "UL") Spnl ">"
721
+ HtmlBlockUl = HtmlBlockOpenUl (HtmlBlockUl | !HtmlBlockCloseUl .)* HtmlBlockCloseUl
722
+
723
+ HtmlBlockOpenDd = "<" Spnl ("dd" | "DD") Spnl HtmlAttribute* ">"
724
+ HtmlBlockCloseDd = "<" Spnl "/" ("dd" | "DD") Spnl ">"
725
+ HtmlBlockDd = HtmlBlockOpenDd (HtmlBlockDd | !HtmlBlockCloseDd .)* HtmlBlockCloseDd
726
+
727
+ HtmlBlockOpenDt = "<" Spnl ("dt" | "DT") Spnl HtmlAttribute* ">"
728
+ HtmlBlockCloseDt = "<" Spnl "/" ("dt" | "DT") Spnl ">"
729
+ HtmlBlockDt = HtmlBlockOpenDt (HtmlBlockDt | !HtmlBlockCloseDt .)* HtmlBlockCloseDt
730
+
731
+ HtmlBlockOpenFrameset = "<" Spnl ("frameset" | "FRAMESET") Spnl HtmlAttribute* ">"
732
+ HtmlBlockCloseFrameset = "<" Spnl "/" ("frameset" | "FRAMESET") Spnl ">"
733
+ HtmlBlockFrameset = HtmlBlockOpenFrameset (HtmlBlockFrameset | !HtmlBlockCloseFrameset .)* HtmlBlockCloseFrameset
734
+
735
+ HtmlBlockOpenLi = "<" Spnl ("li" | "LI") Spnl HtmlAttribute* ">"
736
+ HtmlBlockCloseLi = "<" Spnl "/" ("li" | "LI") Spnl ">"
737
+ HtmlBlockLi = HtmlBlockOpenLi (HtmlBlockLi | !HtmlBlockCloseLi .)* HtmlBlockCloseLi
738
+
739
+ HtmlBlockOpenTbody = "<" Spnl ("tbody" | "TBODY") Spnl HtmlAttribute* ">"
740
+ HtmlBlockCloseTbody = "<" Spnl "/" ("tbody" | "TBODY") Spnl ">"
741
+ HtmlBlockTbody = HtmlBlockOpenTbody (HtmlBlockTbody | !HtmlBlockCloseTbody .)* HtmlBlockCloseTbody
742
+
743
+ HtmlBlockOpenTd = "<" Spnl ("td" | "TD") Spnl HtmlAttribute* ">"
744
+ HtmlBlockCloseTd = "<" Spnl "/" ("td" | "TD") Spnl ">"
745
+ HtmlBlockTd = HtmlBlockOpenTd (HtmlBlockTd | !HtmlBlockCloseTd .)* HtmlBlockCloseTd
746
+
747
+ HtmlBlockOpenTfoot = "<" Spnl ("tfoot" | "TFOOT") Spnl HtmlAttribute* ">"
748
+ HtmlBlockCloseTfoot = "<" Spnl "/" ("tfoot" | "TFOOT") Spnl ">"
749
+ HtmlBlockTfoot = HtmlBlockOpenTfoot (HtmlBlockTfoot | !HtmlBlockCloseTfoot .)* HtmlBlockCloseTfoot
750
+
751
+ HtmlBlockOpenTh = "<" Spnl ("th" | "TH") Spnl HtmlAttribute* ">"
752
+ HtmlBlockCloseTh = "<" Spnl "/" ("th" | "TH") Spnl ">"
753
+ HtmlBlockTh = HtmlBlockOpenTh (HtmlBlockTh | !HtmlBlockCloseTh .)* HtmlBlockCloseTh
754
+
755
+ HtmlBlockOpenThead = "<" Spnl ("thead" | "THEAD") Spnl HtmlAttribute* ">"
756
+ HtmlBlockCloseThead = "<" Spnl "/" ("thead" | "THEAD") Spnl ">"
757
+ HtmlBlockThead = HtmlBlockOpenThead (HtmlBlockThead | !HtmlBlockCloseThead .)* HtmlBlockCloseThead
758
+
759
+ HtmlBlockOpenTr = "<" Spnl ("tr" | "TR") Spnl HtmlAttribute* ">"
760
+ HtmlBlockCloseTr = "<" Spnl "/" ("tr" | "TR") Spnl ">"
761
+ HtmlBlockTr = HtmlBlockOpenTr (HtmlBlockTr | !HtmlBlockCloseTr .)* HtmlBlockCloseTr
762
+
763
+ HtmlBlockOpenScript = "<" Spnl ("script" | "SCRIPT") Spnl HtmlAttribute* ">"
764
+ HtmlBlockCloseScript = "<" Spnl "/" ("script" | "SCRIPT") Spnl ">"
765
+ HtmlBlockScript = HtmlBlockOpenScript (!HtmlBlockCloseScript .)* HtmlBlockCloseScript
766
+
767
+ HtmlBlockOpenHead = "<" Spnl ("head" | "HEAD") Spnl HtmlAttribute* ">"
768
+ HtmlBlockCloseHead = "<" Spnl "/" ("head" | "HEAD") Spnl ">"
769
+ HtmlBlockHead = HtmlBlockOpenHead (!HtmlBlockCloseHead .)* HtmlBlockCloseHead
770
+
771
+ HtmlBlockInTags = HtmlAnchor
772
+ | HtmlBlockAddress
773
+ | HtmlBlockBlockquote
774
+ | HtmlBlockCenter
775
+ | HtmlBlockDir
776
+ | HtmlBlockDiv
777
+ | HtmlBlockDl
778
+ | HtmlBlockFieldset
779
+ | HtmlBlockForm
780
+ | HtmlBlockH1
781
+ | HtmlBlockH2
782
+ | HtmlBlockH3
783
+ | HtmlBlockH4
784
+ | HtmlBlockH5
785
+ | HtmlBlockH6
786
+ | HtmlBlockMenu
787
+ | HtmlBlockNoframes
788
+ | HtmlBlockNoscript
789
+ | HtmlBlockOl
790
+ | HtmlBlockP
791
+ | HtmlBlockPre
792
+ | HtmlBlockTable
793
+ | HtmlBlockUl
794
+ | HtmlBlockDd
795
+ | HtmlBlockDt
796
+ | HtmlBlockFrameset
797
+ | HtmlBlockLi
798
+ | HtmlBlockTbody
799
+ | HtmlBlockTd
800
+ | HtmlBlockTfoot
801
+ | HtmlBlockTh
802
+ | HtmlBlockThead
803
+ | HtmlBlockTr
804
+ | HtmlBlockScript
805
+ | HtmlBlockHead
806
+
807
+ HtmlBlock = < ( HtmlBlockInTags | HtmlComment | HtmlBlockSelfClosing | HtmlUnclosed) >
808
+ @BlankLine+
809
+ { if html? then
810
+ RDoc::Markup::Raw.new text
811
+ end }
812
+
813
+ HtmlUnclosed = "<" Spnl HtmlUnclosedType Spnl HtmlAttribute* Spnl ">"
814
+
815
+ HtmlUnclosedType = "HR" | "hr"
816
+
817
+ HtmlBlockSelfClosing = "<" Spnl HtmlBlockType Spnl HtmlAttribute* "/" Spnl ">"
818
+
819
+ HtmlBlockType = "ADDRESS" |
820
+ "BLOCKQUOTE" |
821
+ "CENTER" |
822
+ "DD" |
823
+ "DIR" |
824
+ "DIV" |
825
+ "DL" |
826
+ "DT" |
827
+ "FIELDSET" |
828
+ "FORM" |
829
+ "FRAMESET" |
830
+ "H1" |
831
+ "H2" |
832
+ "H3" |
833
+ "H4" |
834
+ "H5" |
835
+ "H6" |
836
+ "HR" |
837
+ "ISINDEX" |
838
+ "LI" |
839
+ "MENU" |
840
+ "NOFRAMES" |
841
+ "NOSCRIPT" |
842
+ "OL" |
843
+ "P" |
844
+ "PRE" |
845
+ "SCRIPT" |
846
+ "TABLE" |
847
+ "TBODY" |
848
+ "TD" |
849
+ "TFOOT" |
850
+ "TH" |
851
+ "THEAD" |
852
+ "TR" |
853
+ "UL" |
854
+ "address" |
855
+ "blockquote" |
856
+ "center" |
857
+ "dd" |
858
+ "dir" |
859
+ "div" |
860
+ "dl" |
861
+ "dt" |
862
+ "fieldset" |
863
+ "form" |
864
+ "frameset" |
865
+ "h1" |
866
+ "h2" |
867
+ "h3" |
868
+ "h4" |
869
+ "h5" |
870
+ "h6" |
871
+ "hr" |
872
+ "isindex" |
873
+ "li" |
874
+ "menu" |
875
+ "noframes" |
876
+ "noscript" |
877
+ "ol" |
878
+ "p" |
879
+ "pre" |
880
+ "script" |
881
+ "table" |
882
+ "tbody" |
883
+ "td" |
884
+ "tfoot" |
885
+ "th" |
886
+ "thead" |
887
+ "tr" |
888
+ "ul"
889
+
890
+ StyleOpen = "<" Spnl ("style" | "STYLE") Spnl HtmlAttribute* ">"
891
+ StyleClose = "<" Spnl "/" ("style" | "STYLE") Spnl ">"
892
+ InStyleTags = StyleOpen (!StyleClose .)* StyleClose
893
+ StyleBlock = < InStyleTags >
894
+ @BlankLine*
895
+ { if css? then
896
+ RDoc::Markup::Raw.new text
897
+ end }
898
+
899
+ Inlines = ( !@Endline Inline:i { i }
900
+ | @Endline:c !( &{ github? } Ticks3 /[^`\n]*$/ )
901
+ &Inline { c } )+:chunks @Endline?
902
+ { chunks }
903
+
904
+ Inline = Str
905
+ | @Endline
906
+ | UlOrStarLine
907
+ | @Space
908
+ | Strong
909
+ | Emph
910
+ | Strike
911
+ | Image
912
+ | Link
913
+ | NoteReference
914
+ | InlineNote
915
+ | Code
916
+ | RawHtml
917
+ | Entity
918
+ | EscapedChar
919
+ | Symbol
920
+
921
+ Space = @Spacechar+ { " " }
922
+
923
+ Str = @StartList:a
924
+ < @NormalChar+ > { a = text }
925
+ ( StrChunk:c { a << c } )* { a }
926
+
927
+ StrChunk = < (@NormalChar | /_+/ &Alphanumeric)+ > { text }
928
+
929
+ EscapedChar = "\\" !@Newline < /[:\\`|*_{}\[\]()#+.!><-]/ > { text }
930
+
931
+ Entity = ( HexEntity | DecEntity | CharEntity ):a { a }
932
+
933
+ Endline = @LineBreak | @TerminalEndline | @NormalEndline
934
+
935
+ NormalEndline = @Sp @Newline !@BlankLine !">" !AtxStart
936
+ !(Line /={1,}|-{1,}/ @Newline)
937
+ { "\n" }
938
+
939
+ TerminalEndline = @Sp @Newline @Eof
940
+
941
+ LineBreak = " " @NormalEndline { RDoc::Markup::HardBreak.new }
942
+
943
+ Symbol = < @SpecialChar >
944
+ { text }
945
+
946
+ # This keeps the parser from getting bogged down on long strings of '*' or '_',
947
+ # or strings of '*' or '_' with space on each side:
948
+ UlOrStarLine = (UlLine | StarLine):a { a }
949
+ StarLine = < /\*{4,}/ > { text } |
950
+ < @Spacechar /\*+/ &@Spacechar > { text }
951
+ UlLine = < /_{4,}/ > { text } |
952
+ < @Spacechar /_+/ &@Spacechar > { text }
953
+
954
+ Emph = EmphStar | EmphUl
955
+
956
+ Whitespace = @Spacechar | @Newline
957
+
958
+ EmphStar = "*" !@Whitespace
959
+ @StartList:a
960
+ ( !"*" Inline:b { a << b }
961
+ | StrongStar:b { a << b }
962
+ )+
963
+ "*"
964
+ { emphasis a.join }
965
+
966
+ EmphUl = "_" !@Whitespace
967
+ @StartList:a
968
+ ( !"_" Inline:b { a << b }
969
+ | StrongUl:b { a << b }
970
+ )+
971
+ "_"
972
+ { emphasis a.join }
973
+
974
+ Strong = StrongStar | StrongUl
975
+
976
+ StrongStar = "**" !@Whitespace
977
+ @StartList:a
978
+ ( !"**" Inline:b { a << b } )+
979
+ "**"
980
+ { strong a.join }
981
+
982
+ StrongUl = "__" !@Whitespace
983
+ @StartList:a
984
+ ( !"__" Inline:b { a << b } )+
985
+ "__"
986
+ { strong a.join }
987
+
988
+ Strike = &{ strike? }
989
+ "~~" !@Whitespace
990
+ @StartList:a
991
+ ( !"~~" Inline:b { a << b } )+
992
+ "~~"
993
+ { strike a.join }
994
+
995
+ # TODO alt text support
996
+ Image = "!" ( ExplicitLink | ReferenceLink ):a
997
+ { "rdoc-image:#{a[/\[(.*)\]/, 1]}" }
998
+
999
+ Link = ExplicitLink | ReferenceLink | AutoLink
1000
+
1001
+ ReferenceLink = ReferenceLinkDouble | ReferenceLinkSingle
1002
+
1003
+ ReferenceLinkDouble = Label:content < Spnl > !"[]" Label:label
1004
+ { link_to content, label, text }
1005
+
1006
+ ReferenceLinkSingle = Label:content < (Spnl "[]")? >
1007
+ { link_to content, content, text }
1008
+
1009
+ ExplicitLink = Label:l "(" @Sp Source:s Spnl Title @Sp ")"
1010
+ { "{#{l}}[#{s}]" }
1011
+
1012
+ Source = ( "<" < SourceContents > ">" | < SourceContents > )
1013
+ { text }
1014
+
1015
+ SourceContents = ( ( !"(" !")" !">" Nonspacechar )+ | "(" SourceContents ")")*
1016
+
1017
+ Title = ( TitleSingle | TitleDouble | "" ):a
1018
+ { a }
1019
+
1020
+ TitleSingle = "'" ( !( "'" @Sp ( ")" | @Newline ) ) . )* "'"
1021
+
1022
+ TitleDouble = "\"" ( !( "\"" @Sp ( ")" | @Newline ) ) . )* "\""
1023
+
1024
+ AutoLink = AutoLinkUrl | AutoLinkEmail
1025
+
1026
+ AutoLinkUrl = "<" < /[A-Za-z]+/ "://" ( !@Newline !">" . )+ > ">"
1027
+ { text }
1028
+
1029
+ AutoLinkEmail = "<" ("mailto:")? < /[\w+.\/!%~$-]+/i "@" ( !@Newline !">" . )+ > ">"
1030
+ { "mailto:#{text}" }
1031
+
1032
+ Reference = @NonindentSpace !"[]"
1033
+ Label:label ":" Spnl RefSrc:link RefTitle @BlankLine+
1034
+ { # TODO use title
1035
+ reference label, link
1036
+ nil
1037
+ }
1038
+
1039
+ Label = "[" ( !"^" &{ notes? } | &. &{ !notes? } )
1040
+ @StartList:a
1041
+ ( !"]" Inline:l { a << l } )*
1042
+ "]"
1043
+ { a.join.gsub(/\s+/, ' ') }
1044
+
1045
+ RefSrc = < Nonspacechar+ > { text }
1046
+
1047
+ RefTitle = ( RefTitleSingle | RefTitleDouble | RefTitleParens | EmptyTitle )
1048
+
1049
+ EmptyTitle = ""
1050
+
1051
+ RefTitleSingle = Spnl "'" < ( !( "'" @Sp @Newline | @Newline ) . )* > "'" { text }
1052
+
1053
+ RefTitleDouble = Spnl "\"" < ( !("\"" @Sp @Newline | @Newline) . )* > "\"" { text }
1054
+
1055
+ RefTitleParens = Spnl "(" < ( !(")" @Sp @Newline | @Newline) . )* > ")" { text }
1056
+
1057
+ References = ( Reference | SkipBlock )*
1058
+
1059
+ Ticks1 = "`" !"`"
1060
+ Ticks2 = "``" !"`"
1061
+ Ticks3 = "```" !"`"
1062
+ Ticks4 = "````" !"`"
1063
+ Ticks5 = "`````" !"`"
1064
+
1065
+ Code = ( Ticks1 @Sp < (
1066
+ ( !"`" Nonspacechar )+ | !Ticks1 /`+/ |
1067
+ !( @Sp Ticks1 ) ( @Spacechar | @Newline !@BlankLine )
1068
+ )+ > @Sp Ticks1 |
1069
+ Ticks2 @Sp < (
1070
+ ( !"`" Nonspacechar )+ |
1071
+ !Ticks2 /`+/ |
1072
+ !( @Sp Ticks2 ) ( @Spacechar | @Newline !@BlankLine )
1073
+ )+ > @Sp Ticks2 |
1074
+ Ticks3 @Sp < (
1075
+ ( !"`" Nonspacechar )+ |
1076
+ !Ticks3 /`+/ |
1077
+ !( @Sp Ticks3 ) ( @Spacechar | @Newline !@BlankLine )
1078
+ )+ > @Sp Ticks3 |
1079
+ Ticks4 @Sp < (
1080
+ ( !"`" Nonspacechar )+ |
1081
+ !Ticks4 /`+/ |
1082
+ !( @Sp Ticks4 ) ( @Spacechar | @Newline !@BlankLine )
1083
+ )+ > @Sp Ticks4 |
1084
+ Ticks5 @Sp < (
1085
+ ( !"`" Nonspacechar )+ |
1086
+ !Ticks5 /`+/ |
1087
+ !( @Sp Ticks5 ) ( @Spacechar | @Newline !@BlankLine )
1088
+ )+ > @Sp Ticks5
1089
+ )
1090
+ { "<code>#{text}</code>" }
1091
+
1092
+ RawHtml = < (HtmlComment | HtmlBlockScript | HtmlTag) >
1093
+ { if html? then text else '' end }
1094
+
1095
+ BlankLine = @Sp @Newline { "\n" }
1096
+
1097
+ Quoted = "\"" (!"\"" .)* "\"" | "'" (!"'" .)* "'"
1098
+ HtmlAttribute = (AlphanumericAscii | "-")+ Spnl ("=" Spnl (Quoted | (!">" Nonspacechar)+))? Spnl
1099
+ HtmlComment = "<!--" (!"-->" .)* "-->"
1100
+ HtmlTag = "<" Spnl "/"? AlphanumericAscii+ Spnl HtmlAttribute* "/"? Spnl ">"
1101
+ Eof = !.
1102
+ Nonspacechar = !@Spacechar !@Newline .
1103
+ Sp = @Spacechar*
1104
+ Spnl = @Sp (@Newline @Sp)?
1105
+ SpecialChar = /[~*_`&\[\]()<!#\\'"]/ | @ExtendedSpecialChar
1106
+ NormalChar = !( @SpecialChar | @Spacechar | @Newline ) .
1107
+ Digit = [0-9]
1108
+
1109
+ %literals = RDoc::Markdown::Literals
1110
+ Alphanumeric = %literals.Alphanumeric
1111
+ AlphanumericAscii = %literals.AlphanumericAscii
1112
+ BOM = %literals.BOM
1113
+ Newline = %literals.Newline
1114
+ Spacechar = %literals.Spacechar
1115
+
1116
+ HexEntity = /&#x/i < /[0-9a-fA-F]+/ > ";"
1117
+ { [text.to_i(16)].pack 'U' }
1118
+ DecEntity = "&#" < /[0-9]+/ > ";"
1119
+ { [text.to_i].pack 'U' }
1120
+ CharEntity = "&" </[A-Za-z0-9]+/ > ";"
1121
+ { if entity = HTML_ENTITIES[text] then
1122
+ entity.pack 'U*'
1123
+ else
1124
+ "&#{text};"
1125
+ end
1126
+ }
1127
+
1128
+ NonindentSpace = / {0,3}/
1129
+ Indent = /\t| /
1130
+ IndentedLine = Indent Line
1131
+ OptionallyIndentedLine = Indent? Line
1132
+
1133
+ # StartList starts a list data structure that can be added to with cons:
1134
+ StartList = &.
1135
+ { [] }
1136
+
1137
+ Line = @RawLine:a { a }
1138
+ RawLine = ( < (!"\r" !"\n" .)* @Newline >
1139
+ | < .+ > @Eof ) { text }
1140
+
1141
+ SkipBlock = HtmlBlock
1142
+ | ( !"#" !SetextBottom1 !SetextBottom2 !@BlankLine @RawLine )+
1143
+ @BlankLine*
1144
+ | @BlankLine+
1145
+ | @RawLine
1146
+
1147
+ # Syntax extensions
1148
+
1149
+ ExtendedSpecialChar = &{ notes? } ( "^" )
1150
+
1151
+ NoteReference = &{ notes? }
1152
+ RawNoteReference:ref
1153
+ { note_for ref }
1154
+
1155
+ RawNoteReference = "[^" < ( !@Newline !"]" . )+ > "]" { text }
1156
+
1157
+ # TODO multiple paragraphs for a footnote
1158
+ Note = &{ notes? }
1159
+ @NonindentSpace RawNoteReference:ref ":" @Sp
1160
+ @StartList:a
1161
+ RawNoteBlock:i { a.concat i }
1162
+ ( &Indent RawNoteBlock:i { a.concat i } )*
1163
+ { @footnotes[ref] = paragraph a
1164
+
1165
+ nil
1166
+ }
1167
+
1168
+ InlineNote = &{ notes? }
1169
+ "^["
1170
+ @StartList:a
1171
+ ( !"]" Inline:l { a << l } )+
1172
+ "]"
1173
+ { ref = [:inline, @note_order.length]
1174
+ @footnotes[ref] = paragraph a
1175
+
1176
+ note_for ref
1177
+ }
1178
+
1179
+ Notes = ( Note | SkipBlock )*
1180
+
1181
+ RawNoteBlock = @StartList:a
1182
+ ( !@BlankLine OptionallyIndentedLine:l { a << l } )+
1183
+ ( < @BlankLine* > { a << text } )
1184
+ { a }
1185
+
1186
+ # Markdown extensions added by RDoc follow
1187
+
1188
+ CodeFence = &{ github? }
1189
+ Ticks3 (@Sp StrChunk:format)? Spnl < (
1190
+ ( !"`" Nonspacechar )+ |
1191
+ !Ticks3 /`+/ |
1192
+ Spacechar |
1193
+ @Newline
1194
+ )+ > Ticks3 @Sp @Newline*
1195
+ { verbatim = RDoc::Markup::Verbatim.new text
1196
+ verbatim.format = format.intern if format.instance_of?(String)
1197
+ verbatim
1198
+ }
1199
+
1200
+ Table = &{ github? }
1201
+ TableRow:header TableLine:line TableRow+:body
1202
+ { table = RDoc::Markup::Table.new(header, line, body) }
1203
+
1204
+ TableRow = TableItem+:row "|" @Newline
1205
+ { row }
1206
+ TableItem = "|" < (!"|" !@Newline .)+ >
1207
+ { text.strip }
1208
+
1209
+ TableLine = TableColumn+:line "|" @Newline
1210
+ { line }
1211
+ TableColumn = "|" < ( "-"+ ":"? | ":" "-"* ) >
1212
+ { text.start_with?(":") ? :left :
1213
+ text.end_with?(":") ? :right : nil
1214
+ }
1215
+
1216
+ DefinitionList = &{ definition_lists? }
1217
+ ( DefinitionListItem+:list )
1218
+ { RDoc::Markup::List.new :NOTE, *list.flatten }
1219
+
1220
+ DefinitionListItem = ( DefinitionListLabel+ ):label
1221
+ ( DefinitionListDefinition+ ):defns
1222
+ { list_items = []
1223
+ list_items <<
1224
+ RDoc::Markup::ListItem.new(label, defns.shift)
1225
+
1226
+ list_items.concat defns.map { |defn|
1227
+ RDoc::Markup::ListItem.new nil, defn
1228
+ } unless list_items.empty?
1229
+
1230
+ list_items
1231
+ }
1232
+
1233
+ DefinitionListLabel = StrChunk:label @Sp @Newline
1234
+ { label }
1235
+
1236
+ DefinitionListDefinition = @NonindentSpace ":" @Space Inlines:a @BlankLine+
1237
+ { paragraph a }