Engine getting complicated - need some JSON for troubleshooting.
This commit is contained in:
parent
350c20efa6
commit
30e30c8a7b
3 changed files with 70 additions and 9 deletions
|
@ -25,6 +25,11 @@ public:
|
||||||
return mChildren.size();
|
return mChildren.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual std::string getIdentifier() const
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
TemplateNode* getChild(std::size_t index) const
|
TemplateNode* getChild(std::size_t index) const
|
||||||
{
|
{
|
||||||
return mChildren[index].get();
|
return mChildren[index].get();
|
||||||
|
@ -41,15 +46,25 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
T* getFirstChildShallow() const
|
T* getFirstChildShallow(const std::string& identifier = {}) const
|
||||||
{
|
{
|
||||||
for (const auto& child : mChildren)
|
for (const auto& child : mChildren)
|
||||||
{
|
{
|
||||||
if (auto ret = dynamic_cast<T*>(child.get()))
|
if (auto ret = dynamic_cast<T*>(child.get()))
|
||||||
|
{
|
||||||
|
if (!identifier.empty())
|
||||||
|
{
|
||||||
|
if (child->getIdentifier() == identifier)
|
||||||
{
|
{
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,12 +73,17 @@ public:
|
||||||
mExtensionParent = parent;
|
mExtensionParent = parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual std::string render()
|
virtual std::string render(TemplateNode* parentContext = nullptr)
|
||||||
{
|
{
|
||||||
|
if (!parentContext && mExtensionParent)
|
||||||
|
{
|
||||||
|
parentContext = mExtensionParent;
|
||||||
|
}
|
||||||
|
|
||||||
std::string content;
|
std::string content;
|
||||||
for (size_t idx = 0; idx < mChildren.size(); idx++)
|
for (size_t idx = 0; idx < mChildren.size(); idx++)
|
||||||
{
|
{
|
||||||
content += mChildren[idx]->render();
|
content += mChildren[idx]->render(parentContext);
|
||||||
}
|
}
|
||||||
return content;
|
return content;
|
||||||
}
|
}
|
||||||
|
@ -80,10 +100,9 @@ class TemplateExtends : public TemplateNode
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TemplateExtends(TemplateNode* parent, const std::string& path)
|
TemplateExtends(TemplateNode* parent, const std::string& path)
|
||||||
: TemplateNode(parent),
|
: TemplateNode(parent)
|
||||||
mPath(path)
|
|
||||||
{
|
{
|
||||||
|
mPath = StringUtils::stripQuotes(path);
|
||||||
};
|
};
|
||||||
|
|
||||||
std::string getRawContent() const override
|
std::string getRawContent() const override
|
||||||
|
@ -122,6 +141,28 @@ public:
|
||||||
return content;
|
return content;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string renderAsParent(TemplateNode* base)
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string render(TemplateNode* parentContext) override
|
||||||
|
{
|
||||||
|
std::string content;
|
||||||
|
if (parentContext)
|
||||||
|
{
|
||||||
|
if (auto parent_node = parentContext->getFirstChildShallow<TemplateBlock>(getIdentifier()))
|
||||||
|
{
|
||||||
|
content = dynamic_cast<TemplateBlock*>(parent_node)->renderAsParent(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string mName;
|
std::string mName;
|
||||||
std::vector<std::string> mBody;
|
std::vector<std::string> mBody;
|
||||||
|
@ -165,12 +206,12 @@ public:
|
||||||
return !mContent.empty();
|
return !mContent.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string render() override
|
std::string render(TemplateNode* parentContext) override
|
||||||
{
|
{
|
||||||
std::string content;
|
std::string content;
|
||||||
for (const auto& line : mContent)
|
for (const auto& line : mContent)
|
||||||
{
|
{
|
||||||
content += line;
|
content += line + '\n';
|
||||||
}
|
}
|
||||||
return content;
|
return content;
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,3 +121,22 @@ std::string StringUtils::ToPaddedString(unsigned numBytes, unsigned entry)
|
||||||
sstr << std::setfill('0') << std::setw(numBytes) << entry;
|
sstr << std::setfill('0') << std::setw(numBytes) << entry;
|
||||||
return sstr.str();
|
return sstr.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string StringUtils::stripQuotes(const std::string& input)
|
||||||
|
{
|
||||||
|
if (input.size() < 3)
|
||||||
|
{
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
std::size_t start_index = 0;
|
||||||
|
std::size_t end_index = input.size()-1;
|
||||||
|
if (input[start_index] == '"')
|
||||||
|
{
|
||||||
|
start_index = 1;
|
||||||
|
}
|
||||||
|
if (input[end_index] == '"')
|
||||||
|
{
|
||||||
|
end_index = end_index - 1;
|
||||||
|
}
|
||||||
|
return input.substr(start_index, end_index - start_index + 1);
|
||||||
|
}
|
||||||
|
|
|
@ -23,4 +23,5 @@ public:
|
||||||
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);
|
static std::string strip(const std::string& input);
|
||||||
|
static std::string stripQuotes(const std::string& input);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue