forked from qt-creator/qt-creator
CMakePM: Initial import of the RSTparser
Change-Id: I45bc3d53df3358c1f52ca219b53a1dec8e85a4ca Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
33
README.md
33
README.md
@@ -970,3 +970,36 @@ SQLite (https://www.sqlite.org) is in the Public Domain.
|
|||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
### RSTParser
|
||||||
|
|
||||||
|
RSTParser is an open-source C++ library for parsing reStructuredText
|
||||||
|
|
||||||
|
https://github.com/vitaut-archive/rstparser
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
|
||||||
|
Copyright (c) 2013, Victor Zverovich
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
@@ -938,6 +938,43 @@
|
|||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
\endcode
|
\endcode
|
||||||
|
|
||||||
|
\li \b RSTParser
|
||||||
|
|
||||||
|
RSTParser is an open-source C++ library for parsing reStructuredText
|
||||||
|
|
||||||
|
\list
|
||||||
|
\li \l https://github.com/vitaut-archive/rstparser
|
||||||
|
\endlist
|
||||||
|
|
||||||
|
\badcode
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
|
||||||
|
Copyright (c) 2013, Victor Zverovich
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
*/
|
*/
|
||||||
|
3
src/plugins/cmakeprojectmanager/3rdparty/rstparser/README.qt
vendored
Normal file
3
src/plugins/cmakeprojectmanager/3rdparty/rstparser/README.qt
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
Files taken from the CMake repository https://github.com/vitaut-archive/rstparser.git
|
||||||
|
|
||||||
|
49e1e6626ba28357749acfe3bf07c4a19e5bc4ef
|
32
src/plugins/cmakeprojectmanager/3rdparty/rstparser/README.rst
vendored
Normal file
32
src/plugins/cmakeprojectmanager/3rdparty/rstparser/README.rst
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
RSTParser
|
||||||
|
=========
|
||||||
|
|
||||||
|
RSTParser is an open-source C++ library for parsing
|
||||||
|
`reStructuredText <http://docutils.sourceforge.net/rst.html>`__.
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
|
||||||
|
Copyright (c) 2013, Victor Zverovich
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
169
src/plugins/cmakeprojectmanager/3rdparty/rstparser/rstparser-test.cc
vendored
Normal file
169
src/plugins/cmakeprojectmanager/3rdparty/rstparser/rstparser-test.cc
vendored
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
/*
|
||||||
|
reStructuredText parser tests.
|
||||||
|
|
||||||
|
Copyright (c) 2012, Victor Zverovich
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
#include <stack>
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
# include <crtdbg.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "rstparser.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
class TestHandler : public rst::ContentHandler {
|
||||||
|
private:
|
||||||
|
std::stack<std::string> tags_;
|
||||||
|
std::string content_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
const std::string &content() const { return content_; }
|
||||||
|
|
||||||
|
void StartBlock(rst::BlockType type) {
|
||||||
|
std::string tag;
|
||||||
|
switch (type) {
|
||||||
|
case rst::PARAGRAPH:
|
||||||
|
tag = "p";
|
||||||
|
break;
|
||||||
|
case rst::LINE_BLOCK:
|
||||||
|
tag = "lineblock";
|
||||||
|
break;
|
||||||
|
case rst::BLOCK_QUOTE:
|
||||||
|
tag = "blockquote";
|
||||||
|
break;
|
||||||
|
case rst::BULLET_LIST:
|
||||||
|
tag = "ul";
|
||||||
|
break;
|
||||||
|
case rst::LIST_ITEM:
|
||||||
|
tag = "li";
|
||||||
|
break;
|
||||||
|
case rst::LITERAL_BLOCK:
|
||||||
|
tag = "code";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
content_ += "<" + tag + ">";
|
||||||
|
tags_.push(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EndBlock() {
|
||||||
|
content_ += "</" + tags_.top() + ">";
|
||||||
|
tags_.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void HandleText(const char *text, std::size_t size) {
|
||||||
|
content_.append(text, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HandleDirective(const char *type) {
|
||||||
|
content_ += std::string("<") + type + " />";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
std::string Parse(const char *s) {
|
||||||
|
TestHandler handler;
|
||||||
|
rst::Parser parser(&handler);
|
||||||
|
parser.Parse(s);
|
||||||
|
return handler.content();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ParserTest, Paragraph) {
|
||||||
|
EXPECT_EQ("<p>test</p>", Parse("test"));
|
||||||
|
EXPECT_EQ("<p>test</p>", Parse("\ntest"));
|
||||||
|
EXPECT_EQ("<p>.</p>", Parse("."));
|
||||||
|
EXPECT_EQ("<p>..test</p>", Parse("..test"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ParserTest, LineBlock) {
|
||||||
|
EXPECT_EQ("<lineblock>test</lineblock>", Parse("| test"));
|
||||||
|
EXPECT_EQ("<lineblock> abc\ndef</lineblock>", Parse("| abc\n| def"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ParserTest, BlockQuote) {
|
||||||
|
EXPECT_EQ("<blockquote>test</blockquote>", Parse(" test"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ParserTest, PreserveInnerSpace) {
|
||||||
|
EXPECT_EQ("<p>a b</p>", Parse("a b"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ParserTest, ReplaceWhitespace) {
|
||||||
|
EXPECT_EQ("<p>a b</p>", Parse("a\tb"));
|
||||||
|
EXPECT_EQ("<blockquote>a b</blockquote>", Parse(" a\tb"));
|
||||||
|
EXPECT_EQ("<p>a b</p>", Parse("a\vb"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ParserTest, StripTrailingSpace) {
|
||||||
|
EXPECT_EQ("<p>test</p>", Parse("test \t"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ParserTest, MultiLineBlock) {
|
||||||
|
EXPECT_EQ("<p>line 1\nline 2</p>", Parse("line 1\nline 2"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ParserTest, UnindentBlock) {
|
||||||
|
EXPECT_EQ("<blockquote>abc</blockquote><p>def</p>", Parse(" abc\ndef"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ParserTest, BulletList) {
|
||||||
|
EXPECT_EQ("<ul><li>item</li></ul>", Parse("* item"));
|
||||||
|
EXPECT_EQ("<ul><li>abc\ndef</li></ul>", Parse("* abc\n def"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ParserTest, Literal) {
|
||||||
|
EXPECT_EQ("<p>abc:</p><code>def</code>", Parse("abc::\n\n def"));
|
||||||
|
EXPECT_EQ("<code>abc\ndef</code>", Parse("::\n\n abc\n def"));
|
||||||
|
EXPECT_EQ("<p>abc\ndef</p>", Parse("::\n\nabc\ndef"));
|
||||||
|
EXPECT_EQ("<p>::\nabc\ndef</p>", Parse("::\nabc\ndef"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ParserTest, Comment) {
|
||||||
|
EXPECT_EQ("", Parse(".."));
|
||||||
|
EXPECT_EQ("", Parse("..\n"));
|
||||||
|
EXPECT_EQ("", Parse(".. comment"));
|
||||||
|
EXPECT_EQ("", Parse(".. comment:"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ParserTest, Directive) {
|
||||||
|
EXPECT_EQ("<test />", Parse(".. test::"));
|
||||||
|
EXPECT_EQ("<test />", Parse(".. test::"));
|
||||||
|
EXPECT_EQ("<test />", Parse("..\ttest::"));
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
#ifdef _WIN32
|
||||||
|
// Disable message boxes on assertion failures.
|
||||||
|
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
|
||||||
|
_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
|
||||||
|
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
|
||||||
|
_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
|
||||||
|
#endif
|
||||||
|
testing::InitGoogleTest(&argc, argv);
|
||||||
|
return RUN_ALL_TESTS();
|
||||||
|
}
|
249
src/plugins/cmakeprojectmanager/3rdparty/rstparser/rstparser.cc
vendored
Normal file
249
src/plugins/cmakeprojectmanager/3rdparty/rstparser/rstparser.cc
vendored
Normal file
@@ -0,0 +1,249 @@
|
|||||||
|
/*
|
||||||
|
A reStructuredText parser written in C++.
|
||||||
|
|
||||||
|
Copyright (c) 2013, Victor Zverovich
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "rstparser.h"
|
||||||
|
|
||||||
|
#include <cctype>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
inline bool IsSpace(char c) {
|
||||||
|
switch (c) {
|
||||||
|
case ' ': case '\t': case '\v': case '\f':
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns true if s ends with string end.
|
||||||
|
bool EndsWith(const std::string &s, const char *end) {
|
||||||
|
std::size_t size = s.size(), end_size = std::strlen(end);
|
||||||
|
return size >= end_size ? std::strcmp(&s[size - end_size], end) == 0 : false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rst::ContentHandler::~ContentHandler() {}
|
||||||
|
|
||||||
|
void rst::Parser::SkipSpace() {
|
||||||
|
while (IsSpace(*ptr_))
|
||||||
|
++ptr_;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string rst::Parser::ParseDirectiveType() {
|
||||||
|
const char *s = ptr_;
|
||||||
|
if (!std::isalnum(*s))
|
||||||
|
return std::string();
|
||||||
|
for (;;) {
|
||||||
|
++s;
|
||||||
|
if (std::isalnum(*s))
|
||||||
|
continue;
|
||||||
|
switch (*s) {
|
||||||
|
case '-': case '_': case '+': case ':': case '.':
|
||||||
|
if (std::isalnum(s[1])) {
|
||||||
|
++s;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Fall through.
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
std::string type;
|
||||||
|
if (s != ptr_)
|
||||||
|
type.assign(ptr_, s);
|
||||||
|
ptr_ = s;
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rst::Parser::EnterBlock(rst::BlockType &prev_type, rst::BlockType type) {
|
||||||
|
if (type == prev_type)
|
||||||
|
return;
|
||||||
|
if (prev_type == LIST_ITEM)
|
||||||
|
handler_->EndBlock();
|
||||||
|
if (type == LIST_ITEM)
|
||||||
|
handler_->StartBlock(BULLET_LIST);
|
||||||
|
prev_type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rst::Parser::ParseBlock(
|
||||||
|
rst::BlockType type, rst::BlockType &prev_type, int indent) {
|
||||||
|
std::string text;
|
||||||
|
for (bool first = true; ; first = false) {
|
||||||
|
const char *line_start = ptr_;
|
||||||
|
if (!first) {
|
||||||
|
// Check indentation.
|
||||||
|
SkipSpace();
|
||||||
|
if (ptr_ - line_start != indent)
|
||||||
|
break;
|
||||||
|
if (*ptr_ == '\n') {
|
||||||
|
++ptr_;
|
||||||
|
break; // Empty line ends the block.
|
||||||
|
}
|
||||||
|
if (!*ptr_)
|
||||||
|
break; // End of input.
|
||||||
|
}
|
||||||
|
// Strip indentation.
|
||||||
|
line_start = ptr_;
|
||||||
|
|
||||||
|
// Find the end of the line.
|
||||||
|
while (*ptr_ && *ptr_ != '\n')
|
||||||
|
++ptr_;
|
||||||
|
|
||||||
|
// Strip whitespace at the end of the line.
|
||||||
|
const char *end = ptr_;
|
||||||
|
while (end != line_start && IsSpace(end[-1]))
|
||||||
|
--end;
|
||||||
|
|
||||||
|
// Copy text converting all whitespace characters to spaces.
|
||||||
|
text.reserve(end - line_start + 1);
|
||||||
|
if (!first)
|
||||||
|
text.push_back('\n');
|
||||||
|
enum {TAB_WIDTH = 8};
|
||||||
|
for (const char *s = line_start; s != end; ++s) {
|
||||||
|
char c = *s;
|
||||||
|
if (c == '\t') {
|
||||||
|
text.append(" ",
|
||||||
|
TAB_WIDTH - ((indent + s - line_start) % TAB_WIDTH));
|
||||||
|
} else if (IsSpace(c)) {
|
||||||
|
text.push_back(' ');
|
||||||
|
} else {
|
||||||
|
text.push_back(*s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (*ptr_ == '\n')
|
||||||
|
++ptr_;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove a trailing newline.
|
||||||
|
if (*text.rbegin() == '\n')
|
||||||
|
text.resize(text.size() - 1);
|
||||||
|
|
||||||
|
bool literal = type == PARAGRAPH && EndsWith(text, "::");
|
||||||
|
if (!literal || text.size() != 2) {
|
||||||
|
std::size_t size = text.size();
|
||||||
|
if (literal)
|
||||||
|
--size;
|
||||||
|
EnterBlock(prev_type, type);
|
||||||
|
handler_->StartBlock(type);
|
||||||
|
handler_->HandleText(text.c_str(), size);
|
||||||
|
handler_->EndBlock();
|
||||||
|
}
|
||||||
|
if (literal) {
|
||||||
|
// Parse a literal block.
|
||||||
|
const char *line_start = ptr_;
|
||||||
|
SkipSpace();
|
||||||
|
int new_indent = static_cast<int>(ptr_ - line_start);
|
||||||
|
if (new_indent > indent)
|
||||||
|
ParseBlock(LITERAL_BLOCK, prev_type, new_indent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void rst::Parser::ParseLineBlock(rst::BlockType &prev_type, int indent) {
|
||||||
|
std::string text;
|
||||||
|
for (bool first = true; ; first = false) {
|
||||||
|
const char *line_start = ptr_;
|
||||||
|
if (!first) {
|
||||||
|
// Check indentation.
|
||||||
|
SkipSpace();
|
||||||
|
if (*ptr_ != '|' || !IsSpace(ptr_[1]) || ptr_ - line_start != indent)
|
||||||
|
break;
|
||||||
|
ptr_ += 2;
|
||||||
|
if (!*ptr_)
|
||||||
|
break; // End of input.
|
||||||
|
}
|
||||||
|
// Strip indentation.
|
||||||
|
line_start = ptr_;
|
||||||
|
|
||||||
|
// Find the end of the line.
|
||||||
|
while (*ptr_ && *ptr_ != '\n')
|
||||||
|
++ptr_;
|
||||||
|
if (*ptr_ == '\n')
|
||||||
|
++ptr_;
|
||||||
|
text.append(line_start, ptr_);
|
||||||
|
}
|
||||||
|
|
||||||
|
EnterBlock(prev_type, rst::LINE_BLOCK);
|
||||||
|
handler_->StartBlock(rst::LINE_BLOCK);
|
||||||
|
handler_->HandleText(text.c_str(), text.size());
|
||||||
|
handler_->EndBlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
void rst::Parser::Parse(const char *s) {
|
||||||
|
BlockType prev_type = PARAGRAPH;
|
||||||
|
ptr_ = s;
|
||||||
|
while (*ptr_) {
|
||||||
|
// Skip whitespace and empty lines.
|
||||||
|
const char *line_start = ptr_;
|
||||||
|
SkipSpace();
|
||||||
|
if (*ptr_ == '\n') {
|
||||||
|
++ptr_;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
switch (*ptr_) {
|
||||||
|
case '.':
|
||||||
|
if (ptr_[1] == '.') {
|
||||||
|
char c = ptr_[2];
|
||||||
|
if (!IsSpace(c) && c != '\n' && c)
|
||||||
|
break;
|
||||||
|
// Parse a directive or a comment.
|
||||||
|
ptr_ += 2;
|
||||||
|
SkipSpace();
|
||||||
|
std::string type = ParseDirectiveType();
|
||||||
|
if (!type.empty() && ptr_[0] == ':' && ptr_[1] == ':') {
|
||||||
|
ptr_ += 2;
|
||||||
|
handler_->HandleDirective(type.c_str());
|
||||||
|
}
|
||||||
|
// Skip everything till the end of the line.
|
||||||
|
while (*ptr_ && *ptr_ != '\n')
|
||||||
|
++ptr_;
|
||||||
|
if (*ptr_ == '\n')
|
||||||
|
++ptr_;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '*': case '+': case '-':
|
||||||
|
if (IsSpace(ptr_[1])) {
|
||||||
|
// Parse a bullet list item.
|
||||||
|
ptr_ += 2;
|
||||||
|
ParseBlock(LIST_ITEM, prev_type, static_cast<int>(ptr_ - line_start));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '|':
|
||||||
|
if (IsSpace(ptr_[1])) {
|
||||||
|
// Parse a line block.
|
||||||
|
int indent = static_cast<int>(ptr_ - line_start);
|
||||||
|
ptr_ += 2;
|
||||||
|
ParseLineBlock(prev_type, indent);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ParseBlock(std::isspace(line_start[0]) ? BLOCK_QUOTE : PARAGRAPH,
|
||||||
|
prev_type, static_cast<int>(ptr_ - line_start));
|
||||||
|
}
|
||||||
|
EnterBlock(prev_type, PARAGRAPH);
|
||||||
|
}
|
97
src/plugins/cmakeprojectmanager/3rdparty/rstparser/rstparser.h
vendored
Normal file
97
src/plugins/cmakeprojectmanager/3rdparty/rstparser/rstparser.h
vendored
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
A reStructuredText parser written in C++.
|
||||||
|
|
||||||
|
Copyright (c) 2013, Victor Zverovich
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef RSTPARSER_H_
|
||||||
|
#define RSTPARSER_H_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace rst {
|
||||||
|
|
||||||
|
enum BlockType {
|
||||||
|
PARAGRAPH,
|
||||||
|
LINE_BLOCK,
|
||||||
|
BLOCK_QUOTE,
|
||||||
|
BULLET_LIST,
|
||||||
|
LIST_ITEM,
|
||||||
|
LITERAL_BLOCK
|
||||||
|
};
|
||||||
|
|
||||||
|
// Receive notification of the logical content of a document.
|
||||||
|
class ContentHandler {
|
||||||
|
public:
|
||||||
|
virtual ~ContentHandler();
|
||||||
|
|
||||||
|
// Receives notification of the beginning of a text block.
|
||||||
|
virtual void StartBlock(BlockType type) = 0;
|
||||||
|
|
||||||
|
// Receives notification of the end of a text block.
|
||||||
|
virtual void EndBlock() = 0;
|
||||||
|
|
||||||
|
// Receives notification of text.
|
||||||
|
virtual void HandleText(const char *text, std::size_t size) = 0;
|
||||||
|
|
||||||
|
// Receives notification of a directive.
|
||||||
|
virtual void HandleDirective(const char *type) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// A parser for a subset of reStructuredText.
|
||||||
|
class Parser {
|
||||||
|
private:
|
||||||
|
ContentHandler *handler_;
|
||||||
|
const char *ptr_;
|
||||||
|
|
||||||
|
// Skips whitespace.
|
||||||
|
void SkipSpace();
|
||||||
|
|
||||||
|
// Parses a directive type.
|
||||||
|
std::string ParseDirectiveType();
|
||||||
|
|
||||||
|
// Parses a paragraph.
|
||||||
|
void ParseParagraph();
|
||||||
|
|
||||||
|
// Changes the current block type sending notifications if necessary.
|
||||||
|
void EnterBlock(rst::BlockType &prev_type, rst::BlockType type);
|
||||||
|
|
||||||
|
// Parses a block of text.
|
||||||
|
void ParseBlock(rst::BlockType type, rst::BlockType &prev_type, int indent);
|
||||||
|
|
||||||
|
// Parses a line block.
|
||||||
|
void ParseLineBlock(rst::BlockType &prev_type, int indent);
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit Parser(ContentHandler *h) : handler_(h), ptr_(0) {}
|
||||||
|
|
||||||
|
// Parses a string containing reStructuredText and returns a document node.
|
||||||
|
void Parse(const char *s);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // RSTPARSER_H_
|
||||||
|
|
Reference in New Issue
Block a user