hemplateSimple XML template engine |
git clone git://git.dimitrijedobrota.com/hemplate.git |
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING |
commit | dd6874a63aebeef93332146a2c42f183b414d0ab |
parent | 1bdb83d9ebb9f366de8e52bcede50f91b0104324 |
author | Dimitrije Dobrota < mail@dimitrijedobrota.com > |
date | Mon, 21 Apr 2025 18:15:38 +0200 |
Flesh out some functionality
M | include/hemplate/attribute.hpp | | | ++ |
M | include/hemplate/classes.hpp | | | ++++++++++++++++++++++++++++++++++++++ ---- |
M | source/attribute.cpp | | | ++++++++++++++++++++ |
3 files changed, 60 insertions(+), 4 deletions(-)
diff --git a/ include/hemplate/attribute.hpp b/ include/hemplate/attribute.hpp
@@ -52,9 +52,11 @@
public:
attributeList(std::initializer_list<attribute> list);
attributeList(attribute attr); // NOLINT
attributeList& set(const attributeList& list);
attributeList& set(const std::string& name);
attributeList& set(const std::string& name, const std::string& value);
attributeList add(const attributeList& list) const;
attributeList add(const std::string& name) const;
attributeList add(const std::string& name, const std::string& value) const;
diff --git a/ include/hemplate/classes.hpp b/ include/hemplate/classes.hpp
@@ -68,6 +68,12 @@
transparent transform(const R& range,
namespace html {
using hemplate::comment;
using hemplate::element;
using hemplate::transform;
using hemplate::transparent;
using hemplate::xml;
// clang-format off
using abbr = elementBuilder<tag<"abbr">, element::Type::Boolean>;
using address = elementBuilder<tag<"address">, element::Type::Boolean>;
@@ -236,31 +242,53 @@
public:
explicit atomLink(std::string rel,
std::string type,
const attributeList& attributes,
const std::derived_from<element> auto&... children)
: elementBuilder({{"rel", std::move(rel)}, {"type", std::move(type)}},
: elementBuilder(attributes.add({{"rel", std::move(rel)},
{"type", std::move(type)}}),
children...)
{
}
explicit atomLink(std::string rel,
std::string type,
const attributeList& attributes,
std::span<const element> children)
: elementBuilder({{"rel", std::move(rel)}, {"type", std::move(type)}},
: elementBuilder(attributes.add({{"rel", std::move(rel)},
{"type", std::move(type)}}),
children)
{
}
explicit atomLink(const std::derived_from<element> auto&... children)
: atomLink(default_rel, default_type, children...)
: atomLink(default_rel, default_type, {}, children...)
{
}
explicit atomLink(std::span<const element> children)
: atomLink(default_rel, default_type, children)
: atomLink(default_rel, default_type, {}, children)
{
}
explicit atomLink(const attributeList& attributes,
const std::derived_from<element> auto&... children)
: atomLink(default_rel, default_type, attributes, children...)
{
}
explicit atomLink(const attributeList& attributes,
std::span<const element> children)
: atomLink(default_rel, default_type, attributes, children)
{
}
};
using hemplate::comment;
using hemplate::element;
using hemplate::transform;
using hemplate::transparent;
using hemplate::xml;
// clang-format off
using author = elementBuilder<tag<"author">, element::Type::Boolean>;
using category = elementBuilder<tag<"category">, element::Type::Boolean>;
@@ -329,6 +357,12 @@
public:
}
};
using hemplate::comment;
using hemplate::element;
using hemplate::transform;
using hemplate::transparent;
using hemplate::xml;
// clang-format off
using author = elementBuilder<tag<"author">, element::Type::Boolean>;
using category = elementBuilder<tag<"category">, element::Type::Boolean>;
diff --git a/ source/attribute.cpp b/ source/attribute.cpp
@@ -18,11 +18,24 @@
bool attributeList::empty() const
&& m_style.get_value().empty();
}
attributeList& attributeList::set(const attributeList& list)
{
for (const auto& attr : list.m_attributes)
{
set(attr.get_name(), attr.get_value());
}
set("class", list.m_class);
set("style", list.m_style);
return (*this);
}
attributeList& attributeList::set(const std::string& name)
{
if (name != "class" && name != "style") m_attributes.emplace_back(name);
return *this;
}
attributeList& attributeList::set(const std::string& name,
const std::string& value)
{
@@ -41,6 +54,13 @@
attributeList& attributeList::set(const std::string& name,
return *this;
}
attributeList attributeList::add(const attributeList& list) const
{
attributeList res = *this;
res.set(list);
return res;
}
attributeList attributeList::add(const std::string& name) const
{
attributeList res = *this;