From 56c0c5049b9b81da08195f6a3ff2c94cefb5e0f3 Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Tue, 7 Jan 2025 13:15:38 -0400 Subject: [PATCH] Make better use of metadata when rendering directories (#90) Signed-off-by: Juan Cruz Viotti --- src/enterprise/enterprise_html.h | 77 +++++++++++++++++++++++++++++-- src/enterprise/enterprise_index.h | 18 ++++---- test/sandbox/configuration.json | 7 +++ 3 files changed, 87 insertions(+), 15 deletions(-) diff --git a/src/enterprise/enterprise_html.h b/src/enterprise/enterprise_html.h index 92799af..2149b5d 100644 --- a/src/enterprise/enterprise_html.h +++ b/src/enterprise/enterprise_html.h @@ -77,12 +77,8 @@ template auto html_end(T &html) -> void { } template -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()) { @@ -124,6 +120,77 @@ auto html_file_manager(T &html, const std::filesystem::path &directory) html << ""; + if (!meta.at("breadcrumb").empty() && meta.defines("title")) { + html << "
"; + + if (meta.defines("github")) { + html << "
"; + html << ""; + html << "
"; + } + + html << "
"; + html << "

"; + html << meta.at("title").to_string(); + html << "

"; + + if (meta.defines("description")) { + html << "

"; + html << meta.at("description").to_string(); + html << "

"; + } + + if (meta.defines("email") || meta.defines("github") || + meta.defines("website")) { + html << "
"; + + if (meta.defines("github")) { + html << ""; + html << ""; + html << ""; + html << meta.at("github").to_string(); + html << ""; + html << ""; + } + + if (meta.defines("website")) { + html << ""; + html << ""; + html << ""; + html << meta.at("website").to_string(); + html << ""; + html << ""; + } + + if (meta.defines("email")) { + html << ""; + html << ""; + html << ""; + html << meta.at("email").to_string(); + html << ""; + html << ""; + } + + html << "
"; + } + + html << "
"; + html << "
"; + } + + // "email": "hello@sourcemeta.com", + // "github": "sourcemeta", + // "website": "https://www.sourcemeta.com", + html << ""; html << ""; html << ""; diff --git a/src/enterprise/enterprise_index.h b/src/enterprise/enterprise_index.h index 2fd47d2..aabf3e1 100644 --- a/src/enterprise/enterprise_index.h +++ b/src/enterprise/enterprise_index.h @@ -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()}; @@ -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" / @@ -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(); @@ -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(); @@ -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(); diff --git a/test/sandbox/configuration.json b/test/sandbox/configuration.json index 6b8e3e9..3430e08 100644 --- a/test/sandbox/configuration.json +++ b/test/sandbox/configuration.json @@ -2,6 +2,13 @@ "url": "http://localhost:8000", "port": 8000, "pages": { + "example": { + "title": "Sourcemeta", + "description": "My description", + "email": "hello@sourcemeta.com", + "github": "sourcemeta", + "website": "https://www.sourcemeta.com" + }, "doc": { "title": "A sample schema folder", "description": "For testing purposes"