From 84f3301f1c6e49db33403ea6de3d6bf4d6bd7dcb Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Mon, 10 Feb 2025 17:47:56 +0000 Subject: [PATCH 01/21] =?UTF-8?q?=E2=9C=A8=20feat(webmentions):=20add=20we?= =?UTF-8?q?bmentions=20support=20templates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - create webmentions partial template for page head integration - add webmentions shortcode template to position webmentions on the page --- templates/partials/webmentions.html | 70 +++++++++++++++++++++++++++ templates/shortcodes/webmentions.html | 8 +++ 2 files changed, 78 insertions(+) create mode 100644 templates/partials/webmentions.html create mode 100644 templates/shortcodes/webmentions.html diff --git a/templates/partials/webmentions.html b/templates/partials/webmentions.html new file mode 100644 index 000000000..453ee76bf --- /dev/null +++ b/templates/partials/webmentions.html @@ -0,0 +1,70 @@ +{# Incorporate webmention.io links and script into the page head. +1. Provide the link to the webmention data in the at webmention.io. +2. Link to the stylesheet for styling webmentions on a page. +3. Add and configure the javascript to fetch and display the webmentions collected at webmention.io. #} + + + + +{# Calculate the configured data for the script, if any #} + +{% set script_data = "" %} + +{% if config.extra.webmentions.id %} + {% set script_data = script_data ~ "data-id=" ~ config.extra.webmentions.id %} +{% endif %} + +{% if config.extra.webmentions.page_url %} + {% set script_data = script_data ~ " data-page-url=" ~ config.extra.webmentions.page_url %} +{% endif %} + +{% if config.extra.webmentions.add_urls %} + {% set script_data = script_data ~ "data-add-urls=" ~ config.extra.webmentions.add_urls %} +{% endif %} + +{% if config.extra.webmentions.wordcount %} + {% set script_data = script_data ~ " data-wordcount=" ~ config.extra.webmentions.wordcount %} +{% endif %} + +{% if config.extra.webmentions.max_webmentions %} + {% set script_data = script_data ~ "data-max-webmentions=" ~ config.extra.webmentions.max_webmentions %} +{% endif %} + +{% if config.extra.webmentions.prevent_spoofing %} + {% set script_data = script_data ~ "data-prevent-spoofing=" ~ config.extra.webmentions.prevent_spoofing %} +{% endif %} + +{% if config.extra.webmentions.sort_by %} + {% set script_data = script_data ~ "data-sort-by=" ~ config.extra.webmentions.sort_by %} +{% endif %} + +{% if config.extra.webmentions.sort_dir %} + {% set script_data = script_data ~ "data-sort-dir=" ~ config.extra.webmentions.sort_dir %} +{% endif %} + +{% if config.extra.webmentions.comments_are_reactions %} + {% set script_data = script_data ~ " data-comments-are-reactions=" ~ config.extra.webmentions.comments_are_reactions %} +{% endif %} + + + +{# + + +#} \ No newline at end of file diff --git a/templates/shortcodes/webmentions.html b/templates/shortcodes/webmentions.html new file mode 100644 index 000000000..33986fbdc --- /dev/null +++ b/templates/shortcodes/webmentions.html @@ -0,0 +1,8 @@ +{%- set format = config.extra.webmentions.format | default(value="") -%} +{% if format == "" %} +{%- set dash = "" -%} +{% else %} +{%- set dash = "-" -%} +{% endif %} + +
hello
\ No newline at end of file From cab76ee50701c9019acf7dfabdf2604f81409f98 Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Tue, 11 Feb 2025 06:32:11 +0000 Subject: [PATCH 02/21] =?UTF-8?q?=E2=9C=A8=20feat(config):=20add=20webment?= =?UTF-8?q?ion=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - introduce webmention.io configuration for enhanced comment integration - add connect-src directive for webmention.io to CSP policy --- config.toml | 42 ++++++++++++++++++++++++++++++++++++++++++ theme.toml | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/config.toml b/config.toml index 4e7380061..533c1c0ef 100644 --- a/config.toml +++ b/config.toml @@ -328,6 +328,7 @@ allowed_domains = [ { directive = "script-src", domains = ["'self'"] }, { directive = "style-src", domains = ["'self'"] }, { directive = "frame-src", domains = ["player.vimeo.com", "https://www.youtube-nocookie.com"] }, +# { directive = "connect-src", domains = [ "https://webmention.io"] }, ] # Enable the CSP directives configured (or default). @@ -363,6 +364,47 @@ service = "goatcounter" # Leave this field empty if you're using the service's default hosting. self_hosted_url = "https://tabi-stats.osc.garden" +[extra.webmentions] +# enable = true +# Specify the domain registered with webmention.io. +# domain = "www.example.com" + +# The HTML ID for the object to fill in with the webmention data. +# Defaults to "webmentions" +# id = "webmentions" + +# data configuration for the webmention.min.js script +# The base URL to use for this page. Defaults to window.location +page_url = "https://beesbuzz.biz/code/439-Falsehoods-programmers-believe-about-email" + +# Additional URLs to check, separated by |s +# add_urls + +# The maximum number of words to render in reply mentions. +# wordcount = 20 + +# The maximum number of mentions to retrieve. Defaults to 30. +# max_webmentions + +# By default, Webmentions render using the mf2 'url' element, which plays +# nicely with webmention bridges (such as brid.gy and telegraph) +# but allows certain spoofing attacks. If you would like to prevent +# spoofing, set this to a non-empty string (e.g. "true"). +# prevent_spoofing + +# What to order the responses by; defaults to 'published'. See +# https://github.com/aaronpk/webmention.io#api +# sort_by + +# The order to sort the responses by; defaults to 'up' (i.e. oldest +# first). See https://github.com/aaronpk/webmention.io#api +# sort_dir + +# If set to a non-empty string (e.g. "true"), will display comment-type responses +# (replies/mentions/etc.) as being part of the reactions +# (favorites/bookmarks/etc.) instead of in a separate comment list. +# comments_are_reactions = "true" + # giscus support for comments. https://giscus.app # Setup instructions: https://welpo.github.io/tabi/blog/comments/#setup [extra.giscus] diff --git a/theme.toml b/theme.toml index 5772e6122..417323f80 100644 --- a/theme.toml +++ b/theme.toml @@ -285,6 +285,7 @@ allowed_domains = [ { directive = "script-src", domains = ["'self'"] }, { directive = "style-src", domains = ["'self'"] }, { directive = "frame-src", domains = ["player.vimeo.com", "https://www.youtube-nocookie.com"] }, +# { directive = "connect-src", domains = [ "https://webmention.io"] }, ] # Enable the CSP directives configured (or default). @@ -320,6 +321,47 @@ custom_subset = true # Leave this field empty if you're using the service's default hosting. # self_hosted_url = "" +[extra.webmentions] +# enable = true +# Specify the domain registered with webmention.io. +# domain = "www.example.com" + +# The HTML ID for the object to fill in with the webmention data. +# Defaults to "webmentions" +# id = "webmentions" + +# data configuration for the webmention.min.js script +# The base URL to use for this page. Defaults to window.location +page_url = "https://beesbuzz.biz/code/439-Falsehoods-programmers-believe-about-email" + +# Additional URLs to check, separated by |s +# add_urls + +# The maximum number of words to render in reply mentions. +# wordcount = 20 + +# The maximum number of mentions to retrieve. Defaults to 30. +# max_webmentions + +# By default, Webmentions render using the mf2 'url' element, which plays +# nicely with webmention bridges (such as brid.gy and telegraph) +# but allows certain spoofing attacks. If you would like to prevent +# spoofing, set this to a non-empty string (e.g. "true"). +# prevent_spoofing + +# What to order the responses by; defaults to 'published'. See +# https://github.com/aaronpk/webmention.io#api +# sort_by + +# The order to sort the responses by; defaults to 'up' (i.e. oldest +# first). See https://github.com/aaronpk/webmention.io#api +# sort_dir + +# If set to a non-empty string (e.g. "true"), will display comment-type responses +# (replies/mentions/etc.) as being part of the reactions +# (favorites/bookmarks/etc.) instead of in a separate comment list. +# comments_are_reactions = "true" + # giscus support for comments. https://giscus.app # Setup instructions: https://welpo.github.io/tabi/blog/comments/#setup [extra.giscus] From b930658f862dc2c274689570aa486ff1ad8a81f2 Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Tue, 11 Feb 2025 06:46:30 +0000 Subject: [PATCH 03/21] =?UTF-8?q?=E2=9C=A8=20feat(webmention):=20add=20web?= =?UTF-8?q?mention.js=20for=20embedding=20webmentions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - add webmention.js to enable client-side embedding of webmentions from webmention.io - support multiple configuration parameters for customization - based on PlaidWeb/webmention.js ✨ feat(webmention): add minified version of webmention.js - include webmention.min.js as a minified version for optimized loading - mirror functionality of the unminified webmention.js --- static/js/webmention.js | 475 ++++++++++++++++++++++++++++++++++++ static/js/webmention.min.js | 3 + 2 files changed, 478 insertions(+) create mode 100644 static/js/webmention.js create mode 100644 static/js/webmention.min.js diff --git a/static/js/webmention.js b/static/js/webmention.js new file mode 100644 index 000000000..49d23d360 --- /dev/null +++ b/static/js/webmention.js @@ -0,0 +1,475 @@ +/* webmention.js + +Simple thing for embedding webmentions from webmention.io into a page, client-side. + +(c)2018-2022 fluffy (http://beesbuzz.biz) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +GitHub repo (for latest released versions, issue tracking, etc.): + + https://github.com/PlaidWeb/webmention.js + +Basic usage: + + + + + - + {# If JavaScript is disabled, hide the button. #} + + + {%- endif -%} {%- if config.extra.analytics.service -%} @@ -151,6 +153,11 @@ {%- endif -%} + {# Webmentions #} + {%- if config.extra.webmentions.enable -%} + {%- include "partials/webmentions.html" -%} + {%- endif -%} + {# Search #} {%- if config.build_search_index -%} {%- if config.search.index_format -%} From e9cfbdc2eb5e2f64fb28d3db0416b2e171f20c71 Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Tue, 11 Feb 2025 08:03:01 +0000 Subject: [PATCH 06/21] =?UTF-8?q?=E2=9C=A8=20feat(shortcodes):=20add=20web?= =?UTF-8?q?mentions=20section?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - introduce a section for displaying webmentions for posts - include subsections for mentions of posts and sites mentioned in posts 📝 docs(shortcodes): correct typos and improve clarity - fix spacing and punctuation issues in Mermaid diagrams - correct typo in "Provides" within the swap image section - update Markdown syntax in admonition examples - change "tranquility" to "tranquillity" in multilingual quote - correct movie title from "Beoning" to "Burning" - add usage examples for webmentions section --- content/blog/shortcodes/index.md | 57 ++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/content/blog/shortcodes/index.md b/content/blog/shortcodes/index.md index 34ef9f875..f65a9c51a 100644 --- a/content/blog/shortcodes/index.md +++ b/content/blog/shortcodes/index.md @@ -1,7 +1,7 @@ +++ title = "Custom shortcodes" date = 2023-02-19 -updated = 2024-12-28 +updated = 2025-02-11 description = "This theme includes some useful custom shortcodes that you can use to enhance your posts. Whether you want to display images that adapt to light and dark themes, or format a professional-looking reference section, these custom shortcodes have got you covered." [taxonomies] @@ -79,9 +79,9 @@ classDiagram +MakeAssumptions() } CognitiveDistortions *-- AllOrNothingThinking - CognitiveDistortions *-- Overgeneralization + CognitiveDistortions*-- Overgeneralization CognitiveDistortions *-- MentalFilter - CognitiveDistortions *-- JumpingToConclusions + CognitiveDistortions*-- JumpingToConclusions {% end %} The Mermaid shortcode supports two parameters: @@ -121,6 +121,7 @@ Useful if you want to use a different image for the light and dark themes: {{ dual_theme_image(light_src="img/paris_day.webp", dark_src="img/paris_night.webp" alt="The Eiffel tower") }} #### Usage + ``` {{/* dual_theme_image(light_src="img/paris_day.webp", dark_src="img/paris_night.webp" alt="The Eiffel tower") */}} ``` @@ -151,7 +152,7 @@ Images with too much brightness or contrast can be jarring against a dark backgr ### Swap image on hover -Povides an interaction where the image displayed changes as the user hovers over it. Useful for before-after comparisons, for example. +Provides an interaction where the image displayed changes as the user hovers over it. Useful for before-after comparisons, for example. {{ image_hover(default_src="img/edited.webp", hovered_src="img/raw.webp", default_alt="Edited picture", hovered_alt="Original shot") }} @@ -193,7 +194,7 @@ All other image shortcodes can be made into full-width by setting the optional p Display a path or URL on the next code block found. If it starts with "http", it will become a link. Particularly useful when used in conjunction with the [remote text shortcode](#remote-text). -{{ add_src_to_code_block(src="https://github.com/welpo/doteki/blob/main/.gitignore") }} +{{ add_src_to_code_block(src="") }} ```.gitignore {{ remote_text(src="https://raw.githubusercontent.com/welpo/doteki/main/.gitignore") }} @@ -292,19 +293,19 @@ Display lines 3 to 7 (both inclusive) of a local file: Bring attention to information with these admonition shortcodes. They come in five `type`s: `note`, `tip`, `info`, `warning`, and `danger`. -{{ admonition(type="note", text="Some **content** with _Markdown_ `syntax`. Check [this `api`](#).") }} +{{ admonition(type="note", text="Some **content** with *Markdown* `syntax`. Check [this `api`](#).") }} -{{ admonition(type="tip", text="Some **content** with _Markdown_ `syntax`. Check [this `api`](#).") }} +{{ admonition(type="tip", text="Some **content** with *Markdown* `syntax`. Check [this `api`](#).") }} -{{ admonition(type="info", text="Some **content** with _Markdown_ `syntax`. Check [this `api`](#).") }} +{{ admonition(type="info", text="Some **content** with *Markdown* `syntax`. Check [this `api`](#).") }} -{{ admonition(type="warning", text="Some **content** with _Markdown_ `syntax`. Check [this `api`](#).") }} +{{ admonition(type="warning", text="Some **content** with *Markdown* `syntax`. Check [this `api`](#).") }} -{{ admonition(type="danger", text="Some **content** with _Markdown_ `syntax`. Check [this `api`](#).") }} +{{ admonition(type="danger", text="Some **content** with *Markdown* `syntax`. Check [this `api`](#).") }} You can change the `title` and `icon` of the admonition. Both parameters take a string and default to the type of admonition. `icon` can be any of the available admonition types. -{{ admonition(type="note", icon="tip", title="Custom title and icon", text="Some **content** with _Markdown_ `syntax`. Check [this `api`](#).") }} +{{ admonition(type="note", icon="tip", title="Custom title and icon", text="Some **content** with *Markdown* `syntax`. Check [this `api`](#).") }} #### Usage @@ -332,12 +333,12 @@ Both methods support the same parameters (`type`, `icon`, and `title`), with the This shortcode allows you to display both the translated and original text for a quote. The quotation marks will be added automatically: -{{ multilingual_quote(original="Qué sosiego, ir por la vida en silencio, saludando sólo a los amigos.", translated="What tranquility, to go through life in silence, greeting only friends.", author="Francisco Umbral") }} +{{ multilingual_quote(original="Qué sosiego, ir por la vida en silencio, saludando sólo a los amigos.", translated="What tranquillity, to go through life in silence, greeting only friends.", author="Francisco Umbral") }} #### Usage ``` -{{/* multilingual_quote(original="Qué sosiego, ir por la vida en silencio, saludando sólo a los amigos.", translated="What tranquility, to go through life in silence, greeting only friends.", author="Francisco Umbral") */}} +{{/* multilingual_quote(original="Qué sosiego, ir por la vida en silencio, saludando sólo a los amigos.", translated="What tranquillity, to go through life in silence, greeting only friends.", author="Francisco Umbral") */}} ``` ### References with hanging indent @@ -394,7 +395,7 @@ Use this shortcode if you want to have a wider table, paragraph, code block… O | Title | Year | Director | Cinematographer | Genre | IMDb | Duration | |-------------------|-------|----------------------|-----------------------|---------------|-------|--------------| -| Beoning | 2018 | Lee Chang-dong | Hong Kyung-pyo | Drama/Mystery | 7.5 | 148 min | +| Burning | 2018 | Lee Chang-dong | Hong Kyung-pyo | Drama/Mystery | 7.5 | 148 min | | The Master | 2012 | Paul Thomas Anderson | Mihai Mălaimare Jr. | Drama/History | 7.1 | 137 min | | The Tree of Life | 2011 | Terrence Malick | Emmanuel Lubezki | Drama | 6.8 | 139 min | @@ -419,10 +420,12 @@ Force the text direction of a content block. Overrides both the global `force_co Accepts the parameter `direction`: the desired text direction. This can be either "ltr" (left-to-right) or "rtl" (right-to-left). Defaults to "ltr". {% force_text_direction(direction="rtl") %} + ```python def مرحبا_بالعالم(): print("مرحبا بالعالم!") ``` + {% end %} #### Usage @@ -439,3 +442,29 @@ def مرحبا_بالعالم(): {%/* end */%} ```` + +## Displaying webmentions for your posts + +As described by the recommended W3C standard [Webmention][1] is a simple way to notify any URL when you mention it on your site. From the receiver's perspective, it's a way to request notifications when other sites mention it. + +For static sites [webmention.io][2] hosts a webmention endpoint that can be used to receive webmentions. This feature fetches the webmentions stored at webmention.io and displays them for a page. You will need to have setup an account for your website at webmention.io. When you enable the webmention feature it will advertise your webmention.io endpoint and display the webmentions for any post using the webmention shortcut. + +### Configuration and Usage + +Enable webmentions for your site, add the following to your `config.toml` file: + +```toml +[extra.webmentions] +enable = true +# Specify the domain registered with webmention.io. +domain = "www.example.com" +``` + +Add the shortcut on the page where you want to display the webmentions: + +``` +{{/* webmentions() */}} +``` + +[1]: https://www.w3.org/TR/webmention/#abstract-p-1 +[2]: https://webmention.io/ From f2d13b9468564ddf0adfff558727bf42d5233c40 Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Tue, 11 Feb 2025 08:57:39 +0000 Subject: [PATCH 07/21] =?UTF-8?q?=F0=9F=93=9D=20docs(blog):=20add=20webmen?= =?UTF-8?q?tions=20section=20to=20mastering=20tabi=20settings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - introduce webmentions as per W3C standard - provide configuration and usage instructions - include links for further reading --- content/blog/mastering-tabi-settings/index.md | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/content/blog/mastering-tabi-settings/index.md b/content/blog/mastering-tabi-settings/index.md index ab8814b0b..58c423402 100644 --- a/content/blog/mastering-tabi-settings/index.md +++ b/content/blog/mastering-tabi-settings/index.md @@ -1,7 +1,7 @@ +++ title = "Mastering tabi Settings: A Comprehensive Guide" date = 2023-09-18 -updated = 2025-02-02 +updated = 2025-02-11 description = "Discover the many ways you can customise your tabi site." [taxonomies] @@ -759,6 +759,37 @@ If you have enabled a system globally, but want to disable it on a specific page Read [the docs](@/blog/comments/index.md) for more information on the available systems and their setup. +## Webmentions + +As described by the recommended W3C standard [Webmention][1] is a simple way to notify any URL when you mention it on your site. From the receiver's perspective, it's a way to request notifications when other sites mention it. + +For static sites [webmention.io][2] hosts a webmention endpoint that can be used to receive webmentions. This feature fetches the webmentions stored at webmention.io and displays them for a page. You will need to have setup an account for your website at webmention.io. When you enable the webmention feature it will advertise your webmention.io endpoint and display the webmentions for any post using the webmention shortcut. + +### Configuration and Usage + +Enable webmentions for your site by adding the following to your `config.toml` file. A directive for CSP is required to allow the webmention.io endpoint to be used. + +```toml +[extra] +allowed_domains = [ + { directive = "connect-src", domains = [ "https://webmention.io"] }, +] + +[extra.webmentions] +enable = true +# Specify the domain registered with webmention.io. +domain = "www.example.com" +``` + +Add the shortcut on the page where you want to display the webmentions: + +``` +{{/* webmentions() */}} +``` + +[1]: https://www.w3.org/TR/webmention/#abstract-p-1 +[2]: https://webmention.io/ + ### Analytics | Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript | From ee88359ad657db2355b07da8b413ffb3eed548a4 Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Tue, 11 Feb 2025 09:07:47 +0000 Subject: [PATCH 08/21] =?UTF-8?q?=F0=9F=92=84=20style(blog):=20remove=20tr?= =?UTF-8?q?ailing=20space=20in=20markdown=20text?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - eliminate unwanted space at the end of a sentence for style consistency --- content/blog/mastering-tabi-settings/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/mastering-tabi-settings/index.md b/content/blog/mastering-tabi-settings/index.md index 58c423402..30b81418c 100644 --- a/content/blog/mastering-tabi-settings/index.md +++ b/content/blog/mastering-tabi-settings/index.md @@ -113,7 +113,7 @@ The description is regular Markdown content, set outside the front matter. #### Listing Recent Posts -To show posts on your main page, you first need to decide where these posts will be served from: the root path (`/`) or a subdirectory (e.g., `/blog`). +To show posts on your main page, you first need to decide where these posts will be served from: the root path (`/`) or a subdirectory (e.g., `/blog`). **Option A: Serve posts from the root path (`/`)** From 30819dd890f231aa8758f02127f1aeed009577f0 Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Tue, 11 Feb 2025 12:17:32 +0000 Subject: [PATCH 09/21] =?UTF-8?q?=F0=9F=92=84=20style(sass):=20enhance=20w?= =?UTF-8?q?ebmention=20styling=20with=20variables=20=20=20-=20add=20color?= =?UTF-8?q?=20and=20background=20color=20variables=20for=20consistent=20st?= =?UTF-8?q?yling=20=20=20-=20update=20margins=20and=20padding=20for=20bett?= =?UTF-8?q?er=20layout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ♻️ refactor(css): migrate and rename webmention CSS to SCSS - move webmention.css to sass/parts/_webmention.scss - remove unused webmention.min.css - update template to remove old stylesheet link --- sass/main.scss | 1 + .../parts/_webmention.scss | 18 ++++++++++++++---- static/webmention.min.css | 1 - templates/partials/webmentions.html | 1 - 4 files changed, 15 insertions(+), 6 deletions(-) rename static/webmention.css => sass/parts/_webmention.scss (77%) delete mode 100644 static/webmention.min.css diff --git a/sass/main.scss b/sass/main.scss index f2b36c718..d1d13aeeb 100644 --- a/sass/main.scss +++ b/sass/main.scss @@ -23,6 +23,7 @@ @use 'parts/_tags.scss'; @use 'parts/_theme-switch.scss'; @use 'parts/_zola-error.scss'; +@use 'parts/_webmention.scss'; @font-face { src: local('Inter'), diff --git a/static/webmention.css b/sass/parts/_webmention.scss similarity index 77% rename from static/webmention.css rename to sass/parts/_webmention.scss index ab34847d4..8458b23ed 100644 --- a/static/webmention.css +++ b/sass/parts/_webmention.scss @@ -3,6 +3,8 @@ position: relative; z-index: 100; line-height: 1.2em; + color: var(--text-color); + background-color: var(--background-color); } #webmentions .comments { @@ -15,8 +17,10 @@ #webmentions h2 { font-size: medium; margin: 0; + margin-top: 1.4em; + margin-bottom: 1.2em; padding: 2px; - /* background: #ccc; */ + background: var(--background-color); } #webmentions .reacts img { @@ -49,10 +53,16 @@ margin-right: 1ex; } +#webmentions a.source { + margin-right: 1ex; + text-decoration: none; + color: var(--primary-color); + background-color: var(--background-color); +} + #webmentions a.reaction img { max-height: 1.3em; display: inline; - /* padding-right: .5em; */ width: auto; margin-right: -1ex; border-radius: 25%; @@ -69,7 +79,7 @@ } #webmentions .comments li .text { - color: #555; + color: var(--meta-color); font-style: italic; text-decoration: none; text-wrap: wrap; @@ -77,7 +87,7 @@ } #webmentions .comments li .name { - color: #111; + color: var(--meta-color); padding-left: 0.5em; } diff --git a/static/webmention.min.css b/static/webmention.min.css deleted file mode 100644 index c12d90e8e..000000000 --- a/static/webmention.min.css +++ /dev/null @@ -1 +0,0 @@ -#webmentions{margin:0;position:relative;z-index:100;line-height:1.2em}#webmentions .comments{max-height:20em;overflow-x:hidden;overflow-y:scroll;font-size:80%}#webmentions h2{font-size:medium;margin:0;padding:2px}#webmentions .reacts img{margin:3px -1ex 1px 0;display:inline}#webmentions img.missing{background:#fff;border:dashed #000 1px}#webmentions ul{list-style-type:none;margin:0;padding:4px}#webmentions li{text-indent:-1em;padding-left:1em}#webmentions a.reaction{position:relative;text-decoration:none;text-shadow:0 0 3px #fff;margin-right:0;letter-spacing:-1ex;margin-right:1ex}#webmentions a.reaction img{max-height:1.3em;display:inline;width:auto;margin-right:-1ex;border-radius:25%}#webmentions a.reaction sub{font-size:50%}#webmentions .comments li{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}#webmentions .comments li .text{color:#555;font-style:italic;text-decoration:none;text-wrap:wrap;padding-left:.5em}#webmentions .comments li .name{color:#111;padding-left:.5em}#webmentions .comments li .emoji{display:none} \ No newline at end of file diff --git a/templates/partials/webmentions.html b/templates/partials/webmentions.html index 453ee76bf..5d4d68bb1 100644 --- a/templates/partials/webmentions.html +++ b/templates/partials/webmentions.html @@ -4,7 +4,6 @@ 3. Add and configure the javascript to fetch and display the webmentions collected at webmention.io. #} - {# Calculate the configured data for the script, if any #} From 51f36844f0428fc2f1cc4751d091b534c552b737 Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Tue, 11 Feb 2025 13:01:39 +0000 Subject: [PATCH 10/21] =?UTF-8?q?=F0=9F=93=9D=20docs(blog):=20remove=20dup?= =?UTF-8?q?licate=20updated=20date=20in=20blog=20metadata?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - delete repeated updated date entry from the blog post metadata --- content/blog/mastering-tabi-settings/index.md | 1 - 1 file changed, 1 deletion(-) diff --git a/content/blog/mastering-tabi-settings/index.md b/content/blog/mastering-tabi-settings/index.md index 6e5995959..1fdb47a61 100644 --- a/content/blog/mastering-tabi-settings/index.md +++ b/content/blog/mastering-tabi-settings/index.md @@ -2,7 +2,6 @@ title = "Mastering tabi Settings: A Comprehensive Guide" date = 2023-09-18 updated = 2025-02-11 -updated = 2025-02-11 description = "Discover the many ways you can customise your tabi site." [taxonomies] From 1509eff3297d7af3a924fe47d752ed1b20f34468 Mon Sep 17 00:00:00 2001 From: Jeremiah Russell <47631109+jerusdp@users.noreply.github.com> Date: Tue, 11 Feb 2025 22:30:28 +0000 Subject: [PATCH 11/21] Update theme.toml comment out page_url --- theme.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theme.toml b/theme.toml index 417323f80..d3a3459d8 100644 --- a/theme.toml +++ b/theme.toml @@ -332,7 +332,7 @@ custom_subset = true # data configuration for the webmention.min.js script # The base URL to use for this page. Defaults to window.location -page_url = "https://beesbuzz.biz/code/439-Falsehoods-programmers-believe-about-email" +# page_url = "https://beesbuzz.biz/code/439-Falsehoods-programmers-believe-about-email" # Additional URLs to check, separated by |s # add_urls From 4f6b64129a1d507ca3ae2c1d0bb5e09eb695c2cc Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Tue, 11 Feb 2025 22:36:50 +0000 Subject: [PATCH 12/21] =?UTF-8?q?=F0=9F=92=84=20style(theme):=20comment=20?= =?UTF-8?q?out=20page=5Furl=20setting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - comment out page_url to prevent its usage and rely on default behavior --- theme.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theme.toml b/theme.toml index 417323f80..d3a3459d8 100644 --- a/theme.toml +++ b/theme.toml @@ -332,7 +332,7 @@ custom_subset = true # data configuration for the webmention.min.js script # The base URL to use for this page. Defaults to window.location -page_url = "https://beesbuzz.biz/code/439-Falsehoods-programmers-believe-about-email" +# page_url = "https://beesbuzz.biz/code/439-Falsehoods-programmers-believe-about-email" # Additional URLs to check, separated by |s # add_urls From a663de6dacaa6010507beae661bf50545bac6269 Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Wed, 12 Feb 2025 13:01:04 +0000 Subject: [PATCH 13/21] =?UTF-8?q?=E2=9C=A8=20feat(csp):=20add=20webmention?= =?UTF-8?q?=20support=20to=20content=20security=20policy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - include webmention.io in connect-src when webmention system is enabled - ensure compatibility with webmention services by updating CSP directives --- templates/partials/content_security_policy.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/templates/partials/content_security_policy.html b/templates/partials/content_security_policy.html index ee9211cc2..187060d2e 100644 --- a/templates/partials/content_security_policy.html +++ b/templates/partials/content_security_policy.html @@ -54,6 +54,12 @@ {%- set script_src = script_src ~ " " ~ " cdn.jsdelivr.net" -%} {%- endif -%} + {#- Check if a webmention system is enabled to allow the necessary domains and directives -#} + {%- set webmention_enabled = config.extra.webmentions.enabled -%} + {%- if webmention_enabled -%} + {%- set connect_src = connect_src ~ " webmention.io" -%} + {%- endif -%} + {#- Append WebSocket for Zola serve mode -#} {%- if config.mode == "serve" -%} {%- set connect_src = connect_src ~ " ws:" -%} From afbf2aa2ff9df97e86366a16d5eb0ba1b8e9369d Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Wed, 12 Feb 2025 13:01:26 +0000 Subject: [PATCH 14/21] =?UTF-8?q?=F0=9F=90=9B=20fix(config):=20update=20we?= =?UTF-8?q?bmentions=20configuration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - change "enable" to "enabled" for correct configuration key - uncomment and set webmentions configurations for correct functionality ✨ feat(blog): add webmentions shortcode - insert webmentions shortcode in blog shortcode index for display 🐛 fix(theme): update webmentions configuration in theme - change "enable" to "enabled" for correct configuration key in theme - uncomment and set webmentions configurations for correct functionality --- config.toml | 7 +++---- content/blog/shortcodes/index.md | 2 ++ templates/partials/header.html | 2 +- theme.toml | 5 ++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/config.toml b/config.toml index 533c1c0ef..2172b2828 100644 --- a/config.toml +++ b/config.toml @@ -328,7 +328,6 @@ allowed_domains = [ { directive = "script-src", domains = ["'self'"] }, { directive = "style-src", domains = ["'self'"] }, { directive = "frame-src", domains = ["player.vimeo.com", "https://www.youtube-nocookie.com"] }, -# { directive = "connect-src", domains = [ "https://webmention.io"] }, ] # Enable the CSP directives configured (or default). @@ -365,9 +364,9 @@ service = "goatcounter" self_hosted_url = "https://tabi-stats.osc.garden" [extra.webmentions] -# enable = true +enabled = true # Specify the domain registered with webmention.io. -# domain = "www.example.com" +domain = "www.example.com" # The HTML ID for the object to fill in with the webmention data. # Defaults to "webmentions" @@ -381,7 +380,7 @@ page_url = "https://beesbuzz.biz/code/439-Falsehoods-programmers-believe-about-e # add_urls # The maximum number of words to render in reply mentions. -# wordcount = 20 +wordcount = 20 # The maximum number of mentions to retrieve. Defaults to 30. # max_webmentions diff --git a/content/blog/shortcodes/index.md b/content/blog/shortcodes/index.md index f65a9c51a..5d115a3e6 100644 --- a/content/blog/shortcodes/index.md +++ b/content/blog/shortcodes/index.md @@ -466,5 +466,7 @@ Add the shortcut on the page where you want to display the webmentions: {{/* webmentions() */}} ``` +{{ webmentions() }} + [1]: https://www.w3.org/TR/webmention/#abstract-p-1 [2]: https://webmention.io/ diff --git a/templates/partials/header.html b/templates/partials/header.html index f4c43f14a..f93de978c 100644 --- a/templates/partials/header.html +++ b/templates/partials/header.html @@ -154,7 +154,7 @@ {%- endif -%} {# Webmentions #} - {%- if config.extra.webmentions.enable -%} + {%- if config.extra.webmentions.enabled -%} {%- include "partials/webmentions.html" -%} {%- endif -%} diff --git a/theme.toml b/theme.toml index d3a3459d8..fdd3572c1 100644 --- a/theme.toml +++ b/theme.toml @@ -285,7 +285,6 @@ allowed_domains = [ { directive = "script-src", domains = ["'self'"] }, { directive = "style-src", domains = ["'self'"] }, { directive = "frame-src", domains = ["player.vimeo.com", "https://www.youtube-nocookie.com"] }, -# { directive = "connect-src", domains = [ "https://webmention.io"] }, ] # Enable the CSP directives configured (or default). @@ -322,7 +321,7 @@ custom_subset = true # self_hosted_url = "" [extra.webmentions] -# enable = true +# enabled = true # Specify the domain registered with webmention.io. # domain = "www.example.com" @@ -332,7 +331,7 @@ custom_subset = true # data configuration for the webmention.min.js script # The base URL to use for this page. Defaults to window.location -# page_url = "https://beesbuzz.biz/code/439-Falsehoods-programmers-believe-about-email" +# page_url = # Additional URLs to check, separated by |s # add_urls From 2bc1f64acc9c6922e78457bfad3b943d69990276 Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Wed, 12 Feb 2025 14:08:10 +0000 Subject: [PATCH 15/21] =?UTF-8?q?=F0=9F=93=9D=20docs(blog):=20update=20web?= =?UTF-8?q?mentions=20configuration=20details?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - adjust heading level for webmentions section - simplify webmentions configuration instructions - remove redundant CSP directive explanation 🐛 fix(blog): correct webmentions enabled parameter - change "enable" to "enabled" in config.toml example --- content/blog/mastering-tabi-settings/index.md | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/content/blog/mastering-tabi-settings/index.md b/content/blog/mastering-tabi-settings/index.md index 1fdb47a61..f582f77e0 100644 --- a/content/blog/mastering-tabi-settings/index.md +++ b/content/blog/mastering-tabi-settings/index.md @@ -1,7 +1,7 @@ +++ title = "Mastering tabi Settings: A Comprehensive Guide" date = 2023-09-18 -updated = 2025-02-11 +updated = 2025-02-12 description = "Discover the many ways you can customise your tabi site." [taxonomies] @@ -767,22 +767,15 @@ If you have enabled a system globally, but want to disable it on a specific page Read [the docs](@/blog/comments/index.md) for more information on the available systems and their setup. -## Webmentions +### Webmentions As described by the recommended W3C standard [Webmention][1] is a simple way to notify any URL when you mention it on your site. From the receiver's perspective, it's a way to request notifications when other sites mention it. For static sites [webmention.io][2] hosts a webmention endpoint that can be used to receive webmentions. This feature fetches the webmentions stored at webmention.io and displays them for a page. You will need to have setup an account for your website at webmention.io. When you enable the webmention feature it will advertise your webmention.io endpoint and display the webmentions for any post using the webmention shortcut. -### Configuration and Usage - -Enable webmentions for your site by adding the following to your `config.toml` file. A directive for CSP is required to allow the webmention.io endpoint to be used. - -```toml -[extra] -allowed_domains = [ - { directive = "connect-src", domains = [ "https://webmention.io"] }, -] +Enable webmentions for your site by adding the following to your `config.toml` file. +``` [extra.webmentions] enable = true # Specify the domain registered with webmention.io. From e83cef72ebbd87c6d3965d3d200ee0a567102d66 Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Wed, 12 Feb 2025 14:08:30 +0000 Subject: [PATCH 16/21] =?UTF-8?q?=F0=9F=90=9B=20fix(blog):=20correct=20web?= =?UTF-8?q?mention=20config=20typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fix typo in config.toml example from 'enable' to 'enabled' to ensure proper functionality --- content/blog/shortcodes/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/blog/shortcodes/index.md b/content/blog/shortcodes/index.md index 5d115a3e6..9cbfbac7d 100644 --- a/content/blog/shortcodes/index.md +++ b/content/blog/shortcodes/index.md @@ -1,7 +1,7 @@ +++ title = "Custom shortcodes" date = 2023-02-19 -updated = 2025-02-11 +updated = 2025-02-12 description = "This theme includes some useful custom shortcodes that you can use to enhance your posts. Whether you want to display images that adapt to light and dark themes, or format a professional-looking reference section, these custom shortcodes have got you covered." [taxonomies] @@ -455,7 +455,7 @@ Enable webmentions for your site, add the following to your `config.toml` file: ```toml [extra.webmentions] -enable = true +enabled = true # Specify the domain registered with webmention.io. domain = "www.example.com" ``` From f18207b995832b6b52a5d6d0925b580e3653a824 Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Thu, 13 Feb 2025 07:45:26 +0000 Subject: [PATCH 17/21] =?UTF-8?q?=F0=9F=93=9D=20docs(config):=20fix=20typo?= =?UTF-8?q?=20in=20config=20documentation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - correct spelling of "whether" in search index format description --- config.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.toml b/config.toml index 2172b2828..3e6945837 100644 --- a/config.toml +++ b/config.toml @@ -28,7 +28,7 @@ include_content = true # At which character to truncate the content to. Useful if you have a lot of pages and the index would # become too big to load on the site. Defaults to not being set. # truncate_content_length = 100 -# Wether to produce the search index as a javascript file or as a JSON file. +# Whether to produce the search index as a javascript file or as a JSON file. # Accepted value "elasticlunr_javascript" or "elasticlunr_json". index_format = "elasticlunr_json" From 108dfcd5a35a67fbc0ce672572ed3f3ef25a53c7 Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Thu, 20 Feb 2025 12:53:08 +0000 Subject: [PATCH 18/21] =?UTF-8?q?=F0=9F=94=A7=20chore(config):=20update=20?= =?UTF-8?q?page=5Furl=20in=20config.toml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - change page_url to point to the new blog update and release page - ensure the configuration reflects the latest URL for webmention script usage --- config.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.toml b/config.toml index 2172b2828..16e127dde 100644 --- a/config.toml +++ b/config.toml @@ -374,7 +374,7 @@ domain = "www.example.com" # data configuration for the webmention.min.js script # The base URL to use for this page. Defaults to window.location -page_url = "https://beesbuzz.biz/code/439-Falsehoods-programmers-believe-about-email" +page_url = "https://www.jrussell.ie/blog/update-and-release/10-update-and-release/" # Additional URLs to check, separated by |s # add_urls From c9036897ff7c0db6cdcd74891b95c0c217025652 Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Thu, 20 Feb 2025 12:54:15 +0000 Subject: [PATCH 19/21] =?UTF-8?q?=E2=9C=A8=20feat(blog):=20add=20webmentio?= =?UTF-8?q?n=20images=20and=20section=20enhancements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - add webmention_dark.webp and webmention_light.webp for dual theme support - update webmentions section with an anchor and image display code --- .../img/webmention_dark.webp | Bin 0 -> 12750 bytes .../img/webmention_light.webp | Bin 0 -> 13248 bytes content/blog/mastering-tabi-settings/index.md | 8 ++++++-- 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 content/blog/mastering-tabi-settings/img/webmention_dark.webp create mode 100644 content/blog/mastering-tabi-settings/img/webmention_light.webp diff --git a/content/blog/mastering-tabi-settings/img/webmention_dark.webp b/content/blog/mastering-tabi-settings/img/webmention_dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..7bd602509fa3495e1b6a824ad3844727c6a7c79e GIT binary patch literal 12750 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 LZ#rI>PnZ7!uH(;r literal 0 HcmV?d00001 diff --git a/content/blog/mastering-tabi-settings/img/webmention_light.webp b/content/blog/mastering-tabi-settings/img/webmention_light.webp new file mode 100644 index 0000000000000000000000000000000000000000..b19a3443b3329e4d08706932ffbe4c88036f61ec GIT binary patch literal 13248 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 E0NfW78vp Date: Thu, 20 Feb 2025 12:54:23 +0000 Subject: [PATCH 20/21] =?UTF-8?q?=F0=9F=93=9D=20docs(shortcodes):=20add=20?= =?UTF-8?q?example=20for=20webmentions=20section?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - include dual theme image example for webmentions - provide live example based on page_url configuration --- content/blog/shortcodes/index.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/content/blog/shortcodes/index.md b/content/blog/shortcodes/index.md index 9cbfbac7d..edffc3e9f 100644 --- a/content/blog/shortcodes/index.md +++ b/content/blog/shortcodes/index.md @@ -1,7 +1,7 @@ +++ title = "Custom shortcodes" date = 2023-02-19 -updated = 2025-02-12 +updated = 2025-02-19 description = "This theme includes some useful custom shortcodes that you can use to enhance your posts. Whether you want to display images that adapt to light and dark themes, or format a professional-looking reference section, these custom shortcodes have got you covered." [taxonomies] @@ -466,6 +466,12 @@ Add the shortcut on the page where you want to display the webmentions: {{/* webmentions() */}} ``` +The webmentions section will then be displayed where you added it on the page as follows: + +{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/webmention_light.webp", dark_src="blog/mastering-tabi-settings/img/webmention_dark.webp" alt="Page footer, showing a 'Site source' link") }} + +The following is a live example based on the specific page_url configured in the template config.toml. + {{ webmentions() }} [1]: https://www.w3.org/TR/webmention/#abstract-p-1 From ba4d3b849c11728118c2a96f2a0caeda545f7f2a Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Thu, 20 Feb 2025 16:48:25 +0000 Subject: [PATCH 21/21] =?UTF-8?q?=F0=9F=8C=90=20i18n(html):=20add=20microf?= =?UTF-8?q?ormats2=20classes=20for=20semantic=20markup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - introduce h-entry, p-name, u-url, u-uid, p-author, dt-published, p-category, dt-updated, and e-content classes - enhance HTML with semantic and machine-readable attributes for better accessibility and SEO --- templates/page.html | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/templates/page.html b/templates/page.html index c20e93035..fe9b158eb 100644 --- a/templates/page.html +++ b/templates/page.html @@ -106,10 +106,11 @@ {# End debugging #}
-
-

+
+

{{ page.title }}

+
    {#- Draft indicator -#} @@ -137,7 +138,7 @@

    {%- endif -%} {%- set by_author = macros_translate::translate(key="by_author", default="By $AUTHOR", language_strings=language_strings) -%} -
  • {{ by_author | replace(from="$AUTHOR", to=author_string) }}
  • +
  • {{ by_author | replace(from="$AUTHOR", to=author_string) }}
  • {%- set previous_visible = true -%} {% endif %} @@ -145,7 +146,7 @@

    {#- Date -#} {% if page.date and macros_settings::evaluate_setting_priority(setting="show_date", page=page, default_global_value=true) == "true" %} -
  • {%- if previous_visible -%}{{ separator_with_class | safe }}{%- endif -%}{{ macros_format_date::format_date(date=page.date, short=true, language_strings=language_strings) }}
  • +
  • {%- if previous_visible -%}{{ separator_with_class | safe }}{%- endif -%}{{ macros_format_date::format_date(date=page.date, short=true, language_strings=language_strings) }}
  • {#- Variable to keep track of whether we've shown a section, to avoid separators as the first element -#} {%- set previous_visible = true -%} {% endif %} @@ -160,7 +161,7 @@

    {%- if page.taxonomies and page.taxonomies.tags -%}
  • {%- if previous_visible -%}{{ separator_with_class | safe }}{%- endif -%}{{- macros_translate::translate(key="tags", default="tags", language_strings=language_strings) | capitalize -}}: 
  • {%- for tag in page.taxonomies.tags -%} -
  • {{ tag }} +
  • {{ tag }} {%- if not loop.last -%} ,  {%- endif -%} @@ -175,7 +176,7 @@

    {%- set formatted_date = macros_format_date::format_date(date=page.updated, short=true, language_strings=language_strings) -%} {%- set updated_str = last_updated_str | replace(from="$DATE", to=formatted_date) -%} {%- set previous_visible = true -%} -

  • {{ updated_str }}
  • +
  • {{ updated_str }}
  • {#- Show link to remote changes if enabled -#} {%- if config.extra.remote_repository_url and macros_settings::evaluate_setting_priority(setting="show_remote_changes", page=page, default_global_value=true) == "true" -%}
  • {%- if previous_visible -%}{{ separator_with_class | safe }}{%- endif -%}{{ macros_translate::translate(key="see_changes", default="See changes", language_strings=language_strings) }} 
  • @@ -227,7 +228,13 @@

    {{ macros_toc::toc(page=page, header=true, language_strings=language_strings) }} {% endif %} -
    + {#- Optional Summary paragraph for readers -#} + {% if page.description %} + + {%- endif -%} + + +
    {#- Replace series_intro placeholder -#} {%- set content_with_intro = page.content -%} {%- if "" in page.content -%}