commit cb91fd3a2930f24272da2bd9a260bc1ace838322
parent 68acb3567a5817c6f1545d11b6c7d74497d8a0e4
Author: Dimitrije Dobrota <mail@dimitrijedobrota.com>
Date: Sat, 4 Jan 2025 19:48:23 +0100
Add author and keywords meta tags
Diffstat:
3 files changed, 61 insertions(+), 39 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
@@ -4,7 +4,7 @@ include(cmake/prelude.cmake)
project(
stamd
- VERSION 0.3.0
+ VERSION 0.3.1
DESCRIPTION "Static Markdown Page Generator"
HOMEPAGE_URL "https://git.dimitrijedobrota.com/stamd.git"
LANGUAGES CXX
diff --git a/source/article.cpp b/source/article.cpp
@@ -1,6 +1,7 @@
#include <format>
#include <iostream>
#include <iterator>
+#include <numeric>
#include <optional>
#include <string>
@@ -26,7 +27,7 @@ std::optional<std::string> Article::get(const std::string& key) const
std::string Article::get_filename() const
{
- return m_symbols.find("filename")->second;
+ return m_filename;
}
std::string Article::get_date() const
@@ -44,6 +45,31 @@ std::string Article::get_language() const
return get("language").value_or("en");
}
+std::string Article::get_desciprtion() const
+{
+ return get("description").value_or(m_options.description);
+}
+
+std::string Article::get_author() const
+{
+ return get("author").value_or(m_options.author);
+}
+
+std::string Article::get_keywords() const
+{
+ static const auto concat = [](const categories_t& categories)
+ {
+ if (categories.empty()) return std::string();
+ return std::accumulate(std::next(std::begin(categories)),
+ std::end(categories),
+ *categories.begin(),
+ [](const auto& acc, const auto& str)
+ { return acc + ", " + str; });
+ };
+
+ return get("keywords").value_or(concat(m_categories));
+}
+
void Article::print_nav(std::ostream& ost, const std::string& base)
{
using namespace hemplate; // NOLINT
@@ -76,48 +102,40 @@ void Article::write_header(std::ostream& ost) const
{
using namespace hemplate; // NOLINT
- static const char* description_s =
- "Dimitrije Dobrota's personal site. You can find my daily "
- "findings in a "
- "form of articles on my blog as well as various programming "
- "projects.";
-
- static const attributeList icon = {{"rel", "icon"}, {"type", "image/png"}};
- static const attributeList style = {{"rel", "stylesheet"},
- {"type", "text/css"}};
-
- static const attributeList viewport = {
- {"content", "width=device-width, initial-scale=1"},
- {"name", "viewport"}};
-
- static const attributeList description = {{"name", "description"},
- {"content", description_s}};
-
- static const attributeList rss = {{"rel", "alternate"},
- {"type", "application/atom+xml"},
- {"title", "RSS feed"},
- {"href", "/blog/rss.xml"}};
-
- static const attributeList atom = {{"rel", "alternate"},
- {"type", "application/atom+xml"},
- {"title", "Atom feed"},
- {"href", "/blog/atom.xml"}};
-
ost << html::doctype();
ost << html::html().set("lang", get_language());
ost << html::head()
.add(html::title(get_title()))
- .add(html::meta(viewport))
+ // Meta tags
.add(html::meta({{"charset", "UTF-8"}}))
- .add(html::meta(description))
- .add(html::link(style).set("href", "/css/index.css"))
- .add(html::link(style).set("href", "/css/colors.css"))
- .add(html::link(rss))
- .add(html::link(atom))
- .add(html::link(icon)
+ .add(html::meta({{"name", "author"}, {"content", get_author()}}))
+ .add(html::meta(
+ {{"name", "description"}, {"content", get_desciprtion()}}))
+ .add(html::meta(
+ {{"name", "keywords"}, {"content", get_keywords()}}))
+ .add(html::meta(
+ {{"content", "width=device-width, initial-scale=1"},
+ {"name", "viewport"}}))
+ // Stylesheets
+ .add(html::link({{"rel", "stylesheet"}, {"type", "text/css"}})
+ .set("href", "/css/index.css"))
+ .add(html::link({{"rel", "stylesheet"}, {"type", "text/css"}})
+ .set("href", "/css/colors.css"))
+ // Rss feed
+ .add(html::link({{"rel", "alternate"},
+ {"type", "application/atom+xml"},
+ {"title", "RSS feed"},
+ {"href", "/blog/rss.xml"}}))
+ // Atom feed
+ .add(html::link({{"rel", "alternate"},
+ {"type", "application/atom+xml"},
+ {"title", "Atom feed"},
+ {"href", "/blog/atom.xml"}}))
+ // Icons
+ .add(html::link({{"rel", "icon"}, {"type", "image/png"}})
.set("sizes", "32x32")
.set("href", "/img/favicon-32x32.png"))
- .add(html::link(icon)
+ .add(html::link({{"rel", "icon"}, {"type", "image/png"}})
.set("sizes", "16x16")
.set("href", "/img/favicon-16x16.png"));
diff --git a/source/article.hpp b/source/article.hpp
@@ -18,9 +18,9 @@ public:
explicit Article(std::string filename,
options_t options,
categories_t categories = {})
- : m_categories(std::move(categories))
+ : m_filename(std::move(filename))
+ , m_categories(std::move(categories))
, m_options(std::move(options))
- , m_symbols({{"filename", filename}})
{
}
@@ -46,6 +46,9 @@ public:
std::string get_date() const;
std::string get_title() const;
std::string get_language() const;
+ std::string get_desciprtion() const;
+ std::string get_author() const;
+ std::string get_keywords() const;
private:
static void print_nav(std::ostream& ost, const std::string& base);
@@ -55,6 +58,7 @@ private:
bool m_hidden = false;
bool m_nonav = false;
+ std::string m_filename;
categories_t m_categories;
options_t m_options;
symbols_t m_symbols;