hemplate

Simple XML template engine
git clone git://git.dimitrijedobrota.com/hemplate.git
Log | Files | Refs | README | LICENSE

commit 2134cbce8d3b470100b503058bd3894b346892f9
parent ee98b9c229f2c28adaa21872a0b72d1b4869b26b
Author: Dimitrije Dobrota <mail@dimitrijedobrota.com>
Date:   Tue, 25 Jun 2024 21:51:13 +0200

Add commends and shorthand for boilerplate types

Diffstat:
MCMakeLists.txt | 2+-
Minclude/hemplate/classes.hpp | 93++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Mtest/source/hemplate_test.cpp | 6++++++
3 files changed, 99 insertions(+), 2 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt @@ -4,7 +4,7 @@ include(cmake/prelude.cmake) project( hemplate - VERSION 0.1.7 + VERSION 0.1.8 DESCRIPTION "Simple HTML template engine" HOMEPAGE_URL "https://git.dimitrijedobrota.com/hemplate.git" LANGUAGES CXX diff --git a/include/hemplate/classes.hpp b/include/hemplate/classes.hpp @@ -29,8 +29,56 @@ struct tag static char const* get_name() { return Name.data(); } }; +class comment : public elementBoolean<tag<"">> +{ +public: + comment() = default; + explicit comment(std::string text) + : elementBoolean(std::move(text)) + { + } + + void render(std::ostream& out) const override + { + if (get_data().empty()) + { + tgl_state(); + out << (get_state() ? "<!-- " : " -->"); + } + else out << "<!-- " << get_data() << " -->"; + } +}; + +class xml : public elementAtomic<tag<"xml">> +{ +public: + explicit xml(std::string version = "1.0", std::string encoding = "UTF-8") + : m_version(std::move(version)) + , m_encoding(std::move(encoding)) + { + } + + void render(std::ostream& out) const override + { + out << R"(<?xml version=")" << m_version << '"'; + out << R"( encoding=")" << m_encoding << "\"?>"; + } + +private: + std::string m_version; + std::string m_encoding; +}; + namespace html { +class doctype : public elementAtomic<tag<"doctype">> +{ +public: + explicit doctype() = default; + + void render(std::ostream& out) const override { out << "<!DOCTYPE html>"; } +}; + using a = elementBoolean<tag<"a">>; using abbr = elementBoolean<tag<"abbr">>; using address = elementBoolean<tag<"address">>; @@ -148,8 +196,31 @@ using wbr = elementAtomic<tag<"wbr">>; namespace rss { +class rss : public elementBoolean<tag<"rss">> +{ +public: + explicit rss(std::string version = "2.0", + std::string xmlns = "http://www.w3.org/2005/Atom") + : elementBoolean(attributeList( + {{"version", std::move(version)}, {"xmlns:atom", std::move(xmlns)}})) + { + } +}; + +class atomLink : public elementAtomic<tag<"atom:link">> +{ +public: + explicit atomLink(std::string rel = "self", + std::string type = "application/rss+xml") + : elementAtomic( + attributeList({{"rel", std::move(rel)}, {"type", std::move(type)}})) + { + } +}; + using author = elementBoolean<tag<"author">>; using category = elementBoolean<tag<"category">>; +using channel = elementBoolean<tag<"channel">>; using cloud = elementAtomic<tag<"cloud">>; using comments = elementBoolean<tag<"comments">>; using copyright = elementBoolean<tag<"copyright">>; @@ -160,6 +231,7 @@ using generator = elementBoolean<tag<"generator">>; using guid = elementBoolean<tag<"guid">>; using height = elementBoolean<tag<"height">>; using image = elementBoolean<tag<"image">>; +using item = elementBoolean<tag<"item">>; using language = elementBoolean<tag<"language">>; using lastBuildDate = elementBoolean<tag<"lastBuildDate">>; using link = elementBoolean<tag<"link">>; @@ -176,7 +248,6 @@ using ttl = elementBoolean<tag<"ttl">>; using url = elementBoolean<tag<"url">>; using webMaster = elementBoolean<tag<"webMaster">>; using width = elementBoolean<tag<"width">>; -using atomLink = elementAtomic<tag<"atom:link">>; } // namespace rss @@ -210,4 +281,24 @@ using usagePoint = elementBoolean<tag<"usagePoint">>; } // namespace atom +namespace sitemap { + +class urlset : public elementBoolean<tag<"urlset">> +{ +public: + explicit urlset( + std::string xmlns = "http://www.sitemaps.org/schemas/sitemap/0.9") + : elementBoolean(attributeList({"xmlns", std::move(xmlns)})) + { + } +}; + +using changefreq = elementBoolean<tag<"changefreq">>; +using lastmod = elementBoolean<tag<"lastmod">>; +using loc = elementBoolean<tag<"loc">>; +using url = elementBoolean<tag<"url">>; +using priority = elementBoolean<tag<"priority">>; + +} // namespace sitemap + } // namespace hemplate diff --git a/test/source/hemplate_test.cpp b/test/source/hemplate_test.cpp @@ -11,6 +11,7 @@ int main() {"class", "home_ul"}, {"style", "margin-bottom: 1em"}}); + std::cout << comment("Hello this is a commen"); std::cout << html::html() << std::endl; std::cout << html::ul("Won't see", ul_attrs) .set("style", "margin-top: 1em") @@ -21,5 +22,10 @@ int main() std::cout << html::meta() << std::endl; std::cout << html::html() << std::endl; + std::cout << comment(); + std::cout << "split "; + std::cout << "comment "; + std::cout << comment() << std::endl; + return 0; }