Template enginge - start parsing nodes.
This commit is contained in:
parent
cdd0cc6b78
commit
98842b24f2
3 changed files with 166 additions and 18 deletions
|
@ -8,9 +8,67 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
class TemplateBlock
|
class TemplateNode
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
TemplateNode()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void addChild(std::unique_ptr<TemplateNode> child)
|
||||||
|
{
|
||||||
|
mChildren.push_back(std::move(child));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::vector<std::unique_ptr<TemplateNode> > mChildren;
|
||||||
|
};
|
||||||
|
|
||||||
|
using TemplateNodePtr = std::unique_ptr<TemplateNode>;
|
||||||
|
|
||||||
|
class TemplateBlock : public TemplateNode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TemplateBlock(const std::string& name)
|
||||||
|
: mName(name)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void addLine(const std::string& line)
|
||||||
|
{
|
||||||
|
mBody.push_back(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string mName;
|
||||||
|
std::vector<std::string> mBody;
|
||||||
|
};
|
||||||
|
|
||||||
|
class TemplateExpression : public TemplateNode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TemplateExpression(const std::string& content)
|
||||||
|
: mContent(content)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
std::string mContent;
|
||||||
|
};
|
||||||
|
|
||||||
|
class TemplateTextBody : public TemplateNode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TemplateTextBody(const std::string& content)
|
||||||
|
: mContent(content)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
std::string mContent;
|
||||||
};
|
};
|
||||||
|
|
||||||
class TemplateFile
|
class TemplateFile
|
||||||
|
@ -47,49 +105,102 @@ public:
|
||||||
void processLine(const std::string& line)
|
void processLine(const std::string& line)
|
||||||
{
|
{
|
||||||
bool last_was_ldelimiter{ false };
|
bool last_was_ldelimiter{ false };
|
||||||
bool last_was_rdelimiter{ false };
|
bool last_was_statement_rdelimiter{ false };
|
||||||
bool in_tag{ false };
|
bool last_was_expression_rdelimiter{ false };
|
||||||
|
bool in_statement{ false };
|
||||||
|
bool in_expression{ false };
|
||||||
std::string working_string;
|
std::string working_string;
|
||||||
for (auto c : line)
|
for (auto c : line)
|
||||||
{
|
{
|
||||||
if (c == '{')
|
if (c == '{')
|
||||||
|
{
|
||||||
|
if (last_was_ldelimiter)
|
||||||
|
{
|
||||||
|
in_expression = true;
|
||||||
|
last_was_ldelimiter = false;
|
||||||
|
working_string = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
last_was_ldelimiter = true;
|
last_was_ldelimiter = true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else if (c == '%' && last_was_ldelimiter)
|
else if (c == '%' && last_was_ldelimiter)
|
||||||
{
|
{
|
||||||
last_was_ldelimiter = false;
|
last_was_ldelimiter = false;
|
||||||
in_tag = true;
|
in_statement = true;
|
||||||
working_string = "";
|
working_string = "";
|
||||||
}
|
}
|
||||||
else if (c == '%' && in_tag)
|
else if (c == '%' && in_statement)
|
||||||
{
|
{
|
||||||
last_was_rdelimiter = true;
|
last_was_statement_rdelimiter = true;
|
||||||
}
|
}
|
||||||
else if (c == '}' && last_was_rdelimiter)
|
else if (c == '}' && (last_was_statement_rdelimiter || in_expression || last_was_expression_rdelimiter))
|
||||||
{
|
{
|
||||||
break;
|
if (last_was_statement_rdelimiter)
|
||||||
|
{
|
||||||
|
onFoundStatement(working_string);
|
||||||
|
last_was_statement_rdelimiter = false;
|
||||||
|
working_string = "";
|
||||||
|
}
|
||||||
|
else if (in_expression)
|
||||||
|
{
|
||||||
|
last_was_expression_rdelimiter = true;
|
||||||
|
in_expression = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
onFoundExpression(working_string);
|
||||||
|
last_was_expression_rdelimiter = false;
|
||||||
|
working_string = "";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
working_string += c;
|
working_string += c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_tag)
|
|
||||||
{
|
|
||||||
onFoundTag(working_string);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void onFoundTag(const std::string& tag_string)
|
void onFoundStatement(const std::string& statement_string)
|
||||||
{
|
{
|
||||||
const auto tag_elements = StringUtils::split(tag_string);
|
std::cout << "Got Statement: " << statement_string << std::endl;
|
||||||
|
const auto statement_elements = StringUtils::split(statement_string);
|
||||||
|
|
||||||
for (const auto& element : tag_elements)
|
if (statement_elements.size() == 0)
|
||||||
{
|
{
|
||||||
std::cout << "Got tag element: " << element << std::endl;
|
return;
|
||||||
}
|
}
|
||||||
|
const auto statement_type = statement_elements[0];
|
||||||
|
if (statement_type == "block")
|
||||||
|
{
|
||||||
|
onFoundBlock(statement_elements);
|
||||||
|
}
|
||||||
|
else if (statement_type == "endblock")
|
||||||
|
{
|
||||||
|
onFoundEndBlock(statement_elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void onFoundBlock(const std::vector<std::string> args)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void onFoundEndBlock(const std::vector<std::string> args)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void onFoundExtends(const std::vector<std::string> args)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void onFoundExpression(const std::string& expression_string)
|
||||||
|
{
|
||||||
|
std::cout << "Got Expression: " << expression_string << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -20,6 +20,42 @@ bool StringUtils::IsSpace(char c)
|
||||||
return std::isspace(c, loc);
|
return std::isspace(c, loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string StringUtils::strip(const std::string& input)
|
||||||
|
{
|
||||||
|
if (input.empty())
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::locale loc;
|
||||||
|
std::string working_string;
|
||||||
|
std::size_t first_nonspace = 0;
|
||||||
|
std::size_t last_nonspace = working_string.size() - 1;
|
||||||
|
for (std::size_t idx = 0; idx < working_string.size(); idx++)
|
||||||
|
{
|
||||||
|
if (!std::isspace(working_string[idx], loc))
|
||||||
|
{
|
||||||
|
first_nonspace = idx;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (first_nonspace == last_nonspace)
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
for (std::size_t idx = last_nonspace; idx > 0; idx--)
|
||||||
|
{
|
||||||
|
if (!std::isspace(working_string[idx], loc))
|
||||||
|
{
|
||||||
|
last_nonspace = idx;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return working_string.substr(first_nonspace, last_nonspace-first_nonspace);
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<std::string> StringUtils::split(const std::string& input)
|
std::vector<std::string> StringUtils::split(const std::string& input)
|
||||||
{
|
{
|
||||||
std::vector<std::string> substrings;
|
std::vector<std::string> substrings;
|
||||||
|
|
|
@ -22,4 +22,5 @@ public:
|
||||||
static std::string convert(const std::wstring& input);
|
static std::string convert(const std::wstring& input);
|
||||||
static std::string ToPaddedString(unsigned numBytes, unsigned entry);
|
static std::string ToPaddedString(unsigned numBytes, unsigned entry);
|
||||||
static std::vector<std::string> split(const std::string& input);
|
static std::vector<std::string> split(const std::string& input);
|
||||||
|
static std::string strip(const std::string& input);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue