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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +2 -0
- data/ext/snowcrash/Makefile +1 -1
- data/ext/snowcrash/bin/snowcrash +0 -0
- data/ext/snowcrash/configure +9 -9
- data/ext/snowcrash/ext/markdown-parser/Makefile +87 -0
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/CONTRIBUTING.md +0 -0
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/Makefile +2 -1
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/Makefile.win +0 -0
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/examples/smartypants.c +0 -0
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/examples/sundown.c +0 -0
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/html/houdini.h +0 -0
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/html/houdini_href_e.c +0 -0
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/html/houdini_html_e.c +0 -0
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/html/html.c +0 -0
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/html/html.h +0 -0
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/html/html_smartypants.c +0 -0
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/html_block_names.txt +0 -0
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/autolink.c +0 -0
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/autolink.h +0 -0
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/buffer.c +0 -0
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/buffer.h +1 -1
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/html_blocks.h +0 -0
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/markdown.c +9 -3
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/markdown.h +0 -0
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/src_map.c +11 -7
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/src_map.h +1 -1
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/stack.c +0 -0
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/src/stack.h +0 -0
- data/ext/snowcrash/{sundown → ext/markdown-parser/ext/sundown}/sundown.def +0 -0
- data/ext/snowcrash/ext/markdown-parser/msvc/markdown/markdown.vcproj +188 -0
- data/ext/snowcrash/ext/markdown-parser/msvc/msvc.sln +38 -0
- data/ext/snowcrash/ext/markdown-parser/msvc/sundown/sundown.vcproj +206 -0
- data/ext/snowcrash/ext/markdown-parser/src/ByteBuffer.cc +92 -0
- data/ext/snowcrash/ext/markdown-parser/src/ByteBuffer.h +82 -0
- data/ext/snowcrash/ext/markdown-parser/src/MarkdownNode.cc +152 -0
- data/ext/snowcrash/ext/markdown-parser/src/MarkdownNode.h +103 -0
- data/ext/snowcrash/ext/markdown-parser/src/MarkdownParser.cc +388 -0
- data/ext/snowcrash/{src → ext/markdown-parser/src}/MarkdownParser.h +43 -33
- data/ext/snowcrash/snowcrash.gyp +114 -63
- data/ext/snowcrash/src/ActionParser.h +334 -398
- data/ext/snowcrash/src/AssetParser.h +82 -171
- data/ext/snowcrash/src/Blueprint.h +7 -2
- data/ext/snowcrash/src/BlueprintParser.h +212 -286
- data/ext/snowcrash/src/BlueprintUtility.h +2 -2
- data/ext/snowcrash/src/CBlueprint.h +1 -1
- data/ext/snowcrash/src/CSourceAnnotation.cc +11 -11
- data/ext/snowcrash/src/CSourceAnnotation.h +9 -9
- data/ext/snowcrash/src/CodeBlockUtility.h +199 -149
- data/ext/snowcrash/src/HeadersParser.h +197 -0
- data/ext/snowcrash/src/ParameterParser.h +429 -0
- data/ext/snowcrash/src/ParametersParser.h +136 -211
- data/ext/snowcrash/src/PayloadParser.h +458 -562
- data/ext/snowcrash/src/Platform.h +0 -3
- data/ext/snowcrash/src/ResourceGroupParser.h +183 -164
- data/ext/snowcrash/src/ResourceParser.h +325 -493
- data/ext/snowcrash/src/Section.cc +42 -0
- data/ext/snowcrash/src/Section.h +47 -0
- data/ext/snowcrash/src/SectionParser.h +229 -0
- data/ext/snowcrash/src/SectionParserData.h +81 -0
- data/ext/snowcrash/src/SectionProcessor.h +211 -0
- data/ext/snowcrash/src/Signature.cc +74 -0
- data/ext/snowcrash/src/Signature.h +32 -0
- data/ext/snowcrash/src/SourceAnnotation.h +7 -20
- data/ext/snowcrash/src/StringUtility.h +30 -10
- data/ext/snowcrash/src/SymbolTable.h +7 -7
- data/ext/snowcrash/src/UriTemplateParser.cc +10 -10
- data/ext/snowcrash/src/UriTemplateParser.h +11 -14
- data/ext/snowcrash/src/ValuesParser.h +122 -0
- data/ext/snowcrash/src/Version.h +2 -2
- data/ext/snowcrash/src/csnowcrash.cc +5 -5
- data/ext/snowcrash/src/csnowcrash.h +3 -3
- data/ext/snowcrash/src/snowcrash.cc +74 -4
- data/ext/snowcrash/src/snowcrash.h +9 -4
- data/ext/snowcrash/src/snowcrash/snowcrash.cc +16 -16
- data/ext/snowcrash/tools/homebrew/snowcrash.rb +3 -2
- data/ext/snowcrash/vcbuild.bat +13 -4
- data/lib/redsnow.rb +5 -5
- data/lib/redsnow/binding.rb +1 -1
- data/lib/redsnow/blueprint.rb +33 -2
- data/lib/redsnow/parseresult.rb +7 -4
- data/lib/redsnow/version.rb +1 -1
- data/test/redsnow_binding_test.rb +6 -6
- data/test/redsnow_parseresult_test.rb +1 -1
- metadata +62 -42
- data/ext/snowcrash/src/BlockUtility.h +0 -186
- data/ext/snowcrash/src/BlueprintParserCore.h +0 -190
- data/ext/snowcrash/src/BlueprintSection.h +0 -140
- data/ext/snowcrash/src/DescriptionSectionUtility.h +0 -156
- data/ext/snowcrash/src/HeaderParser.h +0 -289
- data/ext/snowcrash/src/ListBlockUtility.h +0 -273
- data/ext/snowcrash/src/ListUtility.h +0 -95
- data/ext/snowcrash/src/MarkdownBlock.cc +0 -176
- data/ext/snowcrash/src/MarkdownBlock.h +0 -93
- data/ext/snowcrash/src/MarkdownParser.cc +0 -266
- data/ext/snowcrash/src/ParameterDefinitonParser.h +0 -645
- data/ext/snowcrash/src/Parser.cc +0 -71
- data/ext/snowcrash/src/Parser.h +0 -29
- data/ext/snowcrash/src/ParserCore.cc +0 -120
- data/ext/snowcrash/src/ParserCore.h +0 -82
- data/ext/snowcrash/src/SectionUtility.h +0 -142
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Signature.cc
|
|
3
|
+
// snowcrash
|
|
4
|
+
//
|
|
5
|
+
// Created by Zdenek Nemec on 6/20/14.
|
|
6
|
+
// Copyright (c) 2014 Apiary Inc. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
#include "Signature.h"
|
|
10
|
+
#include "SectionParser.h"
|
|
11
|
+
#include "ActionParser.h"
|
|
12
|
+
#include "AssetParser.h"
|
|
13
|
+
#include "HeadersParser.h"
|
|
14
|
+
#include "PayloadParser.h"
|
|
15
|
+
#include "ParametersParser.h"
|
|
16
|
+
#include "ResourceParser.h"
|
|
17
|
+
#include "ResourceGroupParser.h"
|
|
18
|
+
|
|
19
|
+
using namespace snowcrash;
|
|
20
|
+
|
|
21
|
+
SectionType snowcrash::SectionKeywordSignature(const mdp::MarkdownNodeIterator& node)
|
|
22
|
+
{
|
|
23
|
+
// Note: Every-keyword defined section should be listed here...
|
|
24
|
+
SectionType type = UndefinedSectionType;
|
|
25
|
+
|
|
26
|
+
if ((type = SectionProcessor<Headers>::sectionType(node)) != UndefinedSectionType)
|
|
27
|
+
return type;
|
|
28
|
+
|
|
29
|
+
if ((type = SectionProcessor<Asset>::sectionType(node)) != UndefinedSectionType)
|
|
30
|
+
return type;
|
|
31
|
+
|
|
32
|
+
if ((type = SectionProcessor<Payload>::sectionType(node)) != UndefinedSectionType)
|
|
33
|
+
return type;
|
|
34
|
+
|
|
35
|
+
if ((type = SectionProcessor<Values>::sectionType(node)) != UndefinedSectionType)
|
|
36
|
+
return type;
|
|
37
|
+
|
|
38
|
+
if ((type = SectionProcessor<Parameters>::sectionType(node)) != UndefinedSectionType)
|
|
39
|
+
return type;
|
|
40
|
+
|
|
41
|
+
/*
|
|
42
|
+
* NOTE: Order is important. Resource MUST preceed the Action.
|
|
43
|
+
*
|
|
44
|
+
* This is because an HTTP Request Method + URI is recognized as both %ActionSectionType and %ResourceSectionType.
|
|
45
|
+
* This is not optimal and should be addressed in the future.
|
|
46
|
+
*/
|
|
47
|
+
if ((type = SectionProcessor<Resource>::sectionType(node)) != UndefinedSectionType)
|
|
48
|
+
return type;
|
|
49
|
+
|
|
50
|
+
if ((type = SectionProcessor<Action>::sectionType(node)) != UndefinedSectionType)
|
|
51
|
+
return type;
|
|
52
|
+
|
|
53
|
+
if ((type = SectionProcessor<ResourceGroup>::sectionType(node)) != UndefinedSectionType)
|
|
54
|
+
return type;
|
|
55
|
+
|
|
56
|
+
return type;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
SectionType snowcrash::RecognizeCodeBlockFirstLine(const mdp::ByteBuffer& subject)
|
|
60
|
+
{
|
|
61
|
+
SectionType type = UndefinedSectionType;
|
|
62
|
+
|
|
63
|
+
if (RegexMatch(subject, HeadersRegex)) {
|
|
64
|
+
return HeadersSectionType;
|
|
65
|
+
}
|
|
66
|
+
else if (RegexMatch(subject, BodyRegex)) {
|
|
67
|
+
return BodySectionType;
|
|
68
|
+
}
|
|
69
|
+
else if (RegexMatch(subject, SchemaRegex)) {
|
|
70
|
+
return SchemaSectionType;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return type;
|
|
74
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Signature.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_SIGNATURE_H
|
|
10
|
+
#define SNOWCRASH_SIGNATURE_H
|
|
11
|
+
|
|
12
|
+
#include "MarkdownNode.h"
|
|
13
|
+
#include "Section.h"
|
|
14
|
+
|
|
15
|
+
namespace snowcrash {
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* \brief Query whether a node has keyword-defined signature.
|
|
19
|
+
* \param node A Markdown AST node to check.
|
|
20
|
+
* \return Type of the node if it has a recognized keyword signature, UndefinedType otherwise
|
|
21
|
+
*/
|
|
22
|
+
extern SectionType SectionKeywordSignature(const mdp::MarkdownNodeIterator& node);
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* \brief Recognize the type of section given the first line from a code block
|
|
26
|
+
* \param subject The first line that needs to be recognized
|
|
27
|
+
* \return SectionType Type of the section if the line contains a keyword
|
|
28
|
+
*/
|
|
29
|
+
extern SectionType RecognizeCodeBlockFirstLine(const mdp::ByteBuffer& subject);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
#endif
|
|
@@ -11,23 +11,10 @@
|
|
|
11
11
|
|
|
12
12
|
#include <string>
|
|
13
13
|
#include <vector>
|
|
14
|
+
#include "ByteBuffer.h"
|
|
14
15
|
|
|
15
16
|
namespace snowcrash {
|
|
16
17
|
|
|
17
|
-
/**
|
|
18
|
-
* \brief A character range within the source code string.
|
|
19
|
-
*/
|
|
20
|
-
struct SourceCharactersRange {
|
|
21
|
-
size_t location;
|
|
22
|
-
size_t length;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* \brief A block (set of ranges) of source code characters. A character map.
|
|
27
|
-
*
|
|
28
|
-
* NOTE: The block does not have to be continuous.
|
|
29
|
-
*/
|
|
30
|
-
typedef std::vector<SourceCharactersRange> SourceCharactersBlock;
|
|
31
18
|
|
|
32
19
|
/**
|
|
33
20
|
* \brief A source data annotation.
|
|
@@ -68,7 +55,7 @@ namespace snowcrash {
|
|
|
68
55
|
*/
|
|
69
56
|
SourceAnnotation(const std::string& message,
|
|
70
57
|
int code = OK,
|
|
71
|
-
const
|
|
58
|
+
const mdp::CharactersRangeSet& location = mdp::CharactersRangeSet()) {
|
|
72
59
|
|
|
73
60
|
this->message = message;
|
|
74
61
|
this->code = code;
|
|
@@ -93,7 +80,7 @@ namespace snowcrash {
|
|
|
93
80
|
}
|
|
94
81
|
|
|
95
82
|
/** The location of this annotation within the source data buffer. */
|
|
96
|
-
|
|
83
|
+
mdp::CharactersRangeSet location;
|
|
97
84
|
|
|
98
85
|
/** An annotation code. */
|
|
99
86
|
int code;
|
|
@@ -147,20 +134,20 @@ namespace snowcrash {
|
|
|
147
134
|
typedef std::vector<Warning> Warnings;
|
|
148
135
|
|
|
149
136
|
/**
|
|
150
|
-
* \brief A parsing
|
|
137
|
+
* \brief A parsing report Report.
|
|
151
138
|
*
|
|
152
139
|
* Result of a source data parsing operation.
|
|
153
140
|
* Composed of ONE error source annotation
|
|
154
141
|
* and a set of warning source annotations.
|
|
155
142
|
*/
|
|
156
|
-
struct
|
|
143
|
+
struct Report {
|
|
157
144
|
|
|
158
145
|
/**
|
|
159
|
-
* \brief Append a
|
|
146
|
+
* \brief Append a report to this one, replacing the error source annotation.
|
|
160
147
|
*
|
|
161
148
|
* NOTE: A binding does not need to wrap this action.
|
|
162
149
|
*/
|
|
163
|
-
|
|
150
|
+
Report& operator+=(const Report& rhs) {
|
|
164
151
|
error = rhs.error;
|
|
165
152
|
warnings.insert(warnings.end(), rhs.warnings.begin(), rhs.warnings.end());
|
|
166
153
|
return *this;
|
|
@@ -45,15 +45,6 @@ namespace snowcrash {
|
|
|
45
45
|
return TrimStringStart(TrimStringEnd(s));
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
// Retrieve first line of given string
|
|
49
|
-
inline std::string GetFirstLine(const std::string& s) {
|
|
50
|
-
std::string::size_type pos = s.find("\n");
|
|
51
|
-
if (pos == std::string::npos)
|
|
52
|
-
return s;
|
|
53
|
-
else
|
|
54
|
-
return s.substr(0, pos);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
48
|
// Split string by delim
|
|
58
49
|
inline std::vector<std::string>& Split(const std::string& s, char delim, std::vector<std::string>& elems) {
|
|
59
50
|
std::stringstream ss(s);
|
|
@@ -85,7 +76,20 @@ namespace snowcrash {
|
|
|
85
76
|
return elems;
|
|
86
77
|
}
|
|
87
78
|
|
|
88
|
-
|
|
79
|
+
// Make sure last two characters are newlines
|
|
80
|
+
inline std::string& TwoNewLines(std::string& s) {
|
|
81
|
+
|
|
82
|
+
if (s[s.length() - 1] != '\n') {
|
|
83
|
+
s += "\n";
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (s[s.length() - 2] != '\n') {
|
|
87
|
+
s += "\n";
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return s;
|
|
91
|
+
}
|
|
92
|
+
|
|
89
93
|
/**
|
|
90
94
|
* \brief Replace all occurrences of a string.
|
|
91
95
|
* \param s A string to search in.
|
|
@@ -104,6 +108,22 @@ namespace snowcrash {
|
|
|
104
108
|
}
|
|
105
109
|
return target;
|
|
106
110
|
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* \brief Extract the first line from a string.
|
|
114
|
+
*
|
|
115
|
+
* \param s Subject of the extraction
|
|
116
|
+
* \param r Remaining content aftert the extraction
|
|
117
|
+
* \return First line from the subject string
|
|
118
|
+
*/
|
|
119
|
+
inline std::string GetFirstLine(const std::string& s, std::string& r){
|
|
120
|
+
std::vector<std::string> elem = SplitOnFirst(s, '\n');
|
|
121
|
+
if (elem.empty())
|
|
122
|
+
return std::string();
|
|
123
|
+
if (elem.size() > 1)
|
|
124
|
+
r = elem.back();
|
|
125
|
+
return elem.front();
|
|
126
|
+
}
|
|
107
127
|
}
|
|
108
128
|
|
|
109
129
|
#endif
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
#include <string>
|
|
13
13
|
#include <map>
|
|
14
|
+
#include "ByteBuffer.h"
|
|
14
15
|
#include "RegexMatch.h"
|
|
15
16
|
|
|
16
17
|
#ifdef DEBUG
|
|
@@ -31,13 +32,10 @@ namespace snowcrashconst {
|
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
namespace snowcrash {
|
|
34
|
-
|
|
35
|
-
// Name of a symbol
|
|
36
|
-
typedef SourceData SymbolName;
|
|
37
35
|
|
|
38
36
|
// Resource Object Symbol
|
|
39
37
|
typedef std::pair<SymbolName, ResourceModel> ResourceModelSymbol;
|
|
40
|
-
|
|
38
|
+
|
|
41
39
|
// Resource Object Symbol Table
|
|
42
40
|
typedef std::map<SymbolName, ResourceModel> ResourceModelSymbolTable;
|
|
43
41
|
|
|
@@ -50,21 +48,23 @@ namespace snowcrash {
|
|
|
50
48
|
|
|
51
49
|
// Checks whether given source data represents reference to a symbol returning true if so,
|
|
52
50
|
// false otherwise. If source data is represent reference referred symbol name is filled in.
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
inline bool GetSymbolReference(const mdp::ByteBuffer& sourceData,
|
|
52
|
+
SymbolName& referredSymbol) {
|
|
55
53
|
|
|
56
54
|
CaptureGroups captureGroups;
|
|
55
|
+
|
|
57
56
|
if (RegexCapture(sourceData, snowcrashconst::SymbolReferenceRegex, captureGroups, 3)) {
|
|
58
57
|
referredSymbol = captureGroups[1];
|
|
59
58
|
TrimString(referredSymbol);
|
|
60
59
|
return true;
|
|
61
60
|
}
|
|
61
|
+
|
|
62
62
|
return false;
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
#ifdef DEBUG
|
|
66
66
|
// Prints markdown block recursively to stdout
|
|
67
|
-
|
|
67
|
+
inline void PrintSymbolTable(const SymbolTable& symbolTable) {
|
|
68
68
|
|
|
69
69
|
std::cout << "Resource Model Symbols:\n";
|
|
70
70
|
for (ResourceModelSymbolTable::const_iterator it = symbolTable.resourceModels.begin();
|
|
@@ -114,7 +114,7 @@ static ClassifiedExpression ClassifyExpression(const Expression& expression) {
|
|
|
114
114
|
return undefinedExpression;
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
-
void URITemplateParser::parse(const URITemplate& uri, const
|
|
117
|
+
void URITemplateParser::parse(const URITemplate& uri, const mdp::CharactersRangeSet& sourceBlock, ParsedURITemplate& result)
|
|
118
118
|
{
|
|
119
119
|
CaptureGroups groups;
|
|
120
120
|
Expressions expressions;
|
|
@@ -128,17 +128,17 @@ void URITemplateParser::parse(const URITemplate& uri, const SourceCharactersBloc
|
|
|
128
128
|
result.path = groups[4];
|
|
129
129
|
|
|
130
130
|
if (HasMismatchedCurlyBrackets(result.path)) {
|
|
131
|
-
result.
|
|
131
|
+
result.report.warnings.push_back(Warning("The URI template contains mismatched expression brackets", URIWarning, sourceBlock));
|
|
132
132
|
return;
|
|
133
133
|
}
|
|
134
134
|
|
|
135
135
|
if (HasNestedCurlyBrackets(result.path)) {
|
|
136
|
-
result.
|
|
136
|
+
result.report.warnings.push_back(Warning("The URI template contains nested expression brackets", URIWarning, sourceBlock));
|
|
137
137
|
return;
|
|
138
138
|
}
|
|
139
139
|
|
|
140
140
|
if (PathContainsSquareBrackets(result.path)) {
|
|
141
|
-
result.
|
|
141
|
+
result.report.warnings.push_back(Warning("The URI template contains square brackets, please percent encode square brackets as %5B and %5D", URIWarning, sourceBlock));
|
|
142
142
|
}
|
|
143
143
|
|
|
144
144
|
expressions = GetUriTemplateExpressions(result.path);
|
|
@@ -155,21 +155,21 @@ void URITemplateParser::parse(const URITemplate& uri, const SourceCharactersBloc
|
|
|
155
155
|
if (classifiedExpression.ContainsSpaces()) {
|
|
156
156
|
std::stringstream ss;
|
|
157
157
|
ss << "URI template expression \"" << classifiedExpression.innerExpression << "\" contains spaces. Allowed characters for expressions are A-Z a-z 0-9 _ and percent encoded characters";
|
|
158
|
-
result.
|
|
158
|
+
result.report.warnings.push_back(Warning(ss.str(), URIWarning, sourceBlock));
|
|
159
159
|
hasIllegalCharacters = true;
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
if (classifiedExpression.ContainsHyphens()) {
|
|
163
163
|
std::stringstream ss;
|
|
164
164
|
ss << "URI template expression \"" << classifiedExpression.innerExpression << "\" contains hyphens. Allowed characters for expressions are A-Z a-z 0-9 _ and percent encoded characters";
|
|
165
|
-
result.
|
|
165
|
+
result.report.warnings.push_back(Warning(ss.str(), URIWarning, sourceBlock));
|
|
166
166
|
hasIllegalCharacters = true;
|
|
167
167
|
}
|
|
168
168
|
|
|
169
169
|
if (classifiedExpression.ContainsAssignment()) {
|
|
170
170
|
std::stringstream ss;
|
|
171
171
|
ss << "URI template expression \"" << classifiedExpression.innerExpression << "\" contains assignment. Allowed characters for expressions are A-Z a-z 0-9 _ and percent encoded characters";
|
|
172
|
-
result.
|
|
172
|
+
result.report.warnings.push_back(Warning(ss.str(), URIWarning, sourceBlock));
|
|
173
173
|
hasIllegalCharacters = true;
|
|
174
174
|
}
|
|
175
175
|
|
|
@@ -177,18 +177,18 @@ void URITemplateParser::parse(const URITemplate& uri, const SourceCharactersBloc
|
|
|
177
177
|
if (classifiedExpression.IsInvalidExpressionName()) {
|
|
178
178
|
std::stringstream ss;
|
|
179
179
|
ss << "URI template expression \"" << classifiedExpression.innerExpression << "\" contains invalid characters. Allowed characters for expressions are A-Z a-z 0-9 _ and percent encoded characters";
|
|
180
|
-
result.
|
|
180
|
+
result.report.warnings.push_back(Warning(ss.str(), URIWarning, sourceBlock));
|
|
181
181
|
}
|
|
182
182
|
}
|
|
183
183
|
}
|
|
184
184
|
else{
|
|
185
|
-
result.
|
|
185
|
+
result.report.warnings.push_back(Warning(classifiedExpression.unsupportedWarningText, URIWarning, sourceBlock));
|
|
186
186
|
}
|
|
187
187
|
currentExpression++;
|
|
188
188
|
}
|
|
189
189
|
}
|
|
190
190
|
else{
|
|
191
|
-
result.
|
|
191
|
+
result.report.error = Error("Failed to parse URI Template", URIWarning);
|
|
192
192
|
}
|
|
193
193
|
|
|
194
194
|
}
|
|
@@ -6,20 +6,17 @@
|
|
|
6
6
|
// Copyright (c) 2013 Apiary Inc. All rights reserved.
|
|
7
7
|
//
|
|
8
8
|
|
|
9
|
-
#ifndef
|
|
10
|
-
#define
|
|
9
|
+
#ifndef SNOWCRASH_URITEMPLATEPARSER_H
|
|
10
|
+
#define SNOWCRASH_URITEMPLATEPARSER_H
|
|
11
11
|
|
|
12
|
-
#include <string>
|
|
13
12
|
#include "Blueprint.h"
|
|
14
|
-
#include "
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
#include "SourceAnnotation.h"
|
|
14
|
+
#include "RegexMatch.h"
|
|
17
15
|
|
|
18
16
|
#define URI_REGEX "^(http|https|ftp|file)?(://)?([^/]*)?(.*)$"
|
|
19
17
|
#define URI_TEMPLATE_OPERATOR_REGEX "([+|#|.|/|;|?|&])"
|
|
20
18
|
#define URI_TEMPLATE_EXPRESSION_REGEX "^([?|#|+|&]?(([A-Z|a-z|0-9|_|,])*|(%[A-F|a-f|0-9]{2})*)*\\*?)$"
|
|
21
19
|
|
|
22
|
-
|
|
23
20
|
namespace snowcrash {
|
|
24
21
|
|
|
25
22
|
/**
|
|
@@ -30,7 +27,7 @@ namespace snowcrash {
|
|
|
30
27
|
std::string host;
|
|
31
28
|
std::string path;
|
|
32
29
|
|
|
33
|
-
|
|
30
|
+
Report report;
|
|
34
31
|
};
|
|
35
32
|
|
|
36
33
|
/**
|
|
@@ -69,19 +66,19 @@ namespace snowcrash {
|
|
|
69
66
|
return false;
|
|
70
67
|
}
|
|
71
68
|
|
|
72
|
-
|
|
69
|
+
bool ContainsSpaces() {
|
|
73
70
|
return innerExpression.find(" ") != std::string::npos;
|
|
74
71
|
}
|
|
75
72
|
|
|
76
|
-
|
|
73
|
+
bool ContainsAssignment() {
|
|
77
74
|
return innerExpression.find("=") != std::string::npos;
|
|
78
75
|
}
|
|
79
76
|
|
|
80
|
-
|
|
77
|
+
bool ContainsHyphens() {
|
|
81
78
|
return innerExpression.find("-") != std::string::npos;
|
|
82
79
|
}
|
|
83
80
|
|
|
84
|
-
|
|
81
|
+
bool IsInvalidExpressionName() {
|
|
85
82
|
std::string tmpExpression = innerExpression;
|
|
86
83
|
if (tmpExpression.find("..") != std::string::npos) return true;
|
|
87
84
|
|
|
@@ -94,7 +91,7 @@ namespace snowcrash {
|
|
|
94
91
|
return !RegexMatch(tmpExpression, URI_TEMPLATE_EXPRESSION_REGEX);
|
|
95
92
|
}
|
|
96
93
|
|
|
97
|
-
|
|
94
|
+
bool IsSupportedExpressionType() {
|
|
98
95
|
return isSupported;
|
|
99
96
|
}
|
|
100
97
|
};
|
|
@@ -236,7 +233,7 @@ namespace snowcrash {
|
|
|
236
233
|
*
|
|
237
234
|
* \param uri A uri to be parsed.
|
|
238
235
|
*/
|
|
239
|
-
static void parse(const URITemplate& uri, const
|
|
236
|
+
static void parse(const URITemplate& uri, const mdp::CharactersRangeSet& sourceBlock, ParsedURITemplate& result);
|
|
240
237
|
};
|
|
241
238
|
}
|
|
242
239
|
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
//
|
|
2
|
+
// ValuesParser.h
|
|
3
|
+
// snowcrash
|
|
4
|
+
//
|
|
5
|
+
// Created by Pavan Kumar Sunkara on 6/12/14
|
|
6
|
+
// Copyright (c) 2014 Apiary Inc. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
#ifndef SNOWCRASH_VALUESPARSER_H
|
|
10
|
+
#define SNOWCRASH_VALUESPARSER_H
|
|
11
|
+
|
|
12
|
+
#include "SectionParser.h"
|
|
13
|
+
#include "RegexMatch.h"
|
|
14
|
+
#include "StringUtility.h"
|
|
15
|
+
|
|
16
|
+
/** Parameter Value regex */
|
|
17
|
+
#define PARAMETER_VALUE "`([^`]+)`"
|
|
18
|
+
|
|
19
|
+
namespace snowcrash {
|
|
20
|
+
|
|
21
|
+
/** Parameter Values */
|
|
22
|
+
typedef Collection<Value>::type Values; // TODO: Move this into core later
|
|
23
|
+
|
|
24
|
+
/** Parameter Values matching regex */
|
|
25
|
+
const char* const ValuesRegex = "^[[:blank:]]*[Vv]alues[[:blank:]]*$";
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Values section processor
|
|
29
|
+
*/
|
|
30
|
+
template<>
|
|
31
|
+
struct SectionProcessor<Values> : public SectionProcessorBase<Values> {
|
|
32
|
+
|
|
33
|
+
static MarkdownNodeIterator processNestedSection(const MarkdownNodeIterator& node,
|
|
34
|
+
const MarkdownNodes& siblings,
|
|
35
|
+
SectionParserData& pd,
|
|
36
|
+
Report& report,
|
|
37
|
+
Values& out) {
|
|
38
|
+
|
|
39
|
+
if (pd.sectionContext() == ValueSectionType) {
|
|
40
|
+
|
|
41
|
+
mdp::ByteBuffer content = node->children().front().text;
|
|
42
|
+
CaptureGroups captureGroups;
|
|
43
|
+
|
|
44
|
+
RegexCapture(content, PARAMETER_VALUE, captureGroups);
|
|
45
|
+
|
|
46
|
+
if (captureGroups.size() > 1) {
|
|
47
|
+
out.push_back(captureGroups[1]);
|
|
48
|
+
} else {
|
|
49
|
+
TrimString(content);
|
|
50
|
+
|
|
51
|
+
// WARN: Ignoring the unexpected param value
|
|
52
|
+
std::stringstream ss;
|
|
53
|
+
ss << "ignoring the '" << content << "' element";
|
|
54
|
+
ss << ", expected '`" << content << "`'";
|
|
55
|
+
|
|
56
|
+
mdp::CharactersRangeSet sourceMap = mdp::BytesRangeSetToCharactersRangeSet(node->sourceMap, pd.sourceData);
|
|
57
|
+
report.warnings.push_back(Warning(ss.str(),
|
|
58
|
+
IgnoringWarning,
|
|
59
|
+
sourceMap));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return ++MarkdownNodeIterator(node);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return node;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
static MarkdownNodeIterator processDescription(const MarkdownNodeIterator& node,
|
|
69
|
+
const MarkdownNodes& siblings,
|
|
70
|
+
SectionParserData& pd,
|
|
71
|
+
Report& report,
|
|
72
|
+
Values& out) {
|
|
73
|
+
|
|
74
|
+
return node;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
static bool isDescriptionNode(const MarkdownNodeIterator& node,
|
|
78
|
+
SectionType sectionType) {
|
|
79
|
+
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
static SectionType sectionType(const MarkdownNodeIterator& node) {
|
|
84
|
+
|
|
85
|
+
if (node->type == mdp::ListItemMarkdownNodeType
|
|
86
|
+
&& !node->children().empty()) {
|
|
87
|
+
|
|
88
|
+
mdp::ByteBuffer subject = node->children().front().text;
|
|
89
|
+
TrimString(subject);
|
|
90
|
+
|
|
91
|
+
if (RegexMatch(subject, ValuesRegex)) {
|
|
92
|
+
return ValuesSectionType;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return UndefinedSectionType;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
static SectionType nestedSectionType(const MarkdownNodeIterator& node) {
|
|
100
|
+
|
|
101
|
+
if (node->type == mdp::ListItemMarkdownNodeType
|
|
102
|
+
&& !node->children().empty()) {
|
|
103
|
+
|
|
104
|
+
mdp::ByteBuffer subject = node->children().front().text;
|
|
105
|
+
TrimString(subject);
|
|
106
|
+
|
|
107
|
+
if (node->children().size() == 1 &&
|
|
108
|
+
!subject.empty()) {
|
|
109
|
+
|
|
110
|
+
return ValueSectionType;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return UndefinedSectionType;
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
/** Parameter Section Parser */
|
|
119
|
+
typedef SectionParser<Values, ListSectionAdapter> ValuesParser;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
#endif
|