startgit

Static page generator for git repositories
git clone git://git.dimitrijedobrota.com/startgit.git
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING

commit b13c4211c2adafdc4bc0b98112a9ff39a94a2ab1
parent 5b65fc4eaee8b9aaaaf3e7b27f900990228f8e22
author Dimitrije Dobrota < mail@dimitrijedobrota.com >
date Sat, 26 Apr 2025 09:36:34 +0200

Utilize cleaner hemplate interface

Diffstat:
M source/document.cpp | +++ ---
M source/startgit-index.cpp | ++ --
M source/startgit.cpp | +++++++++++++++++++++++++++++++++++++++ --------------------------------------------

3 files changed, 50 insertions(+), 56 deletions(-)


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

@@ -13,7 +13,7 @@ void document::render(std::ostream& ost, const content_t& content) const

using hemplate::html::div;
using hemplate::html::link;

ost << transparent {
ost << element {
doctype {},
html {
{{"lang", "en"}},

@@ -50,7 +50,7 @@ void document::render(std::ostream& ost, const content_t& content) const

}},

// Rss feed
!m_has_feed ? text {} : [&]() -> element
!m_has_feed ? element {} : [&]() -> hemplate::element
{
return link {{
{"rel", "alternate"},

@@ -61,7 +61,7 @@ void document::render(std::ostream& ost, const content_t& content) const

}(),

// Atom feed
!m_has_feed ? text {} : [&]() -> element
!m_has_feed ? element {} : [&]() -> hemplate::element
{
return link {{
{"rel", "alternate"},

diff --git a/ source/startgit-index.cpp b/ source/startgit-index.cpp

@@ -124,14 +124,14 @@ hemplate::element write_table_row(const std::filesystem::path& repo_path)

);
}

return text();
return element {};
}

hemplate::element write_table()
{
using namespace hemplate::html; // NOLINT

return transparent {
return element {
h1 {args.title},
p {args.description},
table {

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

@@ -38,9 +38,9 @@ hemplate::element wtable(

head_content,
[](const auto& elem)
{
return td {text {
return td {
elem,
}};
};
}
),
},

@@ -64,7 +64,7 @@ hemplate::element page_title(

{
using namespace hemplate::html; // NOLINT

return transparent {
return element {
table {
tr {
td {

@@ -74,16 +74,16 @@ hemplate::element page_title(

},
tr {
td {
text("git clone "),
"git clone ",
a {{{"href", repo.get_url()}}, repo.get_url()},
},
},
tr {
td {
a {{{"href", relpath + "log.html"}}, "Log"},
text(" | "),
" | ",
a {{{"href", relpath + "files.html"}}, "Files"},
text(" | "),
" | ",
a {{{"href", relpath + "refs.html"}}, "Refs"},
transform(
branch.get_special(),

@@ -94,8 +94,8 @@ hemplate::element page_title(

path.replace_extension("html").string();
const auto name = path.replace_extension().string();

return transparent {
text {" | "},
return element {
" | ",
a {{{"href", relpath + filename}}, name},
};
}

@@ -161,7 +161,7 @@ hemplate::element branch_table(

{
using namespace hemplate::html; // NOLINT

return transparent {
return element {
h2 {"Branches"},
wtable(
{"&nbsp;", "Name", "Last commit date", "Author"},

@@ -189,7 +189,7 @@ hemplate::element tag_table(const repository& repo)

{
using namespace hemplate::html; // NOLINT

return transparent {
return element {
h2 {"Tags"},
wtable(
{"&nbsp;", "Name", "Last commit date", "Author"},

@@ -211,7 +211,7 @@ hemplate::element file_changes(const diff& diff)

{
using namespace hemplate::html; // NOLINT

return transparent {
return element {
b {"Diffstat:"},
wtable(
{},

@@ -266,25 +266,21 @@ hemplate::element diff_hunk(const hunk& hunk)

using namespace hemplate::html; // NOLINT

const std::string header(hunk->header); // NOLINT
return transparent {
return element {
h4 {
text {
std::format(
"@@ -{},{} +{},{} @@ ",
hunk->old_start,
hunk->old_lines,
hunk->new_start,
hunk->new_lines
),
},
text {
xmlencode(header.substr(header.rfind('@') + 2)),
},
std::format(
"@@ -{},{} +{},{} @@ ",
hunk->old_start,
hunk->old_lines,
hunk->new_start,
hunk->new_lines
),
xmlencode(header.substr(header.rfind('@') + 2)),
span {
{{"style", "white-space: pre"}},
transform(
hunk.get_lines(),
[](const auto& line) -> element
[](const auto& line) -> hemplate::element
{
using hemplate::html::div;

@@ -302,9 +298,7 @@ hemplate::element diff_hunk(const hunk& hunk)

};
}

return text {
xmlencode(line.get_content()),
};
return element(xmlencode(line.get_content()));
}
),
},

@@ -325,12 +319,14 @@ hemplate::element file_diffs(const diff& diff)

const auto new_link = std::format("../file/{}.html", new_file);
const auto old_link = std::format("../file/{}.html", old_file);

return transparent {
return element {
h3 {
{{"id", delta->new_file.path}},
text {"diff --git"},
text {text {"a/"}, a {{{"href", new_link}}, new_file}},
text {text {"b/"}, a {{{"href", old_link}}, old_file}},
"diff --git",
"a/",
a {{{"href", new_link}}, new_file},
"b/",
a {{{"href", old_link}}, old_file},
},
transform(delta.get_hunks(), diff_hunk),
};

@@ -345,14 +341,15 @@ hemplate::element commit_diff(const commit& commit)

const auto url = std::format("../commit/{}.html", commit.get_id());
const auto mailto = std::string("mailto:") + commit.get_author_email();

return transparent {
return element {
table {
tbody {
tr {
td {b {"commit"}},
td {a {{{"href", url}}, commit.get_id()}},
},
commit.get_parentcount() == 0 ? text {} : [&]() -> element
commit.get_parentcount() == 0 ? element {}
: [&]() -> hemplate::element
{
const auto purl =
std::format("../commit/{}.html", commit.get_parent_id());

@@ -365,7 +362,7 @@ hemplate::element commit_diff(const commit& commit)

tr {
td {b {"author"}},
td {
text {commit.get_author_name()},
commit.get_author_name(),
a {
{{"href", mailto}},
"&lt;" + commit.get_author_email() + "&gt;",

@@ -381,7 +378,7 @@ hemplate::element commit_diff(const commit& commit)

br {},
p {
{{"style", "white-space: pre;"}},
text {xmlencode(commit.get_message())},
xmlencode(commit.get_message()),
},
file_changes(commit.get_diff()),
hr {},

@@ -395,7 +392,7 @@ hemplate::element write_file_title(const file& file)


const auto path = file.get_path().filename().string();

return transparent {
return element {
h3 {std::format("{} ({}B)", path, file.get_size())},
hr {},
};

@@ -426,14 +423,11 @@ hemplate::element write_file_content(const file& file)

lines,
[&](const auto& line)
{
return text {
std::format(
R"(<a id="{0}" href="#{0}">{0:5}</a> {1})",
count++,
xmlencode(line)
),

};
return std::format(
R"(<a id="{0}" href="#{0}">{0:5}</a> {1})",
count++,
xmlencode(line)
);
}
),
};

@@ -470,7 +464,7 @@ void write_log(

ofs,
[&]()
{
return hemplate::transparent {
return hemplate::element {
page_title(repo, branch),
commit_table(branch),
};

@@ -489,7 +483,7 @@ void write_file(

ofs,
[&]()
{
return hemplate::transparent {
return hemplate::element {
page_title(repo, branch),
files_table(branch),
};

@@ -508,7 +502,7 @@ void write_refs(

ofs,
[&]()
{
return hemplate::transparent {
return hemplate::element {
page_title(repo, branch),
branch_table(repo, branch.get_name()),
tag_table(repo),

@@ -536,7 +530,7 @@ bool write_commits(

ofs,
[&]()
{
return hemplate::transparent {
return hemplate::element {
page_title(repo, branch, "../"),
commit_diff(commit),
};

@@ -571,7 +565,7 @@ void write_files(

ofs,
[&]()
{
return hemplate::transparent {
return hemplate::element {
page_title(repo, branch, relpath),
write_file_title(file),
write_file_content(file),

@@ -594,7 +588,7 @@ void write_readme_licence(

sstr,
[&]()
{
return hemplate::transparent {
return hemplate::element {
page_title(repo, branch),
};
}