redsnow 0.1.6 → 0.2.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 (101) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +2 -0
  3. data/ext/snowcrash/Makefile +1 -1
  4. data/ext/snowcrash/bin/snowcrash +0 -0
  5. data/ext/snowcrash/configure +9 -9
  6. data/ext/snowcrash/ext/markdown-parser/Makefile +87 -0
  7. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/CONTRIBUTING.md +0 -0
  8. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/Makefile +2 -1
  9. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/Makefile.win +0 -0
  10. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/examples/smartypants.c +0 -0
  11. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/examples/sundown.c +0 -0
  12. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/html/houdini.h +0 -0
  13. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/html/houdini_href_e.c +0 -0
  14. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/html/houdini_html_e.c +0 -0
  15. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/html/html.c +0 -0
  16. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/html/html.h +0 -0
  17. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/html/html_smartypants.c +0 -0
  18. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/html_block_names.txt +0 -0
  19. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/autolink.c +0 -0
  20. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/autolink.h +0 -0
  21. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/buffer.c +0 -0
  22. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/buffer.h +1 -1
  23. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/html_blocks.h +0 -0
  24. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/markdown.c +9 -3
  25. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/markdown.h +0 -0
  26. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/src_map.c +11 -7
  27. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/src_map.h +1 -1
  28. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/stack.c +0 -0
  29. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/stack.h +0 -0
  30. data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/sundown.def +0 -0
  31. data/ext/snowcrash/ext/markdown-parser/msvc/markdown/markdown.vcproj +188 -0
  32. data/ext/snowcrash/ext/markdown-parser/msvc/msvc.sln +38 -0
  33. data/ext/snowcrash/ext/markdown-parser/msvc/sundown/sundown.vcproj +206 -0
  34. data/ext/snowcrash/ext/markdown-parser/src/ByteBuffer.cc +92 -0
  35. data/ext/snowcrash/ext/markdown-parser/src/ByteBuffer.h +82 -0
  36. data/ext/snowcrash/ext/markdown-parser/src/MarkdownNode.cc +152 -0
  37. data/ext/snowcrash/ext/markdown-parser/src/MarkdownNode.h +103 -0
  38. data/ext/snowcrash/ext/markdown-parser/src/MarkdownParser.cc +388 -0
  39. data/ext/snowcrash/{src → ext/markdown-parser/src}/MarkdownParser.h +43 -33
  40. data/ext/snowcrash/snowcrash.gyp +114 -63
  41. data/ext/snowcrash/src/ActionParser.h +334 -398
  42. data/ext/snowcrash/src/AssetParser.h +82 -171
  43. data/ext/snowcrash/src/Blueprint.h +7 -2
  44. data/ext/snowcrash/src/BlueprintParser.h +212 -286
  45. data/ext/snowcrash/src/BlueprintUtility.h +2 -2
  46. data/ext/snowcrash/src/CBlueprint.h +1 -1
  47. data/ext/snowcrash/src/CSourceAnnotation.cc +11 -11
  48. data/ext/snowcrash/src/CSourceAnnotation.h +9 -9
  49. data/ext/snowcrash/src/CodeBlockUtility.h +199 -149
  50. data/ext/snowcrash/src/HeadersParser.h +197 -0
  51. data/ext/snowcrash/src/ParameterParser.h +429 -0
  52. data/ext/snowcrash/src/ParametersParser.h +136 -211
  53. data/ext/snowcrash/src/PayloadParser.h +458 -562
  54. data/ext/snowcrash/src/Platform.h +0 -3
  55. data/ext/snowcrash/src/ResourceGroupParser.h +183 -164
  56. data/ext/snowcrash/src/ResourceParser.h +325 -493
  57. data/ext/snowcrash/src/Section.cc +42 -0
  58. data/ext/snowcrash/src/Section.h +47 -0
  59. data/ext/snowcrash/src/SectionParser.h +229 -0
  60. data/ext/snowcrash/src/SectionParserData.h +81 -0
  61. data/ext/snowcrash/src/SectionProcessor.h +211 -0
  62. data/ext/snowcrash/src/Signature.cc +74 -0
  63. data/ext/snowcrash/src/Signature.h +32 -0
  64. data/ext/snowcrash/src/SourceAnnotation.h +7 -20
  65. data/ext/snowcrash/src/StringUtility.h +30 -10
  66. data/ext/snowcrash/src/SymbolTable.h +7 -7
  67. data/ext/snowcrash/src/UriTemplateParser.cc +10 -10
  68. data/ext/snowcrash/src/UriTemplateParser.h +11 -14
  69. data/ext/snowcrash/src/ValuesParser.h +122 -0
  70. data/ext/snowcrash/src/Version.h +2 -2
  71. data/ext/snowcrash/src/csnowcrash.cc +5 -5
  72. data/ext/snowcrash/src/csnowcrash.h +3 -3
  73. data/ext/snowcrash/src/snowcrash.cc +74 -4
  74. data/ext/snowcrash/src/snowcrash.h +9 -4
  75. data/ext/snowcrash/src/snowcrash/snowcrash.cc +16 -16
  76. data/ext/snowcrash/tools/homebrew/snowcrash.rb +3 -2
  77. data/ext/snowcrash/vcbuild.bat +13 -4
  78. data/lib/redsnow.rb +5 -5
  79. data/lib/redsnow/binding.rb +1 -1
  80. data/lib/redsnow/blueprint.rb +33 -2
  81. data/lib/redsnow/parseresult.rb +7 -4
  82. data/lib/redsnow/version.rb +1 -1
  83. data/test/redsnow_binding_test.rb +6 -6
  84. data/test/redsnow_parseresult_test.rb +1 -1
  85. metadata +62 -42
  86. data/ext/snowcrash/src/BlockUtility.h +0 -186
  87. data/ext/snowcrash/src/BlueprintParserCore.h +0 -190
  88. data/ext/snowcrash/src/BlueprintSection.h +0 -140
  89. data/ext/snowcrash/src/DescriptionSectionUtility.h +0 -156
  90. data/ext/snowcrash/src/HeaderParser.h +0 -289
  91. data/ext/snowcrash/src/ListBlockUtility.h +0 -273
  92. data/ext/snowcrash/src/ListUtility.h +0 -95
  93. data/ext/snowcrash/src/MarkdownBlock.cc +0 -176
  94. data/ext/snowcrash/src/MarkdownBlock.h +0 -93
  95. data/ext/snowcrash/src/MarkdownParser.cc +0 -266
  96. data/ext/snowcrash/src/ParameterDefinitonParser.h +0 -645
  97. data/ext/snowcrash/src/Parser.cc +0 -71
  98. data/ext/snowcrash/src/Parser.h +0 -29
  99. data/ext/snowcrash/src/ParserCore.cc +0 -120
  100. data/ext/snowcrash/src/ParserCore.h +0 -82
  101. data/ext/snowcrash/src/SectionUtility.h +0 -142
@@ -0,0 +1,42 @@
1
+ //
2
+ // Section.cc
3
+ // snowcrash
4
+ //
5
+ // Created by Zdenek Nemec on 5/14/14.
6
+ // Copyright (c) 2014 Apiary Inc. All rights reserved.
7
+ //
8
+
9
+ #include "Section.h"
10
+
11
+ using namespace snowcrash;
12
+
13
+ std::string snowcrash::SectionName(const SectionType& section) {
14
+
15
+ switch (section) {
16
+ case ModelSectionType:
17
+ case ModelBodySectionType:
18
+ return "model";
19
+
20
+ case RequestSectionType:
21
+ case RequestBodySectionType:
22
+ return "request";
23
+
24
+ case ResponseSectionType:
25
+ case ResponseBodySectionType:
26
+ return "response";
27
+
28
+ case BodySectionType:
29
+ case DanglingBodySectionType:
30
+ return "message-body";
31
+
32
+ case SchemaSectionType:
33
+ case DanglingSchemaSectionType:
34
+ return "message-schema";
35
+
36
+ case HeadersSectionType:
37
+ return "headers";
38
+
39
+ default:
40
+ return "section";
41
+ }
42
+ }
@@ -0,0 +1,47 @@
1
+ //
2
+ // Section.h
3
+ // snowcrash
4
+ //
5
+ // Created by Zdenek Nemec on 11/1/13.
6
+ // Copyright (c) 2013 Apiary Inc. All rights reserved.
7
+ //
8
+
9
+ #ifndef SNOWCRASH_SECTION_H
10
+ #define SNOWCRASH_SECTION_H
11
+
12
+ #include <string>
13
+
14
+ namespace snowcrash {
15
+
16
+ /**
17
+ * API Blueprint Sections Types.
18
+ */
19
+ enum SectionType {
20
+ UndefinedSectionType, /// < Undefined section
21
+ BlueprintSectionType, /// < Blueprint overview
22
+ ResourceGroupSectionType, /// < Resource group
23
+ ResourceSectionType, /// < Resource
24
+ ActionSectionType, /// < Action
25
+ RequestSectionType, /// < Request
26
+ RequestBodySectionType, /// < Request & Payload body combined (abbrev)
27
+ ResponseSectionType, /// < Response
28
+ ResponseBodySectionType, /// < Response & Body combined (abbrev)
29
+ ModelSectionType, /// < Model
30
+ ModelBodySectionType, /// < Model & Body combined (abbrev)
31
+ BodySectionType, /// < Payload Body
32
+ DanglingBodySectionType, /// < Dangling Body (unrecognised section considered to be Body)
33
+ SchemaSectionType, /// < Payload Schema
34
+ DanglingSchemaSectionType, /// < Dangling Schema (unrecognised section considered to be Schema)
35
+ HeadersSectionType, /// < Headers
36
+ ForeignSectionType, /// < Foreign, unexpected section
37
+ ParametersSectionType, /// < Parameters
38
+ ParameterSectionType, /// < One Parameter definition
39
+ ValuesSectionType, /// < Value enumeration
40
+ ValueSectionType /// < One Value
41
+ };
42
+
43
+ /** \return Human readable name for given %SectionType */
44
+ extern std::string SectionName(const SectionType& section);
45
+ }
46
+
47
+ #endif
@@ -0,0 +1,229 @@
1
+ //
2
+ // SectionParser.h
3
+ // snowcrash
4
+ //
5
+ // Created by Zdenek Nemec on 5/4/13.
6
+ // Copyright (c) 2013 Apiary Inc. All rights reserved.
7
+ //
8
+
9
+ #ifndef SNOWCRASH_SECTIONPARSER_H
10
+ #define SNOWCRASH_SECTIONPARSER_H
11
+
12
+ #include <stdexcept>
13
+ #include "SectionProcessor.h"
14
+
15
+ #define ADAPTER_MISMATCH_ERR std::logic_error("mismatched adapter and node type")
16
+
17
+ namespace snowcrash {
18
+
19
+ /**
20
+ * Blueprint section parser
21
+ */
22
+ template<typename T, typename Adapter>
23
+ struct SectionParser {
24
+
25
+
26
+ /**
27
+ * \brief Parse a section of blueprint
28
+ * \param node Initial node to start parsing at
29
+ * \param siblings Siblings of the initial node
30
+ * \param pd Parser data
31
+ * \param T Parsed output
32
+ * \return Iterator to the first unparsed block
33
+ */
34
+ static MarkdownNodeIterator parse(const MarkdownNodeIterator& node,
35
+ const MarkdownNodes& siblings,
36
+ SectionParserData& pd,
37
+ Report& report,
38
+ T& out) {
39
+
40
+ SectionLayout layout = DefaultSectionLayout;
41
+ MarkdownNodeIterator cur = Adapter::startingNode(node);
42
+ const MarkdownNodes& collection = Adapter::startingNodeSiblings(node, siblings);
43
+
44
+ // Signature node
45
+ MarkdownNodeIterator lastCur = cur;
46
+ cur = SectionProcessor<T>::processSignature(cur, collection, pd, layout, report, out);
47
+
48
+ // Exclusive Nested Sections Layout
49
+ if (layout == ExclusiveNestedSectionLayout) {
50
+
51
+ cur = parseNestedSections(cur, collection, pd, report, out);
52
+
53
+ SectionProcessor<T>::finalize(node, pd, report, out);
54
+
55
+ return Adapter::nextStartingNode(node, siblings, cur);
56
+ }
57
+
58
+ // Parser redirect layout
59
+ if (layout == RedirectSectionLayout) {
60
+ SectionProcessor<T>::finalize(node, pd, report, out);
61
+
62
+ return Adapter::nextStartingNode(node, siblings, cur);
63
+ }
64
+
65
+ // Default layout
66
+ if (lastCur == cur)
67
+ return Adapter::nextStartingNode(node, siblings, cur);
68
+
69
+ // Description nodes
70
+ while(cur != collection.end() &&
71
+ SectionProcessor<T>::isDescriptionNode(cur, pd.sectionContext())) {
72
+
73
+ lastCur = cur;
74
+ cur = SectionProcessor<T>::processDescription(cur, collection, pd, report, out);
75
+ if (lastCur == cur)
76
+ return Adapter::nextStartingNode(node, siblings, cur);
77
+ }
78
+
79
+ // Content nodes
80
+ while(cur != collection.end() &&
81
+ SectionProcessor<T>::isContentNode(cur, pd.sectionContext())) {
82
+
83
+ lastCur = cur;
84
+ cur = SectionProcessor<T>::processContent(cur, collection, pd, report, out);
85
+ if (lastCur == cur)
86
+ return Adapter::nextStartingNode(node, siblings, cur);
87
+ }
88
+
89
+ // Nested Sections
90
+ cur = parseNestedSections(cur, collection, pd, report, out);
91
+
92
+ SectionProcessor<T>::finalize(node, pd, report, out);
93
+
94
+ return Adapter::nextStartingNode(node, siblings, cur);
95
+ }
96
+
97
+
98
+ /** Parse nested sections */
99
+ static MarkdownNodeIterator parseNestedSections(const MarkdownNodeIterator& node,
100
+ const MarkdownNodes& collection,
101
+ SectionParserData& pd,
102
+ Report& report,
103
+ T& out) {
104
+
105
+ MarkdownNodeIterator cur = node;
106
+ MarkdownNodeIterator lastCur = cur;
107
+
108
+ SectionType lastSectionType = UndefinedSectionType;
109
+
110
+ // Nested sections
111
+ while(cur != collection.end()) {
112
+
113
+ lastCur = cur;
114
+ SectionType nestedType = SectionProcessor<T>::nestedSectionType(cur);
115
+
116
+ pd.sectionsContext.push_back(nestedType);
117
+
118
+ if (nestedType != UndefinedSectionType) {
119
+ cur = SectionProcessor<T>::processNestedSection(cur, collection, pd, report, out);
120
+ }
121
+ else if (Adapter::nextSkipsUnexpected ||
122
+ SectionProcessor<T>::isUnexpectedNode(cur, pd.sectionContext())) {
123
+ cur = SectionProcessor<T>::processUnexpectedNode(cur, collection, pd, lastSectionType, report, out);
124
+ }
125
+
126
+ if (cur != collection.end() &&
127
+ (pd.sectionContext() != UndefinedSectionType ||
128
+ (cur->type != mdp::ParagraphMarkdownNodeType &&
129
+ cur->type != mdp::CodeMarkdownNodeType))) {
130
+
131
+ lastSectionType = pd.sectionContext();
132
+ }
133
+
134
+ pd.sectionsContext.pop_back();
135
+
136
+ if (lastCur == cur)
137
+ break;
138
+ }
139
+
140
+ return cur;
141
+ }
142
+ };
143
+
144
+ /** Parser Adapter for parsing header-defined sections */
145
+ struct HeaderSectionAdapter {
146
+
147
+ /** \return Node to start parsing with */
148
+ static const MarkdownNodeIterator startingNode(const MarkdownNodeIterator& seed) {
149
+ if (seed->type != mdp::HeaderMarkdownNodeType)
150
+ throw ADAPTER_MISMATCH_ERR;
151
+
152
+ return seed;
153
+ }
154
+
155
+ /** \return Collection of siblings to starting Node */
156
+ static const MarkdownNodes& startingNodeSiblings(const MarkdownNodeIterator& seed,
157
+ const MarkdownNodes& siblings) {
158
+ return siblings;
159
+ }
160
+
161
+ /** \return Starting node for next parsing */
162
+ static const MarkdownNodeIterator nextStartingNode(const MarkdownNodeIterator& seed,
163
+ const MarkdownNodes& siblings,
164
+ const MarkdownNodeIterator& cur) {
165
+ return cur;
166
+ }
167
+
168
+ /**
169
+ * \brief Adapter Markdown node skipping behavior trait.
170
+ *
171
+ * Adapter trait signalizing that the adapter can possibly skip some Markdown nodes on a nextStartingNode() call.
172
+ * If set to true, a call to nextStartingNode() can skip some nodes causing some information loss. False otherwise.
173
+ */
174
+ static const bool nextSkipsUnexpected = false;
175
+ };
176
+
177
+ /** Parser Adapter for parsing list-defined sections */
178
+ struct ListSectionAdapter {
179
+
180
+ static const MarkdownNodeIterator startingNode(const MarkdownNodeIterator& seed) {
181
+ if (seed->type != mdp::ListItemMarkdownNodeType)
182
+ throw ADAPTER_MISMATCH_ERR;
183
+
184
+ return seed->children().begin();
185
+ }
186
+
187
+ static const MarkdownNodes& startingNodeSiblings(const MarkdownNodeIterator& seed,
188
+ const MarkdownNodes& siblings) {
189
+ return seed->children();
190
+ }
191
+
192
+ static const MarkdownNodeIterator nextStartingNode(const MarkdownNodeIterator& seed,
193
+ const MarkdownNodes& siblings,
194
+ const MarkdownNodeIterator& cur) {
195
+ if (seed == siblings.end())
196
+ return seed;
197
+
198
+ return ++MarkdownNodeIterator(seed);
199
+ }
200
+
201
+ static const bool nextSkipsUnexpected = true;
202
+ };
203
+
204
+ /** Parser Adapter for parsing blueprint sections */
205
+ struct BlueprintSectionAdapter {
206
+
207
+ /** \return Node to start parsing with */
208
+ static const MarkdownNodeIterator startingNode(const MarkdownNodeIterator& seed) {
209
+ return seed;
210
+ }
211
+
212
+ /** \return Collection of siblings to starting Node */
213
+ static const MarkdownNodes& startingNodeSiblings(const MarkdownNodeIterator& seed,
214
+ const MarkdownNodes& siblings) {
215
+ return siblings;
216
+ }
217
+
218
+ /** \return Starting node for next parsing */
219
+ static const MarkdownNodeIterator nextStartingNode(const MarkdownNodeIterator& seed,
220
+ const MarkdownNodes& siblings,
221
+ const MarkdownNodeIterator& cur) {
222
+ return cur;
223
+ }
224
+
225
+ static const bool nextSkipsUnexpected = false;
226
+ };
227
+ }
228
+
229
+ #endif
@@ -0,0 +1,81 @@
1
+ //
2
+ // SectionParserData.h
3
+ // snowcrash
4
+ //
5
+ // Created by Zdenek Nemec on 5/21/14.
6
+ // Copyright (c) 2014 Apiary Inc. All rights reserved.
7
+ //
8
+
9
+ #ifndef SNOWCRASH_SECTIONPARSERDATA_H
10
+ #define SNOWCRASH_SECTIONPARSERDATA_H
11
+
12
+ #include "Blueprint.h"
13
+ #include "Section.h"
14
+ #include "SymbolTable.h"
15
+
16
+ namespace snowcrash {
17
+
18
+ /**
19
+ * \brief Blueprint Parser Options.
20
+ *
21
+ * Controls blueprint parser behavior.
22
+ */
23
+ enum BlueprintParserOption {
24
+ RenderDescriptionsOption = (1 << 0), /// < Render Markdown in description.
25
+ RequireBlueprintNameOption = (1 << 1) /// < Treat missing blueprint name as error
26
+ };
27
+
28
+ typedef unsigned int BlueprintParserOptions;
29
+
30
+ /**
31
+ * \brief Section Parser Data
32
+ *
33
+ * State of the parser.
34
+ */
35
+ struct SectionParserData {
36
+ SectionParserData(BlueprintParserOptions opts,
37
+ const mdp::ByteBuffer& src,
38
+ const Blueprint& bp)
39
+ : options(opts), sourceData(src), blueprint(bp) {}
40
+
41
+ /** Parser Options */
42
+ BlueprintParserOptions options;
43
+
44
+ /** Symbol Table */
45
+ SymbolTable symbolTable;
46
+
47
+ /** Source Data */
48
+ const mdp::ByteBuffer& sourceData;
49
+
50
+ /** AST being parsed **/
51
+ const Blueprint& blueprint;
52
+
53
+ /** Sections Context */
54
+ typedef std::vector<SectionType> SectionsStack;
55
+ SectionsStack sectionsContext;
56
+
57
+ /** \returns Actual Section Context */
58
+ SectionType sectionContext() const {
59
+ return (sectionsContext.empty()) ? UndefinedSectionType : sectionsContext.back();
60
+ }
61
+
62
+ /** \returns Parent Section Context */
63
+ SectionType parentSectionContext() const {
64
+ if (sectionsContext.empty())
65
+ return UndefinedSectionType;
66
+
67
+ size_t size = sectionsContext.size();
68
+ if (size == 1)
69
+ return sectionsContext.back();
70
+ else
71
+ return sectionsContext[size-2];
72
+ }
73
+
74
+ private:
75
+ SectionParserData();
76
+ SectionParserData(const SectionParserData&);
77
+ SectionParserData& operator=(const SectionParserData&);
78
+ };
79
+ }
80
+
81
+ #endif
@@ -0,0 +1,211 @@
1
+ //
2
+ // Processor.h
3
+ // snowcrash
4
+ //
5
+ // Created by Zdenek Nemec on 5/14/14.
6
+ // Copyright (c) 2014 Apiary Inc. All rights reserved.
7
+ //
8
+
9
+ #ifndef SNOWCRASH_SECTIONPROCESSOR_H
10
+ #define SNOWCRASH_SECTIONPROCESSOR_H
11
+
12
+ #include "SectionParserData.h"
13
+ #include "SourceAnnotation.h"
14
+ #include "Signature.h"
15
+
16
+ namespace snowcrash {
17
+
18
+ using mdp::MarkdownNode;
19
+ using mdp::MarkdownNodes;
20
+ using mdp::MarkdownNodeIterator;
21
+
22
+ typedef Collection<SectionType>::type SectionTypes;
23
+
24
+ /**
25
+ * Layout of the section being parsed
26
+ */
27
+ enum SectionLayout {
28
+ DefaultSectionLayout, /// Default Section Layout: Signature > Description > Content > Nested
29
+ ExclusiveNestedSectionLayout, /// Section is composed of nested sections only
30
+ RedirectSectionLayout /// Section should be parsed by another parser as whole
31
+ };
32
+
33
+ /*
34
+ * Forward Declarations
35
+ */
36
+ template<typename T>
37
+ struct SectionProcessor;
38
+
39
+ /**
40
+ * \brief Section Processor Base
41
+ *
42
+ * Defines section processor interface alongised with its default
43
+ * behavior.
44
+ */
45
+ template<typename T>
46
+ struct SectionProcessorBase {
47
+
48
+ /**
49
+ * \brief Process section signature Markdown node
50
+ * \param node Node to process
51
+ * \param siblings Siblings of the node being processed
52
+ * \param pd Section parser state
53
+ * \param report Process log report
54
+ * \param out Processed output
55
+ * \return Result of the process operation
56
+ */
57
+ static MarkdownNodeIterator processSignature(const MarkdownNodeIterator& node,
58
+ const MarkdownNodes& siblings,
59
+ SectionParserData& pd,
60
+ SectionLayout& layout,
61
+ Report& report,
62
+ T& out) {
63
+ return ++MarkdownNodeIterator(node);
64
+ }
65
+
66
+ /** Process section description Markdown node */
67
+ static MarkdownNodeIterator processDescription(const MarkdownNodeIterator& node,
68
+ const MarkdownNodes& siblings,
69
+ SectionParserData& pd,
70
+ Report& report,
71
+ T& out) {
72
+
73
+ if (!out.description.empty()) {
74
+ TwoNewLines(out.description);
75
+ }
76
+
77
+ out.description += mdp::MapBytesRangeSet(node->sourceMap, pd.sourceData);
78
+
79
+ return ++MarkdownNodeIterator(node);
80
+ }
81
+
82
+ /** Process section-specific content Markdown node */
83
+ static MarkdownNodeIterator processContent(const MarkdownNodeIterator& node,
84
+ const MarkdownNodes& siblings,
85
+ SectionParserData& pd,
86
+ Report& report,
87
+ T& out) {
88
+ return ++MarkdownNodeIterator(node);
89
+ }
90
+
91
+ /**
92
+ * \brief Process nested sections Markdown node(s)
93
+ * \param node Node to process
94
+ * \param siblings Siblings of the node being processed
95
+ * \param pd Section parser state
96
+ * \param report Process log report
97
+ * \param out Processed output
98
+ */
99
+ static MarkdownNodeIterator processNestedSection(const MarkdownNodeIterator& node,
100
+ const MarkdownNodes& siblings,
101
+ SectionParserData& pd,
102
+ Report& report,
103
+ T& out) {
104
+ return node;
105
+ }
106
+
107
+ /** Process unexpected Markdown node */
108
+ static MarkdownNodeIterator processUnexpectedNode(const MarkdownNodeIterator& node,
109
+ const MarkdownNodes& siblings,
110
+ SectionParserData& pd,
111
+ SectionType& lastSectionType,
112
+ Report& report,
113
+ T& out) {
114
+
115
+ // WARN: Ignoring unexpected node
116
+ std::stringstream ss;
117
+ mdp::CharactersRangeSet sourceMap = mdp::BytesRangeSetToCharactersRangeSet(node->sourceMap, pd.sourceData);
118
+
119
+ if (node->type == mdp::HeaderMarkdownNodeType) {
120
+ ss << "unexpected header block, expected a group, resource or an action definition";
121
+ ss << ", e.g. '# Group <name>', '# <resource name> [<URI>]' or '# <HTTP method> <URI>'";
122
+ } else {
123
+ ss << "ignoring unrecognized block";
124
+ }
125
+
126
+ report.warnings.push_back(Warning(ss.str(),
127
+ IgnoringWarning,
128
+ sourceMap));
129
+
130
+ return ++MarkdownNodeIterator(node);
131
+ }
132
+
133
+ /** Final validation after processing */
134
+ static void finalize(const MarkdownNodeIterator& node,
135
+ SectionParserData& pd,
136
+ Report& report,
137
+ T& out) {
138
+ }
139
+
140
+ /** \return True if the node is a section description node */
141
+ static bool isDescriptionNode(const MarkdownNodeIterator& node,
142
+ SectionType sectionType) {
143
+
144
+ if (SectionProcessor<T>::isContentNode(node, sectionType) ||
145
+ SectionProcessor<T>::nestedSectionType(node) != UndefinedSectionType) {
146
+
147
+ return false;
148
+ }
149
+
150
+ SectionType keywordSectionType = SectionKeywordSignature(node);
151
+
152
+ if (keywordSectionType == UndefinedSectionType) {
153
+ return true;
154
+ }
155
+
156
+ SectionTypes nestedTypes = SectionProcessor<T>::nestedSectionTypes();
157
+
158
+ if (std::find(nestedTypes.begin(), nestedTypes.end(), keywordSectionType) != nestedTypes.end()) {
159
+ // Node is a keyword defined section defined in one of the nested sections
160
+ // Treat it as a description
161
+ return true;
162
+ }
163
+
164
+ return false;
165
+ }
166
+
167
+ /** \return True if the node is a section-specific content node */
168
+ static bool isContentNode(const MarkdownNodeIterator& node,
169
+ SectionType sectionType) {
170
+ return false;
171
+ }
172
+
173
+ /** \return True if the node is unexpected in the current context */
174
+ static bool isUnexpectedNode(const MarkdownNodeIterator& node,
175
+ SectionType sectionType) {
176
+
177
+ SectionType keywordSectionType = SectionKeywordSignature(node);
178
+ SectionTypes nestedTypes = SectionProcessor<T>::nestedSectionTypes();
179
+
180
+ if (std::find(nestedTypes.begin(), nestedTypes.end(), keywordSectionType) != nestedTypes.end()) {
181
+ return true;
182
+ }
183
+
184
+ return (keywordSectionType == UndefinedSectionType);
185
+ }
186
+
187
+ /** \return Nested sections of the section */
188
+ static SectionTypes nestedSectionTypes() {
189
+ return SectionTypes();
190
+ }
191
+
192
+ /** \return %SectionType of the node */
193
+ static SectionType sectionType(const MarkdownNodeIterator& node) {
194
+ return UndefinedSectionType;
195
+ }
196
+
197
+ /** \return Nested %SectionType of the node */
198
+ static SectionType nestedSectionType(const MarkdownNodeIterator& node) {
199
+ return UndefinedSectionType;
200
+ }
201
+ };
202
+
203
+ /**
204
+ * Default Section Processor
205
+ */
206
+ template<typename T>
207
+ struct SectionProcessor : public SectionProcessorBase<T> {
208
+ };
209
+ }
210
+
211
+ #endif