hemplate

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

commit a4013908e40f037e1f775cac2697165670954199
parent bf0389ba151e90bf9837fb2c442a73b14e5ef91b
author Dimitrije Dobrota <mail@dimitrijedobrota.com>
date Fri, 25 Apr 2025 09:52:46 +0200

Nice shorthand for element_builder

Diffstat:
M include/hemplate/atom.hpp | ++++++++++++++++++++++++++ ----------------------------
M include/hemplate/element.hpp | ++++++
M include/hemplate/html.hpp | +++++++++++++++++++++++++++++++++++++++++ -----------------------------------------
M include/hemplate/rss.hpp | +++++++++++++++++++++++++++++++++ ----------------------------------
M include/hemplate/sitemap.hpp | ++++++ -------

5 files changed, 184 insertions(+), 182 deletions(-)


diff --git a/ include/hemplate/atom.hpp b/ include/hemplate/atom.hpp

@@ -9,8 +9,7 @@ namespace hemplate::atom std::string format_time(std::int64_t sec); std::string format_time_now();
class HEMPLATE_EXPORT feed
: public element_builder<"feed", element::Type::Boolean>
class HEMPLATE_EXPORT feed : public element_boolean<"feed">
{ static auto attributes(std::string_view xmlns) {

@@ -40,32 +39,31 @@ using hemplate::xml; // clang-format off // NOLINTBEGIN *-identifier-naming
using author = element_builder<"author", element::Type::Boolean>;
using category = element_builder<"category", element::Type::Boolean>;
using content = element_builder<"content", element::Type::Boolean>;
using contributor = element_builder<"contributor", element::Type::Boolean>;
using div = element_builder<"div", element::Type::Boolean>;
using email = element_builder<"email", element::Type::Boolean>;
using entry = element_builder<"entry", element::Type::Boolean>;
using generator = element_builder<"generator", element::Type::Boolean>;
using icon = element_builder<"icon", element::Type::Boolean>;
using id = element_builder<"id", element::Type::Boolean>;
using intervalBlock = element_builder<"intervalBlock", element::Type::Boolean>;
using link = element_builder<"link", element::Type::Boolean>;
using logo = element_builder<"logo", element::Type::Boolean>;
using meterReading = element_builder<"meterReading", element::Type::Boolean>;
using name = element_builder<"name", element::Type::Boolean>;
using published = element_builder<"published", element::Type::Boolean>;
using readingType = element_builder<"readingType", element::Type::Boolean>;
using rights = element_builder<"rights", element::Type::Boolean>;
using source = element_builder<"source", element::Type::Boolean>;
using subtitle = element_builder<"subtitle", element::Type::Boolean>;
using summary = element_builder<"summary", element::Type::Boolean>;
using text = element_builder<"", element::Type::Boolean>;
using title = element_builder<"title", element::Type::Boolean>;
using updated = element_builder<"updated", element::Type::Boolean>;
using uri = element_builder<"uri", element::Type::Boolean>;
using usagePoint = element_builder<"usagePoint", element::Type::Boolean>;
using author = element_boolean<"author">;
using category = element_boolean<"category">;
using content = element_boolean<"content">;
using contributor = element_boolean<"contributor">;
using div = element_boolean<"div">;
using email = element_boolean<"email">;
using entry = element_boolean<"entry">;
using generator = element_boolean<"generator">;
using icon = element_boolean<"icon">;
using id = element_boolean<"id">;
using intervalBlock = element_boolean<"intervalBlock">;
using link = element_boolean<"link">;
using logo = element_boolean<"logo">;
using meterReading = element_boolean<"meterReading">;
using name = element_boolean<"name">;
using published = element_boolean<"published">;
using readingType = element_boolean<"readingType">;
using rights = element_boolean<"rights">;
using source = element_boolean<"source">;
using subtitle = element_boolean<"subtitle">;
using summary = element_boolean<"summary">;
using title = element_boolean<"title">;
using updated = element_boolean<"updated">;
using uri = element_boolean<"uri">;
using usagePoint = element_boolean<"usagePoint">;
// NOLINTEND *-identifier-naming // clang-format on

diff --git a/ include/hemplate/element.hpp b/ include/hemplate/element.hpp

@@ -134,6 +134,9 @@ public: }; template<based::string_literal Tag>
using element_boolean = element_builder<Tag, element::Type::Boolean>;
template<based::string_literal Tag>
class HEMPLATE_EXPORT element_builder<Tag, element::Type::Atomic> : public element {

@@ -150,4 +153,7 @@ public: } };
template<based::string_literal Tag>
using element_atomic = element_builder<Tag, element::Type::Atomic>;
} // namespace hemplate

diff --git a/ include/hemplate/html.hpp b/ include/hemplate/html.hpp

@@ -21,119 +21,119 @@ public: // clang-format off // NOLINTBEGIN *-identifier-naming
using abbr = element_builder<"abbr", element::Type::Boolean>;
using address = element_builder<"address", element::Type::Boolean>;
using a = element_builder<"a", element::Type::Boolean>;
using area = element_builder<"area", element::Type::Atomic>;
using article = element_builder<"article", element::Type::Boolean>;
using aside = element_builder<"aside", element::Type::Boolean>;
using audio = element_builder<"audio", element::Type::Boolean>;
using base = element_builder<"base", element::Type::Atomic>;
using bdi = element_builder<"bdi", element::Type::Boolean>;
using bdo = element_builder<"bdo", element::Type::Boolean>;
using b = element_builder<"b", element::Type::Boolean>;
using blockquote = element_builder<"blockquote", element::Type::Boolean>;
using body = element_builder<"body", element::Type::Boolean>;
using br = element_builder<"br", element::Type::Atomic>;
using button = element_builder<"button", element::Type::Boolean>;
using canvas = element_builder<"canvas", element::Type::Boolean>;
using caption = element_builder<"caption", element::Type::Boolean>;
using cite = element_builder<"cite", element::Type::Boolean>;
using code = element_builder<"code", element::Type::Boolean>;
using col = element_builder<"col", element::Type::Atomic>;
using colgroup = element_builder<"colgroup", element::Type::Boolean>;
using data = element_builder<"data", element::Type::Boolean>;
using datalist = element_builder<"datalist", element::Type::Boolean>;
using dd = element_builder<"dd", element::Type::Boolean>;
using del = element_builder<"del", element::Type::Boolean>;
using details = element_builder<"details", element::Type::Boolean>;
using dfn = element_builder<"dfn", element::Type::Boolean>;
using dialog = element_builder<"dialog", element::Type::Boolean>;
using div = element_builder<"div", element::Type::Boolean>;
using dl = element_builder<"dl", element::Type::Boolean>;
using dt = element_builder<"dt", element::Type::Boolean>;
using embed = element_builder<"embed", element::Type::Atomic>;
using em = element_builder<"em", element::Type::Boolean>;
using fieldset = element_builder<"fieldset", element::Type::Boolean>;
using figcaption = element_builder<"figcaption", element::Type::Boolean>;
using figure = element_builder<"figure", element::Type::Boolean>;
using footer = element_builder<"footer", element::Type::Boolean>;
using form = element_builder<"form", element::Type::Boolean>;
using h1 = element_builder<"h1", element::Type::Boolean>;
using h2 = element_builder<"h2", element::Type::Boolean>;
using h3 = element_builder<"h3", element::Type::Boolean>;
using h4 = element_builder<"h4", element::Type::Boolean>;
using h5 = element_builder<"h5", element::Type::Boolean>;
using h6 = element_builder<"h6", element::Type::Boolean>;
using head = element_builder<"head", element::Type::Boolean>;
using header = element_builder<"header", element::Type::Boolean>;
using hgroup = element_builder<"hgroup", element::Type::Boolean>;
using hr = element_builder<"hr", element::Type::Atomic>;
using html = element_builder<"html", element::Type::Boolean>;
using i = element_builder<"i", element::Type::Boolean>;
using iframe = element_builder<"iframe", element::Type::Boolean>;
using img = element_builder<"img", element::Type::Atomic>;
using input = element_builder<"input", element::Type::Atomic>;
using ins = element_builder<"ins", element::Type::Boolean>;
using kbd = element_builder<"kbd", element::Type::Boolean>;
using label = element_builder<"label", element::Type::Boolean>;
using legend = element_builder<"legend", element::Type::Boolean>;
using li = element_builder<"li", element::Type::Boolean>;
using link = element_builder<"link", element::Type::Atomic>;
using main = element_builder<"main", element::Type::Boolean>;
using map = element_builder<"map", element::Type::Boolean>;
using mark = element_builder<"mark", element::Type::Boolean>;
using menu = element_builder<"menu", element::Type::Boolean>;
using meta = element_builder<"meta", element::Type::Atomic>;
using meter = element_builder<"meter", element::Type::Boolean>;
using nav = element_builder<"nav", element::Type::Boolean>;
using noscript = element_builder<"noscript", element::Type::Boolean>;
using object = element_builder<"object", element::Type::Boolean>;
using ol = element_builder<"ol", element::Type::Boolean>;
using optgroup = element_builder<"optgroup", element::Type::Boolean>;
using option = element_builder<"option", element::Type::Boolean>;
using output = element_builder<"output", element::Type::Boolean>;
using p = element_builder<"p", element::Type::Boolean>;
using param = element_builder<"param", element::Type::Atomic>;
using picture = element_builder<"picture", element::Type::Boolean>;
using pre = element_builder<"pre", element::Type::Boolean>;
using progress = element_builder<"progress", element::Type::Boolean>;
using q = element_builder<"q", element::Type::Boolean>;
using rp = element_builder<"rp", element::Type::Boolean>;
using rt = element_builder<"rt", element::Type::Boolean>;
using ruby = element_builder<"ruby", element::Type::Boolean>;
using s = element_builder<"s", element::Type::Boolean>;
using samp = element_builder<"samp", element::Type::Boolean>;
using script = element_builder<"script", element::Type::Boolean>;
using search = element_builder<"search", element::Type::Boolean>;
using section = element_builder<"section", element::Type::Boolean>;
using select = element_builder<"select", element::Type::Boolean>;
using small = element_builder<"small", element::Type::Boolean>;
using source = element_builder<"source", element::Type::Atomic>;
using span = element_builder<"span", element::Type::Boolean>;
using strong = element_builder<"strong", element::Type::Boolean>;
using style = element_builder<"style", element::Type::Boolean>;
using sub = element_builder<"sub", element::Type::Boolean>;
using summary = element_builder<"summary", element::Type::Boolean>;
using sup = element_builder<"sup", element::Type::Boolean>;
using svg = element_builder<"svg", element::Type::Boolean>;
using table = element_builder<"table", element::Type::Boolean>;
using tbody = element_builder<"tbody", element::Type::Boolean>;
using td = element_builder<"td", element::Type::Boolean>;
using textarea = element_builder<"textarea", element::Type::Boolean>;
using text = element_builder<"", element::Type::Boolean>;
using tfoot = element_builder<"tfoot", element::Type::Boolean>;
using th = element_builder<"th", element::Type::Boolean>;
using thead = element_builder<"thead", element::Type::Boolean>;
using time = element_builder<"time", element::Type::Boolean>;
using title = element_builder<"title", element::Type::Boolean>;
using tr = element_builder<"tr", element::Type::Boolean>;
using track = element_builder<"track", element::Type::Atomic>;
using u = element_builder<"u", element::Type::Boolean>;
using ul = element_builder<"ul", element::Type::Boolean>;
using var = element_builder<"var", element::Type::Boolean>;
using video = element_builder<"video", element::Type::Boolean>;
using wbr = element_builder<"wbr", element::Type::Atomic>;
using abbr = element_boolean<"abbr">;
using address = element_boolean<"address">;
using a = element_boolean<"a">;
using article = element_boolean<"article">;
using aside = element_boolean<"aside">;
using audio = element_boolean<"audio">;
using bdi = element_boolean<"bdi">;
using bdo = element_boolean<"bdo">;
using b = element_boolean<"b">;
using blockquote = element_boolean<"blockquote">;
using body = element_boolean<"body">;
using button = element_boolean<"button">;
using canvas = element_boolean<"canvas">;
using caption = element_boolean<"caption">;
using cite = element_boolean<"cite">;
using code = element_boolean<"code">;
using colgroup = element_boolean<"colgroup">;
using data = element_boolean<"data">;
using datalist = element_boolean<"datalist">;
using dd = element_boolean<"dd">;
using del = element_boolean<"del">;
using details = element_boolean<"details">;
using dfn = element_boolean<"dfn">;
using dialog = element_boolean<"dialog">;
using div = element_boolean<"div">;
using dl = element_boolean<"dl">;
using dt = element_boolean<"dt">;
using em = element_boolean<"em">;
using fieldset = element_boolean<"fieldset">;
using figcaption = element_boolean<"figcaption">;
using figure = element_boolean<"figure">;
using footer = element_boolean<"footer">;
using form = element_boolean<"form">;
using h1 = element_boolean<"h1">;
using h2 = element_boolean<"h2">;
using h3 = element_boolean<"h3">;
using h4 = element_boolean<"h4">;
using h5 = element_boolean<"h5">;
using h6 = element_boolean<"h6">;
using head = element_boolean<"head">;
using header = element_boolean<"header">;
using hgroup = element_boolean<"hgroup">;
using html = element_boolean<"html">;
using i = element_boolean<"i">;
using iframe = element_boolean<"iframe">;
using ins = element_boolean<"ins">;
using kbd = element_boolean<"kbd">;
using label = element_boolean<"label">;
using legend = element_boolean<"legend">;
using li = element_boolean<"li">;
using main = element_boolean<"main">;
using map = element_boolean<"map">;
using mark = element_boolean<"mark">;
using menu = element_boolean<"menu">;
using meter = element_boolean<"meter">;
using nav = element_boolean<"nav">;
using noscript = element_boolean<"noscript">;
using object = element_boolean<"object">;
using ol = element_boolean<"ol">;
using optgroup = element_boolean<"optgroup">;
using option = element_boolean<"option">;
using output = element_boolean<"output">;
using p = element_boolean<"p">;
using picture = element_boolean<"picture">;
using pre = element_boolean<"pre">;
using progress = element_boolean<"progress">;
using q = element_boolean<"q">;
using rp = element_boolean<"rp">;
using rt = element_boolean<"rt">;
using ruby = element_boolean<"ruby">;
using s = element_boolean<"s">;
using samp = element_boolean<"samp">;
using script = element_boolean<"script">;
using search = element_boolean<"search">;
using section = element_boolean<"section">;
using select = element_boolean<"select">;
using small = element_boolean<"small">;
using span = element_boolean<"span">;
using strong = element_boolean<"strong">;
using style = element_boolean<"style">;
using sub = element_boolean<"sub">;
using summary = element_boolean<"summary">;
using sup = element_boolean<"sup">;
using svg = element_boolean<"svg">;
using table = element_boolean<"table">;
using tbody = element_boolean<"tbody">;
using td = element_boolean<"td">;
using textarea = element_boolean<"textarea">;
using tfoot = element_boolean<"tfoot">;
using th = element_boolean<"th">;
using thead = element_boolean<"thead">;
using time = element_boolean<"time">;
using title = element_boolean<"title">;
using tr = element_boolean<"tr">;
using u = element_boolean<"u">;
using ul = element_boolean<"ul">;
using var = element_boolean<"var">;
using video = element_boolean<"video">;
using area = element_atomic<"area">;
using base = element_atomic<"base">;
using br = element_atomic<"br">;
using col = element_atomic<"col">;
using embed = element_atomic<"embed">;
using hr = element_atomic<"hr">;
using img = element_atomic<"img">;
using input = element_atomic<"input">;
using link = element_atomic<"link">;
using meta = element_atomic<"meta">;
using param = element_atomic<"param">;
using source = element_atomic<"source">;
using track = element_atomic<"track">;
using wbr = element_atomic<"wbr">;
// NOLINTEND *-identifier-naming // clang-format on

diff --git a/ include/hemplate/rss.hpp b/ include/hemplate/rss.hpp

@@ -9,8 +9,7 @@ namespace hemplate::rss std::string format_time(std::int64_t sec); std::string format_time_now();
class HEMPLATE_EXPORT rss
: public element_builder<"rss", element::Type::Boolean>
class HEMPLATE_EXPORT rss : public element_boolean<"rss">
{ static auto attributes(std::string_view version, std::string_view xmlns) {

@@ -40,7 +39,7 @@ public: }; class HEMPLATE_EXPORT atomLink // NOLINT *-identifier-naming
: public element_builder<"atom:link", element::Type::Boolean>
: public element_boolean<"atom:link">
{ static auto attributes( attribute_list& list, std::string_view rel, std::string_view type

@@ -94,37 +93,37 @@ using hemplate::xml; // clang-format off // NOLINTBEGIN *-identifier-naming
using author = element_builder<"author", element::Type::Boolean>;
using category = element_builder<"category", element::Type::Boolean>;
using channel = element_builder<"channel", element::Type::Boolean>;
using cloud = element_builder<"cloud", element::Type::Atomic>;
using comments = element_builder<"comments", element::Type::Boolean>;
using copyright = element_builder<"copyright", element::Type::Boolean>;
using description = element_builder<"description", element::Type::Boolean>;
using docs = element_builder<"docs", element::Type::Boolean>;
using enclosure = element_builder<"enclosure", element::Type::Atomic>;
using generator = element_builder<"generator", element::Type::Boolean>;
using guid = element_builder<"guid", element::Type::Boolean>;
using height = element_builder<"height", element::Type::Boolean>;
using image = element_builder<"image", element::Type::Boolean>;
using item = element_builder<"item", element::Type::Boolean>;
using language = element_builder<"language", element::Type::Boolean>;
using lastBuildDate = element_builder<"lastBuildDate", element::Type::Boolean>;
using link = element_builder<"link", element::Type::Boolean>;
using managingEditor = element_builder<"managingEditor", element::Type::Boolean>;
using name = element_builder<"name", element::Type::Boolean>;
using pubDate = element_builder<"pubDate", element::Type::Boolean>;
using rating = element_builder<"rating", element::Type::Boolean>;
using skipDays = element_builder<"skipDays", element::Type::Boolean>;
using skipHours = element_builder<"skipHours", element::Type::Boolean>;
using source = element_builder<"source", element::Type::Boolean>;
using text = element_builder<"", element::Type::Boolean>;
using textinput = element_builder<"textinput", element::Type::Boolean>;
using title = element_builder<"title", element::Type::Boolean>;
using ttl = element_builder<"ttl", element::Type::Boolean>;
using url = element_builder<"url", element::Type::Boolean>;
using webMaster = element_builder<"webMaster", element::Type::Boolean>;
using width = element_builder<"width", element::Type::Boolean>;
using author = element_boolean<"author">;
using category = element_boolean<"category">;
using channel = element_boolean<"channel">;
using comments = element_boolean<"comments">;
using copyright = element_boolean<"copyright">;
using description = element_boolean<"description">;
using docs = element_boolean<"docs">;
using generator = element_boolean<"generator">;
using guid = element_boolean<"guid">;
using height = element_boolean<"height">;
using image = element_boolean<"image">;
using item = element_boolean<"item">;
using language = element_boolean<"language">;
using lastBuildDate = element_boolean<"lastBuildDate">;
using link = element_boolean<"link">;
using managingEditor = element_boolean<"managingEditor">;
using name = element_boolean<"name">;
using pubDate = element_boolean<"pubDate">;
using rating = element_boolean<"rating">;
using skipDays = element_boolean<"skipDays">;
using skipHours = element_boolean<"skipHours">;
using source = element_boolean<"source">;
using textinput = element_boolean<"textinput">;
using title = element_boolean<"title">;
using ttl = element_boolean<"ttl">;
using url = element_boolean<"url">;
using webMaster = element_boolean<"webMaster">;
using width = element_boolean<"width">;
using cloud = element_atomic<"cloud">;
using enclosure = element_atomic<"enclosure">;
// NOLINTEND *-identifier-naming // clang-format on

diff --git a/ include/hemplate/sitemap.hpp b/ include/hemplate/sitemap.hpp

@@ -6,8 +6,7 @@ namespace hemplate::sitemap {
class HEMPLATE_EXPORT urlset
: public element_builder<"urlset", element::Type::Boolean>
class HEMPLATE_EXPORT urlset : public element_boolean<"urlset">
{ static auto attributes(std::string_view xmlns) {

@@ -38,11 +37,11 @@ using hemplate::xml; // clang-format off // NOLINTBEGIN *-identifier-naming
using changefreq = element_builder<"changefreq", element::Type::Boolean>;
using lastmod = element_builder<"lastmod", element::Type::Boolean>;
using loc = element_builder<"loc", element::Type::Boolean>;
using url = element_builder<"url", element::Type::Boolean>;
using priority = element_builder<"priority", element::Type::Boolean>;
using changefreq = element_boolean<"changefreq">;
using lastmod = element_boolean<"lastmod">;
using loc = element_boolean<"loc">;
using url = element_boolean<"url">;
using priority = element_boolean<"priority">;
// NOLINTEND *-identifier-naming // clang-format on