#include "TemplatingEngine.h" #include "Directory.h" #include "FileLogger.h" #include "TemplateElements.h" #include "TemplateSubstitutionContext.h" #include TemplatingEngine::TemplatingEngine(const Path& workingDirectory) : mWorkingDirectory(workingDirectory) { } std::string TemplatingEngine::renderTemplate(const std::string& name, TemplateSubstitutionContext* substitutionContext) { if (mTemplateFiles.empty()) { loadTemplateFiles(); } if (auto file = getTemplateFile(name)) { if (!file->hasLoaded()) { file->loadContent(); //std::cout << file->dumpContent(); processTemplate(file, nullptr); } return file->getContent()->render(substitutionContext, nullptr); } else { return {}; } } void TemplatingEngine::loadTemplateFiles() { const auto files = Directory::getFilesWithExtension(mWorkingDirectory, mTemplateExtension); for (const auto& path : files) { mTemplateFiles[path.stem().string()] = std::make_unique(path); } MLOG_INFO("Found: " << mTemplateFiles.size() << " templates in " << mWorkingDirectory); } TemplateFile* TemplatingEngine::getTemplateFile(const Path& path) { return getTemplateFile(path.stem().string()); } TemplateFile* TemplatingEngine::getTemplateFile(const std::string& name) { return mTemplateFiles[name].get(); } void TemplatingEngine::processTemplate(TemplateFile* file, TemplateNode* parent) { auto content = file->getContent(); if (parent) { content->setExtensionParent(parent); parent->setExtensionBase(content); } if (auto extension_node = dynamic_cast(content->getFirstChildShallow(TemplateNode::Type::EXTENDS))) { if (auto extension_template = getTemplateFile(Path(extension_node->getPath()))) { extension_template->loadContent(); //std::cout << extension_template->dumpContent(); processTemplate(extension_template, content); } } }