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

Improve formatting

Diffstat:
M .clang-format | + -
M include/hemplate/attribute.hpp | +++ --
M include/hemplate/classes.hpp | ++++++++++ ------
M include/hemplate/element.hpp | +++++++++++++++++++++++++++++++++++++++++++ --------------------------------
M include/hemplate/rss.hpp | +++++++++++++++++++++++++ -----------------
M source/attribute.cpp | +++ --
M source/classes.cpp | ++ -
M test/source/attribute_list.cpp | ++++++ ---

8 files changed, 93 insertions(+), 64 deletions(-)


diff --git a/ .clang-format b/ .clang-format

@@ -2,7 +2,7 @@

Language: Cpp
# BasedOnStyle: Chromium
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AlignAfterOpenBracket: BlockIndent
AlignConsecutiveMacros: false
AlignConsecutiveAssignments: false
AlignConsecutiveBitFields: false

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

@@ -112,8 +112,9 @@ struct std::formatter<hemplate::attribute_list>

return ctx.begin();
}

static auto format(const hemplate::attribute_list& type,
std::format_context& ctx)
static auto format(
const hemplate::attribute_list& type, std::format_context& ctx
)
{
return std::format_to(ctx.out(), "{}", static_cast<std::string>(type));
}

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

@@ -20,17 +20,21 @@ public:

static constexpr const auto default_version = "1.0";
static constexpr const auto default_encoding = "UTF-8";

explicit xml(std::string version = default_version,
std::string encoding = default_encoding)
: element_builder(attribute_list {{"version", std::move(version)},
{"encoding", std::move(encoding)}})
explicit xml(
std::string version = default_version,
std::string encoding = default_encoding
)
: element_builder(attribute_list {
{"version", std::move(version)}, {"encoding", std::move(encoding)}
})
{
}
};

template<std::ranges::forward_range R>
transparent transform(const R& range,
based::Procedure<std::ranges::range_value_t<R>> auto proc)
transparent transform(
const R& range, based::Procedure<std::ranges::range_value_t<R>> auto proc
)
{
std::vector<element> res;

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

@@ -41,10 +41,12 @@ private:

std::vector<element> m_children;
std::string m_data;

explicit element(bool& state,
Type type,
std::string_view tag,
const is_element auto&... children)
explicit element(
bool& state,
Type type,
std::string_view tag,
const is_element auto&... children
)
: m_state(&state)
, m_type(type)
, m_tag(tag)

@@ -52,10 +54,9 @@ private:

{
}

explicit element(bool& state,
Type type,
std::string_view tag,
std::string_view data)
explicit element(
bool& state, Type type, std::string_view tag, std::string_view data
)
: m_state(&state)
, m_type(type)
, m_tag(tag)

@@ -63,10 +64,12 @@ private:

{
}

explicit element(bool& state,
Type type,
std::string_view tag,
std::span<const element> children)
explicit element(
bool& state,
Type type,
std::string_view tag,
std::span<const element> children
)
: m_state(&state)
, m_type(type)
, m_tag(tag)

@@ -74,11 +77,13 @@ private:

{
}

explicit element(bool& state,
Type type,
std::string_view tag,
attribute_list attributes,
const is_element auto&... children)
explicit element(
bool& state,
Type type,
std::string_view tag,
attribute_list attributes,
const is_element auto&... children
)
: attribute_list(std::move(attributes))
, m_state(&state)
, m_type(type)

@@ -87,11 +92,13 @@ private:

{
}

explicit element(bool& state,
Type type,
std::string_view tag,
attribute_list attributes,
std::string_view data)
explicit element(
bool& state,
Type type,
std::string_view tag,
attribute_list attributes,
std::string_view data
)
: attribute_list(std::move(attributes))
, m_state(&state)
, m_type(type)

@@ -100,11 +107,13 @@ private:

{
}

explicit element(bool& state,
Type type,
std::string_view tag,
attribute_list attributes,
std::span<const element> children)
explicit element(
bool& state,
Type type,
std::string_view tag,
attribute_list attributes,
std::span<const element> children
)
: attribute_list(std::move(attributes))
, m_state(&state)
, m_type(type)

@@ -152,11 +161,13 @@ public:


template<typename... Args>
explicit element_builder(attribute_list list, Args&&... args)
: element(m_state,
MyType,
Tag.data(),
std::move(list),
std::forward<Args>(args)...)
: element(
m_state,
MyType,
Tag.data(),
std::move(list),
std::forward<Args>(args)...
)
{
}
// NOLINTEND *-no-array-decay

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

@@ -24,16 +24,20 @@ public:

static constexpr const auto default_version = "2.0";
static constexpr const auto default_xmlns = "http://www.w3.org/2005/Atom";

explicit rss(std::string_view version,
std::string_view xmlns,
const is_element auto&... children)
explicit rss(
std::string_view version,
std::string_view xmlns,
const is_element auto&... children
)
: element_builder(attributes(version, xmlns), children...)
{
}

explicit rss(std::string_view version,
std::string_view xmlns,
std::span<const element> children)
explicit rss(
std::string_view version,
std::string_view xmlns,
std::span<const element> children
)
: element_builder(attributes(version, xmlns), children)
{
}

@@ -52,9 +56,9 @@ public:

class HEMPLATE_EXPORT atomLink // NOLINT *-identifier-naming
: public element_builder<"atom:link", element::Type::Boolean>
{
static auto attributes(attribute_list& list,
std::string_view rel,
std::string_view type)
static auto attributes(
attribute_list& list, std::string_view rel, std::string_view type
)
{
list.set({
{"rel", rel},

@@ -67,18 +71,22 @@ public:

static constexpr const auto default_rel = "self";
static constexpr const auto default_type = "application/rss+xml";

explicit atomLink(std::string_view rel,
std::string_view type,
attribute_list attrs,
const is_element auto&... children)
explicit atomLink(
std::string_view rel,
std::string_view type,
attribute_list attrs,
const is_element auto&... children
)
: element_builder(attributes(attrs, rel, type), children...)
{
}

explicit atomLink(std::string_view rel,
std::string_view type,
attribute_list attrs,
std::span<const element> children)
explicit atomLink(
std::string_view rel,
std::string_view type,
attribute_list attrs,
std::span<const element> children
)
: element_builder(attributes(attrs, rel, type), children)
{
}

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

@@ -26,8 +26,9 @@ attribute_list::attribute_list(attribute attr)

set(std::move(attr));
}

attribute_list::attribute_list(attribute_list attrs,
std::initializer_list<attribute> list)
attribute_list::attribute_list(
attribute_list attrs, std::initializer_list<attribute> list
)
: attribute_list(std::move(attrs))
{
for (const auto& attr : list) {

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

@@ -13,7 +13,8 @@ auto sec_since_epoch(int64_t sec)

{
return std::chrono::time_point_cast<std::chrono::seconds>(
std::chrono::system_clock::from_time_t(time_t {0})
+ std::chrono::seconds(sec));
+ std::chrono::seconds(sec)
);
}

auto get_time_now()

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

@@ -59,7 +59,8 @@ TEST_CASE("set list", "[attribute_list]")


REQUIRE(
std::string(attrs)
== R"(class="first second" style="first; second" test_first test_second)");
== R"(class="first second" style="first; second" test_first test_second)"
);

SECTION("set")
{

@@ -71,7 +72,8 @@ TEST_CASE("set list", "[attribute_list]")


REQUIRE(
std::string(attrs)
== R"(class="first second third" style="first; second; third" test_first test_second test_third)");
== R"(class="first second third" style="first; second; third" test_first test_second test_third)"
);
}
}

@@ -81,7 +83,8 @@ TEST_CASE("add", "[attribute_list]")


const auto tmp = hemplate::attribute_list {{"class", "first"}};
const auto attrs = hemplate::attribute_list {
tmp, {{"class"sv, "second"sv}, {"class"sv, "third"sv}}};
tmp, {{"class"sv, "second"sv}, {"class"sv, "third"sv}}
};

REQUIRE(std::string(attrs) == R"(class="first second third")");
}