From 1890024e57f623ceec744bb3a6922d89d2d47640 Mon Sep 17 00:00:00 2001 From: Toni Uhlig Date: Thu, 4 Jul 2019 00:03:51 +0200 Subject: very basic templating engine --- MemDriverWeb/MemDriverWeb.cpp | 15 +++++++++++---- MemDriverWeb/MemDriverWeb.vcxproj | 1 + MemDriverWeb/MemDriverWeb.vcxproj.filters | 3 +++ MemDriverWeb/minitmpl.cpp | 19 +++++++++++++++++++ MemDriverWeb/minitmpl.h | 17 +++++++++-------- MemDriverWeb/pch.h | 1 + MemDriverWeb/www.h | 7 +++---- 7 files changed, 47 insertions(+), 16 deletions(-) create mode 100644 MemDriverWeb/minitmpl.cpp (limited to 'MemDriverWeb') diff --git a/MemDriverWeb/MemDriverWeb.cpp b/MemDriverWeb/MemDriverWeb.cpp index cf0e07e..5e9dfc5 100644 --- a/MemDriverWeb/MemDriverWeb.cpp +++ b/MemDriverWeb/MemDriverWeb.cpp @@ -9,21 +9,28 @@ using httplib::Response; static const char *host = "127.0.0.1"; static const int port = 8080; -static const std::string header = DEFAULT_HEADER; -static const std::string footer = DEFAULT_FOOTER; +static const std::string template_content = DEFAULT_TEMPLATE; static void page_root(const Request &req, Response &res) { TemplateString ss; - ss << header << footer; - res.set_content(ss.str(), "text/html"); + ss << template_content; + res.set_content(ss.doTemplateStr(), "text/html"); +} + +static std::string& template_test_cb(std::string &out) +{ + out.append("--- TEST ---"); + return out; } int main() { httplib::Server httpServer; + TemplateString::registerTemplateCallback("<% CONTENT %>", template_test_cb); + std::cout << "Starting WebServer on " << host << ":" << port << "\n"; httpServer.Get("/", page_root); diff --git a/MemDriverWeb/MemDriverWeb.vcxproj b/MemDriverWeb/MemDriverWeb.vcxproj index 00d5a8b..a545fd4 100644 --- a/MemDriverWeb/MemDriverWeb.vcxproj +++ b/MemDriverWeb/MemDriverWeb.vcxproj @@ -162,6 +162,7 @@ + Create Create diff --git a/MemDriverWeb/MemDriverWeb.vcxproj.filters b/MemDriverWeb/MemDriverWeb.vcxproj.filters index 5874c87..040e7bd 100644 --- a/MemDriverWeb/MemDriverWeb.vcxproj.filters +++ b/MemDriverWeb/MemDriverWeb.vcxproj.filters @@ -35,5 +35,8 @@ Source Files + + Source Files + \ No newline at end of file diff --git a/MemDriverWeb/minitmpl.cpp b/MemDriverWeb/minitmpl.cpp new file mode 100644 index 0000000..3d7c34c --- /dev/null +++ b/MemDriverWeb/minitmpl.cpp @@ -0,0 +1,19 @@ +#include "pch.h" +#include "minitmpl.h" + +std::map TemplateString::template_callbacks; + +std::string TemplateString::doTemplateStr() { + size_t pos = 0; + in_cache = str(); + + out_cache.clear(); + for (auto& key : template_callbacks) { + while ((pos = in_cache.find(key.first, pos)) != std::string::npos) { + in_cache.replace(pos, key.first.length(), key.second(out_cache)); + pos += out_cache.length(); + } + } + + return in_cache; +} \ No newline at end of file diff --git a/MemDriverWeb/minitmpl.h b/MemDriverWeb/minitmpl.h index 446930a..426579c 100644 --- a/MemDriverWeb/minitmpl.h +++ b/MemDriverWeb/minitmpl.h @@ -1,17 +1,18 @@ #pragma once +#include #include +typedef std::function template_cb; + class TemplateString : public std::stringstream { public: - std::string& doTemplateStr(const std::string& search, const std::string& replace) { - size_t pos = 0; - std::string s = this->str(); - while ((pos = s.find(search, pos)) != std::string::npos) { - s.replace(pos, search.length(), replace); - pos += replace.length(); - } - return s; + static void registerTemplateCallback(const char *variable, template_cb cb) { + TemplateString::template_callbacks[std::string(variable)] = cb; } + std::string doTemplateStr(); +private: + std::string in_cache, out_cache; + static std::map template_callbacks; }; \ No newline at end of file diff --git a/MemDriverWeb/pch.h b/MemDriverWeb/pch.h index a4977f6..314f3f7 100644 --- a/MemDriverWeb/pch.h +++ b/MemDriverWeb/pch.h @@ -2,5 +2,6 @@ #define PCH_H #include "httplib.h" +#include "minitmpl.h" #endif //PCH_H diff --git a/MemDriverWeb/www.h b/MemDriverWeb/www.h index 79c1116..48d2fbb 100644 --- a/MemDriverWeb/www.h +++ b/MemDriverWeb/www.h @@ -1,6 +1,6 @@ #pragma once -#define DEFAULT_HEADER \ +#define DEFAULT_TEMPLATE \ "\n\n\n" \ "Bootstrap Example\n" \ "\n" \ @@ -17,7 +17,6 @@ "\n
  • \n" \ "Link 3 \n" \ "
  • \n\n\n
    \n\n" \ -"
    \n\n"; - -#define DEFAULT_FOOTER \ +"
    \n\n" \ +"<% CONTENT %>\n\n" \ "
    \n\n\n\n\n"; \ No newline at end of file -- cgit v1.2.3