redsnow 0.3.7 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/Rakefile +4 -4
  4. data/ext/drafter/Makefile +54 -0
  5. data/ext/drafter/appveyor.yml +10 -0
  6. data/ext/drafter/bin/drafter +0 -0
  7. data/ext/{snowcrash → drafter}/build/Makefile +29 -14
  8. data/ext/{snowcrash/build/snowcrash.Makefile → drafter/build/drafter.Makefile} +1 -1
  9. data/ext/{snowcrash/build/snowcrash.target.mk → drafter/build/drafter.target.mk} +25 -23
  10. data/ext/{snowcrash/build → drafter/build/ext/snowcrash}/libmarkdownparser.target.mk +7 -7
  11. data/ext/drafter/build/ext/snowcrash/libsnowcrash.target.mk +152 -0
  12. data/ext/{snowcrash/build → drafter/build/ext/snowcrash}/libsundown.target.mk +13 -13
  13. data/ext/{snowcrash/build → drafter/build/ext/snowcrash}/perf-libsnowcrash.target.mk +14 -20
  14. data/ext/drafter/build/ext/snowcrash/snowcrash.Makefile +6 -0
  15. data/ext/{snowcrash → drafter}/build/gyp-mac-tool +0 -0
  16. data/ext/{snowcrash/build/libsnowcrash.target.mk → drafter/build/libdrafter.target.mk} +29 -36
  17. data/ext/drafter/build/libsos.target.mk +133 -0
  18. data/ext/drafter/build/out/Release/drafter +0 -0
  19. data/ext/drafter/build/out/Release/libdrafter.dylib +0 -0
  20. data/ext/drafter/build/out/Release/libmarkdownparser.a +0 -0
  21. data/ext/drafter/build/out/Release/libsnowcrash.a +0 -0
  22. data/ext/drafter/build/out/Release/libsos.a +0 -0
  23. data/ext/{snowcrash → drafter}/build/out/Release/libsundown.a +0 -0
  24. data/ext/{snowcrash → drafter}/build/out/Release/linker.lock +0 -0
  25. data/ext/drafter/build/out/Release/obj.target/drafter/src/config.o +0 -0
  26. data/ext/drafter/build/out/Release/obj.target/drafter/src/main.o +0 -0
  27. data/ext/drafter/build/out/Release/obj.target/drafter/src/reporting.o +0 -0
  28. data/ext/drafter/build/out/Release/obj.target/libdrafter/src/Serialize.o +0 -0
  29. data/ext/drafter/build/out/Release/obj.target/libdrafter/src/SerializeAST.o +0 -0
  30. data/ext/drafter/build/out/Release/obj.target/libdrafter/src/SerializeResult.o +0 -0
  31. data/ext/drafter/build/out/Release/obj.target/libdrafter/src/SerializeSourcemap.o +0 -0
  32. data/ext/drafter/build/out/Release/obj.target/libdrafter/src/cdrafter.o +0 -0
  33. data/ext/drafter/build/out/Release/obj.target/libdrafter/src/drafter.o +0 -0
  34. data/ext/drafter/build/out/Release/obj.target/libmarkdownparser/ext/snowcrash/ext/markdown-parser/src/ByteBuffer.o +0 -0
  35. data/ext/drafter/build/out/Release/obj.target/libmarkdownparser/ext/snowcrash/ext/markdown-parser/src/MarkdownNode.o +0 -0
  36. data/ext/drafter/build/out/Release/obj.target/libmarkdownparser/ext/snowcrash/ext/markdown-parser/src/MarkdownParser.o +0 -0
  37. data/ext/drafter/build/out/Release/obj.target/libsnowcrash/ext/snowcrash/src/Blueprint.o +0 -0
  38. data/ext/drafter/build/out/Release/obj.target/libsnowcrash/ext/snowcrash/src/BlueprintSourcemap.o +0 -0
  39. data/ext/drafter/build/out/Release/obj.target/libsnowcrash/ext/snowcrash/src/HTTP.o +0 -0
  40. data/ext/drafter/build/out/Release/obj.target/libsnowcrash/ext/snowcrash/src/HeadersParser.o +0 -0
  41. data/ext/drafter/build/out/Release/obj.target/libsnowcrash/ext/snowcrash/src/MSON.o +0 -0
  42. data/ext/drafter/build/out/Release/obj.target/libsnowcrash/ext/snowcrash/src/MSONOneOfParser.o +0 -0
  43. data/ext/drafter/build/out/Release/obj.target/libsnowcrash/ext/snowcrash/src/MSONSourcemap.o +0 -0
  44. data/ext/drafter/build/out/Release/obj.target/libsnowcrash/ext/snowcrash/src/MSONTypeSectionParser.o +0 -0
  45. data/ext/drafter/build/out/Release/obj.target/libsnowcrash/ext/snowcrash/src/MSONValueMemberParser.o +0 -0
  46. data/ext/drafter/build/out/Release/obj.target/libsnowcrash/ext/snowcrash/src/Section.o +0 -0
  47. data/ext/drafter/build/out/Release/obj.target/libsnowcrash/ext/snowcrash/src/Signature.o +0 -0
  48. data/ext/drafter/build/out/Release/obj.target/libsnowcrash/ext/snowcrash/src/UriTemplateParser.o +0 -0
  49. data/ext/drafter/build/out/Release/obj.target/libsnowcrash/ext/snowcrash/src/posix/RegexMatch.o +0 -0
  50. data/ext/drafter/build/out/Release/obj.target/libsnowcrash/ext/snowcrash/src/snowcrash.o +0 -0
  51. data/ext/drafter/build/out/Release/obj.target/libsos/ext/sos/src/sos.o +0 -0
  52. data/ext/drafter/build/out/Release/obj.target/libsundown/ext/snowcrash/ext/markdown-parser/ext/sundown/html/houdini_href_e.o +0 -0
  53. data/ext/drafter/build/out/Release/obj.target/libsundown/ext/snowcrash/ext/markdown-parser/ext/sundown/html/houdini_html_e.o +0 -0
  54. data/ext/{snowcrash/build/out/Release/obj.target/libsundown → drafter/build/out/Release/obj.target/libsundown/ext/snowcrash}/ext/markdown-parser/ext/sundown/html/html.o +0 -0
  55. data/ext/{snowcrash/build/out/Release/obj.target/libsundown → drafter/build/out/Release/obj.target/libsundown/ext/snowcrash}/ext/markdown-parser/ext/sundown/html/html_smartypants.o +0 -0
  56. data/ext/{snowcrash/build/out/Release/obj.target/libsundown → drafter/build/out/Release/obj.target/libsundown/ext/snowcrash}/ext/markdown-parser/ext/sundown/src/autolink.o +0 -0
  57. data/ext/{snowcrash/build/out/Release/obj.target/libsundown → drafter/build/out/Release/obj.target/libsundown/ext/snowcrash}/ext/markdown-parser/ext/sundown/src/buffer.o +0 -0
  58. data/ext/{snowcrash/build/out/Release/obj.target/libsundown → drafter/build/out/Release/obj.target/libsundown/ext/snowcrash}/ext/markdown-parser/ext/sundown/src/markdown.o +0 -0
  59. data/ext/{snowcrash/build/out/Release/obj.target/libsundown → drafter/build/out/Release/obj.target/libsundown/ext/snowcrash}/ext/markdown-parser/ext/sundown/src/src_map.o +0 -0
  60. data/ext/drafter/build/out/Release/obj.target/libsundown/ext/snowcrash/ext/markdown-parser/ext/sundown/src/stack.o +0 -0
  61. data/ext/drafter/circle.yml +12 -0
  62. data/ext/{snowcrash → drafter}/config.gypi +1 -1
  63. data/ext/{snowcrash → drafter}/config.mk +0 -0
  64. data/ext/{snowcrash → drafter}/configure +16 -5
  65. data/ext/drafter/drafter.gyp +118 -0
  66. data/ext/{snowcrash → drafter/ext/snowcrash}/Makefile +4 -12
  67. data/ext/{snowcrash → drafter/ext/snowcrash}/Vagrantfile +14 -4
  68. data/ext/drafter/ext/snowcrash/appveyor.yml +7 -0
  69. data/ext/{snowcrash → drafter/ext/snowcrash}/common.gypi +0 -0
  70. data/ext/drafter/ext/snowcrash/configure +197 -0
  71. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/Makefile +0 -0
  72. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/CONTRIBUTING.md +0 -0
  73. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/Makefile +0 -0
  74. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/Makefile.win +0 -0
  75. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/examples/smartypants.c +0 -0
  76. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/examples/sundown.c +0 -0
  77. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/html/houdini.h +0 -0
  78. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/html/houdini_href_e.c +0 -0
  79. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/html/houdini_html_e.c +0 -0
  80. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/html/html.c +0 -0
  81. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/html/html.h +0 -0
  82. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/html/html_smartypants.c +0 -0
  83. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/html_block_names.txt +0 -0
  84. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/src/autolink.c +0 -0
  85. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/src/autolink.h +0 -0
  86. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/src/buffer.c +0 -0
  87. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/src/buffer.h +0 -0
  88. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/src/html_blocks.h +0 -0
  89. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/src/markdown.c +0 -0
  90. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/src/markdown.h +0 -0
  91. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/src/src_map.c +0 -0
  92. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/src/src_map.h +0 -0
  93. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/src/stack.c +0 -0
  94. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/src/stack.h +0 -0
  95. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/ext/sundown/sundown.def +0 -0
  96. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/msvc/markdown/markdown.vcproj +0 -0
  97. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/msvc/msvc.sln +0 -0
  98. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/msvc/sundown/sundown.vcproj +0 -0
  99. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/src/ByteBuffer.cc +0 -0
  100. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/src/ByteBuffer.h +0 -0
  101. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/src/MarkdownNode.cc +0 -0
  102. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/src/MarkdownNode.h +0 -0
  103. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/src/MarkdownParser.cc +0 -0
  104. data/ext/{snowcrash → drafter/ext/snowcrash}/ext/markdown-parser/src/MarkdownParser.h +10 -2
  105. data/ext/{snowcrash → drafter/ext/snowcrash}/provisioning.sh +0 -0
  106. data/ext/{snowcrash → drafter/ext/snowcrash}/snowcrash.gyp +41 -39
  107. data/ext/{snowcrash → drafter/ext/snowcrash}/snowcrash.xcworkspace/contents.xcworkspacedata +0 -0
  108. data/ext/{snowcrash → drafter/ext/snowcrash}/src/ActionParser.h +50 -6
  109. data/ext/{snowcrash → drafter/ext/snowcrash}/src/AssetParser.h +1 -12
  110. data/ext/drafter/ext/snowcrash/src/AttributesParser.h +121 -0
  111. data/ext/drafter/ext/snowcrash/src/Blueprint.cc +90 -0
  112. data/ext/{snowcrash → drafter/ext/snowcrash}/src/Blueprint.h +169 -33
  113. data/ext/{snowcrash → drafter/ext/snowcrash}/src/BlueprintParser.h +305 -48
  114. data/ext/drafter/ext/snowcrash/src/BlueprintSourcemap.cc +81 -0
  115. data/ext/{snowcrash → drafter/ext/snowcrash}/src/BlueprintSourcemap.h +130 -39
  116. data/ext/{snowcrash → drafter/ext/snowcrash}/src/BlueprintUtility.h +10 -4
  117. data/ext/{snowcrash → drafter/ext/snowcrash}/src/CodeBlockUtility.h +1 -1
  118. data/ext/drafter/ext/snowcrash/src/DataStructureGroupParser.h +154 -0
  119. data/ext/{snowcrash → drafter/ext/snowcrash}/src/HTTP.cc +0 -0
  120. data/ext/{snowcrash → drafter/ext/snowcrash}/src/HTTP.h +0 -0
  121. data/ext/drafter/ext/snowcrash/src/HeadersParser.cc +110 -0
  122. data/ext/{snowcrash → drafter/ext/snowcrash}/src/HeadersParser.h +123 -54
  123. data/ext/drafter/ext/snowcrash/src/MSON.cc +272 -0
  124. data/ext/drafter/ext/snowcrash/src/MSON.h +399 -0
  125. data/ext/drafter/ext/snowcrash/src/MSONMixinParser.h +95 -0
  126. data/ext/drafter/ext/snowcrash/src/MSONNamedTypeParser.h +108 -0
  127. data/ext/drafter/ext/snowcrash/src/MSONOneOfParser.cc +132 -0
  128. data/ext/drafter/ext/snowcrash/src/MSONOneOfParser.h +80 -0
  129. data/ext/drafter/ext/snowcrash/src/MSONParameterParser.h +232 -0
  130. data/ext/drafter/ext/snowcrash/src/MSONPropertyMemberParser.h +91 -0
  131. data/ext/drafter/ext/snowcrash/src/MSONSourcemap.cc +141 -0
  132. data/ext/drafter/ext/snowcrash/src/MSONSourcemap.h +181 -0
  133. data/ext/drafter/ext/snowcrash/src/MSONTypeSectionParser.cc +209 -0
  134. data/ext/drafter/ext/snowcrash/src/MSONTypeSectionParser.h +213 -0
  135. data/ext/drafter/ext/snowcrash/src/MSONUtility.h +423 -0
  136. data/ext/drafter/ext/snowcrash/src/MSONValueMemberParser.cc +179 -0
  137. data/ext/drafter/ext/snowcrash/src/MSONValueMemberParser.h +346 -0
  138. data/ext/drafter/ext/snowcrash/src/ModelTable.h +87 -0
  139. data/ext/{snowcrash → drafter/ext/snowcrash}/src/ParameterParser.h +120 -61
  140. data/ext/{snowcrash → drafter/ext/snowcrash}/src/ParametersParser.h +17 -18
  141. data/ext/{snowcrash → drafter/ext/snowcrash}/src/PayloadParser.h +36 -18
  142. data/ext/{snowcrash → drafter/ext/snowcrash}/src/Platform.h +0 -0
  143. data/ext/{snowcrash → drafter/ext/snowcrash}/src/RegexMatch.h +0 -0
  144. data/ext/drafter/ext/snowcrash/src/RelationParser.h +75 -0
  145. data/ext/{snowcrash → drafter/ext/snowcrash}/src/ResourceGroupParser.h +127 -33
  146. data/ext/{snowcrash → drafter/ext/snowcrash}/src/ResourceParser.h +126 -33
  147. data/ext/{snowcrash → drafter/ext/snowcrash}/src/Section.cc +6 -0
  148. data/ext/{snowcrash → drafter/ext/snowcrash}/src/Section.h +15 -2
  149. data/ext/{snowcrash → drafter/ext/snowcrash}/src/SectionParser.h +3 -1
  150. data/ext/{snowcrash → drafter/ext/snowcrash}/src/SectionParserData.h +15 -5
  151. data/ext/{snowcrash → drafter/ext/snowcrash}/src/SectionProcessor.h +24 -0
  152. data/ext/{snowcrash → drafter/ext/snowcrash}/src/Signature.cc +14 -0
  153. data/ext/drafter/ext/snowcrash/src/Signature.h +80 -0
  154. data/ext/drafter/ext/snowcrash/src/SignatureSectionProcessor.h +439 -0
  155. data/ext/{snowcrash → drafter/ext/snowcrash}/src/SourceAnnotation.h +3 -2
  156. data/ext/{snowcrash → drafter/ext/snowcrash}/src/StringUtility.h +103 -6
  157. data/ext/{snowcrash → drafter/ext/snowcrash}/src/UriTemplateParser.cc +0 -0
  158. data/ext/{snowcrash → drafter/ext/snowcrash}/src/UriTemplateParser.h +0 -0
  159. data/ext/{snowcrash → drafter/ext/snowcrash}/src/ValuesParser.h +1 -13
  160. data/ext/{snowcrash → drafter/ext/snowcrash}/src/posix/RegexMatch.cc +0 -0
  161. data/ext/{snowcrash → drafter/ext/snowcrash}/src/snowcrash.cc +0 -0
  162. data/ext/{snowcrash → drafter/ext/snowcrash}/src/snowcrash.h +0 -0
  163. data/ext/{snowcrash → drafter/ext/snowcrash}/src/win/RegexMatch.cc +0 -0
  164. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/AUTHORS +0 -0
  165. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/DEPS +0 -0
  166. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/OWNERS +0 -0
  167. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/PRESUBMIT.py +0 -0
  168. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/buildbot/buildbot_run.py +0 -0
  169. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/codereview.settings +0 -0
  170. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/data/win/large-pdb-shim.cc +0 -0
  171. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/gyp +0 -0
  172. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/gyp.bat +0 -0
  173. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/gyp_main.py +0 -0
  174. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/MSVSNew.py +0 -0
  175. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/MSVSProject.py +0 -0
  176. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/MSVSSettings.py +0 -0
  177. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/MSVSToolFile.py +0 -0
  178. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/MSVSUserFile.py +0 -0
  179. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/MSVSUtil.py +0 -0
  180. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/MSVSVersion.py +0 -0
  181. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/__init__.py +0 -0
  182. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/__init__.pyc +0 -0
  183. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/common.py +0 -0
  184. data/ext/drafter/ext/snowcrash/tools/gyp/pylib/gyp/common.pyc +0 -0
  185. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/easy_xml.py +0 -0
  186. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/flock_tool.py +0 -0
  187. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/generator/__init__.py +0 -0
  188. data/ext/drafter/ext/snowcrash/tools/gyp/pylib/gyp/generator/__init__.pyc +0 -0
  189. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/generator/android.py +0 -0
  190. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/generator/cmake.py +0 -0
  191. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/generator/dump_dependency_json.py +0 -0
  192. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/generator/eclipse.py +0 -0
  193. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/generator/gypd.py +0 -0
  194. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/generator/gypsh.py +0 -0
  195. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/generator/make.py +0 -0
  196. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/generator/make.pyc +0 -0
  197. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/generator/msvs.py +0 -0
  198. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/generator/ninja.py +0 -0
  199. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/generator/xcode.py +0 -0
  200. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/generator/xcode.pyc +0 -0
  201. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/input.py +0 -0
  202. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/input.pyc +0 -0
  203. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/mac_tool.py +0 -0
  204. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/msvs_emulation.py +0 -0
  205. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/ninja_syntax.py +0 -0
  206. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/ordered_dict.py +0 -0
  207. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/win_tool.py +0 -0
  208. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/xcode_emulation.py +0 -0
  209. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/xcode_emulation.pyc +0 -0
  210. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/xcodeproj_file.py +0 -0
  211. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/xcodeproj_file.pyc +0 -0
  212. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylib/gyp/xml_fix.py +0 -0
  213. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/pylintrc +0 -0
  214. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/samples/samples +0 -0
  215. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/samples/samples.bat +0 -0
  216. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/setup.py +0 -0
  217. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/tools/Xcode/Specifications/gyp.pbfilespec +0 -0
  218. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/tools/Xcode/Specifications/gyp.xclangspec +0 -0
  219. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/tools/emacs/gyp.el +0 -0
  220. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/tools/graphviz.py +0 -0
  221. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/tools/pretty_gyp.py +0 -0
  222. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/tools/pretty_sln.py +0 -0
  223. data/ext/{snowcrash → drafter/ext/snowcrash}/tools/gyp/tools/pretty_vcproj.py +0 -0
  224. data/ext/drafter/ext/snowcrash/vcbuild.bat +139 -0
  225. data/ext/drafter/ext/sos/Makefile +57 -0
  226. data/ext/drafter/ext/sos/src/sos.cc +200 -0
  227. data/ext/drafter/ext/sos/src/sos.h +179 -0
  228. data/ext/drafter/ext/sos/src/sosJSON.h +105 -0
  229. data/ext/drafter/ext/sos/src/sosYAML.h +104 -0
  230. data/ext/{snowcrash → drafter}/src/Serialize.cc +30 -15
  231. data/ext/drafter/src/Serialize.h +135 -0
  232. data/ext/drafter/src/SerializeAST.cc +775 -0
  233. data/ext/drafter/src/SerializeAST.h +19 -0
  234. data/ext/drafter/src/SerializeResult.cc +67 -0
  235. data/ext/drafter/src/SerializeResult.h +26 -0
  236. data/ext/drafter/src/SerializeSourcemap.cc +446 -0
  237. data/ext/drafter/src/SerializeSourcemap.h +19 -0
  238. data/ext/drafter/src/Version.h +38 -0
  239. data/ext/drafter/src/cdrafter.cc +44 -0
  240. data/ext/drafter/src/cdrafter.h +55 -0
  241. data/ext/drafter/src/config.cc +80 -0
  242. data/ext/drafter/src/config.h +35 -0
  243. data/ext/drafter/src/drafter.cc +22 -0
  244. data/ext/drafter/src/drafter.h +38 -0
  245. data/ext/drafter/src/main.cc +91 -0
  246. data/ext/drafter/src/reporting.cc +162 -0
  247. data/ext/drafter/src/reporting.h +28 -0
  248. data/ext/drafter/src/stream.h +146 -0
  249. data/ext/drafter/tools/homebrew/drafter.rb +12 -0
  250. data/ext/{snowcrash → drafter}/vcbuild.bat +3 -3
  251. data/lib/redsnow.rb +6 -11
  252. data/lib/redsnow/binding.rb +11 -201
  253. data/lib/redsnow/blueprint.rb +104 -169
  254. data/lib/redsnow/parseresult.rb +28 -42
  255. data/lib/redsnow/sourcemap.rb +92 -177
  256. data/lib/redsnow/version.rb +1 -1
  257. data/redsnow.gemspec +1 -1
  258. metadata +249 -197
  259. data/ext/snowcrash/bin/snowcrash +0 -0
  260. data/ext/snowcrash/build/out/Release/libmarkdownparser.a +0 -0
  261. data/ext/snowcrash/build/out/Release/libsnowcrash.dylib +0 -0
  262. data/ext/snowcrash/build/out/Release/obj.target/libmarkdownparser/ext/markdown-parser/src/ByteBuffer.o +0 -0
  263. data/ext/snowcrash/build/out/Release/obj.target/libmarkdownparser/ext/markdown-parser/src/MarkdownNode.o +0 -0
  264. data/ext/snowcrash/build/out/Release/obj.target/libmarkdownparser/ext/markdown-parser/src/MarkdownParser.o +0 -0
  265. data/ext/snowcrash/build/out/Release/obj.target/libsnowcrash/src/CBlueprint.o +0 -0
  266. data/ext/snowcrash/build/out/Release/obj.target/libsnowcrash/src/CBlueprintSourcemap.o +0 -0
  267. data/ext/snowcrash/build/out/Release/obj.target/libsnowcrash/src/CSourceAnnotation.o +0 -0
  268. data/ext/snowcrash/build/out/Release/obj.target/libsnowcrash/src/HTTP.o +0 -0
  269. data/ext/snowcrash/build/out/Release/obj.target/libsnowcrash/src/Section.o +0 -0
  270. data/ext/snowcrash/build/out/Release/obj.target/libsnowcrash/src/Serialize.o +0 -0
  271. data/ext/snowcrash/build/out/Release/obj.target/libsnowcrash/src/SerializeJSON.o +0 -0
  272. data/ext/snowcrash/build/out/Release/obj.target/libsnowcrash/src/SerializeYAML.o +0 -0
  273. data/ext/snowcrash/build/out/Release/obj.target/libsnowcrash/src/Signature.o +0 -0
  274. data/ext/snowcrash/build/out/Release/obj.target/libsnowcrash/src/UriTemplateParser.o +0 -0
  275. data/ext/snowcrash/build/out/Release/obj.target/libsnowcrash/src/csnowcrash.o +0 -0
  276. data/ext/snowcrash/build/out/Release/obj.target/libsnowcrash/src/posix/RegexMatch.o +0 -0
  277. data/ext/snowcrash/build/out/Release/obj.target/libsnowcrash/src/snowcrash.o +0 -0
  278. data/ext/snowcrash/build/out/Release/obj.target/libsundown/ext/markdown-parser/ext/sundown/html/houdini_href_e.o +0 -0
  279. data/ext/snowcrash/build/out/Release/obj.target/libsundown/ext/markdown-parser/ext/sundown/html/houdini_html_e.o +0 -0
  280. data/ext/snowcrash/build/out/Release/obj.target/libsundown/ext/markdown-parser/ext/sundown/src/stack.o +0 -0
  281. data/ext/snowcrash/build/out/Release/obj.target/snowcrash/src/snowcrash/snowcrash.o +0 -0
  282. data/ext/snowcrash/build/out/Release/snowcrash +0 -0
  283. data/ext/snowcrash/src/CBlueprint.cc +0 -628
  284. data/ext/snowcrash/src/CBlueprint.h +0 -366
  285. data/ext/snowcrash/src/CBlueprintSourcemap.cc +0 -630
  286. data/ext/snowcrash/src/CBlueprintSourcemap.h +0 -351
  287. data/ext/snowcrash/src/CSourceAnnotation.cc +0 -154
  288. data/ext/snowcrash/src/CSourceAnnotation.h +0 -106
  289. data/ext/snowcrash/src/Serialize.h +0 -71
  290. data/ext/snowcrash/src/SerializeJSON.cc +0 -1221
  291. data/ext/snowcrash/src/SerializeJSON.h +0 -24
  292. data/ext/snowcrash/src/SerializeYAML.cc +0 -702
  293. data/ext/snowcrash/src/SerializeYAML.h +0 -24
  294. data/ext/snowcrash/src/Signature.h +0 -32
  295. data/ext/snowcrash/src/SymbolTable.h +0 -94
  296. data/ext/snowcrash/src/Version.h +0 -39
  297. data/ext/snowcrash/src/csnowcrash.cc +0 -29
  298. data/ext/snowcrash/src/csnowcrash.h +0 -40
  299. data/ext/snowcrash/src/snowcrash/snowcrash.cc +0 -200
  300. data/ext/snowcrash/tools/gyp/pylib/gyp/common.pyc +0 -0
  301. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/__init__.pyc +0 -0
  302. data/ext/snowcrash/tools/homebrew/snowcrash.rb +0 -12
@@ -0,0 +1,75 @@
1
+ //
2
+ // RelationParser.h
3
+ // snowcrash
4
+ //
5
+ // Created by Pavan Kumar Sunkara on 04/03/15.
6
+ // Copyright (c) 2015 Apiary Inc. All rights reserved.
7
+ //
8
+
9
+ #ifndef SNOWCRASH_RELATIONPARSER_H
10
+ #define SNOWCRASH_RELATIONPARSER_H
11
+
12
+ #include "SectionParser.h"
13
+ #include "RegexMatch.h"
14
+
15
+ namespace snowcrash {
16
+
17
+ /** Link Relation matching regex */
18
+ const char* const RelationRegex = "^[[:blank:]]*[Rr]elation[[:blank:]]*:[[:blank:]]*([a-z][a-z0-9.-]*)?[[:blank:]]*$";
19
+
20
+ /**
21
+ * Relation Section Processor
22
+ */
23
+ template<>
24
+ struct SectionProcessor<Relation> : public SectionProcessorBase<Relation> {
25
+
26
+ static MarkdownNodeIterator processSignature(const MarkdownNodeIterator& node,
27
+ const MarkdownNodes& siblings,
28
+ SectionParserData& pd,
29
+ SectionLayout& layout,
30
+ const ParseResultRef<Relation>& out) {
31
+
32
+ mdp::ByteBuffer signature, remainingContent;
33
+ CaptureGroups captureGroups;
34
+
35
+ signature = GetFirstLine(node->text, remainingContent);
36
+ TrimString(signature);
37
+
38
+ if (RegexCapture(signature, RelationRegex, captureGroups, 3)) {
39
+ out.node.str = captureGroups[1];
40
+ TrimString(out.node.str);
41
+ }
42
+
43
+ if (pd.exportSourceMap() && !out.node.str.empty()) {
44
+ out.sourceMap.sourceMap.append(node->sourceMap);
45
+ }
46
+
47
+ return ++MarkdownNodeIterator(node);
48
+ }
49
+
50
+ NO_SECTION_DESCRIPTION(Relation)
51
+
52
+ static SectionType sectionType(const MarkdownNodeIterator& node) {
53
+
54
+ if (node->type == mdp::ListItemMarkdownNodeType
55
+ && !node->children().empty()) {
56
+
57
+ mdp::ByteBuffer remaining, subject = node->children().front().text;
58
+
59
+ subject = GetFirstLine(subject, remaining);
60
+ TrimString(subject);
61
+
62
+ if (RegexMatch(subject, RelationRegex)) {
63
+ return RelationSectionType;
64
+ }
65
+ }
66
+
67
+ return UndefinedSectionType;
68
+ }
69
+ };
70
+
71
+ /** Relation Section Parser */
72
+ typedef SectionParser<Relation, ListSectionAdapter> RelationParser;
73
+ }
74
+
75
+ #endif
@@ -47,37 +47,72 @@ namespace snowcrash {
47
47
  CaptureGroups captureGroups;
48
48
 
49
49
  if (RegexCapture(node->text, GroupHeaderRegex, captureGroups, 3)) {
50
- out.node.name = captureGroups[1];
51
- TrimString(out.node.name);
50
+ out.node.attributes.name = captureGroups[1];
51
+ TrimString(out.node.attributes.name);
52
52
  }
53
53
 
54
- if (pd.exportSourceMap() && !out.node.name.empty()) {
55
- out.sourceMap.name.sourceMap = node->sourceMap;
54
+ if (pd.exportSourceMap() && !out.node.attributes.name.empty()) {
55
+ out.sourceMap.attributes.name.sourceMap = node->sourceMap;
56
56
  }
57
57
 
58
58
  return ++MarkdownNodeIterator(node);
59
59
  }
60
60
 
61
+ static MarkdownNodeIterator processDescription(const MarkdownNodeIterator& node,
62
+ const MarkdownNodes& siblings,
63
+ SectionParserData& pd,
64
+ const ParseResultRef<ResourceGroup>& out) {
65
+
66
+ // Check for a description child element
67
+ if (out.node.content.elements().empty() ||
68
+ (!out.node.content.elements().empty() &&
69
+ out.node.content.elements().back().element != Element::CopyElement)) {
70
+
71
+ Element description(Element::CopyElement);
72
+ out.node.content.elements().push_back(description);
73
+
74
+ if (pd.exportSourceMap()) {
75
+
76
+ SourceMap<Element> descriptionSM(Element::CopyElement);
77
+ out.sourceMap.content.elements().collection.push_back(descriptionSM);
78
+ }
79
+ }
80
+
81
+ if (!out.node.content.elements().back().content.copy.empty()) {
82
+ TwoNewLines(out.node.content.elements().back().content.copy);
83
+ }
84
+
85
+ mdp::ByteBuffer content = mdp::MapBytesRangeSet(node->sourceMap, pd.sourceData);
86
+
87
+ if (pd.exportSourceMap() && !content.empty()) {
88
+ out.sourceMap.content.elements().collection.back().content.copy.sourceMap.append(node->sourceMap);
89
+ }
90
+
91
+ out.node.content.elements().back().content.copy += content;
92
+
93
+ return ++MarkdownNodeIterator(node);
94
+ }
95
+
61
96
  static MarkdownNodeIterator processNestedSection(const MarkdownNodeIterator& node,
62
97
  const MarkdownNodes& siblings,
63
98
  SectionParserData& pd,
64
99
  const ParseResultRef<ResourceGroup>& out) {
65
100
 
101
+ MarkdownNodeIterator cur = node;
102
+
66
103
  if (pd.sectionContext() == ResourceSectionType) {
67
104
 
68
105
  IntermediateParseResult<Resource> resource(out.report);
106
+ cur = ResourceParser::parse(node, siblings, pd, resource);
69
107
 
70
- MarkdownNodeIterator cur = ResourceParser::parse(node, siblings, pd, resource);
71
-
72
- ResourceIterator duplicate = SectionProcessor<Resource>::findResource(out.node.resources, resource.node);
73
- ResourceIteratorPair globalDuplicate;
108
+ bool duplicate = SectionProcessor<Resource>::isResourceDuplicate(out.node.content.elements(), resource.node.uriTemplate);
109
+ bool globalDuplicate;
74
110
 
75
- if (duplicate == out.node.resources.end()) {
76
- globalDuplicate = findResource(pd.blueprint, resource.node);
111
+ if (!duplicate) {
112
+ globalDuplicate = isResourceDuplicate(pd.blueprint, resource.node.uriTemplate);
77
113
  }
78
114
 
79
- if (duplicate != out.node.resources.end() ||
80
- globalDuplicate.first != pd.blueprint.resourceGroups.end()) {
115
+ if (duplicate || globalDuplicate) {
81
116
 
82
117
  // WARN: Duplicate resource
83
118
  mdp::CharactersRangeSet sourceMap = mdp::BytesRangeSetToCharactersRangeSet(node->sourceMap, pd.sourceData);
@@ -86,16 +121,21 @@ namespace snowcrash {
86
121
  sourceMap));
87
122
  }
88
123
 
89
- out.node.resources.push_back(resource.node);
124
+ Element resourceElement(Element::ResourceElement);
125
+ resourceElement.content.resource = resource.node;
126
+
127
+ out.node.content.elements().push_back(resourceElement);
90
128
 
91
129
  if (pd.exportSourceMap()) {
92
- out.sourceMap.resources.collection.push_back(resource.sourceMap);
93
- }
94
130
 
95
- return cur;
131
+ SourceMap<Element> resourceElementSM(Element::ResourceElement);
132
+ resourceElementSM.content.resource = resource.sourceMap;
133
+
134
+ out.sourceMap.content.elements().collection.push_back(resourceElementSM);
135
+ }
96
136
  }
97
137
 
98
- return node;
138
+ return cur;
99
139
  }
100
140
 
101
141
  static MarkdownNodeIterator processUnexpectedNode(const MarkdownNodeIterator& node,
@@ -105,17 +145,16 @@ namespace snowcrash {
105
145
  const ParseResultRef<ResourceGroup>& out) {
106
146
 
107
147
  if (SectionProcessor<Action>::actionType(node) == DependentActionType &&
108
- !out.node.resources.empty()) {
148
+ isResourcePresent(out.node.content.elements())) {
109
149
 
110
- mdp::ByteBuffer method;
111
- mdp::ByteBuffer name;
150
+ mdp::ByteBuffer method, name, uriTemplate;
112
151
 
113
- SectionProcessor<Action>::actionHTTPMethodAndName(node, method, name);
152
+ SectionProcessor<Action>::actionHTTPMethodAndName(node, method, name, uriTemplate);
114
153
  mdp::CharactersRangeSet sourceMap = mdp::BytesRangeSetToCharactersRangeSet(node->sourceMap, pd.sourceData);
115
154
 
116
155
  // WARN: Unexpected action
117
156
  std::stringstream ss;
118
- ss << "unexpected action '" << method << "', to define multiple actions for the '" << out.node.resources.back().uriTemplate;
157
+ ss << "unexpected action '" << method << "', to define multiple actions for the '" << lastResource(out.node.content.elements()).uriTemplate;
119
158
  ss << "' resource omit the HTTP method in its definition, e.g. '# /resource'";
120
159
 
121
160
  out.report.warnings.push_back(Warning(ss.str(),
@@ -128,6 +167,20 @@ namespace snowcrash {
128
167
  return SectionProcessorBase<ResourceGroup>::processUnexpectedNode(node, siblings, pd, lastSectionType, out);
129
168
  }
130
169
 
170
+ static void finalize(const MarkdownNodeIterator& node,
171
+ SectionParserData& pd,
172
+ const ParseResultRef<ResourceGroup>& out) {
173
+
174
+ out.node.element = Element::CategoryElement;
175
+ out.node.category = Element::ResourceGroupCategory;
176
+
177
+ if (pd.exportSourceMap()) {
178
+
179
+ out.sourceMap.element = out.node.element;
180
+ out.sourceMap.category = out.node.category;
181
+ }
182
+ }
183
+
131
184
  static SectionType sectionType(const MarkdownNodeIterator& node) {
132
185
 
133
186
  if (node->type == mdp::HeaderMarkdownNodeType
@@ -183,22 +236,63 @@ namespace snowcrash {
183
236
  return SectionProcessorBase<ResourceGroup>::isUnexpectedNode(node, sectionType);
184
237
  }
185
238
 
186
- /** Finds a resource in blueprint by its URI template */
187
- static ResourceIteratorPair findResource(const Blueprint& blueprint,
188
- const Resource& resource) {
189
-
190
- for (ResourceGroupIterator it = blueprint.resourceGroups.begin();
191
- it != blueprint.resourceGroups.end();
239
+ /**
240
+ * \brief Given a blueprint, Check if a resource already exists with the given uri template
241
+ *
242
+ * \param blueprint The blueprint which is formed until now
243
+ * \param uri The resource uri template to be checked
244
+ */
245
+ static bool isResourceDuplicate(const Blueprint& blueprint,
246
+ const URITemplate& uri) {
247
+
248
+ for (Elements::const_iterator it = blueprint.content.elements().begin();
249
+ it != blueprint.content.elements().end();
192
250
  ++it) {
193
251
 
194
- ResourceIterator match = SectionProcessor<Resource>::findResource(it->resources, resource);
252
+ if (it->element == Element::CategoryElement &&
253
+ SectionProcessor<Resource>::isResourceDuplicate(it->content.elements(), uri)) {
254
+
255
+ return true;
256
+ }
257
+ }
258
+
259
+ return false;
260
+ }
261
+
262
+ /**
263
+ * \brief Given list of elements, return true if none of them is a resource element
264
+ *
265
+ * \param elements Collection of elements
266
+ */
267
+ static bool isResourcePresent(const Elements& elements) {
268
+
269
+ for (Elements::const_iterator it = elements.begin(); it != elements.end(); ++it) {
270
+
271
+ if (it->element == Element::ResourceElement) {
272
+ return false;
273
+ }
274
+ }
195
275
 
196
- if (match != it->resources.end()) {
197
- return std::make_pair(it, match);
276
+ return true;
277
+ }
278
+
279
+ /**
280
+ * \brief Given list of elements, get the last resource
281
+ *
282
+ * \param elements Collection fo elements
283
+ */
284
+ static Resource lastResource(const Elements& elements) {
285
+
286
+ Resource last;
287
+
288
+ for (Elements::const_iterator it = elements.begin(); it != elements.end(); ++it) {
289
+
290
+ if (it->element == Element::ResourceElement) {
291
+ last = it->content.resource;
198
292
  }
199
- }
293
+ }
200
294
 
201
- return std::make_pair(blueprint.resourceGroups.end(), ResourceIterator());
295
+ return last;
202
296
  }
203
297
  };
204
298
 
@@ -11,6 +11,7 @@
11
11
 
12
12
  #include "SectionParser.h"
13
13
  #include "ActionParser.h"
14
+ #include "DataStructureGroupParser.h"
14
15
  #include "HeadersParser.h"
15
16
  #include "ParametersParser.h"
16
17
  #include "UriTemplateParser.h"
@@ -63,11 +64,8 @@ namespace snowcrash {
63
64
 
64
65
  return cur;
65
66
  }
66
- } else if (RegexCapture(node->text, NamedResourceHeaderRegex, captureGroups, 4)) {
67
-
68
- out.node.name = captureGroups[1];
69
- TrimString(out.node.name);
70
- out.node.uriTemplate = captureGroups[2];
67
+ } else {
68
+ matchNamedResourceHeader(node, out.node);
71
69
  }
72
70
 
73
71
  if (pd.exportSourceMap()) {
@@ -105,6 +103,40 @@ namespace snowcrash {
105
103
  return SectionProcessor<Action>::handleDeprecatedHeaders(node, siblings, pd, headers);
106
104
  }
107
105
 
106
+ case AttributesSectionType:
107
+ {
108
+ ParseResultRef<Attributes> attributes(out.report, out.node.attributes, out.sourceMap.attributes);
109
+ MarkdownNodeIterator cur = AttributesParser::parse(node, siblings, pd, attributes);
110
+
111
+ if (!out.node.name.empty()) {
112
+
113
+ if (SectionProcessor<DataStructureGroup>::isNamedTypeDuplicate(pd.blueprint, out.node.name)) {
114
+
115
+ // WARN: duplicate named type
116
+ std::stringstream ss;
117
+ ss << "named type with name '" << out.node.name << "' already exists";
118
+
119
+ mdp::CharactersRangeSet sourceMap = mdp::BytesRangeSetToCharactersRangeSet(node->sourceMap, pd.sourceData);
120
+ out.report.warnings.push_back(Warning(ss.str(),
121
+ DuplicateWarning,
122
+ sourceMap));
123
+
124
+ // Remove the attributes data from the AST since we are ignoring this
125
+ out.node.attributes = mson::NamedType();
126
+
127
+ return cur;
128
+ }
129
+
130
+ attributes.node.name.symbol.literal = out.node.name;
131
+
132
+ if (pd.exportSourceMap()) {
133
+ attributes.sourceMap.name.sourceMap = out.sourceMap.name.sourceMap;
134
+ }
135
+ }
136
+
137
+ return cur;
138
+ }
139
+
108
140
  default:
109
141
  break;
110
142
  }
@@ -129,14 +161,14 @@ namespace snowcrash {
129
161
  out.sourceMap.model.body.sourceMap.append(node->sourceMap);
130
162
  }
131
163
 
132
- // Update model in the symbol table as well
133
- ResourceModelSymbolTable::iterator it = pd.symbolTable.resourceModels.find(out.node.model.name);
164
+ // Update model in the model table as well
165
+ ModelTable::iterator it = pd.modelTable.find(out.node.model.name);
134
166
 
135
- if (it != pd.symbolTable.resourceModels.end()) {
167
+ if (it != pd.modelTable.end()) {
136
168
  it->second.body = out.node.model.body;
137
169
 
138
170
  if (pd.exportSourceMap()) {
139
- pd.symbolSourceMapTable.resourceModels[out.node.model.name].body = out.sourceMap.model.body;
171
+ pd.modelSourceMapTable[out.node.model.name].body = out.sourceMap.model.body;
140
172
  }
141
173
  }
142
174
 
@@ -189,7 +221,7 @@ namespace snowcrash {
189
221
  // Check if headers section
190
222
  nestedType = SectionProcessor<Headers>::sectionType(node);
191
223
 
192
- if (nestedType == HeadersSectionType) {
224
+ if (nestedType != UndefinedSectionType) {
193
225
  return nestedType;
194
226
  }
195
227
 
@@ -202,6 +234,13 @@ namespace snowcrash {
202
234
  return nestedType;
203
235
  }
204
236
 
237
+ // Check if attributes section
238
+ nestedType = SectionProcessor<Attributes>::sectionType(node);
239
+
240
+ if (nestedType != UndefinedSectionType) {
241
+ return nestedType;
242
+ }
243
+
205
244
  // Check if action section
206
245
  nestedType = SectionProcessor<Action>::sectionType(node);
207
246
 
@@ -252,14 +291,14 @@ namespace snowcrash {
252
291
  // Consolidate deprecated headers into subsequent payloads
253
292
  if (!out.node.headers.empty()) {
254
293
 
255
- Collection<Action>::iterator actIt = out.node.actions.begin();
256
- Collection<SourceMap<Action> >::iterator actSMIt = out.sourceMap.actions.collection.begin();
294
+ Collection<Action>::iterator actionIt = out.node.actions.begin();
295
+ Collection<SourceMap<Action> >::iterator actionSMIt = out.sourceMap.actions.collection.begin();
257
296
 
258
297
  for (;
259
- actIt != out.node.actions.end();
260
- ++actIt, ++actSMIt) {
298
+ actionIt != out.node.actions.end();
299
+ ++actionIt, ++actionSMIt) {
261
300
 
262
- SectionProcessor<Headers>::injectDeprecatedHeaders(pd, out.node.headers, out.sourceMap.headers, actIt->examples, actSMIt->examples);
301
+ SectionProcessor<Headers>::injectDeprecatedHeaders(pd, out.node.headers, out.sourceMap.headers, actionIt->examples, actionSMIt->examples);
263
302
  }
264
303
 
265
304
  out.node.headers.clear();
@@ -270,6 +309,25 @@ namespace snowcrash {
270
309
  }
271
310
  }
272
311
 
312
+ /**
313
+ * \brief Given a named resource header, retrieve the name and uriTemplate
314
+ *
315
+ * \param node Markdown node to process
316
+ * \param resource Resource data structure
317
+ */
318
+ static void matchNamedResourceHeader(const MarkdownNodeIterator& node,
319
+ Resource& resource) {
320
+
321
+ CaptureGroups captureGroups;
322
+
323
+ if (RegexCapture(node->text, NamedResourceHeaderRegex, captureGroups, 4)) {
324
+
325
+ resource.name = captureGroups[1];
326
+ TrimString(resource.name);
327
+ resource.uriTemplate = captureGroups[2];
328
+ }
329
+ }
330
+
273
331
  /** Process Action section */
274
332
  static MarkdownNodeIterator processAction(const MarkdownNodeIterator& node,
275
333
  const MarkdownNodes& siblings,
@@ -277,7 +335,6 @@ namespace snowcrash {
277
335
  const ParseResultRef<Resource>& out) {
278
336
 
279
337
  IntermediateParseResult<Action> action(out.report);
280
-
281
338
  MarkdownNodeIterator cur = ActionParser::parse(node, siblings, pd, action);
282
339
 
283
340
  ActionIterator duplicate = SectionProcessor<Action>::findAction(out.node.actions, action.node);
@@ -295,9 +352,28 @@ namespace snowcrash {
295
352
  sourceMap));
296
353
  }
297
354
 
355
+ ActionIterator relationDuplicate = SectionProcessor<Action>::findRelation(out.node.actions, action.node.relation);
356
+
357
+ if (relationDuplicate != out.node.actions.end()) {
358
+
359
+ // WARN: duplicate relation identifier
360
+ std::stringstream ss;
361
+ ss << "relation identifier '" << action.node.relation.str << "' already defined for resource '" << out.node.uriTemplate << "'";
362
+
363
+ mdp::CharactersRangeSet sourceMap = mdp::BytesRangeSetToCharactersRangeSet(node->sourceMap, pd.sourceData);
364
+ out.report.warnings.push_back(Warning(ss.str(),
365
+ DuplicateWarning,
366
+ sourceMap));
367
+ }
368
+
298
369
  if (!action.node.parameters.empty()) {
299
370
 
300
- checkParametersEligibility(node, pd, action.node.parameters, out);
371
+ if (!action.node.uriTemplate.empty()) {
372
+ checkParametersEligibility<Action>(node, pd, action.node.parameters, action);
373
+ }
374
+ else {
375
+ checkParametersEligibility<Resource>(node, pd, action.node.parameters, out);
376
+ }
301
377
  }
302
378
 
303
379
  out.node.actions.push_back(action.node);
@@ -321,7 +397,7 @@ namespace snowcrash {
321
397
 
322
398
  if (!parameters.node.empty()) {
323
399
 
324
- checkParametersEligibility(node, pd, parameters.node, out);
400
+ checkParametersEligibility<Resource>(node, pd, parameters.node, out);
325
401
  out.node.parameters.insert(out.node.parameters.end(), parameters.node.begin(), parameters.node.end());
326
402
 
327
403
  if (pd.exportSourceMap()) {
@@ -382,29 +458,29 @@ namespace snowcrash {
382
458
 
383
459
  mdp::CharactersRangeSet sourceMap = mdp::BytesRangeSetToCharactersRangeSet(node->sourceMap, pd.sourceData);
384
460
  out.report.error = Error(ss.str(),
385
- SymbolError,
461
+ ModelError,
386
462
  sourceMap);
387
463
  }
388
464
  }
389
465
 
390
- ResourceModelSymbolTable::iterator it = pd.symbolTable.resourceModels.find(model.node.name);
466
+ ModelTable::iterator it = pd.modelTable.find(model.node.name);
391
467
 
392
- if (it == pd.symbolTable.resourceModels.end()) {
468
+ if (it == pd.modelTable.end()) {
393
469
 
394
- pd.symbolTable.resourceModels[model.node.name] = model.node;
470
+ pd.modelTable[model.node.name] = model.node;
395
471
 
396
472
  if (pd.exportSourceMap()) {
397
- pd.symbolSourceMapTable.resourceModels[model.node.name] = model.sourceMap;
473
+ pd.modelSourceMapTable[model.node.name] = model.sourceMap;
398
474
  }
399
475
  } else {
400
476
 
401
- // ERR: Symbol already defined
477
+ // ERR: Model already defined
402
478
  std::stringstream ss;
403
479
  ss << "symbol '" << model.node.name << "' already defined";
404
480
 
405
481
  mdp::CharactersRangeSet sourceMap = mdp::BytesRangeSetToCharactersRangeSet(node->sourceMap, pd.sourceData);
406
482
  out.report.error = Error(ss.str(),
407
- SymbolError,
483
+ ModelError,
408
484
  sourceMap);
409
485
  }
410
486
 
@@ -417,11 +493,16 @@ namespace snowcrash {
417
493
  return cur;
418
494
  }
419
495
 
420
- /** Check Parameters eligibility in URI template */
496
+ /**
497
+ * \brief Check Parameters eligibility in URI template
498
+ *
499
+ * \warning Do not specialise this.
500
+ */
501
+ template<typename T>
421
502
  static void checkParametersEligibility(const MarkdownNodeIterator& node,
422
503
  const SectionParserData& pd,
423
504
  Parameters& parameters,
424
- const ParseResultRef<Resource>& out) {
505
+ const ParseResultRef<T>& out) {
425
506
 
426
507
  for (ParameterIterator it = parameters.begin();
427
508
  it != parameters.end();
@@ -448,13 +529,25 @@ namespace snowcrash {
448
529
  }
449
530
  }
450
531
 
451
- /** Finds a resource inside an resources collection */
452
- static ResourceIterator findResource(const Resources& resources,
453
- const Resource& resource) {
532
+ /**
533
+ * \brief Given a list of elements, Check if a resource already exists with the given uri template
534
+ *
535
+ * \param elements Collection of elements
536
+ * \param uri The resource uri template to be checked
537
+ */
538
+ static bool isResourceDuplicate(const Elements& elements,
539
+ const URITemplate& uri) {
540
+
541
+ for (Elements::const_iterator it = elements.begin(); it != elements.end(); ++it) {
542
+
543
+ if (it->element == Element::ResourceElement &&
544
+ it->content.resource.uriTemplate == uri) {
545
+
546
+ return true;
547
+ }
548
+ }
454
549
 
455
- return std::find_if(resources.begin(),
456
- resources.end(),
457
- std::bind2nd(MatchResource(), resource));
550
+ return false;
458
551
  }
459
552
  };
460
553