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 a2af38695e4b6be946b33ba20d09ab0d1cb80834
parent 14c196fa229e9b4baf62db69d4730d64367b769b
author Dimitrije Dobrota <mail@dimitrijedobrota.com>
date Thu, 24 Apr 2025 08:47:38 +0200

Rework attribute_list operations

Diffstat:
M example/html.cpp | ++ --
M include/hemplate/attribute.hpp | +++ -----
M include/hemplate/element.hpp | +++++++++++++ --
M include/hemplate/rss.hpp | ++ -
M source/attribute.cpp | +++++++++++++++++ ------------------
M test/source/attribute_list.cpp | +++ ------

6 files changed, 40 insertions(+), 34 deletions(-)


diff --git a/ example/html.cpp b/ example/html.cpp

@@ -20,11 +20,11 @@ int main() html::ul { ul_attrs, html::li {
li_attrs.add({"class", "item1"}),
{li_attrs, {{"class", "item1"}}},
"Item 1", }, html::li {
li_attrs.add({"class", "item2"}),
{li_attrs, {{"class", "item2"}}},
"Item 2", }, },

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

@@ -51,12 +51,10 @@ public: attribute_list(std::initializer_list<attribute> list); attribute_list(attribute attr); // NOLINT *-explicit-constructor
attribute_list(attribute_list attrs, std::initializer_list<attribute> list);
attribute_list& set(const attribute_list& list);
attribute_list& set(attribute attr);
attribute_list add(const attribute_list& list) const;
attribute_list add(attribute attr) const;
void set(const attribute_list& list);
void set(attribute attr);
explicit operator std::string() const {

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

@@ -140,15 +140,26 @@ public: template<based::string_literal Tag, element::Type MyType> class HEMPLATE_EXPORT element_builder : public element {
static bool m_state; // NOLINT
static bool m_state;
public:
// NOLINTBEGIN *-no-array-decay
template<typename... Args> explicit element_builder(Args&&... args)
// NOLINTNEXTLINE *-no-array-decay
: element(m_state, MyType, Tag.data(), std::forward<Args>(args)...) { }
template<typename... Args>
explicit element_builder(attribute_list list, Args&&... args)
: element(m_state,
MyType,
Tag.data(),
std::move(list),
std::forward<Args>(args)...)
{
}
// NOLINTEND *-no-array-decay
}; template<based::string_literal Tag, element::Type Type>

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

@@ -56,10 +56,11 @@ class HEMPLATE_EXPORT atomLink // NOLINT *-identifier-naming std::string_view rel, std::string_view type) {
return list.set({
list.set({
{"rel", rel}, {"type", type}, });
return list;
} public:

diff --git a/ source/attribute.cpp b/ source/attribute.cpp

@@ -26,7 +26,16 @@ attribute_list::attribute_list(attribute attr) set(std::move(attr)); }
attribute_list& attribute_list::set(const attribute_list& list)
attribute_list::attribute_list(attribute_list attrs,
std::initializer_list<attribute> list)
: attribute_list(std::move(attrs))
{
for (const auto& attr : list) {
set(attr);
}
}
void attribute_list::set(const attribute_list& list)
{ for (const auto& attr : list.m_attributes) { set(attr);

@@ -34,31 +43,21 @@ attribute_list& attribute_list::set(const attribute_list& list) set(list.m_class); set(list.m_style);
return (*this);
}
attribute_list& attribute_list::set(attribute attr)
void attribute_list::set(attribute attr)
{ if (attr.name() == "class") { m_class.append(" ", attr.value());
} else if (attr.name() == "style") {
m_style.append("; ", attr.value());
} else {
m_attributes.emplace_back(std::move(attr));
return;
}
return *this;
}
attribute_list attribute_list::add(const attribute_list& list) const
{
return attribute_list(*this).set(list);
}
if (attr.name() == "style") {
m_style.append("; ", attr.value());
return;
}
attribute_list attribute_list::add(attribute attr) const
{
return attribute_list(*this).set(std::move(attr));
m_attributes.emplace_back(std::move(attr));
} } // namespace hemplate

diff --git a/ test/source/attribute_list.cpp b/ test/source/attribute_list.cpp

@@ -79,12 +79,9 @@ TEST_CASE("add", "[attribute_list]") { using namespace std::literals::string_view_literals;
const auto attrs = hemplate::attribute_list {}
.add({"class", "first"})
.add({
{"class"sv, "second"sv},
{"class"sv, "third"sv},
});
const auto tmp = hemplate::attribute_list {{"class", "first"}};
const auto attrs = hemplate::attribute_list {
tmp, {{"class"sv, "second"sv}, {"class"sv, "third"sv}}};
REQUIRE(std::string(attrs) == R"(class="first second third")"); }