Skip to content

Commit

Permalink
Make better use of metadata when rendering directories (#90)
Browse files Browse the repository at this point in the history
Signed-off-by: Juan Cruz Viotti <[email protected]>
  • Loading branch information
jviotti authored Jan 7, 2025
1 parent fbf47fc commit 56c0c50
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 15 deletions.
77 changes: 72 additions & 5 deletions src/enterprise/enterprise_html.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,8 @@ template <typename T> auto html_end(T &html) -> void {
}

template <typename T>
auto html_file_manager(T &html, const std::filesystem::path &directory)
auto html_file_manager(T &html, const sourcemeta::jsontoolkit::JSON &meta)
-> void {
const auto meta_path{directory / "index.json"};
assert(std::filesystem::exists(meta_path));
const auto meta{sourcemeta::jsontoolkit::from_file(meta_path)};

assert(meta.defines("breadcrumb"));
assert(meta.at("breadcrumb").is_array());
if (!meta.at("breadcrumb").empty()) {
Expand Down Expand Up @@ -124,6 +120,77 @@ auto html_file_manager(T &html, const std::filesystem::path &directory)
html << "<table class=\"table table-bordered border-light-subtle "
"table-light\">";

if (!meta.at("breadcrumb").empty() && meta.defines("title")) {
html << "<div class=\"mb-4 d-flex\">";

if (meta.defines("github")) {
html << "<div class=\"me-4\">";
html << "<img src=\"https://github.com/";
html << meta.at("github").to_string();
html << ".png?size=200\" class=\"img-thumbnail\" width=\"100\" "
"height=\"100\">";
html << "</div>";
}

html << "<div>";
html << "<h2 class=\"fw-bold h4\">";
html << meta.at("title").to_string();
html << "</h2>";

if (meta.defines("description")) {
html << "<p class=\"text-secondary\">";
html << meta.at("description").to_string();
html << "</p>";
}

if (meta.defines("email") || meta.defines("github") ||
meta.defines("website")) {
html << "<div>";

if (meta.defines("github")) {
html << "<small class=\"me-3\">";
html << "<i class=\"bi bi-github text-secondary me-1\"></i>";
html << "<a href=\"https://github.com/";
html << meta.at("github").to_string();
html << "\" class=\"text-secondary\">";
html << meta.at("github").to_string();
html << "</a>";
html << "</small>";
}

if (meta.defines("website")) {
html << "<small class=\"me-3\">";
html << "<i class=\"bi bi-link-45deg text-secondary me-1\"></i>";
html << "<a href=\"";
html << meta.at("website").to_string();
html << "\" class=\"text-secondary\">";
html << meta.at("website").to_string();
html << "</a>";
html << "</small>";
}

if (meta.defines("email")) {
html << "<small class=\"me-3\">";
html << "<i class=\"bi bi-envelope text-secondary me-1\"></i>";
html << "<a href=\"mailto:";
html << meta.at("email").to_string();
html << "\" class=\"text-secondary\">";
html << meta.at("email").to_string();
html << "</a>";
html << "</small>";
}

html << "</div>";
}

html << "</div>";
html << "</div>";
}

// "email": "[email protected]",
// "github": "sourcemeta",
// "website": "https://www.sourcemeta.com",

html << "<thead>";
html << "<tr>";
html << "<th scope=\"col\" style=\"width: 50px\"></th>";
Expand Down
18 changes: 8 additions & 10 deletions src/enterprise/enterprise_index.h
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ auto generate_toc(
return left.at("type") < right.at("type");
});

auto result{sourcemeta::jsontoolkit::JSON::make_object()};
auto meta{sourcemeta::jsontoolkit::JSON::make_object()};
const auto page_entry_name{
std::filesystem::relative(directory, base).string()};

Expand All @@ -183,24 +183,24 @@ auto generate_toc(
configuration.at("pages").defines(page_entry_name)) {
for (const auto &entry :
configuration.at("pages").at(page_entry_name).as_object()) {
result.assign(entry.first, entry.second);
meta.assign(entry.first, entry.second);
}
}

// Store entries
result.assign("entries", std::move(entries));
meta.assign("entries", std::move(entries));

// Precompute the breadcrumb
const std::filesystem::path relative_path{directory.string().substr(
std::min(base.string().size() + 1, directory.string().size()))};
result.assign("breadcrumb", sourcemeta::jsontoolkit::JSON::make_array());
meta.assign("breadcrumb", sourcemeta::jsontoolkit::JSON::make_array());
std::filesystem::path current_path{"/"};
for (const auto &part : relative_path) {
current_path = current_path / part;
auto breadcrumb_entry{sourcemeta::jsontoolkit::JSON::make_object()};
breadcrumb_entry.assign("name", sourcemeta::jsontoolkit::JSON{part});
breadcrumb_entry.assign("url", sourcemeta::jsontoolkit::JSON{current_path});
result.at("breadcrumb").push_back(std::move(breadcrumb_entry));
meta.at("breadcrumb").push_back(std::move(breadcrumb_entry));
}

const auto index_path{base.parent_path() / "generated" /
Expand All @@ -210,7 +210,7 @@ auto generate_toc(
std::filesystem::create_directories(index_path.parent_path());
std::ofstream stream{index_path};
assert(!stream.fail());
sourcemeta::jsontoolkit::prettify(result, stream);
sourcemeta::jsontoolkit::prettify(meta, stream);
stream << "\n";
stream.close();

Expand All @@ -221,8 +221,7 @@ auto generate_toc(
sourcemeta::registry::enterprise::html_start(
html, configuration, configuration.at("title").to_string(),
configuration.at("description").to_string(), "");
sourcemeta::registry::enterprise::html_file_manager(
html, index_path.parent_path());
sourcemeta::registry::enterprise::html_file_manager(html, meta);
sourcemeta::registry::enterprise::html_end(html);
html << "\n";
html.close();
Expand All @@ -234,8 +233,7 @@ auto generate_toc(
sourcemeta::registry::enterprise::html_start(
html, configuration, page_relative_path, page_relative_path,
page_relative_path);
sourcemeta::registry::enterprise::html_file_manager(
html, index_path.parent_path());
sourcemeta::registry::enterprise::html_file_manager(html, meta);
sourcemeta::registry::enterprise::html_end(html);
html << "\n";
html.close();
Expand Down
7 changes: 7 additions & 0 deletions test/sandbox/configuration.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@
"url": "http://localhost:8000",
"port": 8000,
"pages": {
"example": {
"title": "Sourcemeta",
"description": "My description",
"email": "[email protected]",
"github": "sourcemeta",
"website": "https://www.sourcemeta.com"
},
"doc": {
"title": "A sample schema folder",
"description": "For testing purposes"
Expand Down

0 comments on commit 56c0c50

Please sign in to comment.