climine 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (830) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/lib/climine/command/issue.rb +10 -1
  4. data/lib/climine/redmine.rb +9 -1
  5. data/lib/climine/template/issue.erb +9 -1
  6. data/lib/climine/version.rb +1 -1
  7. data/vendor/bundle/ruby/2.1.0/bin/climine +23 -0
  8. data/vendor/bundle/ruby/2.1.0/bin/redcarpet +23 -0
  9. data/vendor/bundle/ruby/2.1.0/bin/thor +23 -0
  10. data/vendor/bundle/ruby/2.1.0/bin/yard +23 -0
  11. data/vendor/bundle/ruby/2.1.0/bin/yardoc +23 -0
  12. data/vendor/bundle/ruby/2.1.0/bin/yri +23 -0
  13. data/vendor/bundle/ruby/2.1.0/build_info/hashie-2.0.5.info +1 -0
  14. data/vendor/bundle/ruby/2.1.0/build_info/hirb-0.7.1.info +1 -0
  15. data/vendor/bundle/ruby/2.1.0/build_info/hirb-unicode-0.0.5.info +1 -0
  16. data/vendor/bundle/ruby/2.1.0/build_info/redcarpet-3.0.0.info +1 -0
  17. data/vendor/bundle/ruby/2.1.0/build_info/thor-0.18.1.info +1 -0
  18. data/vendor/bundle/ruby/2.1.0/build_info/unicode-display_width-0.1.1.info +1 -0
  19. data/vendor/bundle/ruby/2.1.0/build_info/yard-0.8.7.3.info +1 -0
  20. data/vendor/bundle/ruby/2.1.0/cache/hashie-2.0.5.gem +0 -0
  21. data/vendor/bundle/ruby/2.1.0/cache/hirb-0.7.1.gem +0 -0
  22. data/vendor/bundle/ruby/2.1.0/cache/hirb-unicode-0.0.5.gem +0 -0
  23. data/vendor/bundle/ruby/2.1.0/cache/redcarpet-3.0.0.gem +0 -0
  24. data/vendor/bundle/ruby/2.1.0/cache/thor-0.18.1.gem +0 -0
  25. data/vendor/bundle/ruby/2.1.0/cache/unicode-display_width-0.1.1.gem +0 -0
  26. data/vendor/bundle/ruby/2.1.0/cache/yard-0.8.7.3.gem +0 -0
  27. data/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-13/2.1.0/redcarpet-3.0.0/gem.build_complete +0 -0
  28. data/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-13/2.1.0/redcarpet-3.0.0/gem_make.out +58 -0
  29. data/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-13/2.1.0/redcarpet-3.0.0/redcarpet.bundle +0 -0
  30. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/CHANGELOG.md +39 -0
  31. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/CONTRIBUTING.md +27 -0
  32. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/Gemfile +2 -0
  33. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/Guardfile +5 -0
  34. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/LICENSE +20 -0
  35. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/README.markdown +236 -0
  36. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/Rakefile +13 -0
  37. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/hashie.gemspec +23 -0
  38. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/lib/hashie.rb +23 -0
  39. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/lib/hashie/clash.rb +86 -0
  40. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/lib/hashie/dash.rb +170 -0
  41. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/lib/hashie/extensions/coercion.rb +115 -0
  42. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/lib/hashie/extensions/deep_merge.rb +21 -0
  43. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/lib/hashie/extensions/indifferent_access.rb +120 -0
  44. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/lib/hashie/extensions/key_conversion.rb +92 -0
  45. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/lib/hashie/extensions/merge_initializer.rb +26 -0
  46. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/lib/hashie/extensions/method_access.rb +124 -0
  47. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/lib/hashie/extensions/structure.rb +47 -0
  48. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/lib/hashie/hash.rb +33 -0
  49. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/lib/hashie/hash_extensions.rb +49 -0
  50. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/lib/hashie/mash.rb +233 -0
  51. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/lib/hashie/trash.rb +91 -0
  52. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/lib/hashie/version.rb +3 -0
  53. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/spec/hashie/clash_spec.rb +50 -0
  54. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/spec/hashie/dash_spec.rb +267 -0
  55. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/spec/hashie/extensions/coercion_spec.rb +151 -0
  56. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/spec/hashie/extensions/deep_merge_spec.rb +20 -0
  57. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/spec/hashie/extensions/indifferent_access_spec.rb +99 -0
  58. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/spec/hashie/extensions/key_conversion_spec.rb +102 -0
  59. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/spec/hashie/extensions/merge_initializer_spec.rb +20 -0
  60. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/spec/hashie/extensions/method_access_spec.rb +112 -0
  61. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/spec/hashie/hash_spec.rb +22 -0
  62. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/spec/hashie/mash_spec.rb +412 -0
  63. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/spec/hashie/trash_spec.rb +155 -0
  64. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/spec/spec.opts +3 -0
  65. data/vendor/bundle/ruby/2.1.0/gems/hashie-2.0.5/spec/spec_helper.rb +12 -0
  66. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/CHANGELOG.rdoc +158 -0
  67. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/LICENSE.txt +22 -0
  68. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/README.rdoc +201 -0
  69. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/Rakefile +35 -0
  70. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/bond/completions/hirb.rb +15 -0
  71. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb.rb +82 -0
  72. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/console.rb +43 -0
  73. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/dynamic_view.rb +113 -0
  74. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/formatter.rb +126 -0
  75. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/helpers.rb +18 -0
  76. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/helpers/auto_table.rb +24 -0
  77. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/helpers/markdown_table.rb +14 -0
  78. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/helpers/object_table.rb +14 -0
  79. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/helpers/parent_child_tree.rb +24 -0
  80. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/helpers/tab_table.rb +24 -0
  81. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/helpers/table.rb +374 -0
  82. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/helpers/table/filters.rb +10 -0
  83. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/helpers/table/resizer.rb +82 -0
  84. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/helpers/tree.rb +181 -0
  85. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/helpers/unicode_table.rb +15 -0
  86. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/helpers/vertical_table.rb +37 -0
  87. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/import_object.rb +10 -0
  88. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/menu.rb +226 -0
  89. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/pager.rb +105 -0
  90. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/string.rb +44 -0
  91. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/util.rb +96 -0
  92. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/version.rb +3 -0
  93. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/view.rb +270 -0
  94. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/views.rb +8 -0
  95. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/views/couch_db.rb +11 -0
  96. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/views/misc_db.rb +15 -0
  97. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/views/mongo_db.rb +17 -0
  98. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/views/orm.rb +11 -0
  99. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/hirb/views/rails.rb +19 -0
  100. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/lib/ripl/hirb.rb +15 -0
  101. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/test/auto_table_test.rb +33 -0
  102. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/test/console_test.rb +27 -0
  103. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/test/deps.rip +4 -0
  104. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/test/dynamic_view_test.rb +94 -0
  105. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/test/formatter_test.rb +176 -0
  106. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/test/hirb_test.rb +39 -0
  107. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/test/import_test.rb +9 -0
  108. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/test/menu_test.rb +272 -0
  109. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/test/object_table_test.rb +79 -0
  110. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/test/pager_test.rb +162 -0
  111. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/test/resizer_test.rb +62 -0
  112. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/test/table_test.rb +667 -0
  113. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/test/test_helper.rb +60 -0
  114. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/test/tree_test.rb +184 -0
  115. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/test/util_test.rb +59 -0
  116. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/test/view_test.rb +178 -0
  117. data/vendor/bundle/ruby/2.1.0/gems/hirb-0.7.1/test/views_test.rb +22 -0
  118. data/vendor/bundle/ruby/2.1.0/gems/hirb-unicode-0.0.5/Gemfile +4 -0
  119. data/vendor/bundle/ruby/2.1.0/gems/hirb-unicode-0.0.5/MIT-LICENSE +19 -0
  120. data/vendor/bundle/ruby/2.1.0/gems/hirb-unicode-0.0.5/README.md +42 -0
  121. data/vendor/bundle/ruby/2.1.0/gems/hirb-unicode-0.0.5/Rakefile +25 -0
  122. data/vendor/bundle/ruby/2.1.0/gems/hirb-unicode-0.0.5/hirb-unicode.gemspec +29 -0
  123. data/vendor/bundle/ruby/2.1.0/gems/hirb-unicode-0.0.5/lib/hirb-unicode.rb +1 -0
  124. data/vendor/bundle/ruby/2.1.0/gems/hirb-unicode-0.0.5/lib/hirb/unicode.rb +4 -0
  125. data/vendor/bundle/ruby/2.1.0/gems/hirb-unicode-0.0.5/lib/hirb/unicode/string_util.rb +39 -0
  126. data/vendor/bundle/ruby/2.1.0/gems/hirb-unicode-0.0.5/lib/hirb/unicode/version.rb +5 -0
  127. data/vendor/bundle/ruby/2.1.0/gems/hirb-unicode-0.0.5/test/string_test.rb +51 -0
  128. data/vendor/bundle/ruby/2.1.0/gems/hirb-unicode-0.0.5/test/test_helper.rb +63 -0
  129. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/COPYING +14 -0
  130. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/Gemfile +2 -0
  131. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/README.markdown +364 -0
  132. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/Rakefile +57 -0
  133. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/bin/redcarpet +38 -0
  134. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/Makefile +239 -0
  135. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/autolink.c +296 -0
  136. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/autolink.h +49 -0
  137. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/autolink.o +0 -0
  138. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/buffer.c +225 -0
  139. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/buffer.h +89 -0
  140. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/buffer.o +0 -0
  141. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/extconf.rb +6 -0
  142. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/houdini.h +37 -0
  143. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/houdini_href_e.c +108 -0
  144. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/houdini_href_e.o +0 -0
  145. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/houdini_html_e.c +88 -0
  146. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/houdini_html_e.o +0 -0
  147. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/html.c +679 -0
  148. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/html.h +78 -0
  149. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/html.o +0 -0
  150. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/html_blocks.h +206 -0
  151. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/html_smartypants.c +439 -0
  152. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/html_smartypants.o +0 -0
  153. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/markdown.c +2570 -0
  154. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/markdown.h +141 -0
  155. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/markdown.o +0 -0
  156. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/rc_markdown.c +159 -0
  157. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/rc_markdown.o +0 -0
  158. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/rc_render.c +485 -0
  159. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/rc_render.o +0 -0
  160. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/redcarpet.bundle +0 -0
  161. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/redcarpet.h +30 -0
  162. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/stack.c +81 -0
  163. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/stack.h +29 -0
  164. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/ext/redcarpet/stack.o +0 -0
  165. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/lib/redcarpet.bundle +0 -0
  166. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/lib/redcarpet.rb +125 -0
  167. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/lib/redcarpet/compat.rb +3 -0
  168. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/lib/redcarpet/render_man.rb +65 -0
  169. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/lib/redcarpet/render_strip.rb +41 -0
  170. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/redcarpet.gemspec +65 -0
  171. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/test/custom_render_test.rb +28 -0
  172. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/test/html_render_test.rb +139 -0
  173. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/test/markdown_test.rb +253 -0
  174. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/test/pathological_inputs_test.rb +34 -0
  175. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/test/redcarpet_compat_test.rb +38 -0
  176. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/test/smarty_html_test.rb +30 -0
  177. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/test/smarty_pants_test.rb +43 -0
  178. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/test/stripdown_render_test.rb +31 -0
  179. data/vendor/bundle/ruby/2.1.0/gems/redcarpet-3.0.0/test/test_helper.rb +16 -0
  180. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/CHANGELOG.md +139 -0
  181. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/LICENSE.md +20 -0
  182. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/README.md +35 -0
  183. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/Thorfile +30 -0
  184. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/bin/thor +6 -0
  185. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor.rb +473 -0
  186. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/actions.rb +318 -0
  187. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/actions/create_file.rb +105 -0
  188. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/actions/create_link.rb +60 -0
  189. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/actions/directory.rb +119 -0
  190. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/actions/empty_directory.rb +137 -0
  191. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/actions/file_manipulation.rb +314 -0
  192. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/actions/inject_into_file.rb +109 -0
  193. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/base.rb +652 -0
  194. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/command.rb +136 -0
  195. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/core_ext/hash_with_indifferent_access.rb +80 -0
  196. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/core_ext/io_binary_read.rb +12 -0
  197. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/core_ext/ordered_hash.rb +100 -0
  198. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/error.rb +28 -0
  199. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/group.rb +282 -0
  200. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/invocation.rb +172 -0
  201. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/parser.rb +4 -0
  202. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/parser/argument.rb +74 -0
  203. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/parser/arguments.rb +171 -0
  204. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/parser/option.rb +121 -0
  205. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/parser/options.rb +218 -0
  206. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/rake_compat.rb +72 -0
  207. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/runner.rb +322 -0
  208. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/shell.rb +88 -0
  209. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/shell/basic.rb +393 -0
  210. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/shell/color.rb +148 -0
  211. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/shell/html.rb +127 -0
  212. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/util.rb +270 -0
  213. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/lib/thor/version.rb +3 -0
  214. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/actions/create_file_spec.rb +170 -0
  215. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/actions/create_link_spec.rb +95 -0
  216. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/actions/directory_spec.rb +169 -0
  217. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/actions/empty_directory_spec.rb +129 -0
  218. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/actions/file_manipulation_spec.rb +382 -0
  219. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/actions/inject_into_file_spec.rb +135 -0
  220. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/actions_spec.rb +331 -0
  221. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/base_spec.rb +291 -0
  222. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/command_spec.rb +80 -0
  223. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/core_ext/hash_with_indifferent_access_spec.rb +48 -0
  224. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/core_ext/ordered_hash_spec.rb +115 -0
  225. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/exit_condition_spec.rb +19 -0
  226. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/fixtures/application.rb +2 -0
  227. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/fixtures/app{1}/README +3 -0
  228. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/fixtures/bundle/execute.rb +6 -0
  229. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/fixtures/bundle/main.thor +1 -0
  230. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/fixtures/command.thor +10 -0
  231. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/fixtures/doc/%file_name%.rb.tt +1 -0
  232. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/fixtures/doc/COMMENTER +11 -0
  233. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/fixtures/doc/README +3 -0
  234. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/fixtures/doc/block_helper.rb +3 -0
  235. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/fixtures/doc/config.rb +1 -0
  236. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/fixtures/doc/config.yaml.tt +1 -0
  237. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/fixtures/doc/excluding/%file_name%.rb.tt +1 -0
  238. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/fixtures/enum.thor +10 -0
  239. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/fixtures/group.thor +128 -0
  240. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/fixtures/invoke.thor +112 -0
  241. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/fixtures/path with spaces b/data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/fixtures/path with → spaces +0 -0
  242. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/fixtures/preserve/script.sh +3 -0
  243. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/fixtures/script.thor +220 -0
  244. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/fixtures/subcommand.thor +17 -0
  245. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/group_spec.rb +216 -0
  246. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/helper.rb +67 -0
  247. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/invocation_spec.rb +100 -0
  248. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/parser/argument_spec.rb +53 -0
  249. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/parser/arguments_spec.rb +66 -0
  250. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/parser/option_spec.rb +202 -0
  251. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/parser/options_spec.rb +400 -0
  252. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/rake_compat_spec.rb +72 -0
  253. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/register_spec.rb +197 -0
  254. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/runner_spec.rb +241 -0
  255. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/shell/basic_spec.rb +311 -0
  256. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/shell/color_spec.rb +95 -0
  257. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/shell/html_spec.rb +32 -0
  258. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/shell_spec.rb +47 -0
  259. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/subcommand_spec.rb +30 -0
  260. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/thor_spec.rb +491 -0
  261. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/spec/util_spec.rb +196 -0
  262. data/vendor/bundle/ruby/2.1.0/gems/thor-0.18.1/thor.gemspec +24 -0
  263. data/vendor/bundle/ruby/2.1.0/gems/unicode-display_width-0.1.1/LICENSE.txt +22 -0
  264. data/vendor/bundle/ruby/2.1.0/gems/unicode-display_width-0.1.1/README.rdoc +36 -0
  265. data/vendor/bundle/ruby/2.1.0/gems/unicode-display_width-0.1.1/Rakefile +35 -0
  266. data/vendor/bundle/ruby/2.1.0/gems/unicode-display_width-0.1.1/data/EastAsianWidth.index +0 -0
  267. data/vendor/bundle/ruby/2.1.0/gems/unicode-display_width-0.1.1/data/EastAsianWidth.txt +23735 -0
  268. data/vendor/bundle/ruby/2.1.0/gems/unicode-display_width-0.1.1/lib/unicode/display_size.rb +1 -0
  269. data/vendor/bundle/ruby/2.1.0/gems/unicode-display_width-0.1.1/lib/unicode/display_width.rb +76 -0
  270. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/LEGAL +66 -0
  271. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/LICENSE +22 -0
  272. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/README.md +620 -0
  273. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/Rakefile +61 -0
  274. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/benchmarks/builtins_vs_eval.rb +23 -0
  275. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/benchmarks/concat_vs_join.rb +12 -0
  276. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/benchmarks/erb_vs_erubis.rb +53 -0
  277. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/benchmarks/format_args.rb +46 -0
  278. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/benchmarks/generation.rb +37 -0
  279. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/benchmarks/marshal_vs_dbm.rb +63 -0
  280. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/benchmarks/parsing.rb +46 -0
  281. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/benchmarks/pathname_vs_string.rb +50 -0
  282. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/benchmarks/rdoc_vs_yardoc.rb +10 -0
  283. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/benchmarks/registry_store_types.rb +48 -0
  284. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/benchmarks/ri_vs_yri.rb +18 -0
  285. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/benchmarks/ripper_parser.rb +12 -0
  286. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/benchmarks/splat_vs_flatten.rb +12 -0
  287. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/benchmarks/template_erb.rb +22 -0
  288. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/benchmarks/template_format.rb +6 -0
  289. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/benchmarks/template_profile.rb +17 -0
  290. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/benchmarks/yri_cache.rb +19 -0
  291. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/bin/yard +12 -0
  292. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/bin/yardoc +12 -0
  293. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/bin/yri +12 -0
  294. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/docs/CodeObjects.md +115 -0
  295. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/docs/GettingStarted.md +592 -0
  296. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/docs/Handlers.md +152 -0
  297. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/docs/Overview.md +61 -0
  298. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/docs/Parser.md +191 -0
  299. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/docs/Tags.md +282 -0
  300. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/docs/TagsArch.md +123 -0
  301. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/docs/Templates.md +496 -0
  302. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/docs/WhatsNew.md +1244 -0
  303. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/docs/images/code-objects-class-diagram.png +0 -0
  304. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/docs/images/handlers-class-diagram.png +0 -0
  305. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/docs/images/overview-class-diagram.png +0 -0
  306. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/docs/images/parser-class-diagram.png +0 -0
  307. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/docs/images/tags-class-diagram.png +0 -0
  308. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/docs/templates/default/fulldoc/html/full_list_tag.erb +7 -0
  309. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/docs/templates/default/fulldoc/html/setup.rb +6 -0
  310. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/docs/templates/default/layout/html/setup.rb +8 -0
  311. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/docs/templates/default/layout/html/tag_list.erb +11 -0
  312. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/docs/templates/default/yard_tags/html/list.erb +18 -0
  313. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/docs/templates/default/yard_tags/html/setup.rb +27 -0
  314. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/docs/templates/plugin.rb +65 -0
  315. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/rubygems_plugin.rb +4 -0
  316. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard.rb +71 -0
  317. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/autoload.rb +290 -0
  318. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/cli/command.rb +84 -0
  319. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/cli/command_parser.rb +92 -0
  320. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/cli/config.rb +136 -0
  321. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/cli/diff.rb +270 -0
  322. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/cli/display.rb +68 -0
  323. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/cli/gems.rb +83 -0
  324. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/cli/graph.rb +126 -0
  325. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/cli/help.rb +18 -0
  326. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/cli/i18n.rb +69 -0
  327. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/cli/list.rb +22 -0
  328. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/cli/markup_types.rb +33 -0
  329. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/cli/server.rb +253 -0
  330. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/cli/stats.rb +213 -0
  331. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/cli/yardoc.rb +752 -0
  332. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/cli/yardopts_command.rb +109 -0
  333. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/cli/yri.rb +214 -0
  334. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/code_objects/base.rb +585 -0
  335. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/code_objects/class_object.rb +143 -0
  336. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/code_objects/class_variable_object.rb +8 -0
  337. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/code_objects/constant_object.rb +13 -0
  338. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/code_objects/extended_method_object.rb +23 -0
  339. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/code_objects/extra_file_object.rb +128 -0
  340. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/code_objects/macro_object.rb +172 -0
  341. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/code_objects/method_object.rb +191 -0
  342. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/code_objects/module_object.rb +18 -0
  343. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/code_objects/namespace_object.rb +200 -0
  344. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/code_objects/proxy.rb +258 -0
  345. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/code_objects/root_object.rb +17 -0
  346. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/config.rb +270 -0
  347. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/core_ext/array.rb +15 -0
  348. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/core_ext/file.rb +65 -0
  349. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/core_ext/hash.rb +15 -0
  350. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/core_ext/insertion.rb +60 -0
  351. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/core_ext/module.rb +19 -0
  352. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/core_ext/string.rb +67 -0
  353. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/core_ext/symbol_hash.rb +73 -0
  354. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/docstring.rb +362 -0
  355. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/docstring_parser.rb +321 -0
  356. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/globals.rb +18 -0
  357. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/base.rb +597 -0
  358. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/c/alias_handler.rb +15 -0
  359. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/c/attribute_handler.rb +13 -0
  360. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/c/base.rb +110 -0
  361. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/c/class_handler.rb +26 -0
  362. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/c/constant_handler.rb +12 -0
  363. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/c/handler_methods.rb +166 -0
  364. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/c/init_handler.rb +18 -0
  365. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/c/method_handler.rb +35 -0
  366. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/c/mixin_handler.rb +13 -0
  367. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/c/module_handler.rb +16 -0
  368. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/c/override_comment_handler.rb +30 -0
  369. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/c/path_handler.rb +10 -0
  370. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/c/struct_handler.rb +12 -0
  371. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/c/symbol_handler.rb +7 -0
  372. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/processor.rb +201 -0
  373. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/alias_handler.rb +41 -0
  374. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/attribute_handler.rb +82 -0
  375. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/base.rb +164 -0
  376. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/class_condition_handler.rb +86 -0
  377. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/class_handler.rb +121 -0
  378. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/class_variable_handler.rb +16 -0
  379. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/comment_handler.rb +9 -0
  380. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/constant_handler.rb +45 -0
  381. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/dsl_handler.rb +14 -0
  382. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/dsl_handler_methods.rb +77 -0
  383. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/exception_handler.rb +26 -0
  384. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/extend_handler.rb +21 -0
  385. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/legacy/alias_handler.rb +35 -0
  386. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/legacy/attribute_handler.rb +60 -0
  387. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/legacy/base.rb +250 -0
  388. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/legacy/class_condition_handler.rb +83 -0
  389. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/legacy/class_handler.rb +111 -0
  390. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/legacy/class_variable_handler.rb +14 -0
  391. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/legacy/comment_handler.rb +9 -0
  392. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/legacy/constant_handler.rb +28 -0
  393. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/legacy/dsl_handler.rb +16 -0
  394. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/legacy/exception_handler.rb +12 -0
  395. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/legacy/extend_handler.rb +20 -0
  396. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/legacy/method_handler.rb +85 -0
  397. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/legacy/mixin_handler.rb +39 -0
  398. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/legacy/module_function_handler.rb +18 -0
  399. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/legacy/module_handler.rb +11 -0
  400. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/legacy/private_constant_handler.rb +21 -0
  401. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/legacy/visibility_handler.rb +16 -0
  402. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/legacy/yield_handler.rb +28 -0
  403. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/method_condition_handler.rb +8 -0
  404. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/method_handler.rb +92 -0
  405. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/mixin_handler.rb +36 -0
  406. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/module_function_handler.rb +26 -0
  407. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/module_handler.rb +11 -0
  408. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/private_constant_handler.rb +36 -0
  409. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/struct_handler_methods.rb +141 -0
  410. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/visibility_handler.rb +24 -0
  411. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/handlers/ruby/yield_handler.rb +30 -0
  412. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/i18n/locale.rb +66 -0
  413. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/i18n/message.rb +56 -0
  414. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/i18n/messages.rb +55 -0
  415. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/i18n/po_parser.rb +60 -0
  416. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/i18n/pot_generator.rb +280 -0
  417. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/i18n/text.rb +173 -0
  418. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/logging.rb +190 -0
  419. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/options.rb +216 -0
  420. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/parser/base.rb +56 -0
  421. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/parser/c/c_parser.rb +231 -0
  422. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/parser/c/comment_parser.rb +131 -0
  423. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/parser/c/statement.rb +63 -0
  424. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/parser/ruby/ast_node.rb +496 -0
  425. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/parser/ruby/legacy/ruby_lex.rb +1377 -0
  426. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/parser/ruby/legacy/ruby_parser.rb +31 -0
  427. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/parser/ruby/legacy/statement.rb +65 -0
  428. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/parser/ruby/legacy/statement_list.rb +384 -0
  429. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/parser/ruby/legacy/token_list.rb +71 -0
  430. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/parser/ruby/ruby_parser.rb +625 -0
  431. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/parser/source_parser.rb +517 -0
  432. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/rake/yardoc_task.rb +74 -0
  433. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/registry.rb +438 -0
  434. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/registry_store.rb +319 -0
  435. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/rubygems/backports.rb +8 -0
  436. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/rubygems/backports/LICENSE.txt +57 -0
  437. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/rubygems/backports/MIT.txt +20 -0
  438. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/rubygems/backports/gem.rb +9 -0
  439. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/rubygems/backports/source_index.rb +370 -0
  440. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/rubygems/doc_manager.rb +88 -0
  441. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/rubygems/specification.rb +41 -0
  442. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/serializers/base.rb +80 -0
  443. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/serializers/file_system_serializer.rb +90 -0
  444. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/serializers/process_serializer.rb +24 -0
  445. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/serializers/stdout_serializer.rb +32 -0
  446. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/serializers/yardoc_serializer.rb +124 -0
  447. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server.rb +11 -0
  448. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/adapter.rb +100 -0
  449. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/commands/base.rb +192 -0
  450. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/commands/display_file_command.rb +24 -0
  451. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/commands/display_object_command.rb +58 -0
  452. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/commands/frames_command.rb +15 -0
  453. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/commands/library_command.rb +148 -0
  454. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/commands/library_index_command.rb +24 -0
  455. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/commands/list_command.rb +24 -0
  456. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/commands/search_command.rb +78 -0
  457. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/commands/static_file_command.rb +57 -0
  458. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/doc_server_helper.rb +76 -0
  459. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/doc_server_serializer.rb +43 -0
  460. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/library_version.rb +227 -0
  461. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/rack_adapter.rb +88 -0
  462. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/router.rb +176 -0
  463. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/static_caching.rb +45 -0
  464. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/templates/default/fulldoc/html/css/custom.css +78 -0
  465. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/templates/default/fulldoc/html/images/processing.gif +0 -0
  466. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js +12 -0
  467. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/templates/default/layout/html/breadcrumb.erb +46 -0
  468. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/templates/default/layout/html/script_setup.erb +8 -0
  469. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/templates/default/layout/html/setup.rb +7 -0
  470. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/templates/default/method_details/html/permalink.erb +4 -0
  471. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/templates/default/method_details/html/setup.rb +4 -0
  472. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/templates/doc_server/library_list/html/contents.erb +13 -0
  473. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/templates/doc_server/library_list/html/headers.erb +26 -0
  474. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/templates/doc_server/library_list/html/library_list.erb +12 -0
  475. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/templates/doc_server/library_list/html/setup.rb +3 -0
  476. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/templates/doc_server/library_list/html/title.erb +2 -0
  477. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/templates/doc_server/processing/html/processing.erb +51 -0
  478. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/templates/doc_server/processing/html/setup.rb +3 -0
  479. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/templates/doc_server/search/html/search.erb +18 -0
  480. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/templates/doc_server/search/html/setup.rb +8 -0
  481. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/server/webrick_adapter.rb +43 -0
  482. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/tags/default_factory.rb +176 -0
  483. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/tags/default_tag.rb +12 -0
  484. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/tags/directives.rb +599 -0
  485. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/tags/library.rb +630 -0
  486. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/tags/option_tag.rb +12 -0
  487. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/tags/overload_tag.rb +66 -0
  488. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/tags/ref_tag.rb +7 -0
  489. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/tags/ref_tag_list.rb +27 -0
  490. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/tags/tag.rb +57 -0
  491. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/tags/tag_format_error.rb +6 -0
  492. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/templates/engine.rb +185 -0
  493. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/templates/erb_cache.rb +22 -0
  494. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/templates/helpers/base_helper.rb +212 -0
  495. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/templates/helpers/filter_helper.rb +26 -0
  496. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/templates/helpers/html_helper.rb +599 -0
  497. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/templates/helpers/html_syntax_highlight_helper.rb +60 -0
  498. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/templates/helpers/markup/rdoc_markdown.rb +22 -0
  499. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/templates/helpers/markup/rdoc_markup.rb +106 -0
  500. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/templates/helpers/markup_helper.rb +169 -0
  501. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/templates/helpers/method_helper.rb +74 -0
  502. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/templates/helpers/module_helper.rb +19 -0
  503. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/templates/helpers/text_helper.rb +95 -0
  504. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/templates/helpers/uml_helper.rb +46 -0
  505. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/templates/section.rb +106 -0
  506. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/templates/template.rb +407 -0
  507. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/templates/template_options.rb +88 -0
  508. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/verifier.rb +148 -0
  509. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/lib/yard/version.rb +3 -0
  510. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/cli/command_parser_spec.rb +43 -0
  511. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/cli/command_spec.rb +36 -0
  512. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/cli/config_spec.rb +92 -0
  513. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/cli/diff_spec.rb +260 -0
  514. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/cli/display_spec.rb +30 -0
  515. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/cli/gems_spec.rb +81 -0
  516. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/cli/graph_spec.rb +17 -0
  517. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/cli/help_spec.rb +22 -0
  518. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/cli/i18n_spec.rb +111 -0
  519. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/cli/list_spec.rb +8 -0
  520. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/cli/markup_types_spec.rb +22 -0
  521. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/cli/server_spec.rb +327 -0
  522. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/cli/stats_spec.rb +90 -0
  523. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/cli/yardoc_spec.rb +804 -0
  524. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/cli/yri_spec.rb +99 -0
  525. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/code_objects/base_spec.rb +438 -0
  526. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/code_objects/class_object_spec.rb +225 -0
  527. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/code_objects/code_object_list_spec.rb +33 -0
  528. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/code_objects/constants_spec.rb +82 -0
  529. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/code_objects/extra_file_object_spec.rb +147 -0
  530. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/code_objects/macro_object_spec.rb +148 -0
  531. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/code_objects/method_object_spec.rb +175 -0
  532. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/code_objects/module_object_spec.rb +141 -0
  533. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/code_objects/namespace_object_spec.rb +170 -0
  534. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/code_objects/proxy_spec.rb +140 -0
  535. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/code_objects/spec_helper.rb +3 -0
  536. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/config_spec.rb +176 -0
  537. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/core_ext/array_spec.rb +14 -0
  538. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/core_ext/file_spec.rb +68 -0
  539. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/core_ext/hash_spec.rb +14 -0
  540. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/core_ext/insertion_spec.rb +37 -0
  541. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/core_ext/module_spec.rb +15 -0
  542. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/core_ext/string_spec.rb +42 -0
  543. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/core_ext/symbol_hash_spec.rb +86 -0
  544. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/docstring_parser_spec.rb +228 -0
  545. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/docstring_spec.rb +335 -0
  546. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/alias_handler_spec.rb +81 -0
  547. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/attribute_handler_spec.rb +94 -0
  548. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/base_spec.rb +206 -0
  549. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/c/alias_handler_spec.rb +33 -0
  550. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/c/attribute_handler_spec.rb +40 -0
  551. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/c/class_handler_spec.rb +63 -0
  552. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/c/constant_handler_spec.rb +68 -0
  553. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/c/init_handler_spec.rb +47 -0
  554. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/c/method_handler_spec.rb +239 -0
  555. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/c/mixin_handler_spec.rb +27 -0
  556. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/c/module_handler_spec.rb +38 -0
  557. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/c/override_comment_handler_spec.rb +46 -0
  558. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/c/path_handler_spec.rb +35 -0
  559. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/c/spec_helper.rb +13 -0
  560. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/c/struct_handler_spec.rb +15 -0
  561. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/class_condition_handler_spec.rb +67 -0
  562. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/class_handler_spec.rb +246 -0
  563. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/class_variable_handler_spec.rb +11 -0
  564. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/constant_handler_spec.rb +64 -0
  565. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/dsl_handler_spec.rb +197 -0
  566. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/examples/alias_handler_001.rb.txt +46 -0
  567. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/examples/attribute_handler_001.rb.txt +32 -0
  568. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/examples/class_condition_handler_001.rb.txt +69 -0
  569. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/examples/class_handler_001.rb.txt +120 -0
  570. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/examples/class_variable_handler_001.rb.txt +10 -0
  571. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/examples/constant_handler_001.rb.txt +25 -0
  572. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/examples/dsl_handler_001.rb.txt +125 -0
  573. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/examples/exception_handler_001.rb.txt +59 -0
  574. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/examples/extend_handler_001.rb.txt +16 -0
  575. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/examples/method_condition_handler_001.rb.txt +10 -0
  576. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/examples/method_handler_001.rb.txt +126 -0
  577. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/examples/mixin_handler_001.rb.txt +37 -0
  578. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/examples/module_handler_001.rb.txt +29 -0
  579. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/examples/private_constant_handler_001.rb.txt +8 -0
  580. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/examples/process_handler_001.rb.txt +11 -0
  581. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/examples/visibility_handler_001.rb.txt +32 -0
  582. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/examples/yield_handler_001.rb.txt +54 -0
  583. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/exception_handler_spec.rb +48 -0
  584. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/extend_handler_spec.rb +23 -0
  585. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/legacy_base_spec.rb +128 -0
  586. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/method_condition_handler_spec.rb +14 -0
  587. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/method_handler_spec.rb +184 -0
  588. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/mixin_handler_spec.rb +55 -0
  589. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/module_function_handler_spec.rb +105 -0
  590. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/module_handler_spec.rb +34 -0
  591. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/private_constant_handler_spec.rb +24 -0
  592. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/processor_spec.rb +34 -0
  593. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/ruby/base_spec.rb +94 -0
  594. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/ruby/legacy/base_spec.rb +82 -0
  595. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/spec_helper.rb +33 -0
  596. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/visibility_handler_spec.rb +39 -0
  597. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/handlers/yield_handler_spec.rb +51 -0
  598. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/i18n/locale_spec.rb +81 -0
  599. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/i18n/message_spec.rb +52 -0
  600. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/i18n/messages_spec.rb +67 -0
  601. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/i18n/pot_generator_spec.rb +262 -0
  602. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/i18n/text_spec.rb +180 -0
  603. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/logging_spec.rb +35 -0
  604. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/options_spec.rb +171 -0
  605. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/parser/base_spec.rb +24 -0
  606. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/parser/c_parser_spec.rb +171 -0
  607. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/parser/examples/array.c.txt +3887 -0
  608. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/parser/examples/example1.rb.txt +8 -0
  609. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/parser/examples/extrafile.c.txt +8 -0
  610. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/parser/examples/multifile.c.txt +22 -0
  611. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/parser/examples/override.c.txt +424 -0
  612. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/parser/examples/parse_in_order_001.rb.txt +2 -0
  613. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/parser/examples/parse_in_order_002.rb.txt +2 -0
  614. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/parser/examples/tag_handler_001.rb.txt +8 -0
  615. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/parser/ruby/ast_node_spec.rb +33 -0
  616. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/parser/ruby/legacy/statement_list_spec.rb +299 -0
  617. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/parser/ruby/legacy/token_list_spec.rb +77 -0
  618. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/parser/ruby/ruby_parser_spec.rb +334 -0
  619. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/parser/source_parser_spec.rb +717 -0
  620. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/parser/tag_parsing_spec.rb +18 -0
  621. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/rake/yardoc_task_spec.rb +101 -0
  622. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/registry_spec.rb +393 -0
  623. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/registry_store_spec.rb +315 -0
  624. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/rubygems/doc_manager_spec.rb +112 -0
  625. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/serializers/data/serialized_yardoc/checksums +1 -0
  626. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/serializers/data/serialized_yardoc/objects/Foo.dat +0 -0
  627. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/serializers/data/serialized_yardoc/objects/Foo/bar_i.dat +0 -0
  628. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/serializers/data/serialized_yardoc/objects/Foo/baz_i.dat +0 -0
  629. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/serializers/data/serialized_yardoc/objects/root.dat +0 -0
  630. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/serializers/data/serialized_yardoc/proxy_types +2 -0
  631. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/serializers/file_system_serializer_spec.rb +124 -0
  632. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/serializers/spec_helper.rb +2 -0
  633. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/serializers/yardoc_serializer_spec.rb +46 -0
  634. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/server/adapter_spec.rb +38 -0
  635. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/server/commands/base_spec.rb +87 -0
  636. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/server/commands/library_command_spec.rb +39 -0
  637. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/server/commands/static_file_command_spec.rb +84 -0
  638. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/server/doc_server_helper_spec.rb +53 -0
  639. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/server/doc_server_serializer_spec.rb +50 -0
  640. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/server/rack_adapter_spec.rb +20 -0
  641. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/server/router_spec.rb +122 -0
  642. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/server/spec_helper.rb +17 -0
  643. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/server/static_caching_spec.rb +39 -0
  644. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/server/webrick_servlet_spec.rb +20 -0
  645. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/server_spec.rb +10 -0
  646. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/spec_helper.rb +128 -0
  647. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/tags/default_factory_spec.rb +152 -0
  648. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/tags/default_tag_spec.rb +11 -0
  649. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/tags/directives_spec.rb +453 -0
  650. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/tags/library_spec.rb +34 -0
  651. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/tags/overload_tag_spec.rb +53 -0
  652. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/tags/ref_tag_list_spec.rb +53 -0
  653. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/class_spec.rb +44 -0
  654. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/constant_spec.rb +40 -0
  655. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/engine_spec.rb +121 -0
  656. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/class001.html +280 -0
  657. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/class001.txt +36 -0
  658. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/class002.html +35 -0
  659. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/constant001.txt +25 -0
  660. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/constant002.txt +7 -0
  661. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/constant003.txt +11 -0
  662. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/method001.html +130 -0
  663. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/method001.txt +35 -0
  664. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/method002.html +86 -0
  665. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/method002.txt +20 -0
  666. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/method003.html +159 -0
  667. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/method003.txt +45 -0
  668. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/method004.html +44 -0
  669. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/method004.txt +10 -0
  670. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/method005.html +99 -0
  671. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/method005.txt +33 -0
  672. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/module001.dot +33 -0
  673. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/module001.html +825 -0
  674. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/module001.txt +33 -0
  675. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/module002.html +318 -0
  676. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/module003.html +185 -0
  677. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/module004.html +387 -0
  678. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/examples/tag001.txt +82 -0
  679. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/helpers/base_helper_spec.rb +175 -0
  680. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/helpers/html_helper_spec.rb +612 -0
  681. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +53 -0
  682. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/helpers/markup/rdoc_markup_spec.rb +93 -0
  683. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/helpers/markup_helper_spec.rb +135 -0
  684. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/helpers/method_helper_spec.rb +82 -0
  685. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/helpers/shared_signature_examples.rb +123 -0
  686. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/helpers/text_helper_spec.rb +44 -0
  687. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/method_spec.rb +102 -0
  688. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/module_spec.rb +181 -0
  689. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/onefile_spec.rb +64 -0
  690. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/section_spec.rb +146 -0
  691. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/spec_helper.rb +73 -0
  692. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/tag_spec.rb +51 -0
  693. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/templates/template_spec.rb +409 -0
  694. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/spec/verifier_spec.rb +106 -0
  695. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/class/dot/setup.rb +6 -0
  696. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/class/dot/superklass.erb +3 -0
  697. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/class/html/constructor_details.erb +8 -0
  698. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/class/html/setup.rb +1 -0
  699. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/class/html/subclasses.erb +4 -0
  700. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/class/setup.rb +36 -0
  701. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/class/text/setup.rb +11 -0
  702. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/class/text/subclasses.erb +5 -0
  703. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/constant/text/header.erb +11 -0
  704. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/constant/text/setup.rb +3 -0
  705. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/docstring/html/abstract.erb +4 -0
  706. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/docstring/html/deprecated.erb +1 -0
  707. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/docstring/html/index.erb +5 -0
  708. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/docstring/html/note.erb +6 -0
  709. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/docstring/html/private.erb +4 -0
  710. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/docstring/html/returns_void.erb +1 -0
  711. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/docstring/html/text.erb +1 -0
  712. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/docstring/html/todo.erb +6 -0
  713. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/docstring/setup.rb +51 -0
  714. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/docstring/text/abstract.erb +2 -0
  715. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/docstring/text/deprecated.erb +2 -0
  716. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/docstring/text/index.erb +2 -0
  717. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/docstring/text/note.erb +4 -0
  718. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/docstring/text/private.erb +2 -0
  719. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/docstring/text/returns_void.erb +1 -0
  720. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/docstring/text/text.erb +1 -0
  721. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/docstring/text/todo.erb +4 -0
  722. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/fulldoc/html/css/common.css +1 -0
  723. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/fulldoc/html/css/full_list.css +57 -0
  724. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/fulldoc/html/css/style.css +338 -0
  725. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/fulldoc/html/frames.erb +26 -0
  726. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/fulldoc/html/full_list.erb +40 -0
  727. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/fulldoc/html/full_list_class.erb +2 -0
  728. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/fulldoc/html/full_list_file.erb +5 -0
  729. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/fulldoc/html/full_list_method.erb +8 -0
  730. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/fulldoc/html/js/app.js +219 -0
  731. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/fulldoc/html/js/full_list.js +178 -0
  732. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/fulldoc/html/js/jquery.js +4 -0
  733. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/fulldoc/html/setup.rb +199 -0
  734. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/layout/dot/header.erb +6 -0
  735. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/layout/dot/setup.rb +14 -0
  736. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/layout/html/breadcrumb.erb +13 -0
  737. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/layout/html/files.erb +11 -0
  738. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/layout/html/footer.erb +5 -0
  739. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/layout/html/headers.erb +14 -0
  740. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/layout/html/index.erb +2 -0
  741. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/layout/html/layout.erb +20 -0
  742. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/layout/html/listing.erb +4 -0
  743. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/layout/html/objects.erb +32 -0
  744. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/layout/html/script_setup.erb +5 -0
  745. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/layout/html/search.erb +8 -0
  746. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/layout/html/setup.rb +71 -0
  747. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/method/html/header.erb +16 -0
  748. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/method/setup.rb +3 -0
  749. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/method/text/header.erb +1 -0
  750. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/method_details/html/header.erb +3 -0
  751. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/method_details/html/method_signature.erb +25 -0
  752. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/method_details/html/source.erb +10 -0
  753. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/method_details/setup.rb +10 -0
  754. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/method_details/text/header.erb +10 -0
  755. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/method_details/text/method_signature.erb +12 -0
  756. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/method_details/text/setup.rb +10 -0
  757. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/dot/child.erb +1 -0
  758. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/dot/dependencies.erb +3 -0
  759. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/dot/header.erb +6 -0
  760. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/dot/info.erb +14 -0
  761. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/dot/setup.rb +14 -0
  762. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/html/attribute_details.erb +10 -0
  763. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/html/attribute_summary.erb +8 -0
  764. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/html/box_info.erb +37 -0
  765. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/html/children.erb +8 -0
  766. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/html/constant_summary.erb +13 -0
  767. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/html/defines.erb +3 -0
  768. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/html/header.erb +5 -0
  769. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/html/inherited_attributes.erb +14 -0
  770. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/html/inherited_constants.erb +8 -0
  771. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/html/inherited_methods.erb +19 -0
  772. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/html/item_summary.erb +40 -0
  773. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/html/method_details_list.erb +9 -0
  774. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/html/method_summary.erb +14 -0
  775. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/html/methodmissing.erb +12 -0
  776. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/html/pre_docstring.erb +1 -0
  777. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/setup.rb +164 -0
  778. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/text/children.erb +10 -0
  779. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/text/class_meths_list.erb +8 -0
  780. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/text/extends.erb +8 -0
  781. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/text/header.erb +7 -0
  782. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/text/includes.erb +8 -0
  783. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/text/instance_meths_list.erb +8 -0
  784. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/module/text/setup.rb +12 -0
  785. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/onefile/html/files.erb +5 -0
  786. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/onefile/html/headers.erb +6 -0
  787. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/onefile/html/layout.erb +17 -0
  788. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/onefile/html/readme.erb +3 -0
  789. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/onefile/html/setup.rb +61 -0
  790. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/root/dot/child.erb +3 -0
  791. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/root/dot/setup.rb +5 -0
  792. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/root/html/setup.rb +1 -0
  793. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/tags/html/example.erb +11 -0
  794. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/tags/html/index.erb +3 -0
  795. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/tags/html/option.erb +24 -0
  796. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/tags/html/overload.erb +14 -0
  797. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/tags/html/see.erb +8 -0
  798. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/tags/html/tag.erb +20 -0
  799. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/tags/setup.rb +55 -0
  800. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/tags/text/example.erb +12 -0
  801. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/tags/text/index.erb +1 -0
  802. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/tags/text/option.erb +20 -0
  803. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/tags/text/overload.erb +19 -0
  804. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/tags/text/see.erb +11 -0
  805. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/default/tags/text/tag.erb +13 -0
  806. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/guide/class/html/setup.rb +1 -0
  807. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/guide/docstring/html/setup.rb +1 -0
  808. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/guide/fulldoc/html/css/style.css +108 -0
  809. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/guide/fulldoc/html/js/app.js +33 -0
  810. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/guide/fulldoc/html/setup.rb +73 -0
  811. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/guide/layout/html/layout.erb +81 -0
  812. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/guide/layout/html/setup.rb +28 -0
  813. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/guide/method/html/header.erb +18 -0
  814. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/guide/method/html/setup.rb +21 -0
  815. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/guide/module/html/header.erb +7 -0
  816. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/guide/module/html/method_list.erb +5 -0
  817. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/guide/module/html/setup.rb +26 -0
  818. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/guide/onefile/html/files.erb +4 -0
  819. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/guide/onefile/html/setup.rb +5 -0
  820. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/guide/onefile/html/toc.erb +3 -0
  821. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/templates/guide/tags/html/setup.rb +8 -0
  822. data/vendor/bundle/ruby/2.1.0/gems/yard-0.8.7.3/yard.gemspec +25 -0
  823. data/vendor/bundle/ruby/2.1.0/specifications/hashie-2.0.5.gemspec +44 -0
  824. data/vendor/bundle/ruby/2.1.0/specifications/hirb-0.7.1.gemspec +43 -0
  825. data/vendor/bundle/ruby/2.1.0/specifications/hirb-unicode-0.0.5.gemspec +47 -0
  826. data/vendor/bundle/ruby/2.1.0/specifications/redcarpet-3.0.0.gemspec +49 -0
  827. data/vendor/bundle/ruby/2.1.0/specifications/thor-0.18.1.gemspec +34 -0
  828. data/vendor/bundle/ruby/2.1.0/specifications/unicode-display_width-0.1.1.gemspec +22 -0
  829. data/vendor/bundle/ruby/2.1.0/specifications/yard-0.8.7.3.gemspec +23 -0
  830. metadata +913 -90
@@ -0,0 +1,2570 @@
1
+ /* markdown.c - generic markdown parser */
2
+
3
+ /*
4
+ * Copyright (c) 2009, Natacha Porté
5
+ * Copyright (c) 2011, Vicent Marti
6
+ *
7
+ * Permission to use, copy, modify, and distribute this software for any
8
+ * purpose with or without fee is hereby granted, provided that the above
9
+ * copyright notice and this permission notice appear in all copies.
10
+ *
11
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18
+ */
19
+
20
+ #include "markdown.h"
21
+ #include "stack.h"
22
+
23
+ #include <assert.h>
24
+ #include <string.h>
25
+ #include <ctype.h>
26
+ #include <stdio.h>
27
+
28
+ #if defined(_WIN32)
29
+ #define strncasecmp _strnicmp
30
+ #endif
31
+
32
+ #define REF_TABLE_SIZE 8
33
+
34
+ #define BUFFER_BLOCK 0
35
+ #define BUFFER_SPAN 1
36
+
37
+ #define MKD_LI_END 8 /* internal list flag */
38
+
39
+ #define gperf_case_strncmp(s1, s2, n) strncasecmp(s1, s2, n)
40
+ #define GPERF_DOWNCASE 1
41
+ #define GPERF_CASE_STRNCMP 1
42
+ #include "html_blocks.h"
43
+
44
+ /***************
45
+ * LOCAL TYPES *
46
+ ***************/
47
+
48
+ /* link_ref: reference to a link */
49
+ struct link_ref {
50
+ unsigned int id;
51
+
52
+ struct buf *link;
53
+ struct buf *title;
54
+
55
+ struct link_ref *next;
56
+ };
57
+
58
+ /* char_trigger: function pointer to render active chars */
59
+ /* returns the number of chars taken care of */
60
+ /* data is the pointer of the beginning of the span */
61
+ /* offset is the number of valid chars before data */
62
+ struct sd_markdown;
63
+ typedef size_t
64
+ (*char_trigger)(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
65
+
66
+ static size_t char_emphasis(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
67
+ static size_t char_underline(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
68
+ static size_t char_highlight(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
69
+ static size_t char_linebreak(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
70
+ static size_t char_codespan(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
71
+ static size_t char_escape(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
72
+ static size_t char_entity(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
73
+ static size_t char_langle_tag(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
74
+ static size_t char_autolink_url(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
75
+ static size_t char_autolink_email(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
76
+ static size_t char_autolink_www(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
77
+ static size_t char_link(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
78
+ static size_t char_superscript(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
79
+
80
+ enum markdown_char_t {
81
+ MD_CHAR_NONE = 0,
82
+ MD_CHAR_EMPHASIS,
83
+ MD_CHAR_CODESPAN,
84
+ MD_CHAR_LINEBREAK,
85
+ MD_CHAR_LINK,
86
+ MD_CHAR_LANGLE,
87
+ MD_CHAR_ESCAPE,
88
+ MD_CHAR_ENTITITY,
89
+ MD_CHAR_AUTOLINK_URL,
90
+ MD_CHAR_AUTOLINK_EMAIL,
91
+ MD_CHAR_AUTOLINK_WWW,
92
+ MD_CHAR_SUPERSCRIPT,
93
+ };
94
+
95
+ static char_trigger markdown_char_ptrs[] = {
96
+ NULL,
97
+ &char_emphasis,
98
+ &char_codespan,
99
+ &char_linebreak,
100
+ &char_link,
101
+ &char_langle_tag,
102
+ &char_escape,
103
+ &char_entity,
104
+ &char_autolink_url,
105
+ &char_autolink_email,
106
+ &char_autolink_www,
107
+ &char_superscript,
108
+ };
109
+
110
+ /* render • structure containing one particular render */
111
+ struct sd_markdown {
112
+ struct sd_callbacks cb;
113
+ void *opaque;
114
+
115
+ struct link_ref *refs[REF_TABLE_SIZE];
116
+ uint8_t active_char[256];
117
+ struct stack work_bufs[2];
118
+ unsigned int ext_flags;
119
+ size_t max_nesting;
120
+ int in_link_body;
121
+ };
122
+
123
+ /***************************
124
+ * HELPER FUNCTIONS *
125
+ ***************************/
126
+
127
+ static inline struct buf *
128
+ rndr_newbuf(struct sd_markdown *rndr, int type)
129
+ {
130
+ static const size_t buf_size[2] = {256, 64};
131
+ struct buf *work = NULL;
132
+ struct stack *pool = &rndr->work_bufs[type];
133
+
134
+ if (pool->size < pool->asize &&
135
+ pool->item[pool->size] != NULL) {
136
+ work = pool->item[pool->size++];
137
+ work->size = 0;
138
+ } else {
139
+ work = bufnew(buf_size[type]);
140
+ redcarpet_stack_push(pool, work);
141
+ }
142
+
143
+ return work;
144
+ }
145
+
146
+ static inline void
147
+ rndr_popbuf(struct sd_markdown *rndr, int type)
148
+ {
149
+ rndr->work_bufs[type].size--;
150
+ }
151
+
152
+ static void
153
+ unscape_text(struct buf *ob, struct buf *src)
154
+ {
155
+ size_t i = 0, org;
156
+ while (i < src->size) {
157
+ org = i;
158
+ while (i < src->size && src->data[i] != '\\')
159
+ i++;
160
+
161
+ if (i > org)
162
+ bufput(ob, src->data + org, i - org);
163
+
164
+ if (i + 1 >= src->size)
165
+ break;
166
+
167
+ bufputc(ob, src->data[i + 1]);
168
+ i += 2;
169
+ }
170
+ }
171
+
172
+ static unsigned int
173
+ hash_link_ref(const uint8_t *link_ref, size_t length)
174
+ {
175
+ size_t i;
176
+ unsigned int hash = 0;
177
+
178
+ for (i = 0; i < length; ++i)
179
+ hash = tolower(link_ref[i]) + (hash << 6) + (hash << 16) - hash;
180
+
181
+ return hash;
182
+ }
183
+
184
+ static struct link_ref *
185
+ add_link_ref(
186
+ struct link_ref **references,
187
+ const uint8_t *name, size_t name_size)
188
+ {
189
+ struct link_ref *ref = calloc(1, sizeof(struct link_ref));
190
+
191
+ if (!ref)
192
+ return NULL;
193
+
194
+ ref->id = hash_link_ref(name, name_size);
195
+ ref->next = references[ref->id % REF_TABLE_SIZE];
196
+
197
+ references[ref->id % REF_TABLE_SIZE] = ref;
198
+ return ref;
199
+ }
200
+
201
+ static struct link_ref *
202
+ find_link_ref(struct link_ref **references, uint8_t *name, size_t length)
203
+ {
204
+ unsigned int hash = hash_link_ref(name, length);
205
+ struct link_ref *ref = NULL;
206
+
207
+ ref = references[hash % REF_TABLE_SIZE];
208
+
209
+ while (ref != NULL) {
210
+ if (ref->id == hash)
211
+ return ref;
212
+
213
+ ref = ref->next;
214
+ }
215
+
216
+ return NULL;
217
+ }
218
+
219
+ static void
220
+ free_link_refs(struct link_ref **references)
221
+ {
222
+ size_t i;
223
+
224
+ for (i = 0; i < REF_TABLE_SIZE; ++i) {
225
+ struct link_ref *r = references[i];
226
+ struct link_ref *next;
227
+
228
+ while (r) {
229
+ next = r->next;
230
+ bufrelease(r->link);
231
+ bufrelease(r->title);
232
+ free(r);
233
+ r = next;
234
+ }
235
+ }
236
+ }
237
+
238
+ /*
239
+ * Check whether a char is a Markdown space.
240
+
241
+ * Right now we only consider spaces the actual
242
+ * space and a newline: tabs and carriage returns
243
+ * are filtered out during the preprocessing phase.
244
+ *
245
+ * If we wanted to actually be UTF-8 compliant, we
246
+ * should instead extract an Unicode codepoint from
247
+ * this character and check for space properties.
248
+ */
249
+ static inline int
250
+ _isspace(int c)
251
+ {
252
+ return c == ' ' || c == '\n';
253
+ }
254
+
255
+ /****************************
256
+ * INLINE PARSING FUNCTIONS *
257
+ ****************************/
258
+
259
+ /* is_mail_autolink • looks for the address part of a mail autolink and '>' */
260
+ /* this is less strict than the original markdown e-mail address matching */
261
+ static size_t
262
+ is_mail_autolink(uint8_t *data, size_t size)
263
+ {
264
+ size_t i = 0, nb = 0;
265
+
266
+ /* address is assumed to be: [-@._a-zA-Z0-9]+ with exactly one '@' */
267
+ for (i = 0; i < size; ++i) {
268
+ if (isalnum(data[i]))
269
+ continue;
270
+
271
+ switch (data[i]) {
272
+ case '@':
273
+ nb++;
274
+
275
+ case '-':
276
+ case '.':
277
+ case '_':
278
+ break;
279
+
280
+ case '>':
281
+ return (nb == 1) ? i + 1 : 0;
282
+
283
+ default:
284
+ return 0;
285
+ }
286
+ }
287
+
288
+ return 0;
289
+ }
290
+
291
+ /* tag_length • returns the length of the given tag, or 0 is it's not valid */
292
+ static size_t
293
+ tag_length(uint8_t *data, size_t size, enum mkd_autolink *autolink)
294
+ {
295
+ size_t i, j;
296
+
297
+ /* a valid tag can't be shorter than 3 chars */
298
+ if (size < 3) return 0;
299
+
300
+ /* begins with a '<' optionally followed by '/', followed by letter or number */
301
+ if (data[0] != '<') return 0;
302
+ i = (data[1] == '/') ? 2 : 1;
303
+
304
+ if (!isalnum(data[i]))
305
+ return 0;
306
+
307
+ /* scheme test */
308
+ *autolink = MKDA_NOT_AUTOLINK;
309
+
310
+ /* try to find the beginning of an URI */
311
+ while (i < size && (isalnum(data[i]) || data[i] == '.' || data[i] == '+' || data[i] == '-'))
312
+ i++;
313
+
314
+ if (i > 1 && data[i] == '@') {
315
+ if ((j = is_mail_autolink(data + i, size - i)) != 0) {
316
+ *autolink = MKDA_EMAIL;
317
+ return i + j;
318
+ }
319
+ }
320
+
321
+ if (i > 2 && data[i] == ':') {
322
+ *autolink = MKDA_NORMAL;
323
+ i++;
324
+ }
325
+
326
+ /* completing autolink test: no whitespace or ' or " */
327
+ if (i >= size)
328
+ *autolink = MKDA_NOT_AUTOLINK;
329
+
330
+ else if (*autolink) {
331
+ j = i;
332
+
333
+ while (i < size) {
334
+ if (data[i] == '\\') i += 2;
335
+ else if (data[i] == '>' || data[i] == '\'' ||
336
+ data[i] == '"' || data[i] == ' ' || data[i] == '\n')
337
+ break;
338
+ else i++;
339
+ }
340
+
341
+ if (i >= size) return 0;
342
+ if (i > j && data[i] == '>') return i + 1;
343
+ /* one of the forbidden chars has been found */
344
+ *autolink = MKDA_NOT_AUTOLINK;
345
+ }
346
+
347
+ /* looking for sometinhg looking like a tag end */
348
+ while (i < size && data[i] != '>') i++;
349
+ if (i >= size) return 0;
350
+ return i + 1;
351
+ }
352
+
353
+ /* parse_inline • parses inline markdown elements */
354
+ static void
355
+ parse_inline(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)
356
+ {
357
+ size_t i = 0, end = 0;
358
+ uint8_t action = 0;
359
+ struct buf work = { 0, 0, 0, 0 };
360
+
361
+ if (rndr->work_bufs[BUFFER_SPAN].size +
362
+ rndr->work_bufs[BUFFER_BLOCK].size > rndr->max_nesting)
363
+ return;
364
+
365
+ while (i < size) {
366
+ /* copying inactive chars into the output */
367
+ while (end < size && (action = rndr->active_char[data[end]]) == 0) {
368
+ end++;
369
+ }
370
+
371
+ if (rndr->cb.normal_text) {
372
+ work.data = data + i;
373
+ work.size = end - i;
374
+ rndr->cb.normal_text(ob, &work, rndr->opaque);
375
+ }
376
+ else
377
+ bufput(ob, data + i, end - i);
378
+
379
+ if (end >= size) break;
380
+ i = end;
381
+
382
+ end = markdown_char_ptrs[(int)action](ob, rndr, data + i, i, size - i);
383
+ if (!end) /* no action from the callback */
384
+ end = i + 1;
385
+ else {
386
+ i += end;
387
+ end = i;
388
+ }
389
+ }
390
+ }
391
+
392
+ /* find_emph_char • looks for the next emph uint8_t, skipping other constructs */
393
+ static size_t
394
+ find_emph_char(uint8_t *data, size_t size, uint8_t c)
395
+ {
396
+ size_t i = 1;
397
+
398
+ while (i < size) {
399
+ while (i < size && data[i] != c && data[i] != '[')
400
+ i++;
401
+
402
+ if (i == size)
403
+ return 0;
404
+
405
+ if (data[i] == c)
406
+ return i;
407
+
408
+ /* not counting escaped chars */
409
+ if (i && data[i - 1] == '\\') {
410
+ i++; continue;
411
+ }
412
+
413
+ if (data[i] == '`') {
414
+ size_t span_nb = 0, bt;
415
+ size_t tmp_i = 0;
416
+
417
+ /* counting the number of opening backticks */
418
+ while (i < size && data[i] == '`') {
419
+ i++; span_nb++;
420
+ }
421
+
422
+ if (i >= size) return 0;
423
+
424
+ /* finding the matching closing sequence */
425
+ bt = 0;
426
+ while (i < size && bt < span_nb) {
427
+ if (!tmp_i && data[i] == c) tmp_i = i;
428
+ if (data[i] == '`') bt++;
429
+ else bt = 0;
430
+ i++;
431
+ }
432
+
433
+ if (i >= size) return tmp_i;
434
+ }
435
+ /* skipping a link */
436
+ else if (data[i] == '[') {
437
+ size_t tmp_i = 0;
438
+ uint8_t cc;
439
+
440
+ i++;
441
+ while (i < size && data[i] != ']') {
442
+ if (!tmp_i && data[i] == c) tmp_i = i;
443
+ i++;
444
+ }
445
+
446
+ i++;
447
+ while (i < size && (data[i] == ' ' || data[i] == '\n'))
448
+ i++;
449
+
450
+ if (i >= size)
451
+ return tmp_i;
452
+
453
+ switch (data[i]) {
454
+ case '[':
455
+ cc = ']'; break;
456
+
457
+ case '(':
458
+ cc = ')'; break;
459
+
460
+ default:
461
+ if (tmp_i)
462
+ return tmp_i;
463
+ else
464
+ continue;
465
+ }
466
+
467
+ i++;
468
+ while (i < size && data[i] != cc) {
469
+ if (!tmp_i && data[i] == c) tmp_i = i;
470
+ i++;
471
+ }
472
+
473
+ if (i >= size)
474
+ return tmp_i;
475
+
476
+ i++;
477
+ }
478
+ }
479
+
480
+ return 0;
481
+ }
482
+
483
+ /* parse_emph1 • parsing single emphase */
484
+ /* closed by a symbol not preceded by whitespace and not followed by symbol */
485
+ static size_t
486
+ parse_emph1(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, uint8_t c)
487
+ {
488
+ size_t i = 0, len;
489
+ struct buf *work = 0;
490
+ int r;
491
+
492
+ /* skipping one symbol if coming from emph3 */
493
+ if (size > 1 && data[0] == c && data[1] == c) i = 1;
494
+
495
+ while (i < size) {
496
+ len = find_emph_char(data + i, size - i, c);
497
+ if (!len) return 0;
498
+ i += len;
499
+ if (i >= size) return 0;
500
+
501
+ if (data[i] == c && !_isspace(data[i - 1])) {
502
+
503
+ if (rndr->ext_flags & MKDEXT_NO_INTRA_EMPHASIS) {
504
+ if (i + i < size && isalnum(data[i + 1]))
505
+ continue;
506
+ }
507
+
508
+ work = rndr_newbuf(rndr, BUFFER_SPAN);
509
+ parse_inline(work, rndr, data, i);
510
+
511
+ if (rndr->ext_flags & MKDEXT_UNDERLINE && c == '_')
512
+ r = rndr->cb.underline(ob, work, rndr->opaque);
513
+ else
514
+ r = rndr->cb.emphasis(ob, work, rndr->opaque);
515
+
516
+ rndr_popbuf(rndr, BUFFER_SPAN);
517
+ return r ? i + 1 : 0;
518
+ }
519
+ }
520
+
521
+ return 0;
522
+ }
523
+
524
+ /* parse_emph2 • parsing single emphase */
525
+ static size_t
526
+ parse_emph2(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, uint8_t c)
527
+ {
528
+ size_t i = 0, len;
529
+ struct buf *work = 0;
530
+ int r;
531
+
532
+ while (i < size) {
533
+ len = find_emph_char(data + i, size - i, c);
534
+ if (!len) return 0;
535
+ i += len;
536
+
537
+ if (i + 1 < size && data[i] == c && data[i + 1] == c && i && !_isspace(data[i - 1])) {
538
+ work = rndr_newbuf(rndr, BUFFER_SPAN);
539
+ parse_inline(work, rndr, data, i);
540
+
541
+ if (c == '~')
542
+ r = rndr->cb.strikethrough(ob, work, rndr->opaque);
543
+ else if (c == '=')
544
+ r = rndr->cb.highlight(ob, work, rndr->opaque);
545
+ else
546
+ r = rndr->cb.double_emphasis(ob, work, rndr->opaque);
547
+
548
+ rndr_popbuf(rndr, BUFFER_SPAN);
549
+ return r ? i + 2 : 0;
550
+ }
551
+ i++;
552
+ }
553
+ return 0;
554
+ }
555
+
556
+ /* parse_emph3 • parsing single emphase */
557
+ /* finds the first closing tag, and delegates to the other emph */
558
+ static size_t
559
+ parse_emph3(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, uint8_t c)
560
+ {
561
+ size_t i = 0, len;
562
+ int r;
563
+
564
+ while (i < size) {
565
+ len = find_emph_char(data + i, size - i, c);
566
+ if (!len) return 0;
567
+ i += len;
568
+
569
+ /* skip whitespace preceded symbols */
570
+ if (data[i] != c || _isspace(data[i - 1]))
571
+ continue;
572
+
573
+ if (i + 2 < size && data[i + 1] == c && data[i + 2] == c && rndr->cb.triple_emphasis) {
574
+ /* triple symbol found */
575
+ struct buf *work = rndr_newbuf(rndr, BUFFER_SPAN);
576
+
577
+ parse_inline(work, rndr, data, i);
578
+ r = rndr->cb.triple_emphasis(ob, work, rndr->opaque);
579
+ rndr_popbuf(rndr, BUFFER_SPAN);
580
+ return r ? i + 3 : 0;
581
+
582
+ } else if (i + 1 < size && data[i + 1] == c) {
583
+ /* double symbol found, handing over to emph1 */
584
+ len = parse_emph1(ob, rndr, data - 2, size + 2, c);
585
+ if (!len) return 0;
586
+ else return len - 2;
587
+
588
+ } else {
589
+ /* single symbol found, handing over to emph2 */
590
+ len = parse_emph2(ob, rndr, data - 1, size + 1, c);
591
+ if (!len) return 0;
592
+ else return len - 1;
593
+ }
594
+ }
595
+ return 0;
596
+ }
597
+
598
+ /* char_emphasis • single and double emphasis parsing */
599
+ static size_t
600
+ char_emphasis(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
601
+ {
602
+ uint8_t c = data[0];
603
+ size_t ret;
604
+
605
+ if (rndr->ext_flags & MKDEXT_NO_INTRA_EMPHASIS) {
606
+ if (offset > 0 && !_isspace(data[-1]) && data[-1] != '>' && data[-1] != '(')
607
+ return 0;
608
+ }
609
+
610
+ if (size > 2 && data[1] != c) {
611
+ /* whitespace cannot follow an opening emphasis;
612
+ * strikethrough only takes two characters '~~' */
613
+ if (c == '~' || c == '=' || _isspace(data[1]) || (ret = parse_emph1(ob, rndr, data + 1, size - 1, c)) == 0)
614
+ return 0;
615
+
616
+ return ret + 1;
617
+ }
618
+
619
+ if (size > 3 && data[1] == c && data[2] != c) {
620
+ if (_isspace(data[2]) || (ret = parse_emph2(ob, rndr, data + 2, size - 2, c)) == 0)
621
+ return 0;
622
+
623
+ return ret + 2;
624
+ }
625
+
626
+ if (size > 4 && data[1] == c && data[2] == c && data[3] != c) {
627
+ if (c == '~' || c == '=' || _isspace(data[3]) || (ret = parse_emph3(ob, rndr, data + 3, size - 3, c)) == 0)
628
+ return 0;
629
+
630
+ return ret + 3;
631
+ }
632
+
633
+ return 0;
634
+ }
635
+
636
+
637
+ /* char_linebreak • '\n' preceded by two spaces (assuming linebreak != 0) */
638
+ static size_t
639
+ char_linebreak(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
640
+ {
641
+ if (offset < 2 || data[-1] != ' ' || data[-2] != ' ')
642
+ return 0;
643
+
644
+ /* removing the last space from ob and rendering */
645
+ while (ob->size && ob->data[ob->size - 1] == ' ')
646
+ ob->size--;
647
+
648
+ return rndr->cb.linebreak(ob, rndr->opaque) ? 1 : 0;
649
+ }
650
+
651
+
652
+ /* char_codespan • '`' parsing a code span (assuming codespan != 0) */
653
+ static size_t
654
+ char_codespan(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
655
+ {
656
+ size_t end, nb = 0, i, f_begin, f_end;
657
+
658
+ /* counting the number of backticks in the delimiter */
659
+ while (nb < size && data[nb] == '`')
660
+ nb++;
661
+
662
+ /* finding the next delimiter */
663
+ i = 0;
664
+ for (end = nb; end < size && i < nb; end++) {
665
+ if (data[end] == '`') i++;
666
+ else i = 0;
667
+ }
668
+
669
+ if (i < nb && end >= size)
670
+ return 0; /* no matching delimiter */
671
+
672
+ /* trimming outside whitespaces */
673
+ f_begin = nb;
674
+ while (f_begin < end && data[f_begin] == ' ')
675
+ f_begin++;
676
+
677
+ f_end = end - nb;
678
+ while (f_end > nb && data[f_end-1] == ' ')
679
+ f_end--;
680
+
681
+ /* real code span */
682
+ if (f_begin < f_end) {
683
+ struct buf work = { data + f_begin, f_end - f_begin, 0, 0 };
684
+ if (!rndr->cb.codespan(ob, &work, rndr->opaque))
685
+ end = 0;
686
+ } else {
687
+ if (!rndr->cb.codespan(ob, 0, rndr->opaque))
688
+ end = 0;
689
+ }
690
+
691
+ return end;
692
+ }
693
+
694
+
695
+ /* char_escape • '\\' backslash escape */
696
+ static size_t
697
+ char_escape(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
698
+ {
699
+ static const char *escape_chars = "\\`*_{}[]()#+-.!:|&<>^~";
700
+ struct buf work = { 0, 0, 0, 0 };
701
+
702
+ if (size > 1) {
703
+ if (strchr(escape_chars, data[1]) == NULL)
704
+ return 0;
705
+
706
+ if (rndr->cb.normal_text) {
707
+ work.data = data + 1;
708
+ work.size = 1;
709
+ rndr->cb.normal_text(ob, &work, rndr->opaque);
710
+ }
711
+ else bufputc(ob, data[1]);
712
+ } else if (size == 1) {
713
+ bufputc(ob, data[0]);
714
+ }
715
+
716
+ return 2;
717
+ }
718
+
719
+ /* char_entity • '&' escaped when it doesn't belong to an entity */
720
+ /* valid entities are assumed to be anything matching &#?[A-Za-z0-9]+; */
721
+ static size_t
722
+ char_entity(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
723
+ {
724
+ size_t end = 1;
725
+ struct buf work = { 0, 0, 0, 0 };
726
+
727
+ if (end < size && data[end] == '#')
728
+ end++;
729
+
730
+ while (end < size && isalnum(data[end]))
731
+ end++;
732
+
733
+ if (end < size && data[end] == ';')
734
+ end++; /* real entity */
735
+ else
736
+ return 0; /* lone '&' */
737
+
738
+ if (rndr->cb.entity) {
739
+ work.data = data;
740
+ work.size = end;
741
+ rndr->cb.entity(ob, &work, rndr->opaque);
742
+ }
743
+ else bufput(ob, data, end);
744
+
745
+ return end;
746
+ }
747
+
748
+ /* char_langle_tag • '<' when tags or autolinks are allowed */
749
+ static size_t
750
+ char_langle_tag(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
751
+ {
752
+ enum mkd_autolink altype = MKDA_NOT_AUTOLINK;
753
+ size_t end = tag_length(data, size, &altype);
754
+ struct buf work = { data, end, 0, 0 };
755
+ int ret = 0;
756
+
757
+ if (end > 2) {
758
+ if (rndr->cb.autolink && altype != MKDA_NOT_AUTOLINK) {
759
+ struct buf *u_link = rndr_newbuf(rndr, BUFFER_SPAN);
760
+ work.data = data + 1;
761
+ work.size = end - 2;
762
+ unscape_text(u_link, &work);
763
+ ret = rndr->cb.autolink(ob, u_link, altype, rndr->opaque);
764
+ rndr_popbuf(rndr, BUFFER_SPAN);
765
+ }
766
+ else if (rndr->cb.raw_html_tag)
767
+ ret = rndr->cb.raw_html_tag(ob, &work, rndr->opaque);
768
+ }
769
+
770
+ if (!ret) return 0;
771
+ else return end;
772
+ }
773
+
774
+ static size_t
775
+ char_autolink_www(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
776
+ {
777
+ struct buf *link, *link_url, *link_text;
778
+ size_t link_len, rewind;
779
+
780
+ if (!rndr->cb.link || rndr->in_link_body)
781
+ return 0;
782
+
783
+ link = rndr_newbuf(rndr, BUFFER_SPAN);
784
+
785
+ if ((link_len = sd_autolink__www(&rewind, link, data, offset, size, 0)) > 0) {
786
+ link_url = rndr_newbuf(rndr, BUFFER_SPAN);
787
+ BUFPUTSL(link_url, "http://");
788
+ bufput(link_url, link->data, link->size);
789
+
790
+ ob->size -= rewind;
791
+ if (rndr->cb.normal_text) {
792
+ link_text = rndr_newbuf(rndr, BUFFER_SPAN);
793
+ rndr->cb.normal_text(link_text, link, rndr->opaque);
794
+ rndr->cb.link(ob, link_url, NULL, link_text, rndr->opaque);
795
+ rndr_popbuf(rndr, BUFFER_SPAN);
796
+ } else {
797
+ rndr->cb.link(ob, link_url, NULL, link, rndr->opaque);
798
+ }
799
+ rndr_popbuf(rndr, BUFFER_SPAN);
800
+ }
801
+
802
+ rndr_popbuf(rndr, BUFFER_SPAN);
803
+ return link_len;
804
+ }
805
+
806
+ static size_t
807
+ char_autolink_email(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
808
+ {
809
+ struct buf *link;
810
+ size_t link_len, rewind;
811
+
812
+ if (!rndr->cb.autolink || rndr->in_link_body)
813
+ return 0;
814
+
815
+ link = rndr_newbuf(rndr, BUFFER_SPAN);
816
+
817
+ if ((link_len = sd_autolink__email(&rewind, link, data, offset, size, 0)) > 0) {
818
+ ob->size -= rewind;
819
+ rndr->cb.autolink(ob, link, MKDA_EMAIL, rndr->opaque);
820
+ }
821
+
822
+ rndr_popbuf(rndr, BUFFER_SPAN);
823
+ return link_len;
824
+ }
825
+
826
+ static size_t
827
+ char_autolink_url(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
828
+ {
829
+ struct buf *link;
830
+ size_t link_len, rewind;
831
+
832
+ if (!rndr->cb.autolink || rndr->in_link_body)
833
+ return 0;
834
+
835
+ link = rndr_newbuf(rndr, BUFFER_SPAN);
836
+
837
+ if ((link_len = sd_autolink__url(&rewind, link, data, offset, size, 0)) > 0) {
838
+ ob->size -= rewind;
839
+ rndr->cb.autolink(ob, link, MKDA_NORMAL, rndr->opaque);
840
+ }
841
+
842
+ rndr_popbuf(rndr, BUFFER_SPAN);
843
+ return link_len;
844
+ }
845
+
846
+ /* char_link • '[': parsing a link or an image */
847
+ static size_t
848
+ char_link(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
849
+ {
850
+ int is_img = (offset && data[-1] == '!'), level;
851
+ size_t i = 1, txt_e, link_b = 0, link_e = 0, title_b = 0, title_e = 0;
852
+ struct buf *content = 0;
853
+ struct buf *link = 0;
854
+ struct buf *title = 0;
855
+ struct buf *u_link = 0;
856
+ size_t org_work_size = rndr->work_bufs[BUFFER_SPAN].size;
857
+ int text_has_nl = 0, ret = 0;
858
+ int in_title = 0, qtype = 0;
859
+
860
+ /* checking whether the correct renderer exists */
861
+ if ((is_img && !rndr->cb.image) || (!is_img && !rndr->cb.link))
862
+ goto cleanup;
863
+
864
+ /* looking for the matching closing bracket */
865
+ for (level = 1; i < size; i++) {
866
+ if (data[i] == '\n')
867
+ text_has_nl = 1;
868
+
869
+ else if (data[i - 1] == '\\')
870
+ continue;
871
+
872
+ else if (data[i] == '[')
873
+ level++;
874
+
875
+ else if (data[i] == ']') {
876
+ level--;
877
+ if (level <= 0)
878
+ break;
879
+ }
880
+ }
881
+
882
+ if (i >= size)
883
+ goto cleanup;
884
+
885
+ txt_e = i;
886
+ i++;
887
+
888
+ /* skip any amount of whitespace or newline */
889
+ /* (this is much more laxist than original markdown syntax) */
890
+ while (i < size && _isspace(data[i]))
891
+ i++;
892
+
893
+ /* inline style link */
894
+ if (i < size && data[i] == '(') {
895
+ /* skipping initial whitespace */
896
+ i++;
897
+
898
+ while (i < size && _isspace(data[i]))
899
+ i++;
900
+
901
+ link_b = i;
902
+
903
+ /* looking for link end: ' " ) */
904
+ /* Count the number of open parenthesis */
905
+ size_t nb_p = 0;
906
+
907
+ while (i < size) {
908
+ if (data[i] == '\\') i += 2;
909
+ else if (data[i] == '(' && i != 0) {
910
+ nb_p++; i++;
911
+ }
912
+ else if (data[i] == ')') {
913
+ if (nb_p == 0) break;
914
+ else nb_p--; i++;
915
+ } else if (i >= 1 && _isspace(data[i-1]) && (data[i] == '\'' || data[i] == '"')) break;
916
+ else i++;
917
+ }
918
+
919
+ if (i >= size) goto cleanup;
920
+ link_e = i;
921
+
922
+ /* looking for title end if present */
923
+ if (data[i] == '\'' || data[i] == '"') {
924
+ qtype = data[i];
925
+ in_title = 1;
926
+ i++;
927
+ title_b = i;
928
+
929
+ while (i < size) {
930
+ if (data[i] == '\\') i += 2;
931
+ else if (data[i] == qtype) {in_title = 0; i++;}
932
+ else if ((data[i] == ')') && !in_title) break;
933
+ else i++;
934
+ }
935
+
936
+ if (i >= size) goto cleanup;
937
+
938
+ /* skipping whitespaces after title */
939
+ title_e = i - 1;
940
+ while (title_e > title_b && _isspace(data[title_e]))
941
+ title_e--;
942
+
943
+ /* checking for closing quote presence */
944
+ if (data[title_e] != '\'' && data[title_e] != '"') {
945
+ title_b = title_e = 0;
946
+ link_e = i;
947
+ }
948
+ }
949
+
950
+ /* remove whitespace at the end of the link */
951
+ while (link_e > link_b && _isspace(data[link_e - 1]))
952
+ link_e--;
953
+
954
+ /* remove optional angle brackets around the link */
955
+ if (data[link_b] == '<') link_b++;
956
+ if (data[link_e - 1] == '>') link_e--;
957
+
958
+ /* building escaped link and title */
959
+ if (link_e > link_b) {
960
+ link = rndr_newbuf(rndr, BUFFER_SPAN);
961
+ bufput(link, data + link_b, link_e - link_b);
962
+ }
963
+
964
+ if (title_e > title_b) {
965
+ title = rndr_newbuf(rndr, BUFFER_SPAN);
966
+ bufput(title, data + title_b, title_e - title_b);
967
+ }
968
+
969
+ i++;
970
+ }
971
+
972
+ /* reference style link */
973
+ else if (i < size && data[i] == '[') {
974
+ struct buf id = { 0, 0, 0, 0 };
975
+ struct link_ref *lr;
976
+
977
+ /* looking for the id */
978
+ i++;
979
+ link_b = i;
980
+ while (i < size && data[i] != ']') i++;
981
+ if (i >= size) goto cleanup;
982
+ link_e = i;
983
+
984
+ /* finding the link_ref */
985
+ if (link_b == link_e) {
986
+ if (text_has_nl) {
987
+ struct buf *b = rndr_newbuf(rndr, BUFFER_SPAN);
988
+ size_t j;
989
+
990
+ for (j = 1; j < txt_e; j++) {
991
+ if (data[j] != '\n')
992
+ bufputc(b, data[j]);
993
+ else if (data[j - 1] != ' ')
994
+ bufputc(b, ' ');
995
+ }
996
+
997
+ id.data = b->data;
998
+ id.size = b->size;
999
+ } else {
1000
+ id.data = data + 1;
1001
+ id.size = txt_e - 1;
1002
+ }
1003
+ } else {
1004
+ id.data = data + link_b;
1005
+ id.size = link_e - link_b;
1006
+ }
1007
+
1008
+ lr = find_link_ref(rndr->refs, id.data, id.size);
1009
+ if (!lr)
1010
+ goto cleanup;
1011
+
1012
+ /* keeping link and title from link_ref */
1013
+ link = lr->link;
1014
+ title = lr->title;
1015
+ i++;
1016
+ }
1017
+
1018
+ /* shortcut reference style link */
1019
+ else {
1020
+ struct buf id = { 0, 0, 0, 0 };
1021
+ struct link_ref *lr;
1022
+
1023
+ /* crafting the id */
1024
+ if (text_has_nl) {
1025
+ struct buf *b = rndr_newbuf(rndr, BUFFER_SPAN);
1026
+ size_t j;
1027
+
1028
+ for (j = 1; j < txt_e; j++) {
1029
+ if (data[j] != '\n')
1030
+ bufputc(b, data[j]);
1031
+ else if (data[j - 1] != ' ')
1032
+ bufputc(b, ' ');
1033
+ }
1034
+
1035
+ id.data = b->data;
1036
+ id.size = b->size;
1037
+ } else {
1038
+ id.data = data + 1;
1039
+ id.size = txt_e - 1;
1040
+ }
1041
+
1042
+ /* finding the link_ref */
1043
+ lr = find_link_ref(rndr->refs, id.data, id.size);
1044
+ if (!lr)
1045
+ goto cleanup;
1046
+
1047
+ /* keeping link and title from link_ref */
1048
+ link = lr->link;
1049
+ title = lr->title;
1050
+
1051
+ /* rewinding the whitespace */
1052
+ i = txt_e + 1;
1053
+ }
1054
+
1055
+ /* building content: img alt is escaped, link content is parsed */
1056
+ if (txt_e > 1) {
1057
+ content = rndr_newbuf(rndr, BUFFER_SPAN);
1058
+ if (is_img) {
1059
+ bufput(content, data + 1, txt_e - 1);
1060
+ } else {
1061
+ /* disable autolinking when parsing inline the
1062
+ * content of a link */
1063
+ rndr->in_link_body = 1;
1064
+ parse_inline(content, rndr, data + 1, txt_e - 1);
1065
+ rndr->in_link_body = 0;
1066
+ }
1067
+ }
1068
+
1069
+ if (link) {
1070
+ u_link = rndr_newbuf(rndr, BUFFER_SPAN);
1071
+ unscape_text(u_link, link);
1072
+ }
1073
+
1074
+ /* calling the relevant rendering function */
1075
+ if (is_img) {
1076
+ if (ob->size && ob->data[ob->size - 1] == '!')
1077
+ ob->size -= 1;
1078
+
1079
+ ret = rndr->cb.image(ob, u_link, title, content, rndr->opaque);
1080
+ } else {
1081
+ ret = rndr->cb.link(ob, u_link, title, content, rndr->opaque);
1082
+ }
1083
+
1084
+ /* cleanup */
1085
+ cleanup:
1086
+ rndr->work_bufs[BUFFER_SPAN].size = (int)org_work_size;
1087
+ return ret ? i : 0;
1088
+ }
1089
+
1090
+ static size_t
1091
+ char_superscript(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
1092
+ {
1093
+ size_t sup_start, sup_len;
1094
+ struct buf *sup;
1095
+
1096
+ if (!rndr->cb.superscript)
1097
+ return 0;
1098
+
1099
+ if (size < 2)
1100
+ return 0;
1101
+
1102
+ if (data[1] == '(') {
1103
+ sup_start = sup_len = 2;
1104
+
1105
+ while (sup_len < size && data[sup_len] != ')' && data[sup_len - 1] != '\\')
1106
+ sup_len++;
1107
+
1108
+ if (sup_len == size)
1109
+ return 0;
1110
+ } else {
1111
+ sup_start = sup_len = 1;
1112
+
1113
+ while (sup_len < size && !_isspace(data[sup_len]))
1114
+ sup_len++;
1115
+ }
1116
+
1117
+ if (sup_len - sup_start == 0)
1118
+ return (sup_start == 2) ? 3 : 0;
1119
+
1120
+ sup = rndr_newbuf(rndr, BUFFER_SPAN);
1121
+ parse_inline(sup, rndr, data + sup_start, sup_len - sup_start);
1122
+ rndr->cb.superscript(ob, sup, rndr->opaque);
1123
+ rndr_popbuf(rndr, BUFFER_SPAN);
1124
+
1125
+ return (sup_start == 2) ? sup_len + 1 : sup_len;
1126
+ }
1127
+
1128
+ /*********************************
1129
+ * BLOCK-LEVEL PARSING FUNCTIONS *
1130
+ *********************************/
1131
+
1132
+ /* is_empty • returns the line length when it is empty, 0 otherwise */
1133
+ static size_t
1134
+ is_empty(uint8_t *data, size_t size)
1135
+ {
1136
+ size_t i;
1137
+
1138
+ for (i = 0; i < size && data[i] != '\n'; i++)
1139
+ if (data[i] != ' ')
1140
+ return 0;
1141
+
1142
+ return i + 1;
1143
+ }
1144
+
1145
+ /* is_hrule • returns whether a line is a horizontal rule */
1146
+ static int
1147
+ is_hrule(uint8_t *data, size_t size)
1148
+ {
1149
+ size_t i = 0, n = 0;
1150
+ uint8_t c;
1151
+
1152
+ /* skipping initial spaces */
1153
+ if (size < 3) return 0;
1154
+ if (data[0] == ' ') { i++;
1155
+ if (data[1] == ' ') { i++;
1156
+ if (data[2] == ' ') { i++; } } }
1157
+
1158
+ /* looking at the hrule uint8_t */
1159
+ if (i + 2 >= size
1160
+ || (data[i] != '*' && data[i] != '-' && data[i] != '_'))
1161
+ return 0;
1162
+ c = data[i];
1163
+
1164
+ /* the whole line must be the char or whitespace */
1165
+ while (i < size && data[i] != '\n') {
1166
+ if (data[i] == c) n++;
1167
+ else if (data[i] != ' ')
1168
+ return 0;
1169
+
1170
+ i++;
1171
+ }
1172
+
1173
+ return n >= 3;
1174
+ }
1175
+
1176
+ /* check if a line begins with a code fence; return the
1177
+ * width of the code fence */
1178
+ static size_t
1179
+ prefix_codefence(uint8_t *data, size_t size)
1180
+ {
1181
+ size_t i = 0, n = 0;
1182
+ uint8_t c;
1183
+
1184
+ /* skipping initial spaces */
1185
+ if (size < 3) return 0;
1186
+ if (data[0] == ' ') { i++;
1187
+ if (data[1] == ' ') { i++;
1188
+ if (data[2] == ' ') { i++; } } }
1189
+
1190
+ /* looking at the hrule uint8_t */
1191
+ if (i + 2 >= size || !(data[i] == '~' || data[i] == '`'))
1192
+ return 0;
1193
+
1194
+ c = data[i];
1195
+
1196
+ /* the whole line must be the uint8_t or whitespace */
1197
+ while (i < size && data[i] == c) {
1198
+ n++; i++;
1199
+ }
1200
+
1201
+ if (n < 3)
1202
+ return 0;
1203
+
1204
+ return i;
1205
+ }
1206
+
1207
+ /* check if a line is a code fence; return its size if it is */
1208
+ static size_t
1209
+ is_codefence(uint8_t *data, size_t size, struct buf *syntax)
1210
+ {
1211
+ size_t i = 0, syn_len = 0;
1212
+ uint8_t *syn_start;
1213
+
1214
+ i = prefix_codefence(data, size);
1215
+ if (i == 0)
1216
+ return 0;
1217
+
1218
+ while (i < size && data[i] == ' ')
1219
+ i++;
1220
+
1221
+ syn_start = data + i;
1222
+
1223
+ if (i < size && data[i] == '{') {
1224
+ i++; syn_start++;
1225
+
1226
+ while (i < size && data[i] != '}' && data[i] != '\n') {
1227
+ syn_len++; i++;
1228
+ }
1229
+
1230
+ if (i == size || data[i] != '}')
1231
+ return 0;
1232
+
1233
+ /* strip all whitespace at the beginning and the end
1234
+ * of the {} block */
1235
+ while (syn_len > 0 && _isspace(syn_start[0])) {
1236
+ syn_start++; syn_len--;
1237
+ }
1238
+
1239
+ while (syn_len > 0 && _isspace(syn_start[syn_len - 1]))
1240
+ syn_len--;
1241
+
1242
+ i++;
1243
+ } else {
1244
+ while (i < size && !_isspace(data[i])) {
1245
+ syn_len++; i++;
1246
+ }
1247
+ }
1248
+
1249
+ if (syntax) {
1250
+ syntax->data = syn_start;
1251
+ syntax->size = syn_len;
1252
+ }
1253
+
1254
+ while (i < size && data[i] != '\n') {
1255
+ if (!_isspace(data[i]))
1256
+ return 0;
1257
+
1258
+ i++;
1259
+ }
1260
+
1261
+ return i + 1;
1262
+ }
1263
+
1264
+ /* is_atxheader • returns whether the line is a hash-prefixed header */
1265
+ static int
1266
+ is_atxheader(struct sd_markdown *rndr, uint8_t *data, size_t size)
1267
+ {
1268
+ if (data[0] != '#')
1269
+ return 0;
1270
+
1271
+ if (rndr->ext_flags & MKDEXT_SPACE_HEADERS) {
1272
+ size_t level = 0;
1273
+
1274
+ while (level < size && level < 6 && data[level] == '#')
1275
+ level++;
1276
+
1277
+ if (level < size && data[level] != ' ')
1278
+ return 0;
1279
+ }
1280
+
1281
+ return 1;
1282
+ }
1283
+
1284
+ /* is_headerline • returns whether the line is a setext-style hdr underline */
1285
+ static int
1286
+ is_headerline(uint8_t *data, size_t size)
1287
+ {
1288
+ size_t i = 0;
1289
+
1290
+ /* test of level 1 header */
1291
+ if (data[i] == '=') {
1292
+ for (i = 1; i < size && data[i] == '='; i++);
1293
+ while (i < size && data[i] == ' ') i++;
1294
+ return (i >= size || data[i] == '\n') ? 1 : 0; }
1295
+
1296
+ /* test of level 2 header */
1297
+ if (data[i] == '-') {
1298
+ for (i = 1; i < size && data[i] == '-'; i++);
1299
+ while (i < size && data[i] == ' ') i++;
1300
+ return (i >= size || data[i] == '\n') ? 2 : 0; }
1301
+
1302
+ return 0;
1303
+ }
1304
+
1305
+ static int
1306
+ is_next_headerline(uint8_t *data, size_t size)
1307
+ {
1308
+ size_t i = 0;
1309
+
1310
+ while (i < size && data[i] != '\n')
1311
+ i++;
1312
+
1313
+ if (++i >= size)
1314
+ return 0;
1315
+
1316
+ return is_headerline(data + i, size - i);
1317
+ }
1318
+
1319
+ /* prefix_quote • returns blockquote prefix length */
1320
+ static size_t
1321
+ prefix_quote(uint8_t *data, size_t size)
1322
+ {
1323
+ size_t i = 0;
1324
+ if (i < size && data[i] == ' ') i++;
1325
+ if (i < size && data[i] == ' ') i++;
1326
+ if (i < size && data[i] == ' ') i++;
1327
+
1328
+ if (i < size && data[i] == '>') {
1329
+ if (i + 1 < size && data[i + 1] == ' ')
1330
+ return i + 2;
1331
+
1332
+ return i + 1;
1333
+ }
1334
+
1335
+ return 0;
1336
+ }
1337
+
1338
+ /* prefix_code • returns prefix length for block code*/
1339
+ static size_t
1340
+ prefix_code(uint8_t *data, size_t size)
1341
+ {
1342
+ if (size > 3 && data[0] == ' ' && data[1] == ' '
1343
+ && data[2] == ' ' && data[3] == ' ') return 4;
1344
+
1345
+ return 0;
1346
+ }
1347
+
1348
+ /* prefix_oli • returns ordered list item prefix */
1349
+ static size_t
1350
+ prefix_oli(uint8_t *data, size_t size)
1351
+ {
1352
+ size_t i = 0;
1353
+
1354
+ if (i < size && data[i] == ' ') i++;
1355
+ if (i < size && data[i] == ' ') i++;
1356
+ if (i < size && data[i] == ' ') i++;
1357
+
1358
+ if (i >= size || data[i] < '0' || data[i] > '9')
1359
+ return 0;
1360
+
1361
+ while (i < size && data[i] >= '0' && data[i] <= '9')
1362
+ i++;
1363
+
1364
+ if (i + 1 >= size || data[i] != '.' || data[i + 1] != ' ')
1365
+ return 0;
1366
+
1367
+ if (is_next_headerline(data + i, size - i))
1368
+ return 0;
1369
+
1370
+ return i + 2;
1371
+ }
1372
+
1373
+ /* prefix_uli • returns ordered list item prefix */
1374
+ static size_t
1375
+ prefix_uli(uint8_t *data, size_t size)
1376
+ {
1377
+ size_t i = 0;
1378
+
1379
+ if (i < size && data[i] == ' ') i++;
1380
+ if (i < size && data[i] == ' ') i++;
1381
+ if (i < size && data[i] == ' ') i++;
1382
+
1383
+ if (i + 1 >= size ||
1384
+ (data[i] != '*' && data[i] != '+' && data[i] != '-') ||
1385
+ data[i + 1] != ' ')
1386
+ return 0;
1387
+
1388
+ if (is_next_headerline(data + i, size - i))
1389
+ return 0;
1390
+
1391
+ return i + 2;
1392
+ }
1393
+
1394
+
1395
+ /* parse_block • parsing of one block, returning next uint8_t to parse */
1396
+ static void parse_block(struct buf *ob, struct sd_markdown *rndr,
1397
+ uint8_t *data, size_t size);
1398
+
1399
+
1400
+ /* parse_blockquote • handles parsing of a blockquote fragment */
1401
+ static size_t
1402
+ parse_blockquote(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)
1403
+ {
1404
+ size_t beg, end = 0, pre, work_size = 0;
1405
+ uint8_t *work_data = 0;
1406
+ struct buf *out = 0;
1407
+
1408
+ out = rndr_newbuf(rndr, BUFFER_BLOCK);
1409
+ beg = 0;
1410
+ while (beg < size) {
1411
+ for (end = beg + 1; end < size && data[end - 1] != '\n'; end++);
1412
+
1413
+ pre = prefix_quote(data + beg, end - beg);
1414
+
1415
+ if (pre)
1416
+ beg += pre; /* skipping prefix */
1417
+
1418
+ /* empty line followed by non-quote line */
1419
+ else if (is_empty(data + beg, end - beg) &&
1420
+ (end >= size || (prefix_quote(data + end, size - end) == 0 &&
1421
+ !is_empty(data + end, size - end))))
1422
+ break;
1423
+
1424
+ if (beg < end) { /* copy into the in-place working buffer */
1425
+ /* bufput(work, data + beg, end - beg); */
1426
+ if (!work_data)
1427
+ work_data = data + beg;
1428
+ else if (data + beg != work_data + work_size)
1429
+ memmove(work_data + work_size, data + beg, end - beg);
1430
+ work_size += end - beg;
1431
+ }
1432
+ beg = end;
1433
+ }
1434
+
1435
+ parse_block(out, rndr, work_data, work_size);
1436
+ if (rndr->cb.blockquote)
1437
+ rndr->cb.blockquote(ob, out, rndr->opaque);
1438
+ rndr_popbuf(rndr, BUFFER_BLOCK);
1439
+ return end;
1440
+ }
1441
+
1442
+ static size_t
1443
+ parse_htmlblock(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, int do_render);
1444
+
1445
+ /* parse_blockquote • handles parsing of a regular paragraph */
1446
+ static size_t
1447
+ parse_paragraph(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)
1448
+ {
1449
+ size_t i = 0, end = 0;
1450
+ int level = 0;
1451
+ struct buf work = { data, 0, 0, 0 };
1452
+
1453
+ while (i < size) {
1454
+ for (end = i + 1; end < size && data[end - 1] != '\n'; end++) /* empty */;
1455
+
1456
+ if (is_empty(data + i, size - i))
1457
+ break;
1458
+
1459
+ if ((level = is_headerline(data + i, size - i)) != 0)
1460
+ break;
1461
+
1462
+ if (is_atxheader(rndr, data + i, size - i) ||
1463
+ is_hrule(data + i, size - i) ||
1464
+ prefix_quote(data + i, size - i)) {
1465
+ end = i;
1466
+ break;
1467
+ }
1468
+
1469
+ /*
1470
+ * Early termination of a paragraph with the same logic
1471
+ * as Markdown 1.0.0. If this logic is applied, the
1472
+ * Markdown 1.0.3 test suite won't pass cleanly
1473
+ *
1474
+ * :: If the first character in a new line is not a letter,
1475
+ * let's check to see if there's some kind of block starting
1476
+ * here
1477
+ */
1478
+ if ((rndr->ext_flags & MKDEXT_LAX_SPACING) && !isalnum(data[i])) {
1479
+ if (prefix_oli(data + i, size - i) ||
1480
+ prefix_uli(data + i, size - i)) {
1481
+ end = i;
1482
+ break;
1483
+ }
1484
+
1485
+ /* see if an html block starts here */
1486
+ if (data[i] == '<' && rndr->cb.blockhtml &&
1487
+ parse_htmlblock(ob, rndr, data + i, size - i, 0)) {
1488
+ end = i;
1489
+ break;
1490
+ }
1491
+
1492
+ /* see if a code fence starts here */
1493
+ if ((rndr->ext_flags & MKDEXT_FENCED_CODE) != 0 &&
1494
+ is_codefence(data + i, size - i, NULL) != 0) {
1495
+ end = i;
1496
+ break;
1497
+ }
1498
+ }
1499
+
1500
+ i = end;
1501
+ }
1502
+
1503
+ work.size = i;
1504
+ while (work.size && data[work.size - 1] == '\n')
1505
+ work.size--;
1506
+
1507
+ if (!level) {
1508
+ struct buf *tmp = rndr_newbuf(rndr, BUFFER_BLOCK);
1509
+ parse_inline(tmp, rndr, work.data, work.size);
1510
+ if (rndr->cb.paragraph)
1511
+ rndr->cb.paragraph(ob, tmp, rndr->opaque);
1512
+ rndr_popbuf(rndr, BUFFER_BLOCK);
1513
+ } else {
1514
+ struct buf *header_work;
1515
+
1516
+ if (work.size) {
1517
+ size_t beg;
1518
+ i = work.size;
1519
+ work.size -= 1;
1520
+
1521
+ while (work.size && data[work.size] != '\n')
1522
+ work.size -= 1;
1523
+
1524
+ beg = work.size + 1;
1525
+ while (work.size && data[work.size - 1] == '\n')
1526
+ work.size -= 1;
1527
+
1528
+ if (work.size > 0) {
1529
+ struct buf *tmp = rndr_newbuf(rndr, BUFFER_BLOCK);
1530
+ parse_inline(tmp, rndr, work.data, work.size);
1531
+
1532
+ if (rndr->cb.paragraph)
1533
+ rndr->cb.paragraph(ob, tmp, rndr->opaque);
1534
+
1535
+ rndr_popbuf(rndr, BUFFER_BLOCK);
1536
+ work.data += beg;
1537
+ work.size = i - beg;
1538
+ }
1539
+ else work.size = i;
1540
+ }
1541
+
1542
+ header_work = rndr_newbuf(rndr, BUFFER_SPAN);
1543
+ parse_inline(header_work, rndr, work.data, work.size);
1544
+
1545
+ if (rndr->cb.header)
1546
+ rndr->cb.header(ob, header_work, (int)level, rndr->opaque);
1547
+
1548
+ rndr_popbuf(rndr, BUFFER_SPAN);
1549
+ }
1550
+
1551
+ return end;
1552
+ }
1553
+
1554
+ /* parse_fencedcode • handles parsing of a block-level code fragment */
1555
+ static size_t
1556
+ parse_fencedcode(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)
1557
+ {
1558
+ size_t beg, end;
1559
+ struct buf *work = 0;
1560
+ struct buf lang = { 0, 0, 0, 0 };
1561
+
1562
+ beg = is_codefence(data, size, &lang);
1563
+ if (beg == 0) return 0;
1564
+
1565
+ work = rndr_newbuf(rndr, BUFFER_BLOCK);
1566
+
1567
+ while (beg < size) {
1568
+ size_t fence_end;
1569
+ struct buf fence_trail = { 0, 0, 0, 0 };
1570
+
1571
+ fence_end = is_codefence(data + beg, size - beg, &fence_trail);
1572
+ if (fence_end != 0 && fence_trail.size == 0) {
1573
+ beg += fence_end;
1574
+ break;
1575
+ }
1576
+
1577
+ for (end = beg + 1; end < size && data[end - 1] != '\n'; end++);
1578
+
1579
+ if (beg < end) {
1580
+ /* verbatim copy to the working buffer,
1581
+ escaping entities */
1582
+ if (is_empty(data + beg, end - beg))
1583
+ bufputc(work, '\n');
1584
+ else bufput(work, data + beg, end - beg);
1585
+ }
1586
+ beg = end;
1587
+ }
1588
+
1589
+ if (work->size && work->data[work->size - 1] != '\n')
1590
+ bufputc(work, '\n');
1591
+
1592
+ if (rndr->cb.blockcode)
1593
+ rndr->cb.blockcode(ob, work, lang.size ? &lang : NULL, rndr->opaque);
1594
+
1595
+ rndr_popbuf(rndr, BUFFER_BLOCK);
1596
+ return beg;
1597
+ }
1598
+
1599
+ static size_t
1600
+ parse_blockcode(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)
1601
+ {
1602
+ size_t beg, end, pre;
1603
+ struct buf *work = 0;
1604
+
1605
+ work = rndr_newbuf(rndr, BUFFER_BLOCK);
1606
+
1607
+ beg = 0;
1608
+ while (beg < size) {
1609
+ for (end = beg + 1; end < size && data[end - 1] != '\n'; end++) {};
1610
+ pre = prefix_code(data + beg, end - beg);
1611
+
1612
+ if (pre)
1613
+ beg += pre; /* skipping prefix */
1614
+ else if (!is_empty(data + beg, end - beg))
1615
+ /* non-empty non-prefixed line breaks the pre */
1616
+ break;
1617
+
1618
+ if (beg < end) {
1619
+ /* verbatim copy to the working buffer,
1620
+ escaping entities */
1621
+ if (is_empty(data + beg, end - beg))
1622
+ bufputc(work, '\n');
1623
+ else bufput(work, data + beg, end - beg);
1624
+ }
1625
+ beg = end;
1626
+ }
1627
+
1628
+ while (work->size && work->data[work->size - 1] == '\n')
1629
+ work->size -= 1;
1630
+
1631
+ bufputc(work, '\n');
1632
+
1633
+ if (rndr->cb.blockcode)
1634
+ rndr->cb.blockcode(ob, work, NULL, rndr->opaque);
1635
+
1636
+ rndr_popbuf(rndr, BUFFER_BLOCK);
1637
+ return beg;
1638
+ }
1639
+
1640
+ /* parse_listitem • parsing of a single list item */
1641
+ /* assuming initial prefix is already removed */
1642
+ static size_t
1643
+ parse_listitem(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, int *flags)
1644
+ {
1645
+ struct buf *work = 0, *inter = 0;
1646
+ size_t beg = 0, end, pre, sublist = 0, orgpre = 0, i;
1647
+ int in_empty = 0, has_inside_empty = 0, in_fence = 0;
1648
+
1649
+ /* keeping track of the first indentation prefix */
1650
+ while (orgpre < 3 && orgpre < size && data[orgpre] == ' ')
1651
+ orgpre++;
1652
+
1653
+ beg = prefix_uli(data, size);
1654
+ if (!beg)
1655
+ beg = prefix_oli(data, size);
1656
+
1657
+ if (!beg)
1658
+ return 0;
1659
+
1660
+ /* skipping to the beginning of the following line */
1661
+ end = beg;
1662
+ while (end < size && data[end - 1] != '\n')
1663
+ end++;
1664
+
1665
+ /* getting working buffers */
1666
+ work = rndr_newbuf(rndr, BUFFER_SPAN);
1667
+ inter = rndr_newbuf(rndr, BUFFER_SPAN);
1668
+
1669
+ /* putting the first line into the working buffer */
1670
+ bufput(work, data + beg, end - beg);
1671
+ beg = end;
1672
+
1673
+ /* process the following lines */
1674
+ while (beg < size) {
1675
+ size_t has_next_uli = 0, has_next_oli = 0;
1676
+
1677
+ end++;
1678
+
1679
+ while (end < size && data[end - 1] != '\n')
1680
+ end++;
1681
+
1682
+ /* process an empty line */
1683
+ if (is_empty(data + beg, end - beg)) {
1684
+ in_empty = 1;
1685
+ beg = end;
1686
+ continue;
1687
+ }
1688
+
1689
+ /* calculating the indentation */
1690
+ i = 0;
1691
+ while (i < 4 && beg + i < end && data[beg + i] == ' ')
1692
+ i++;
1693
+
1694
+ pre = i;
1695
+
1696
+ if (rndr->ext_flags & MKDEXT_FENCED_CODE) {
1697
+ if (is_codefence(data + beg + i, end - beg - i, NULL) != 0)
1698
+ in_fence = !in_fence;
1699
+ }
1700
+
1701
+ /* Only check for new list items if we are **not** inside
1702
+ * a fenced code block */
1703
+ if (!in_fence) {
1704
+ has_next_uli = prefix_uli(data + beg + i, end - beg - i);
1705
+ has_next_oli = prefix_oli(data + beg + i, end - beg - i);
1706
+ }
1707
+
1708
+ /* checking for ul/ol switch */
1709
+ if (in_empty && (
1710
+ ((*flags & MKD_LIST_ORDERED) && has_next_uli) ||
1711
+ (!(*flags & MKD_LIST_ORDERED) && has_next_oli))){
1712
+ *flags |= MKD_LI_END;
1713
+ break; /* the following item must have same list type */
1714
+ }
1715
+
1716
+ /* checking for a new item */
1717
+ if ((has_next_uli && !is_hrule(data + beg + i, end - beg - i)) || has_next_oli) {
1718
+ if (in_empty)
1719
+ has_inside_empty = 1;
1720
+
1721
+ if (pre == orgpre) /* the following item must have */
1722
+ break; /* the same indentation */
1723
+
1724
+ if (!sublist)
1725
+ sublist = work->size;
1726
+ }
1727
+ /* joining only indented stuff after empty lines;
1728
+ * note that now we only require 1 space of indentation
1729
+ * to continue a list */
1730
+ else if (in_empty && pre == 0) {
1731
+ *flags |= MKD_LI_END;
1732
+ break;
1733
+ }
1734
+ else if (in_empty) {
1735
+ bufputc(work, '\n');
1736
+ has_inside_empty = 1;
1737
+ }
1738
+
1739
+ in_empty = 0;
1740
+
1741
+ /* adding the line without prefix into the working buffer */
1742
+ bufput(work, data + beg + i, end - beg - i);
1743
+ beg = end;
1744
+ }
1745
+
1746
+ /* render of li contents */
1747
+ if (has_inside_empty)
1748
+ *flags |= MKD_LI_BLOCK;
1749
+
1750
+ if (*flags & MKD_LI_BLOCK) {
1751
+ /* intermediate render of block li */
1752
+ if (sublist && sublist < work->size) {
1753
+ parse_block(inter, rndr, work->data, sublist);
1754
+ parse_block(inter, rndr, work->data + sublist, work->size - sublist);
1755
+ }
1756
+ else
1757
+ parse_block(inter, rndr, work->data, work->size);
1758
+ } else {
1759
+ /* intermediate render of inline li */
1760
+ if (sublist && sublist < work->size) {
1761
+ parse_inline(inter, rndr, work->data, sublist);
1762
+ parse_block(inter, rndr, work->data + sublist, work->size - sublist);
1763
+ }
1764
+ else
1765
+ parse_inline(inter, rndr, work->data, work->size);
1766
+ }
1767
+
1768
+ /* render of li itself */
1769
+ if (rndr->cb.listitem)
1770
+ rndr->cb.listitem(ob, inter, *flags, rndr->opaque);
1771
+
1772
+ rndr_popbuf(rndr, BUFFER_SPAN);
1773
+ rndr_popbuf(rndr, BUFFER_SPAN);
1774
+ return beg;
1775
+ }
1776
+
1777
+
1778
+ /* parse_list • parsing ordered or unordered list block */
1779
+ static size_t
1780
+ parse_list(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, int flags)
1781
+ {
1782
+ struct buf *work = 0;
1783
+ size_t i = 0, j;
1784
+
1785
+ work = rndr_newbuf(rndr, BUFFER_BLOCK);
1786
+
1787
+ while (i < size) {
1788
+ j = parse_listitem(work, rndr, data + i, size - i, &flags);
1789
+ i += j;
1790
+
1791
+ if (!j || (flags & MKD_LI_END))
1792
+ break;
1793
+ }
1794
+
1795
+ if (rndr->cb.list)
1796
+ rndr->cb.list(ob, work, flags, rndr->opaque);
1797
+ rndr_popbuf(rndr, BUFFER_BLOCK);
1798
+ return i;
1799
+ }
1800
+
1801
+ /* parse_atxheader • parsing of atx-style headers */
1802
+ static size_t
1803
+ parse_atxheader(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)
1804
+ {
1805
+ size_t level = 0;
1806
+ size_t i, end, skip;
1807
+
1808
+ while (level < size && level < 6 && data[level] == '#')
1809
+ level++;
1810
+
1811
+ for (i = level; i < size && data[i] == ' '; i++);
1812
+
1813
+ for (end = i; end < size && data[end] != '\n'; end++);
1814
+ skip = end;
1815
+
1816
+ while (end && data[end - 1] == '#')
1817
+ end--;
1818
+
1819
+ while (end && data[end - 1] == ' ')
1820
+ end--;
1821
+
1822
+ if (end > i) {
1823
+ struct buf *work = rndr_newbuf(rndr, BUFFER_SPAN);
1824
+
1825
+ parse_inline(work, rndr, data + i, end - i);
1826
+
1827
+ if (rndr->cb.header)
1828
+ rndr->cb.header(ob, work, (int)level, rndr->opaque);
1829
+
1830
+ rndr_popbuf(rndr, BUFFER_SPAN);
1831
+ }
1832
+
1833
+ return skip;
1834
+ }
1835
+
1836
+
1837
+ /* htmlblock_end • checking end of HTML block : </tag>[ \t]*\n[ \t*]\n */
1838
+ /* returns the length on match, 0 otherwise */
1839
+ static size_t
1840
+ htmlblock_end_tag(
1841
+ const char *tag,
1842
+ size_t tag_len,
1843
+ struct sd_markdown *rndr,
1844
+ uint8_t *data,
1845
+ size_t size)
1846
+ {
1847
+ size_t i, w;
1848
+
1849
+ /* checking if tag is a match */
1850
+ if (tag_len + 3 >= size ||
1851
+ strncasecmp((char *)data + 2, tag, tag_len) != 0 ||
1852
+ data[tag_len + 2] != '>')
1853
+ return 0;
1854
+
1855
+ /* checking white lines */
1856
+ i = tag_len + 3;
1857
+ w = 0;
1858
+ if (i < size && (w = is_empty(data + i, size - i)) == 0)
1859
+ return 0; /* non-blank after tag */
1860
+ i += w;
1861
+ w = 0;
1862
+
1863
+ if (i < size)
1864
+ w = is_empty(data + i, size - i);
1865
+
1866
+ return i + w;
1867
+ }
1868
+
1869
+ static size_t
1870
+ htmlblock_end(const char *curtag,
1871
+ struct sd_markdown *rndr,
1872
+ uint8_t *data,
1873
+ size_t size,
1874
+ int start_of_line)
1875
+ {
1876
+ size_t tag_size = strlen(curtag);
1877
+ size_t i = 1, end_tag;
1878
+ int block_lines = 0;
1879
+
1880
+ while (i < size) {
1881
+ i++;
1882
+ while (i < size && !(data[i - 1] == '<' && data[i] == '/')) {
1883
+ if (data[i] == '\n')
1884
+ block_lines++;
1885
+
1886
+ i++;
1887
+ }
1888
+
1889
+ /* If we are only looking for unindented tags, skip the tag
1890
+ * if it doesn't follow a newline.
1891
+ *
1892
+ * The only exception to this is if the tag is still on the
1893
+ * initial line; in that case it still counts as a closing
1894
+ * tag
1895
+ */
1896
+ if (start_of_line && block_lines > 0 && data[i - 2] != '\n')
1897
+ continue;
1898
+
1899
+ if (i + 2 + tag_size >= size)
1900
+ break;
1901
+
1902
+ end_tag = htmlblock_end_tag(curtag, tag_size, rndr, data + i - 1, size - i + 1);
1903
+ if (end_tag)
1904
+ return i + end_tag - 1;
1905
+ }
1906
+
1907
+ return 0;
1908
+ }
1909
+
1910
+
1911
+ /* parse_htmlblock • parsing of inline HTML block */
1912
+ static size_t
1913
+ parse_htmlblock(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, int do_render)
1914
+ {
1915
+ size_t i, j = 0, tag_end;
1916
+ const char *curtag = NULL;
1917
+ struct buf work = { data, 0, 0, 0 };
1918
+
1919
+ /* identification of the opening tag */
1920
+ if (size < 2 || data[0] != '<')
1921
+ return 0;
1922
+
1923
+ i = 1;
1924
+ while (i < size && data[i] != '>' && data[i] != ' ')
1925
+ i++;
1926
+
1927
+ if (i < size)
1928
+ curtag = find_block_tag((char *)data + 1, (int)i - 1);
1929
+
1930
+ /* handling of special cases */
1931
+ if (!curtag) {
1932
+
1933
+ /* HTML comment, laxist form */
1934
+ if (size > 5 && data[1] == '!' && data[2] == '-' && data[3] == '-') {
1935
+ i = 5;
1936
+
1937
+ while (i < size && !(data[i - 2] == '-' && data[i - 1] == '-' && data[i] == '>'))
1938
+ i++;
1939
+
1940
+ i++;
1941
+
1942
+ if (i < size)
1943
+ j = is_empty(data + i, size - i);
1944
+
1945
+ if (j) {
1946
+ work.size = i + j;
1947
+ if (do_render && rndr->cb.blockhtml)
1948
+ rndr->cb.blockhtml(ob, &work, rndr->opaque);
1949
+ return work.size;
1950
+ }
1951
+ }
1952
+
1953
+ /* HR, which is the only self-closing block tag considered */
1954
+ if (size > 4 && (data[1] == 'h' || data[1] == 'H') && (data[2] == 'r' || data[2] == 'R')) {
1955
+ i = 3;
1956
+ while (i < size && data[i] != '>')
1957
+ i++;
1958
+
1959
+ if (i + 1 < size) {
1960
+ i++;
1961
+ j = is_empty(data + i, size - i);
1962
+ if (j) {
1963
+ work.size = i + j;
1964
+ if (do_render && rndr->cb.blockhtml)
1965
+ rndr->cb.blockhtml(ob, &work, rndr->opaque);
1966
+ return work.size;
1967
+ }
1968
+ }
1969
+ }
1970
+
1971
+ /* no special case recognised */
1972
+ return 0;
1973
+ }
1974
+
1975
+ /* looking for an unindented matching closing tag */
1976
+ /* followed by a blank line */
1977
+ tag_end = htmlblock_end(curtag, rndr, data, size, 1);
1978
+
1979
+ /* if not found, trying a second pass looking for indented match */
1980
+ /* but not if tag is "ins" or "del" (following original Markdown.pl) */
1981
+ if (!tag_end && strcmp(curtag, "ins") != 0 && strcmp(curtag, "del") != 0) {
1982
+ tag_end = htmlblock_end(curtag, rndr, data, size, 0);
1983
+ }
1984
+
1985
+ if (!tag_end)
1986
+ return 0;
1987
+
1988
+ /* the end of the block has been found */
1989
+ work.size = tag_end;
1990
+ if (do_render && rndr->cb.blockhtml)
1991
+ rndr->cb.blockhtml(ob, &work, rndr->opaque);
1992
+
1993
+ return tag_end;
1994
+ }
1995
+
1996
+ static void
1997
+ parse_table_row(
1998
+ struct buf *ob,
1999
+ struct sd_markdown *rndr,
2000
+ uint8_t *data,
2001
+ size_t size,
2002
+ size_t columns,
2003
+ int *col_data,
2004
+ int header_flag)
2005
+ {
2006
+ size_t i = 0, col;
2007
+ struct buf *row_work = 0;
2008
+
2009
+ if (!rndr->cb.table_cell || !rndr->cb.table_row)
2010
+ return;
2011
+
2012
+ row_work = rndr_newbuf(rndr, BUFFER_SPAN);
2013
+
2014
+ if (i < size && data[i] == '|')
2015
+ i++;
2016
+
2017
+ for (col = 0; col < columns && i < size; ++col) {
2018
+ size_t cell_start, cell_end;
2019
+ struct buf *cell_work;
2020
+
2021
+ cell_work = rndr_newbuf(rndr, BUFFER_SPAN);
2022
+
2023
+ while (i < size && _isspace(data[i]))
2024
+ i++;
2025
+
2026
+ cell_start = i;
2027
+
2028
+ while (i < size && data[i] != '|')
2029
+ i++;
2030
+
2031
+ cell_end = i - 1;
2032
+
2033
+ while (cell_end > cell_start && _isspace(data[cell_end]))
2034
+ cell_end--;
2035
+
2036
+ parse_inline(cell_work, rndr, data + cell_start, 1 + cell_end - cell_start);
2037
+ rndr->cb.table_cell(row_work, cell_work, col_data[col] | header_flag, rndr->opaque);
2038
+
2039
+ rndr_popbuf(rndr, BUFFER_SPAN);
2040
+ i++;
2041
+ }
2042
+
2043
+ for (; col < columns; ++col) {
2044
+ struct buf empty_cell = { 0, 0, 0, 0 };
2045
+ rndr->cb.table_cell(row_work, &empty_cell, col_data[col] | header_flag, rndr->opaque);
2046
+ }
2047
+
2048
+ rndr->cb.table_row(ob, row_work, rndr->opaque);
2049
+
2050
+ rndr_popbuf(rndr, BUFFER_SPAN);
2051
+ }
2052
+
2053
+ static size_t
2054
+ parse_table_header(
2055
+ struct buf *ob,
2056
+ struct sd_markdown *rndr,
2057
+ uint8_t *data,
2058
+ size_t size,
2059
+ size_t *columns,
2060
+ int **column_data)
2061
+ {
2062
+ int pipes;
2063
+ size_t i = 0, col, header_end, under_end;
2064
+
2065
+ pipes = 0;
2066
+ while (i < size && data[i] != '\n')
2067
+ if (data[i++] == '|')
2068
+ pipes++;
2069
+
2070
+ if (i == size || pipes == 0)
2071
+ return 0;
2072
+
2073
+ header_end = i;
2074
+
2075
+ while (header_end > 0 && _isspace(data[header_end - 1]))
2076
+ header_end--;
2077
+
2078
+ if (data[0] == '|')
2079
+ pipes--;
2080
+
2081
+ if (header_end && data[header_end - 1] == '|')
2082
+ pipes--;
2083
+
2084
+ *columns = pipes + 1;
2085
+ *column_data = calloc(*columns, sizeof(int));
2086
+
2087
+ /* Parse the header underline */
2088
+ i++;
2089
+ if (i < size && data[i] == '|')
2090
+ i++;
2091
+
2092
+ under_end = i;
2093
+ while (under_end < size && data[under_end] != '\n')
2094
+ under_end++;
2095
+
2096
+ for (col = 0; col < *columns && i < under_end; ++col) {
2097
+ size_t dashes = 0;
2098
+
2099
+ while (i < under_end && data[i] == ' ')
2100
+ i++;
2101
+
2102
+ if (data[i] == ':') {
2103
+ i++; (*column_data)[col] |= MKD_TABLE_ALIGN_L;
2104
+ dashes++;
2105
+ }
2106
+
2107
+ while (i < under_end && data[i] == '-') {
2108
+ i++; dashes++;
2109
+ }
2110
+
2111
+ if (i < under_end && data[i] == ':') {
2112
+ i++; (*column_data)[col] |= MKD_TABLE_ALIGN_R;
2113
+ dashes++;
2114
+ }
2115
+
2116
+ while (i < under_end && data[i] == ' ')
2117
+ i++;
2118
+
2119
+ if (i < under_end && data[i] != '|' && data[i] != '+')
2120
+ break;
2121
+
2122
+ if (dashes < 3)
2123
+ break;
2124
+
2125
+ i++;
2126
+ }
2127
+
2128
+ if (col < *columns)
2129
+ return 0;
2130
+
2131
+ parse_table_row(
2132
+ ob, rndr, data,
2133
+ header_end,
2134
+ *columns,
2135
+ *column_data,
2136
+ MKD_TABLE_HEADER
2137
+ );
2138
+
2139
+ return under_end + 1;
2140
+ }
2141
+
2142
+ static size_t
2143
+ parse_table(
2144
+ struct buf *ob,
2145
+ struct sd_markdown *rndr,
2146
+ uint8_t *data,
2147
+ size_t size)
2148
+ {
2149
+ size_t i;
2150
+
2151
+ struct buf *header_work = 0;
2152
+ struct buf *body_work = 0;
2153
+
2154
+ size_t columns;
2155
+ int *col_data = NULL;
2156
+
2157
+ header_work = rndr_newbuf(rndr, BUFFER_SPAN);
2158
+ body_work = rndr_newbuf(rndr, BUFFER_BLOCK);
2159
+
2160
+ i = parse_table_header(header_work, rndr, data, size, &columns, &col_data);
2161
+ if (i > 0) {
2162
+
2163
+ while (i < size) {
2164
+ size_t row_start;
2165
+ int pipes = 0;
2166
+
2167
+ row_start = i;
2168
+
2169
+ while (i < size && data[i] != '\n')
2170
+ if (data[i++] == '|')
2171
+ pipes++;
2172
+
2173
+ if (pipes == 0 || i == size) {
2174
+ i = row_start;
2175
+ break;
2176
+ }
2177
+
2178
+ parse_table_row(
2179
+ body_work,
2180
+ rndr,
2181
+ data + row_start,
2182
+ i - row_start,
2183
+ columns,
2184
+ col_data, 0
2185
+ );
2186
+
2187
+ i++;
2188
+ }
2189
+
2190
+ if (rndr->cb.table)
2191
+ rndr->cb.table(ob, header_work, body_work, rndr->opaque);
2192
+ }
2193
+
2194
+ free(col_data);
2195
+ rndr_popbuf(rndr, BUFFER_SPAN);
2196
+ rndr_popbuf(rndr, BUFFER_BLOCK);
2197
+ return i;
2198
+ }
2199
+
2200
+ /* parse_block • parsing of one block, returning next uint8_t to parse */
2201
+ static void
2202
+ parse_block(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)
2203
+ {
2204
+ size_t beg, end, i;
2205
+ uint8_t *txt_data;
2206
+ beg = 0;
2207
+
2208
+ if (rndr->work_bufs[BUFFER_SPAN].size +
2209
+ rndr->work_bufs[BUFFER_BLOCK].size > rndr->max_nesting)
2210
+ return;
2211
+
2212
+ while (beg < size) {
2213
+ txt_data = data + beg;
2214
+ end = size - beg;
2215
+
2216
+ if (is_atxheader(rndr, txt_data, end))
2217
+ beg += parse_atxheader(ob, rndr, txt_data, end);
2218
+
2219
+ else if (data[beg] == '<' && rndr->cb.blockhtml &&
2220
+ (i = parse_htmlblock(ob, rndr, txt_data, end, 1)) != 0)
2221
+ beg += i;
2222
+
2223
+ else if ((i = is_empty(txt_data, end)) != 0)
2224
+ beg += i;
2225
+
2226
+ else if (is_hrule(txt_data, end)) {
2227
+ if (rndr->cb.hrule)
2228
+ rndr->cb.hrule(ob, rndr->opaque);
2229
+
2230
+ while (beg < size && data[beg] != '\n')
2231
+ beg++;
2232
+
2233
+ beg++;
2234
+ }
2235
+
2236
+ else if ((rndr->ext_flags & MKDEXT_FENCED_CODE) != 0 &&
2237
+ (i = parse_fencedcode(ob, rndr, txt_data, end)) != 0)
2238
+ beg += i;
2239
+
2240
+ else if ((rndr->ext_flags & MKDEXT_TABLES) != 0 &&
2241
+ (i = parse_table(ob, rndr, txt_data, end)) != 0)
2242
+ beg += i;
2243
+
2244
+ else if (prefix_quote(txt_data, end))
2245
+ beg += parse_blockquote(ob, rndr, txt_data, end);
2246
+
2247
+ else if (!(rndr->ext_flags & MKDEXT_DISABLE_INDENTED_CODE) && prefix_code(txt_data, end))
2248
+ beg += parse_blockcode(ob, rndr, txt_data, end);
2249
+
2250
+ else if (prefix_uli(txt_data, end))
2251
+ beg += parse_list(ob, rndr, txt_data, end, 0);
2252
+
2253
+ else if (prefix_oli(txt_data, end))
2254
+ beg += parse_list(ob, rndr, txt_data, end, MKD_LIST_ORDERED);
2255
+
2256
+ else
2257
+ beg += parse_paragraph(ob, rndr, txt_data, end);
2258
+ }
2259
+ }
2260
+
2261
+
2262
+
2263
+ /*********************
2264
+ * REFERENCE PARSING *
2265
+ *********************/
2266
+
2267
+ /* is_ref • returns whether a line is a reference or not */
2268
+ static int
2269
+ is_ref(const uint8_t *data, size_t beg, size_t end, size_t *last, struct link_ref **refs)
2270
+ {
2271
+ /* int n; */
2272
+ size_t i = 0;
2273
+ size_t id_offset, id_end;
2274
+ size_t link_offset, link_end;
2275
+ size_t title_offset, title_end;
2276
+ size_t line_end;
2277
+
2278
+ /* up to 3 optional leading spaces */
2279
+ if (beg + 3 >= end) return 0;
2280
+ if (data[beg] == ' ') { i = 1;
2281
+ if (data[beg + 1] == ' ') { i = 2;
2282
+ if (data[beg + 2] == ' ') { i = 3;
2283
+ if (data[beg + 3] == ' ') return 0; } } }
2284
+ i += beg;
2285
+
2286
+ /* id part: anything but a newline between brackets */
2287
+ if (data[i] != '[') return 0;
2288
+ i++;
2289
+ id_offset = i;
2290
+ while (i < end && data[i] != '\n' && data[i] != '\r' && data[i] != ']')
2291
+ i++;
2292
+ if (i >= end || data[i] != ']') return 0;
2293
+ id_end = i;
2294
+
2295
+ /* spacer: colon (space | tab)* newline? (space | tab)* */
2296
+ i++;
2297
+ if (i >= end || data[i] != ':') return 0;
2298
+ i++;
2299
+ while (i < end && data[i] == ' ') i++;
2300
+ if (i < end && (data[i] == '\n' || data[i] == '\r')) {
2301
+ i++;
2302
+ if (i < end && data[i] == '\r' && data[i - 1] == '\n') i++; }
2303
+ while (i < end && data[i] == ' ') i++;
2304
+ if (i >= end) return 0;
2305
+
2306
+ /* link: whitespace-free sequence, optionally between angle brackets */
2307
+ if (data[i] == '<')
2308
+ i++;
2309
+
2310
+ link_offset = i;
2311
+
2312
+ while (i < end && data[i] != ' ' && data[i] != '\n' && data[i] != '\r')
2313
+ i++;
2314
+
2315
+ if (data[i - 1] == '>') link_end = i - 1;
2316
+ else link_end = i;
2317
+
2318
+ /* optional spacer: (space | tab)* (newline | '\'' | '"' | '(' ) */
2319
+ while (i < end && data[i] == ' ') i++;
2320
+ if (i < end && data[i] != '\n' && data[i] != '\r'
2321
+ && data[i] != '\'' && data[i] != '"' && data[i] != '(')
2322
+ return 0;
2323
+ line_end = 0;
2324
+ /* computing end-of-line */
2325
+ if (i >= end || data[i] == '\r' || data[i] == '\n') line_end = i;
2326
+ if (i + 1 < end && data[i] == '\n' && data[i + 1] == '\r')
2327
+ line_end = i + 1;
2328
+
2329
+ /* optional (space|tab)* spacer after a newline */
2330
+ if (line_end) {
2331
+ i = line_end + 1;
2332
+ while (i < end && data[i] == ' ') i++; }
2333
+
2334
+ /* optional title: any non-newline sequence enclosed in '"()
2335
+ alone on its line */
2336
+ title_offset = title_end = 0;
2337
+ if (i + 1 < end
2338
+ && (data[i] == '\'' || data[i] == '"' || data[i] == '(')) {
2339
+ i++;
2340
+ title_offset = i;
2341
+ /* looking for EOL */
2342
+ while (i < end && data[i] != '\n' && data[i] != '\r') i++;
2343
+ if (i + 1 < end && data[i] == '\n' && data[i + 1] == '\r')
2344
+ title_end = i + 1;
2345
+ else title_end = i;
2346
+ /* stepping back */
2347
+ i -= 1;
2348
+ while (i > title_offset && data[i] == ' ')
2349
+ i -= 1;
2350
+ if (i > title_offset
2351
+ && (data[i] == '\'' || data[i] == '"' || data[i] == ')')) {
2352
+ line_end = title_end;
2353
+ title_end = i; } }
2354
+
2355
+ if (!line_end || link_end == link_offset)
2356
+ return 0; /* garbage after the link empty link */
2357
+
2358
+ /* a valid ref has been found, filling-in return structures */
2359
+ if (last)
2360
+ *last = line_end;
2361
+
2362
+ if (refs) {
2363
+ struct link_ref *ref;
2364
+
2365
+ ref = add_link_ref(refs, data + id_offset, id_end - id_offset);
2366
+ if (!ref)
2367
+ return 0;
2368
+
2369
+ ref->link = bufnew(link_end - link_offset);
2370
+ bufput(ref->link, data + link_offset, link_end - link_offset);
2371
+
2372
+ if (title_end > title_offset) {
2373
+ ref->title = bufnew(title_end - title_offset);
2374
+ bufput(ref->title, data + title_offset, title_end - title_offset);
2375
+ }
2376
+ }
2377
+
2378
+ return 1;
2379
+ }
2380
+
2381
+ static void expand_tabs(struct buf *ob, const uint8_t *line, size_t size)
2382
+ {
2383
+ size_t i = 0, tab = 0;
2384
+
2385
+ while (i < size) {
2386
+ size_t org = i;
2387
+
2388
+ while (i < size && line[i] != '\t') {
2389
+ i++; tab++;
2390
+ }
2391
+
2392
+ if (i > org)
2393
+ bufput(ob, line + org, i - org);
2394
+
2395
+ if (i >= size)
2396
+ break;
2397
+
2398
+ do {
2399
+ bufputc(ob, ' '); tab++;
2400
+ } while (tab % 4);
2401
+
2402
+ i++;
2403
+ }
2404
+ }
2405
+
2406
+ /**********************
2407
+ * EXPORTED FUNCTIONS *
2408
+ **********************/
2409
+
2410
+ struct sd_markdown *
2411
+ sd_markdown_new(
2412
+ unsigned int extensions,
2413
+ size_t max_nesting,
2414
+ const struct sd_callbacks *callbacks,
2415
+ void *opaque)
2416
+ {
2417
+ struct sd_markdown *md = NULL;
2418
+
2419
+ assert(max_nesting > 0 && callbacks);
2420
+
2421
+ md = malloc(sizeof(struct sd_markdown));
2422
+ if (!md)
2423
+ return NULL;
2424
+
2425
+ memcpy(&md->cb, callbacks, sizeof(struct sd_callbacks));
2426
+
2427
+ redcarpet_stack_init(&md->work_bufs[BUFFER_BLOCK], 4);
2428
+ redcarpet_stack_init(&md->work_bufs[BUFFER_SPAN], 8);
2429
+
2430
+ memset(md->active_char, 0x0, 256);
2431
+
2432
+ if (md->cb.emphasis || md->cb.double_emphasis || md->cb.triple_emphasis) {
2433
+ md->active_char['*'] = MD_CHAR_EMPHASIS;
2434
+ md->active_char['_'] = MD_CHAR_EMPHASIS;
2435
+ if (extensions & MKDEXT_STRIKETHROUGH)
2436
+ md->active_char['~'] = MD_CHAR_EMPHASIS;
2437
+ if (extensions & MKDEXT_HIGHLIGHT)
2438
+ md->active_char['='] = MD_CHAR_EMPHASIS;
2439
+ }
2440
+
2441
+ if (md->cb.codespan)
2442
+ md->active_char['`'] = MD_CHAR_CODESPAN;
2443
+
2444
+ if (md->cb.linebreak)
2445
+ md->active_char['\n'] = MD_CHAR_LINEBREAK;
2446
+
2447
+ if (md->cb.image || md->cb.link)
2448
+ md->active_char['['] = MD_CHAR_LINK;
2449
+
2450
+ md->active_char['<'] = MD_CHAR_LANGLE;
2451
+ md->active_char['\\'] = MD_CHAR_ESCAPE;
2452
+ md->active_char['&'] = MD_CHAR_ENTITITY;
2453
+
2454
+ if (extensions & MKDEXT_AUTOLINK) {
2455
+ md->active_char[':'] = MD_CHAR_AUTOLINK_URL;
2456
+ md->active_char['@'] = MD_CHAR_AUTOLINK_EMAIL;
2457
+ md->active_char['w'] = MD_CHAR_AUTOLINK_WWW;
2458
+ }
2459
+
2460
+ if (extensions & MKDEXT_SUPERSCRIPT)
2461
+ md->active_char['^'] = MD_CHAR_SUPERSCRIPT;
2462
+
2463
+ /* Extension data */
2464
+ md->ext_flags = extensions;
2465
+ md->opaque = opaque;
2466
+ md->max_nesting = max_nesting;
2467
+ md->in_link_body = 0;
2468
+
2469
+ return md;
2470
+ }
2471
+
2472
+ void
2473
+ sd_markdown_render(struct buf *ob, const uint8_t *document, size_t doc_size, struct sd_markdown *md)
2474
+ {
2475
+ #define MARKDOWN_GROW(x) ((x) + ((x) >> 1))
2476
+ static const char UTF8_BOM[] = {0xEF, 0xBB, 0xBF};
2477
+
2478
+ struct buf *text;
2479
+ size_t beg, end;
2480
+
2481
+ text = bufnew(64);
2482
+ if (!text)
2483
+ return;
2484
+
2485
+ /* Preallocate enough space for our buffer to avoid expanding while copying */
2486
+ bufgrow(text, doc_size);
2487
+
2488
+ /* reset the references table */
2489
+ memset(&md->refs, 0x0, REF_TABLE_SIZE * sizeof(void *));
2490
+
2491
+ /* first pass: looking for references, copying everything else */
2492
+ beg = 0;
2493
+
2494
+ /* Skip a possible UTF-8 BOM, even though the Unicode standard
2495
+ * discourages having these in UTF-8 documents */
2496
+ if (doc_size >= 3 && memcmp(document, UTF8_BOM, 3) == 0)
2497
+ beg += 3;
2498
+
2499
+ while (beg < doc_size) /* iterating over lines */
2500
+ if (is_ref(document, beg, doc_size, &end, md->refs))
2501
+ beg = end;
2502
+ else { /* skipping to the next line */
2503
+ end = beg;
2504
+ while (end < doc_size && document[end] != '\n' && document[end] != '\r')
2505
+ end++;
2506
+
2507
+ /* adding the line body if present */
2508
+ if (end > beg)
2509
+ expand_tabs(text, document + beg, end - beg);
2510
+
2511
+ while (end < doc_size && (document[end] == '\n' || document[end] == '\r')) {
2512
+ /* add one \n per newline */
2513
+ if (document[end] == '\n' || (end + 1 < doc_size && document[end + 1] != '\n'))
2514
+ bufputc(text, '\n');
2515
+ end++;
2516
+ }
2517
+
2518
+ beg = end;
2519
+ }
2520
+
2521
+ /* pre-grow the output buffer to minimize allocations */
2522
+ bufgrow(ob, MARKDOWN_GROW(text->size));
2523
+
2524
+ /* second pass: actual rendering */
2525
+ if (md->cb.doc_header)
2526
+ md->cb.doc_header(ob, md->opaque);
2527
+
2528
+ if (text->size) {
2529
+ /* adding a final newline if not already present */
2530
+ if (text->data[text->size - 1] != '\n' && text->data[text->size - 1] != '\r')
2531
+ bufputc(text, '\n');
2532
+
2533
+ parse_block(ob, md, text->data, text->size);
2534
+ }
2535
+
2536
+ if (md->cb.doc_footer)
2537
+ md->cb.doc_footer(ob, md->opaque);
2538
+
2539
+ /* clean-up */
2540
+ bufrelease(text);
2541
+ free_link_refs(md->refs);
2542
+
2543
+ assert(md->work_bufs[BUFFER_SPAN].size == 0);
2544
+ assert(md->work_bufs[BUFFER_BLOCK].size == 0);
2545
+ }
2546
+
2547
+ void
2548
+ sd_markdown_free(struct sd_markdown *md)
2549
+ {
2550
+ size_t i;
2551
+
2552
+ for (i = 0; i < (size_t)md->work_bufs[BUFFER_SPAN].asize; ++i)
2553
+ bufrelease(md->work_bufs[BUFFER_SPAN].item[i]);
2554
+
2555
+ for (i = 0; i < (size_t)md->work_bufs[BUFFER_BLOCK].asize; ++i)
2556
+ bufrelease(md->work_bufs[BUFFER_BLOCK].item[i]);
2557
+
2558
+ redcarpet_stack_free(&md->work_bufs[BUFFER_SPAN]);
2559
+ redcarpet_stack_free(&md->work_bufs[BUFFER_BLOCK]);
2560
+
2561
+ free(md);
2562
+ }
2563
+
2564
+ void
2565
+ sd_version(int *ver_major, int *ver_minor, int *ver_revision)
2566
+ {
2567
+ *ver_major = SUNDOWN_VER_MAJOR;
2568
+ *ver_minor = SUNDOWN_VER_MINOR;
2569
+ *ver_revision = SUNDOWN_VER_REVISION;
2570
+ }