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
@@ -1,645 +0,0 @@
1
- //
2
- // ParameterDefinitonParser.h
3
- // snowcrash
4
- //
5
- // Created by Zdenek Nemec on 9/1/13.
6
- // Copyright (c) 2013 Apiary Inc. All rights reserved.
7
- //
8
-
9
- #ifndef SNOWCRASH_PARAMETERDEFINITIONPARSER_H
10
- #define SNOWCRASH_PARAMETERDEFINITIONPARSER_H
11
-
12
- #include <sstream>
13
- #include "BlueprintParserCore.h"
14
- #include "Blueprint.h"
15
- #include "RegexMatch.h"
16
- #include "StringUtility.h"
17
- #include "ListBlockUtility.h"
18
- #include "SectionUtility.h"
19
- #include "DescriptionSectionUtility.h"
20
-
21
- /** Parameter Value regex */
22
- #define PARAMETER_VALUE "`([^`]+)`"
23
-
24
- /** Parameter Identifier */
25
- #define PARAMETER_IDENTIFIER "(([[:alnum:]_.-])*|(%[A-Fa-f0-9]{2})*)+"
26
-
27
- /** Lead in and out for comma separated values regex */
28
- #define CSV_LEADINOUT "[[:blank:]]*,?[[:blank:]]*"
29
-
30
- namespace snowcrashconst {
31
-
32
- /** Parameter Required matching regex */
33
- const char* const ParameterRequiredRegex = "^[[:blank:]]*[Rr]equired[[:blank:]]*$";
34
-
35
- /** Parameter Optional matching regex */
36
- const char* const ParameterOptionalRegex = "^[[:blank:]]*[Oo]ptional[[:blank:]]*$";
37
-
38
- /** Additonal Parameter Traits Example matching regex */
39
- const char* const AdditionalTraitsExampleRegex = CSV_LEADINOUT "`([^`]*)`" CSV_LEADINOUT;
40
-
41
- /** Additonal Parameter Traits Use matching regex */
42
- const char* const AdditionalTraitsUseRegex = CSV_LEADINOUT "([Oo]ptional|[Rr]equired)" CSV_LEADINOUT;
43
-
44
- /** Additonal Parameter Traits Type matching regex */
45
- const char* const AdditionalTraitsTypeRegex = CSV_LEADINOUT "([^,]*)" CSV_LEADINOUT;
46
-
47
- /** Parameter Values matching regex */
48
- const char* const ParameterValuesRegex = "^[[:blank:]]*[Vv]alues[[:blank:]]*$";
49
-
50
- /** Values expected content */
51
- const char* const ExpectedValuesContent = "nested list of possible parameter values, one element per list item e.g. '`value`'";
52
-
53
- const std::string DescriptionIdentifier = "...";
54
- }
55
-
56
- namespace snowcrash {
57
-
58
- /**
59
- * Classifier of internal list items, ParameterCollection context.
60
- */
61
- template <>
62
- FORCEINLINE SectionType ClassifyInternaListBlock<Parameter>(const BlockIterator& begin,
63
- const BlockIterator& end) {
64
-
65
-
66
- if (begin->type != ListBlockBeginType &&
67
- begin->type != ListItemBlockBeginType)
68
- return UndefinedSectionType;
69
-
70
- SourceData remainingContent;
71
- SourceData content = GetListItemSignature(begin, end, remainingContent);
72
-
73
- content = TrimString(content);
74
-
75
- if (RegexMatch(content, snowcrashconst::ParameterValuesRegex))
76
- return ParameterValuesSectionType;
77
-
78
- return UndefinedSectionType;
79
- }
80
-
81
- /** Children blocks classifier */
82
- template <>
83
- FORCEINLINE SectionType ClassifyChildrenListBlock<Parameter>(const BlockIterator& begin,
84
- const BlockIterator& end) {
85
-
86
- SectionType type = ClassifyInternaListBlock<Parameter>(begin, end);
87
- if (type != UndefinedSectionType)
88
- return type;
89
-
90
- return UndefinedSectionType;
91
- }
92
-
93
- /** Determine if a signature is a valid parameter*/
94
- FORCEINLINE bool IsValidParameterSignature(const SourceData& signature) {
95
-
96
- SourceData innerSignature = signature;
97
- innerSignature = TrimString(innerSignature);
98
-
99
- if (innerSignature.length() == 0) {
100
- return false; // Empty string, invalid
101
- }
102
-
103
- size_t firstSpace = innerSignature.find(" ");
104
- if (firstSpace == std::string::npos) {
105
- return RegexMatch(innerSignature, "^" PARAMETER_IDENTIFIER "$");
106
- }
107
-
108
- std::string paramName = innerSignature.substr(0, firstSpace);
109
- if (!RegexMatch(paramName, "^" PARAMETER_IDENTIFIER "$")) {
110
- return false; // Invalid param name
111
- }
112
- // Remove param name
113
- innerSignature = innerSignature.substr(firstSpace + 1);
114
-
115
- size_t descriptionPos = innerSignature.find(snowcrashconst::DescriptionIdentifier);
116
- // Remove description
117
- if (descriptionPos != std::string::npos) {
118
- innerSignature = innerSignature.substr(0, descriptionPos);
119
- innerSignature = TrimString(innerSignature);
120
- }
121
-
122
- size_t attributesPos = innerSignature.find("(");
123
- if (attributesPos != std::string::npos) {
124
- size_t endOfAttributesPos = innerSignature.find_last_of(")");
125
- if (endOfAttributesPos == std::string::npos) {
126
- return false; // Expecting close of attributes
127
- }
128
- // Remove attributes
129
- innerSignature = innerSignature.substr(0, attributesPos);
130
- innerSignature = TrimString(innerSignature);
131
- }
132
-
133
- if (innerSignature.length() == 0) {
134
- return true;
135
- }
136
-
137
- if (innerSignature.substr(0,1) == "=") {
138
- innerSignature = innerSignature.substr(1);
139
- innerSignature = TrimString(innerSignature);
140
- if (innerSignature.length() == 0) {
141
- return false; // No default value
142
- }
143
- if (innerSignature.substr(0,1) == "`" && innerSignature.substr(innerSignature.length()-1,1) == "`") {
144
- return true;
145
- }
146
- }
147
-
148
- return false;
149
- }
150
-
151
- /**
152
- * Returns true if given block has a parameter definition signature, false otherwise.
153
- */
154
- FORCEINLINE bool HasParameterDefinitionSignature(const BlockIterator& begin,
155
- const BlockIterator& end) {
156
-
157
- if (begin->type != ListBlockBeginType &&
158
- begin->type != ListItemBlockBeginType)
159
- return false;
160
-
161
- // Since we are too generic make sure the signature is not inner list
162
- SectionType listSection = ClassifyInternaListBlock<Parameter>(begin, end);
163
- if (listSection != UndefinedSectionType)
164
- return false;
165
-
166
- // Or any other reserved keyword
167
- if (HasParametersSignature(begin, end))
168
- return false;
169
-
170
- SourceData remainingContent;
171
- SourceData content = GetListItemSignature(begin, end, remainingContent);
172
- content = TrimString(content);
173
- return IsValidParameterSignature(content);
174
- }
175
-
176
- /**
177
- * Block Classifier, Parameter context.
178
- */
179
- template <>
180
- FORCEINLINE SectionType ClassifyBlock<Parameter>(const BlockIterator& begin,
181
- const BlockIterator& end,
182
- const SectionType& context) {
183
-
184
- if (context == UndefinedSectionType) {
185
- if (HasParameterDefinitionSignature(begin, end))
186
- return ParameterDefinitionSectionType;
187
- }
188
- else if (context == ParameterDefinitionSectionType) {
189
-
190
- if (begin->type == ListItemBlockEndType ||
191
- begin->type == ListBlockEndType)
192
- return UndefinedSectionType;
193
-
194
- SectionType listSection = ClassifyInternaListBlock<Parameter>(begin, end);
195
- if (listSection != UndefinedSectionType)
196
- return listSection;
197
-
198
- if (begin->type == ListBlockBeginType)
199
- return ForeignSectionType; // Foreign nested list-item
200
-
201
- if (begin->type == ListItemBlockBeginType)
202
- return UndefinedSectionType;
203
- }
204
- else if (context == ParameterValuesSectionType ||
205
- context == ForeignSectionType) {
206
-
207
- if (begin->type == ListItemBlockEndType ||
208
- begin->type == ListBlockEndType)
209
- return UndefinedSectionType;
210
-
211
- SectionType listSection = ClassifyInternaListBlock<Parameter>(begin, end);
212
- if (listSection != UndefinedSectionType)
213
- return listSection;
214
-
215
- return ForeignSectionType;
216
- }
217
-
218
- return (context == ParameterDefinitionSectionType) ? context : UndefinedSectionType;
219
- }
220
-
221
- /**
222
- * Parameter section parser.
223
- */
224
- template<>
225
- struct SectionParser<Parameter> {
226
-
227
- static ParseSectionResult ParseSection(const BlueprintSection& section,
228
- const BlockIterator& cur,
229
- BlueprintParserCore& parser,
230
- Parameter& parameter) {
231
-
232
- ParseSectionResult result = std::make_pair(Result(), cur);
233
- switch (section.type) {
234
-
235
- case ParameterDefinitionSectionType:
236
- result = HandleParmeterDefinitionSection(section, cur, parser, parameter);
237
- break;
238
-
239
- case ParameterValuesSectionType:
240
- result = HandleValuesSection(section, cur, parser, parameter);
241
- break;
242
-
243
- case ForeignSectionType:
244
- result = HandleForeignSection<Parameter>(section, cur, parser.sourceData);
245
- break;
246
-
247
- case UndefinedSectionType:
248
- result.second = CloseList(cur, section.bounds.second);
249
- break;
250
-
251
- default:
252
- result.first.error = UnexpectedBlockError(section, cur, parser.sourceData);
253
- break;
254
- }
255
-
256
- return result;
257
- }
258
-
259
-
260
- static void Finalize(const SectionBounds& bounds,
261
- BlueprintParserCore& parser,
262
- Parameter& parameter,
263
- Result& result) {}
264
-
265
- /** Parse a parameter definition top-level section blocks. */
266
- static ParseSectionResult HandleParmeterDefinitionSection(const BlueprintSection& section,
267
- const BlockIterator& cur,
268
- BlueprintParserCore& parser,
269
- Parameter& parameter) {
270
-
271
- ParseSectionResult result = std::make_pair(Result(), cur);
272
- BlockIterator sectionCur = cur;
273
-
274
- // Signature
275
- if (sectionCur == section.bounds.first) {
276
- ProcessSignature(section, sectionCur, parser.sourceData, result.first, parameter);
277
- result.second = SkipSignatureBlock(sectionCur, section.bounds.second);
278
- return result;
279
- }
280
-
281
- // Description
282
- result = ParseDescriptionBlock<Parameter>(section,
283
- sectionCur,
284
- parser.sourceData,
285
- parameter);
286
- return result;
287
-
288
- }
289
-
290
-
291
-
292
- /**
293
- * Retrieve and process parameter definition signature.
294
- */
295
- static void ProcessSignature(const BlueprintSection& section,
296
- const BlockIterator& cur,
297
- const SourceData& sourceData,
298
- Result& result,
299
- Parameter& parameter) {
300
-
301
- // Set default values
302
- parameter.use = UndefinedParameterUse;
303
-
304
- // Process signature
305
- SourceData remainingContent;
306
- SourceData signature = GetListItemSignature(cur, section.bounds.second, remainingContent);
307
-
308
- TrimString(signature);
309
-
310
- if (IsValidParameterSignature(signature)) {
311
-
312
- SourceData innerSignature = signature;
313
- innerSignature = TrimString(innerSignature);
314
-
315
- size_t firstSpace = innerSignature.find(" ");
316
- if (firstSpace == std::string::npos) {
317
- // Name
318
- parameter.name = signature;
319
- }
320
- else {
321
- parameter.name = innerSignature.substr(0, firstSpace);
322
- innerSignature = innerSignature.substr(firstSpace + 1);
323
- size_t descriptionPos = innerSignature.find(snowcrashconst::DescriptionIdentifier);
324
- if (descriptionPos != std::string::npos) {
325
- // Description
326
- parameter.description = innerSignature.substr(descriptionPos);
327
- parameter.description = TrimString(parameter.description.replace(0, snowcrashconst::DescriptionIdentifier.length(), ""));
328
- innerSignature = innerSignature.substr(0, descriptionPos);
329
- innerSignature = TrimString(innerSignature);
330
- }
331
-
332
- size_t attributesPos = innerSignature.find("(");
333
- if (attributesPos != std::string::npos) {
334
- size_t endOfAttributesPos = innerSignature.find_last_of(")");
335
- if (endOfAttributesPos - attributesPos > 1) {
336
- std::string attributes = innerSignature.substr(attributesPos, endOfAttributesPos - attributesPos);
337
- attributes = attributes.substr(1);
338
- ProcessSignatureAdditionalTraits(section, cur, attributes, sourceData, result, parameter);
339
- innerSignature = innerSignature.substr(0, attributesPos);
340
- innerSignature = TrimString(innerSignature);
341
- }
342
- }
343
-
344
- if (innerSignature.length() > 0) {
345
- // Remove =
346
- parameter.defaultValue = innerSignature;
347
- parameter.defaultValue.erase(std::remove(parameter.defaultValue.begin(), parameter.defaultValue.end(), '='), parameter.defaultValue.end());
348
- parameter.defaultValue.erase(std::remove(parameter.defaultValue.begin(), parameter.defaultValue.end(), '`'), parameter.defaultValue.end());
349
- parameter.defaultValue = TrimString(parameter.defaultValue);
350
- }
351
- }
352
- // Check possible required vs default clash
353
- if (parameter.use != OptionalParameterUse &&
354
- !parameter.defaultValue.empty()) {
355
-
356
- // WARN: Required vs default clash
357
- std::stringstream ss;
358
- ss << "specifying parameter '" << parameter.name << "' as required supersedes its default value"\
359
- ", declare the parameter as 'optional' to specify its default value";
360
-
361
- BlockIterator nameBlock = ListItemNameBlock(cur, section.bounds.second);
362
- SourceCharactersBlock sourceBlock = CharacterMapForBlock(nameBlock, cur, section.bounds, sourceData);
363
- result.warnings.push_back(Warning(ss.str(),
364
- LogicalErrorWarning,
365
- sourceBlock));
366
- }
367
- }
368
- else {
369
- // ERR: unable to parse
370
- BlockIterator nameBlock = ListItemNameBlock(cur, section.bounds.second);
371
- SourceCharactersBlock sourceBlock = CharacterMapForBlock(nameBlock, cur, section.bounds, sourceData);
372
- result.error = (Error("unable to parse parameter specification",
373
- BusinessError,
374
- sourceBlock));
375
- }
376
- }
377
-
378
-
379
- /** Parse additional parameter attributes from abbrev definition bracket */
380
- static void ProcessSignatureAdditionalTraits(const BlueprintSection& section,
381
- const BlockIterator& cur,
382
- const SourceData& additionalTraits,
383
- const SourceData& sourceData,
384
- Result& result,
385
- Parameter& parameter)
386
- {
387
-
388
- // Cherry pick example value, if any
389
- std::string source = additionalTraits;
390
- TrimString(source);
391
- CaptureGroups captureGroups;
392
- if (RegexCapture(source, snowcrashconst::AdditionalTraitsExampleRegex, captureGroups) &&
393
- captureGroups.size() > 1) {
394
-
395
- parameter.exampleValue = captureGroups[1];
396
- std::string::size_type pos = source.find(captureGroups[0]);
397
- if (pos != std::string::npos)
398
- source.replace(pos, captureGroups[0].length(), std::string());
399
- }
400
-
401
- // Cherry pick use attribute, if any
402
- captureGroups.clear();
403
- if (RegexCapture(source, snowcrashconst::AdditionalTraitsUseRegex, captureGroups) &&
404
- captureGroups.size() > 1) {
405
-
406
- parameter.use = (RegexMatch(captureGroups[1], snowcrashconst::ParameterOptionalRegex)) ? OptionalParameterUse : RequiredParameterUse;
407
-
408
- std::string::size_type pos = source.find(captureGroups[0]);
409
- if (pos != std::string::npos)
410
- source.replace(pos, captureGroups[0].length(), std::string());
411
- }
412
-
413
- // Finish with type
414
- captureGroups.clear();
415
- if (RegexCapture(source, snowcrashconst::AdditionalTraitsTypeRegex, captureGroups) &&
416
- captureGroups.size() > 1) {
417
-
418
- parameter.type = captureGroups[1];
419
-
420
- std::string::size_type pos = source.find(captureGroups[0]);
421
- if (pos != std::string::npos)
422
- source.replace(pos, captureGroups[0].length(), std::string());
423
- }
424
-
425
- // Check whats left
426
- TrimString(source);
427
- if (!source.empty()) {
428
- // WARN: Additional parameters traits warning
429
- std::stringstream ss;
430
- ss << "unable to parse additional parameter traits";
431
- ss << ", expected '([required | optional], [<type>], [`<example value>`])'";
432
- ss << ", e.g. '(optional, string, `Hello World`)'";
433
-
434
- BlockIterator nameBlock = ListItemNameBlock(cur, section.bounds.second);
435
- SourceCharactersBlock sourceBlock = CharacterMapForBlock(nameBlock, cur, section.bounds, sourceData);
436
- result.warnings.push_back(Warning(ss.str(),
437
- FormattingWarning,
438
- sourceBlock));
439
-
440
- parameter.type.clear();
441
- parameter.exampleValue.clear();
442
- parameter.use = UndefinedParameterUse;
443
- }
444
- }
445
-
446
- /** Parse possible values enumeration section blocks. */
447
- static ParseSectionResult HandleValuesSection(const BlueprintSection& section,
448
- const BlockIterator& cur,
449
- BlueprintParserCore& parser,
450
- Parameter& parameter) {
451
-
452
- ParseSectionResult result = std::make_pair(Result(), cur);
453
-
454
- // Check redefinition
455
- if (!parameter.values.empty()) {
456
- // WARN: parameter values are already defined
457
- std::stringstream ss;
458
- ss << "overshadowing previous 'values' definition";
459
- ss << " for parameter '" << parameter.name << "'";
460
-
461
- BlockIterator nameBlock = ListItemNameBlock(cur, section.bounds.second);
462
- SourceCharactersBlock sourceBlock = CharacterMapForBlock(nameBlock, cur, section.bounds, parser.sourceData);
463
- result.first.warnings.push_back(Warning(ss.str(),
464
- RedefinitionWarning,
465
- sourceBlock));
466
- }
467
-
468
- // Clear any previous content
469
- parameter.values.clear();
470
-
471
- // Check additional content in signature
472
- CheckSignatureAdditionalContent(section,
473
- cur,
474
- parser.sourceData,
475
- "'values:' keyword",
476
- snowcrashconst::ExpectedValuesContent,
477
- result.first);
478
-
479
- // Parse inner list of entities
480
- BlockIterator sectionCur = SkipSignatureBlock(cur, section.bounds.second);
481
- BlockIterator endCur = cur;
482
- if (endCur->type == ListBlockBeginType)
483
- ++endCur;
484
- endCur = SkipToClosingBlock(endCur, section.bounds.second, ListItemBlockBeginType, ListItemBlockEndType);
485
-
486
- if (sectionCur != endCur) {
487
-
488
- // Iterate over list blocks, try to parse any nested lists of possible elements
489
- for (; sectionCur != endCur; ++sectionCur) {
490
-
491
- if (sectionCur->type == QuoteBlockBeginType)
492
- sectionCur = SkipToClosingBlock(sectionCur, endCur, QuoteBlockBeginType, QuoteBlockEndType);
493
-
494
- bool entitiesParsed = false;
495
- if (sectionCur->type == ListBlockBeginType) {
496
- if (parameter.values.empty()) {
497
-
498
- // Try to parse some values
499
- ParseSectionResult valuesResult = ParseValuesEntities(sectionCur,
500
- section.bounds,
501
- parser,
502
- parameter.values);
503
- result.first += valuesResult.first;
504
- sectionCur = valuesResult.second;
505
- if (result.first.error.code != Error::OK)
506
- return result;
507
-
508
- entitiesParsed = true;
509
- }
510
- else {
511
- sectionCur = SkipToClosingBlock(sectionCur, endCur, ListBlockBeginType, ListBlockEndType);
512
- }
513
- }
514
-
515
- if (!entitiesParsed) {
516
- // WARN: ignoring extraneous content
517
- std::stringstream ss;
518
- ss << "ignoring additional content in the 'values' attribute of the '";
519
- ss << parameter.name << "' parameter";
520
- ss << ", " << snowcrashconst::ExpectedValuesContent;
521
-
522
- SourceCharactersBlock sourceBlock = CharacterMapForBlock(sectionCur, cur, section.bounds, parser.sourceData);
523
- result.first.warnings.push_back(Warning(ss.str(),
524
- IgnoringWarning,
525
- sourceBlock));
526
- }
527
- }
528
- }
529
-
530
- if (parameter.values.empty()) {
531
- // WARN: empty definition
532
- std::stringstream ss;
533
- ss << "no possible values specified for parameter '" << parameter.name << "'";
534
- SourceCharactersBlock sourceBlock = CharacterMapForBlock(sectionCur, cur, section.bounds, parser.sourceData);
535
- result.first.warnings.push_back(Warning(ss.str(),
536
- EmptyDefinitionWarning,
537
- sourceBlock));
538
- }
539
-
540
- if((!parameter.exampleValue.empty() || !parameter.defaultValue.empty()) && !parameter.values.empty()) {
541
- CheckExampleAndDefaultValue(section, sectionCur, parser, parameter, result);
542
- }
543
-
544
- endCur = CloseList(sectionCur, section.bounds.second);
545
- result.second = endCur;
546
- return result;
547
- }
548
-
549
- /** Parse entities in values attribute */
550
- static ParseSectionResult ParseValuesEntities(const BlockIterator& cur,
551
- const SectionBounds& bounds,
552
- BlueprintParserCore& parser,
553
- Collection<Value>::type& values) {
554
-
555
- ParseSectionResult result = std::make_pair(Result(), cur);
556
-
557
- if (cur->type != ListBlockBeginType)
558
- return result;
559
-
560
- BlockIterator sectionCur = ContentBlock(cur, bounds.second);
561
-
562
- while (sectionCur != bounds.second &&
563
- sectionCur->type == ListItemBlockBeginType) {
564
-
565
- sectionCur = SkipToClosingBlock(sectionCur, bounds.second, ListItemBlockBeginType, ListItemBlockEndType);
566
-
567
- CaptureGroups captureGroups;
568
- std::string content = sectionCur->content;
569
- if (content.empty()) {
570
- // Not inline list, map from source
571
- content = MapSourceData(parser.sourceData, sectionCur->sourceMap);
572
- }
573
-
574
- RegexCapture(content, PARAMETER_VALUE, captureGroups);
575
- if (captureGroups.size() > 1) {
576
- values.push_back(captureGroups[1]);
577
- }
578
- else {
579
- // WARN: Ignoring unexpected content
580
- TrimString(content);
581
- std::stringstream ss;
582
- ss << "ignoring the '" << content << "' element";
583
- ss << ", expected '`" << content << "`'";
584
-
585
- SourceCharactersBlock sourceBlock = CharacterMapForBlock(sectionCur, cur, bounds, parser.sourceData);
586
- result.first.warnings.push_back(Warning(ss.str(),
587
- IgnoringWarning,
588
- sourceBlock));
589
- }
590
-
591
- ++sectionCur;
592
- }
593
-
594
- result.second = sectionCur;
595
- return result;
596
- }
597
-
598
- static void CheckExampleAndDefaultValue(const BlueprintSection& section,
599
- const BlockIterator& cur,
600
- const BlueprintParserCore& parser,
601
- const Parameter& parameter,
602
- ParseSectionResult& result) {
603
-
604
- bool isExampleFound = false;
605
- bool isDefaultFound = false;
606
-
607
- for (Collection<Value>::const_iterator it = parameter.values.begin(); it != parameter.values.end(); ++it){
608
- if(parameter.exampleValue == *it) {
609
- isExampleFound = true;
610
- }
611
- if(parameter.defaultValue == *it) {
612
- isDefaultFound = true;
613
- }
614
- }
615
-
616
- if(!parameter.exampleValue.empty() && !isExampleFound) {
617
- // WARN: missing example in values.
618
- std::stringstream ss;
619
- ss << "the example value '" << parameter.exampleValue << "' of parameter '"<< parameter.name <<"' is not in its list of expected values";
620
- SourceCharactersBlock sourceBlock = CharacterMapForBlock(cur, section.bounds.second, section.bounds, parser.sourceData);
621
- result.first.warnings.push_back(Warning(ss.str(),
622
- LogicalErrorWarning,
623
- sourceBlock));
624
- }
625
-
626
- if(!parameter.defaultValue.empty() && !isDefaultFound) {
627
- // WARN: missing default in values.
628
- std::stringstream ss;
629
- ss << "the default value '" << parameter.defaultValue << "' of parameter '"<< parameter.name <<"' is not in its list of expected values";
630
- SourceCharactersBlock sourceBlock = CharacterMapForBlock(cur, section.bounds.second, section.bounds, parser.sourceData);
631
- result.first.warnings.push_back(Warning(ss.str(),
632
- LogicalErrorWarning,
633
- sourceBlock));
634
- }
635
-
636
- return;
637
- }
638
-
639
-
640
- };
641
-
642
- typedef BlockParser<Parameter, SectionParser<Parameter> > ParameterDefinitionParser;
643
- }
644
-
645
- #endif