mirror of
https://github.com/welpo/tabi.git
synced 2025-10-11 07:46:15 +02:00
Compare commits
54 commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
e1860ad1a0 | ||
![]() |
e8dcd0528e | ||
![]() |
13f88a8e86 | ||
![]() |
ea53c823cf | ||
f0e804b4ff | |||
![]() |
e33c1cc00d | ||
![]() |
83b0a5d011 | ||
![]() |
57277a0f23 | ||
![]() |
c36d868b55 | ||
![]() |
479fd96e50 | ||
![]() |
a7a0c05100 | ||
![]() |
a21edd31d5 | ||
![]() |
7e12f9acf3 | ||
![]() |
515fd078a5 | ||
![]() |
2064beae78 | ||
![]() |
3a40ae5a83 | ||
![]() |
daa8b1a412 | ||
![]() |
79b5dcf9a7 | ||
![]() |
0639c0c397 | ||
![]() |
9f5f307444 | ||
![]() |
9b7a45db53 | ||
![]() |
36adac03a4 | ||
![]() |
bda9f22f79 | ||
![]() |
d241fc1fda | ||
![]() |
0f8733b91a | ||
![]() |
0dfd434ce2 | ||
![]() |
2499387693 | ||
![]() |
9b115904d7 | ||
![]() |
23a1baf96c | ||
![]() |
2e29782279 | ||
![]() |
7321fc5a43 | ||
![]() |
c325267bd1 | ||
![]() |
84c67ab2b2 | ||
![]() |
979f347fb0 | ||
![]() |
5c1e4acbb1 | ||
![]() |
68c35b02f8 | ||
![]() |
5f28b0e87e | ||
![]() |
c4f39d7643 | ||
![]() |
93af295d78 | ||
![]() |
f47cefd42b | ||
![]() |
221e245671 | ||
![]() |
b9b76799eb | ||
![]() |
2d68b40e14 | ||
![]() |
3d2c3a14b8 | ||
![]() |
94af15b6e8 | ||
![]() |
a384ac80c8 | ||
![]() |
cc39652eb5 | ||
![]() |
c7bc652618 | ||
![]() |
a59310a6b2 | ||
![]() |
8678c477bf | ||
![]() |
e11186a844 | ||
![]() |
88ebde9b24 | ||
![]() |
f25dfe3429 | ||
![]() |
bf1d05e092 |
111 changed files with 3524 additions and 930 deletions
2
.github/workflows/cd.yml
vendored
2
.github/workflows/cd.yml
vendored
|
@ -13,7 +13,7 @@ jobs:
|
||||||
contents: write
|
contents: write
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
|
|
10
.github/workflows/ci.yml
vendored
10
.github/workflows/ci.yml
vendored
|
@ -15,15 +15,15 @@ jobs:
|
||||||
if: github.event_name == 'pull_request'
|
if: github.event_name == 'pull_request'
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Code
|
- name: Checkout Code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Zola Build
|
- name: Zola Build
|
||||||
uses: shalzz/zola-deploy-action@v0.20.0
|
uses: shalzz/zola-deploy-action@v0.21.0
|
||||||
env:
|
env:
|
||||||
BUILD_ONLY: true
|
BUILD_ONLY: true
|
||||||
|
|
||||||
- name: Zola Check
|
- name: Zola Check
|
||||||
uses: shalzz/zola-deploy-action@v0.20.0
|
uses: shalzz/zola-deploy-action@v0.21.0
|
||||||
env:
|
env:
|
||||||
BUILD_ONLY: true
|
BUILD_ONLY: true
|
||||||
CHECK_LINKS: true
|
CHECK_LINKS: true
|
||||||
|
@ -34,10 +34,10 @@ jobs:
|
||||||
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Code
|
- name: Checkout Code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Build and Deploy
|
- name: Build and Deploy
|
||||||
uses: shalzz/zola-deploy-action@v0.20.0
|
uses: shalzz/zola-deploy-action@v0.21.0
|
||||||
env:
|
env:
|
||||||
PAGES_BRANCH: gh-pages
|
PAGES_BRANCH: gh-pages
|
||||||
TOKEN: ${{ secrets.TOKEN }}
|
TOKEN: ${{ secrets.TOKEN }}
|
||||||
|
|
2
.github/workflows/upgrade-deps.yml
vendored
2
.github/workflows/upgrade-deps.yml
vendored
|
@ -25,7 +25,7 @@ jobs:
|
||||||
dependency: ${{ github.event_name == 'schedule' && fromJson('["mermaid", "katex"]') || fromJson(format('["{0}"]', github.event.inputs.dependency)) }}
|
dependency: ${{ github.event_name == 'schedule' && fromJson('["mermaid", "katex"]') || fromJson(format('["{0}"]', github.event.inputs.dependency)) }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
|
|
67
CHANGELOG.md
67
CHANGELOG.md
|
@ -4,6 +4,67 @@ Welcome to the changelog for tabi. This document aims to provide a comprehensive
|
||||||
|
|
||||||
We use Semantic Versioning (SemVer) for our version numbers, formatted as MAJOR.MINOR.PATCH. Major version changes involve significant (breaking) changes, minor versions introduce features and improvements in a backward compatible manner, and patch versions are for bug fixes and minor tweaks.
|
We use Semantic Versioning (SemVer) for our version numbers, formatted as MAJOR.MINOR.PATCH. Major version changes involve significant (breaking) changes, minor versions introduce features and improvements in a backward compatible manner, and patch versions are for bug fixes and minor tweaks.
|
||||||
|
|
||||||
|
## [4.1.0](https://github.com/welpo/tabi/compare/v4.0.0..v4.1.0) - 2025-06-14
|
||||||
|
|
||||||
|
### ✨ Features
|
||||||
|
|
||||||
|
- *(feed)* Add feed icon tag pages ([#522](https://github.com/welpo/tabi/issues/522)) by [@tzinm](https://github.com/tzinm) and [@welpo](https://github.com/welpo)
|
||||||
|
- *(i18n)* Add Finnish language ([#505](https://github.com/welpo/tabi/issues/505)) by [@axelkar](https://github.com/axelkar) and [@welpo](https://github.com/welpo)
|
||||||
|
- *(indieweb)* Add hidden h-card ([#506](https://github.com/welpo/tabi/issues/506)) by [@mmai](https://github.com/mmai) and [@welpo](https://github.com/welpo)
|
||||||
|
- *(socials)* Add itch.io icon ([#520](https://github.com/welpo/tabi/issues/520)) by [@mystal](https://github.com/mystal)
|
||||||
|
- *(webmentions)* Add hcard in post page ([#524](https://github.com/welpo/tabi/issues/524)) by [@mmai](https://github.com/mmai) and [@welpo](https://github.com/welpo)
|
||||||
|
- Add support for webmentions ([#485](https://github.com/welpo/tabi/issues/485)) by [@gortavoher](https://github.com/gortavoher), [@Jeremiah](https://github.com/Jeremiah) Russell, [@Henri](https://github.com/Henri) Bourcereau and [@welpo](https://github.com/welpo)
|
||||||
|
- Extend tabi `<head>` and `<body>` elements ([#528](https://github.com/welpo/tabi/issues/528)) by [@axis7818](https://github.com/axis7818) and [@welpo](https://github.com/welpo)
|
||||||
|
- Parse markdown in post summary & description ([#517](https://github.com/welpo/tabi/issues/517)) by [@rktjump](https://github.com/rktjump) and [@welpo](https://github.com/welpo)
|
||||||
|
- Cache bust images in shortcodes ([#504](https://github.com/welpo/tabi/issues/504)) by [@axelkar](https://github.com/axelkar)
|
||||||
|
|
||||||
|
### 🐛 Bug fixes
|
||||||
|
|
||||||
|
- *(feed)* Prioritise description > summary ([#525](https://github.com/welpo/tabi/issues/525)) by [@tzinm](https://github.com/tzinm)
|
||||||
|
- Render author HTML on page metadata ([7321fc5](https://github.com/welpo/tabi/commit/7321fc5a43fa50dc24c9fa87714612a2295b904a)) by [@welpo](https://github.com/welpo)
|
||||||
|
- Allow feed icon to be hidden ([#533](https://github.com/welpo/tabi/issues/533)) by [@bajacc](https://github.com/bajacc)
|
||||||
|
- Fix hcard html tags ([#508](https://github.com/welpo/tabi/issues/508)) by [@mmai](https://github.com/mmai)
|
||||||
|
- Fix external link icon breaking word wrapping ([#498](https://github.com/welpo/tabi/issues/498)) by [@welpo](https://github.com/welpo)
|
||||||
|
- Fix padding hover on links with code (custom font) ([#494](https://github.com/welpo/tabi/issues/494)) by [@clement-escolano](https://github.com/clement-escolano)
|
||||||
|
|
||||||
|
### 💄 Styling
|
||||||
|
|
||||||
|
- Remove extra spacing after author ([2e29782](https://github.com/welpo/tabi/commit/2e29782279d8154cb9c6f1df9a2401612ec77948)) by [@welpo](https://github.com/welpo)
|
||||||
|
|
||||||
|
### ♻️ Refactor
|
||||||
|
|
||||||
|
- Add "target_attribute" macro ([#515](https://github.com/welpo/tabi/issues/515)) by [@tzinm](https://github.com/tzinm) and @Óscar
|
||||||
|
- Improve error message when title is unset ([a384ac8](https://github.com/welpo/tabi/commit/a384ac80c8e6b8be46d4a335930fba697a523af9)) by [@welpo](https://github.com/welpo)
|
||||||
|
|
||||||
|
### 🔧 Miscellaneous tasks
|
||||||
|
|
||||||
|
- *(CI)* Fix Mermaid version detection ([e11186a](https://github.com/welpo/tabi/commit/e11186a8448f94494b350402f76a2cc5e5a98a97)) by [@welpo](https://github.com/welpo)
|
||||||
|
- *(README)* Add b1n.io to 'sites using tabi' ([#531](https://github.com/welpo/tabi/issues/531)) by [@b1nhack](https://github.com/b1nhack)
|
||||||
|
- *(README)* Fix broken link tag ([#516](https://github.com/welpo/tabi/issues/516)) by [@Olexandr88](https://github.com/Olexandr88)
|
||||||
|
- *(README)* Add tzinm's blog to 'sites using tabi' ([#496](https://github.com/welpo/tabi/issues/496)) by [@tzinm](https://github.com/tzinm)
|
||||||
|
|
||||||
|
### 👥 New contributors
|
||||||
|
|
||||||
|
🫶 [@gortavoher](https://github.com/gortavoher) made their first contribution in [#485](https://github.com/welpo/tabi/pull/485)
|
||||||
|
|
||||||
|
🫶 [@bajacc](https://github.com/bajacc) made their first contribution in [#533](https://github.com/welpo/tabi/pull/533)
|
||||||
|
|
||||||
|
🫶 [@axis7818](https://github.com/axis7818) made their first contribution in [#528](https://github.com/welpo/tabi/pull/528)
|
||||||
|
|
||||||
|
🫶 [@b1nhack](https://github.com/b1nhack) made their first contribution in [#531](https://github.com/welpo/tabi/pull/531)
|
||||||
|
|
||||||
|
🫶 [@tzinm](https://github.com/tzinm) made their first contribution in [#525](https://github.com/welpo/tabi/pull/525)
|
||||||
|
|
||||||
|
🫶 [@mmai](https://github.com/mmai) made their first contribution in [#524](https://github.com/welpo/tabi/pull/524)
|
||||||
|
|
||||||
|
🫶 [@rktjump](https://github.com/rktjump) made their first contribution in [#517](https://github.com/welpo/tabi/pull/517)
|
||||||
|
|
||||||
|
🫶 [@mystal](https://github.com/mystal) made their first contribution in [#520](https://github.com/welpo/tabi/pull/520)
|
||||||
|
|
||||||
|
🫶 [@axelkar](https://github.com/axelkar) made their first contribution in [#504](https://github.com/welpo/tabi/pull/504)
|
||||||
|
|
||||||
|
🫶 [@clement-escolano](https://github.com/clement-escolano) made their first contribution in [#494](https://github.com/welpo/tabi/pull/494)
|
||||||
|
|
||||||
## [4.0.0](https://github.com/welpo/tabi/compare/v3.1.0..v4.0.0) - 2025-02-16
|
## [4.0.0](https://github.com/welpo/tabi/compare/v3.1.0..v4.0.0) - 2025-02-16
|
||||||
|
|
||||||
### 💥 BREAKING CHANGES 💥
|
### 💥 BREAKING CHANGES 💥
|
||||||
|
@ -206,6 +267,8 @@ We use Semantic Versioning (SemVer) for our version numbers, formatted as MAJOR.
|
||||||
|
|
||||||
🫶 [@jmbhughes](https://github.com/jmbhughes) made their first contribution in [#404](https://github.com/welpo/tabi/pull/404)
|
🫶 [@jmbhughes](https://github.com/jmbhughes) made their first contribution in [#404](https://github.com/welpo/tabi/pull/404)
|
||||||
|
|
||||||
|
🫶 [@soumendrak](https://github.com/soumendrak) made their first contribution in [#402](https://github.com/welpo/tabi/pull/402)
|
||||||
|
|
||||||
## [2.16.0](https://github.com/welpo/tabi/compare/v2.15.0..v2.16.0) - 2024-09-22
|
## [2.16.0](https://github.com/welpo/tabi/compare/v2.15.0..v2.16.0) - 2024-09-22
|
||||||
|
|
||||||
### ✨ Features
|
### ✨ Features
|
||||||
|
@ -245,7 +308,7 @@ We use Semantic Versioning (SemVer) for our version numbers, formatted as MAJOR.
|
||||||
|
|
||||||
### ✨ Features
|
### ✨ Features
|
||||||
|
|
||||||
- *(i18n)* Add Odia language ([#372](https://github.com/welpo/tabi/issues/372)) by [@soumendrak](https://github.com/soumendrak)
|
- *(i18n)* Add Odia language ([#372](https://github.com/welpo/tabi/issues/372))
|
||||||
- *(i18n)* Add Estonian language ([#365](https://github.com/welpo/tabi/issues/365)) by [@NippleOfAnApe](https://github.com/NippleOfAnApe)
|
- *(i18n)* Add Estonian language ([#365](https://github.com/welpo/tabi/issues/365)) by [@NippleOfAnApe](https://github.com/NippleOfAnApe)
|
||||||
- Add Mermaid diagram support ([#370](https://github.com/welpo/tabi/issues/370)) by [@welpo](https://github.com/welpo)
|
- Add Mermaid diagram support ([#370](https://github.com/welpo/tabi/issues/370)) by [@welpo](https://github.com/welpo)
|
||||||
|
|
||||||
|
@ -276,7 +339,7 @@ We use Semantic Versioning (SemVer) for our version numbers, formatted as MAJOR.
|
||||||
|
|
||||||
### 👥 New contributors
|
### 👥 New contributors
|
||||||
|
|
||||||
🫶 [@soumendrak](https://github.com/soumendrak) made their first contribution in [#372](https://github.com/welpo/tabi/pull/372)
|
🫶 @ made their first contribution in [#372](https://github.com/welpo/tabi/pull/372)
|
||||||
|
|
||||||
🫶 [@DataTriny](https://github.com/DataTriny) made their first contribution in [#367](https://github.com/welpo/tabi/pull/367)
|
🫶 [@DataTriny](https://github.com/DataTriny) made their first contribution in [#367](https://github.com/welpo/tabi/pull/367)
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
<img src="https://img.shields.io/github/contributors/welpo/tabi?style=flat-square&labelColor=202b2d&color=087e96" alt="Contributors"></a>
|
<img src="https://img.shields.io/github/contributors/welpo/tabi?style=flat-square&labelColor=202b2d&color=087e96" alt="Contributors"></a>
|
||||||
<a href="https://github.com/welpo/tabi/forks">
|
<a href="https://github.com/welpo/tabi/forks">
|
||||||
<img src="https://img.shields.io/github/forks/welpo/tabi?style=flat-square&labelColor=202b2d&color=087e96" alt="Forks"></a>
|
<img src="https://img.shields.io/github/forks/welpo/tabi?style=flat-square&labelColor=202b2d&color=087e96" alt="Forks"></a>
|
||||||
<a hfref="https://github.com/welpo/tabi/commits/main/">
|
<a href="https://github.com/welpo/tabi/commits/main/">
|
||||||
<img src="https://img.shields.io/github/last-commit/welpo/tabi?style=flat-square&labelColor=202b2d&color=087e96" alt="Last commit"></a>
|
<img src="https://img.shields.io/github/last-commit/welpo/tabi?style=flat-square&labelColor=202b2d&color=087e96" alt="Last commit"></a>
|
||||||
<br>
|
<br>
|
||||||
<a href="https://github.com/welpo/tabi/releases">
|
<a href="https://github.com/welpo/tabi/releases">
|
||||||
|
@ -51,10 +51,12 @@ tabi has a perfect score on Google's Lighthouse audit:
|
||||||
- [X] Perfect Lighthouse score (Performance, Accessibility, Best Practices and SEO).
|
- [X] Perfect Lighthouse score (Performance, Accessibility, Best Practices and SEO).
|
||||||
- [X] [Comprehensive multi-language support](https://welpo.github.io/tabi/blog/faq-languages/#how-does-tabi-handle-multilingual-support). Add as many languages as you wish.
|
- [X] [Comprehensive multi-language support](https://welpo.github.io/tabi/blog/faq-languages/#how-does-tabi-handle-multilingual-support). Add as many languages as you wish.
|
||||||
- [X] Support for [comments using giscus, utterances, Hyvor Talk, or Isso](https://welpo.github.io/tabi/blog/comments/).
|
- [X] Support for [comments using giscus, utterances, Hyvor Talk, or Isso](https://welpo.github.io/tabi/blog/comments/).
|
||||||
|
- [X] [Indieweb](https://indieweb.org/) ready with microformats, [hcard](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#representative-h-card) and [webmentions](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#webmentions) support.
|
||||||
- [X] Code syntax highlighting with colours based on [Catppuccin](https://github.com/catppuccin/catppuccin) Frappé.
|
- [X] Code syntax highlighting with colours based on [Catppuccin](https://github.com/catppuccin/catppuccin) Frappé.
|
||||||
- [X] [Mermaid support](https://welpo.github.io/tabi/blog/shortcodes/#mermaid-diagrams) to create diagrams and charts with text.
|
- [X] [Mermaid support](https://welpo.github.io/tabi/blog/shortcodes/#mermaid-diagrams) to create diagrams and charts with text.
|
||||||
- [X] [Local search](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#search) with an accessible, multi-lingual interface.
|
- [X] [Local search](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#search) with an accessible, multi-lingual interface.
|
||||||
- [X] [Custom Twitter card](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#social-media-cards) and automatic Open Graph tags.
|
- [X] [Custom Twitter card](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#social-media-cards) and automatic Open Graph tags.
|
||||||
|
- [X] Anonymous [like buttons](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#iine) powered by [iine](https://iine.to).
|
||||||
- [X] [KaTeX](https://katex.org/) support for mathematical notation.
|
- [X] [KaTeX](https://katex.org/) support for mathematical notation.
|
||||||
- [X] [Stylized and human readable Atom feed](https://welpo.github.io/tabi/atom.xml).
|
- [X] [Stylized and human readable Atom feed](https://welpo.github.io/tabi/atom.xml).
|
||||||
- [X] [Stylized and human readable sitemap](https://welpo.github.io/tabi/sitemap.xml).
|
- [X] [Stylized and human readable sitemap](https://welpo.github.io/tabi/sitemap.xml).
|
||||||
|
@ -205,7 +207,6 @@ git pull
|
||||||
| Website | Creator | Description | Site Source |
|
| Website | Creator | Description | Site Source |
|
||||||
| - | - | - | - |
|
| - | - | - | - |
|
||||||
| [osc.garden](https://osc.garden) | Óscar Fernández ([welpo](https://github.com/welpo)) | Data science, psychology, and Zola | [Source](https://github.com/welpo/osc.garden) |
|
| [osc.garden](https://osc.garden) | Óscar Fernández ([welpo](https://github.com/welpo)) | Data science, psychology, and Zola | [Source](https://github.com/welpo/osc.garden) |
|
||||||
| [sandip.live](https://sandip.live) | Sandip G ([sandman](https://github.com/sandman)) | Startups, tech and the good life | [Source](https://github.com/sandman/sandman.github.io) |
|
|
||||||
| [seadve.github.io](https://seadve.github.io/) | Dave Patrick Caberto ([SeaDve](https://github.com/SeaDve/)) | Personal blog and portfolio with custom CSS | [Source](https://github.com/SeaDve/seadve.github.io) |
|
| [seadve.github.io](https://seadve.github.io/) | Dave Patrick Caberto ([SeaDve](https://github.com/SeaDve/)) | Personal blog and portfolio with custom CSS | [Source](https://github.com/SeaDve/seadve.github.io) |
|
||||||
| [mikufan.page](https://mikufan.page) | [Nadia](https://github.com/nyadiia) | Personal blog | [Source](https://github.com/nyadiia/mikufan.page) |
|
| [mikufan.page](https://mikufan.page) | [Nadia](https://github.com/nyadiia) | Personal blog | [Source](https://github.com/nyadiia/mikufan.page) |
|
||||||
| [tim-boettcher.online](https://tim-boettcher.online/) | [Tim Böttcher](https://codeberg.org/Tim-Boettcher/) | Insights and ramblings of a deafblind programmer | [Source](https://codeberg.org/Tim-Boettcher/tim-boettcher-online/) |
|
| [tim-boettcher.online](https://tim-boettcher.online/) | [Tim Böttcher](https://codeberg.org/Tim-Boettcher/) | Insights and ramblings of a deafblind programmer | [Source](https://codeberg.org/Tim-Boettcher/tim-boettcher-online/) |
|
||||||
|
@ -216,6 +217,9 @@ git pull
|
||||||
| [Nizzlay](https://nizzlay.com) | Niels Gouman ([Nizzlay](https://github.com/Nizzlay)) | Personal blog | [Source](https://github.com/Nizzlay/nizzlay.com) |
|
| [Nizzlay](https://nizzlay.com) | Niels Gouman ([Nizzlay](https://github.com/Nizzlay)) | Personal blog | [Source](https://github.com/Nizzlay/nizzlay.com) |
|
||||||
| [ZzMzaw's blog](https://zzmzaw.github.io/) | ZzMzaw ([ZzMzaw](https://github.com/ZzMzaw)) | Personal blog | [Source](https://github.com/ZzMzaw/zzmzaw.github.io) |
|
| [ZzMzaw's blog](https://zzmzaw.github.io/) | ZzMzaw ([ZzMzaw](https://github.com/ZzMzaw)) | Personal blog | [Source](https://github.com/ZzMzaw/zzmzaw.github.io) |
|
||||||
| [idle-ti.me](https://idle-ti.me/) | Jérôme Ramette ([be-next](https://github.com/be-next)) | Personal blog | [Source](https://github.com/be-next/idle-ti.me) |
|
| [idle-ti.me](https://idle-ti.me/) | Jérôme Ramette ([be-next](https://github.com/be-next)) | Personal blog | [Source](https://github.com/be-next/idle-ti.me) |
|
||||||
|
| [tzinm.me](https://tzinm.me/) | [Tzinm](https://github.com/tzinm) | Personal blog | [Source](https://codeberg.org/tzinm/blog) |
|
||||||
|
| [b1n.io](https://b1n.io) | [b1nhack](https://github.com/b1nhack) | Linux kernel vulnerability researcher | [Source](https://github.com/b1nhack/blog) |
|
||||||
|
| [posixlycorrect.com](https://posixlycorrect.com/) | [Fabian Montero](https://git.posixlycorrect.com/fabian) | Personal homepage | [Source](https://git.posixlycorrect.com/fabian/homepage) |
|
||||||
|
|
||||||
Using tabi? Feel free to create a PR and add your site to this list.
|
Using tabi? Feel free to create a PR and add your site to this list.
|
||||||
|
|
||||||
|
|
93
config.toml
93
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
|
# 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.
|
# become too big to load on the site. Defaults to not being set.
|
||||||
# truncate_content_length = 100
|
# 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".
|
# Accepted value "elasticlunr_javascript" or "elasticlunr_json".
|
||||||
index_format = "elasticlunr_json"
|
index_format = "elasticlunr_json"
|
||||||
|
|
||||||
|
@ -108,6 +108,9 @@ skin = ""
|
||||||
browser_theme_color = "#087e96"
|
browser_theme_color = "#087e96"
|
||||||
# browser_theme_color = ["#ffffff", "#000000"] # Example of light/dark colours.
|
# browser_theme_color = ["#ffffff", "#000000"] # Example of light/dark colours.
|
||||||
|
|
||||||
|
# For multilingual sites: show current language code on the language switcher.
|
||||||
|
show_selected_language_code_in_language_switcher = false
|
||||||
|
|
||||||
# List additional stylesheets to load site-wide.
|
# List additional stylesheets to load site-wide.
|
||||||
# These stylesheets should be located in your site's `static` directory.
|
# These stylesheets should be located in your site's `static` directory.
|
||||||
# Example: stylesheets = ["extra1.css", "path/extra2.css"]
|
# Example: stylesheets = ["extra1.css", "path/extra2.css"]
|
||||||
|
@ -166,6 +169,14 @@ show_date = true
|
||||||
# "both" - Show both the original date and the last updated date.
|
# "both" - Show both the original date and the last updated date.
|
||||||
post_listing_date = "date"
|
post_listing_date = "date"
|
||||||
|
|
||||||
|
# Enable iine like buttons on all posts: https://iine.to/
|
||||||
|
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
|
||||||
|
iine = true
|
||||||
|
iine_icon = "thumbs_up" # See https://iine.to/#customise
|
||||||
|
# Unify like counts across all language versions of the same page.
|
||||||
|
# When enabled, likes on /es/blog/hello/ will count towards /blog/hello/ (default language).
|
||||||
|
iine_unified_languages = true
|
||||||
|
|
||||||
# Show "Jump to posts" link next to series' title.
|
# Show "Jump to posts" link next to series' title.
|
||||||
# By default, the link appears automatically when a series description exceeds 2000 characters.
|
# By default, the link appears automatically when a series description exceeds 2000 characters.
|
||||||
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
|
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
|
||||||
|
@ -227,6 +238,17 @@ long_date_format = "%d %B %Y"
|
||||||
# Default is "6th July 2049" in English and "%-d %B %Y" in other languages.
|
# Default is "6th July 2049" in English and "%-d %B %Y" in other languages.
|
||||||
short_date_format = ""
|
short_date_format = ""
|
||||||
|
|
||||||
|
# Date format used for the archive page.
|
||||||
|
# Default is "06 July" in English and "%d %b" in other languages.
|
||||||
|
archive_date_format = ""
|
||||||
|
|
||||||
|
# Per-language date format overrides.
|
||||||
|
# Examples: Spanish uses "3 de febrero de 2024", German uses "3. Februar 2024"
|
||||||
|
date_formats = [
|
||||||
|
{ lang = "es", long = "%d de %B de %Y", short = "%-d %b %Y" },
|
||||||
|
{ lang = "de", long = "%d. %B %Y", short = "%d.%m.%Y", archive = "%d. %b" },
|
||||||
|
]
|
||||||
|
|
||||||
# Custom separator used in title tag and posts metadata (between date, time to read, and tags).
|
# Custom separator used in title tag and posts metadata (between date, time to read, and tags).
|
||||||
separator = "•"
|
separator = "•"
|
||||||
|
|
||||||
|
@ -372,6 +394,9 @@ service = "goatcounter"
|
||||||
# Leave this field empty if you're using the service's default hosting.
|
# Leave this field empty if you're using the service's default hosting.
|
||||||
self_hosted_url = "https://tabi-stats.osc.garden"
|
self_hosted_url = "https://tabi-stats.osc.garden"
|
||||||
|
|
||||||
|
# Optional: For Umami, enable this option to respect users' Do Not Track (DNT) settings. The default is true.
|
||||||
|
do_not_track = true
|
||||||
|
|
||||||
# giscus support for comments. https://giscus.app
|
# giscus support for comments. https://giscus.app
|
||||||
# Setup instructions: https://welpo.github.io/tabi/blog/comments/#setup
|
# Setup instructions: https://welpo.github.io/tabi/blog/comments/#setup
|
||||||
[extra.giscus]
|
[extra.giscus]
|
||||||
|
@ -427,3 +452,69 @@ avatar = true
|
||||||
voting = true
|
voting = true
|
||||||
page_author_hashes = "" # hash (or list of hashes) of the author.
|
page_author_hashes = "" # hash (or list of hashes) of the author.
|
||||||
lazy_loading = true # Loads when the comments are in the viewport (using the Intersection Observer API).
|
lazy_loading = true # Loads when the comments are in the viewport (using the Intersection Observer API).
|
||||||
|
|
||||||
|
[extra.webmentions]
|
||||||
|
# To disable for a specific section or page, set webmentions = false in that page/section's front matter's [extra] section.
|
||||||
|
enable = false
|
||||||
|
# Specify the domain registered with webmention.io.
|
||||||
|
domain = ""
|
||||||
|
|
||||||
|
# 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 =
|
||||||
|
|
||||||
|
# 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 = 30
|
||||||
|
|
||||||
|
# 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"
|
||||||
|
|
||||||
|
# h-card configuration
|
||||||
|
# Will identify you on the indieweb (see https://microformats.org/wiki/h-card)
|
||||||
|
[extra.hcard]
|
||||||
|
# Enable home page h-card.
|
||||||
|
# enable = true
|
||||||
|
# Add your email to the card if extra.email is set and not encoded.
|
||||||
|
# with_mail = true
|
||||||
|
# Add your social links ('socials' config) to the card.
|
||||||
|
# with_social_links = true
|
||||||
|
# Homepage url. Defaults to the value of 'base_url'.
|
||||||
|
# homepage = "https://myhomepage.net"
|
||||||
|
# avatar = "img/profile.webp"
|
||||||
|
# Display name, default to the value of 'author'.
|
||||||
|
# full_name = "John Doe"
|
||||||
|
# Small bio, as shown on social media profiles.
|
||||||
|
# biography = "Fond of the indieweb"
|
||||||
|
#
|
||||||
|
# You can add any property from https://microformats.org/wiki/h-card#Properties
|
||||||
|
# Make sure to replace all '-' characters by '_'
|
||||||
|
# Examples:
|
||||||
|
# p_nickname = "nickname"
|
||||||
|
# p_locality = "Bordeaux"
|
||||||
|
# p_country_name = "France"
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
+++
|
+++
|
||||||
title = "Lost in Translation? Explora les capacitats multilingües de tabi"
|
title = "Lost in Translation? Explora les capacitats multilingües de tabi"
|
||||||
date = 2023-09-12
|
date = 2023-09-12
|
||||||
updated = 2024-08-18
|
updated = 2025-09-14
|
||||||
description = "Descobreix com tabi t'ajuda a connectar amb una audiència global gràcies a les seves funcions multilingües. Aprèn a canviar la llengua per defecte, afegir més llengües i aportar les teves pròpies traduccions."
|
description = "Descobreix com tabi t'ajuda a connectar amb una audiència global gràcies a les seves funcions multilingües. Aprèn a canviar la llengua per defecte, afegir més llengües i aportar les teves pròpies traduccions."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
|
@ -30,6 +30,7 @@ tabi admet les següents llengües:
|
||||||
- Coreà
|
- Coreà
|
||||||
- Espanyol
|
- Espanyol
|
||||||
- Estonià
|
- Estonià
|
||||||
|
- Finès
|
||||||
- Francès
|
- Francès
|
||||||
- Hindi
|
- Hindi
|
||||||
- Italià
|
- Italià
|
||||||
|
@ -106,6 +107,19 @@ Per tant, si crees `i18n/ca.toml` al teu directori base, tabi llegirà les caden
|
||||||
|
|
||||||
Assegura't de copiar tot el fitxer per a aquest idioma primer, o el tema utilitzarà l'anglès per les claus que faltin.
|
Assegura't de copiar tot el fitxer per a aquest idioma primer, o el tema utilitzarà l'anglès per les claus que faltin.
|
||||||
|
|
||||||
|
## Com personalitzo els formats de data per a diferents idiomes?
|
||||||
|
|
||||||
|
Pots establir formats de data específics per idioma al teu `config.toml` utilitzant la matriu `date_formats`:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
date_formats = [
|
||||||
|
{ lang = "es", long = "%d de %B de %Y", short = "%-d %b %Y", archive = "%d de %b" },
|
||||||
|
{ lang = "de", long = "%d. %B %Y", short = "%d.%m.%Y", archive = "%d. %b" },
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
Això permet que cada idioma mostri les dates segons les convencions locals. Per exemple, l'espanyol mostrarà «3 de febrero de 2024» mentre que l'alemany mostrarà «3. Februar 2024». Si no es defineix un format específic per a un idioma, tabi utilitzarà la configuració global `long_date_format`, `short_date_format` i `archive_date_format`.
|
||||||
|
|
||||||
## Què passa si falta una traducció o està incompleta?
|
## Què passa si falta una traducció o està incompleta?
|
||||||
|
|
||||||
Si una cadena no es troba en el fitxer d'idioma, tabi utilitzarà a la cadena predeterminada en anglès.
|
Si una cadena no es troba en el fitxer d'idioma, tabi utilitzarà a la cadena predeterminada en anglès.
|
||||||
|
@ -133,3 +147,7 @@ Si ho vas fer, hauràs d'actualitzar manualment les traduccions. Pots fer-ho cop
|
||||||
## tabi tradueix el meu contingut?
|
## tabi tradueix el meu contingut?
|
||||||
|
|
||||||
No. tabi només tradueix les cadenes de text del tema. Hauràs de traduir el teu contingut tu mateix.
|
No. tabi només tradueix les cadenes de text del tema. Hauràs de traduir el teu contingut tu mateix.
|
||||||
|
|
||||||
|
## Com puc mostrar el codi de l'idioma actual al commutador d'idioma?
|
||||||
|
|
||||||
|
Afegeix `show_selected_language_code_in_language_switcher = true` a la secció `[extra]` del teu `config.toml`.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
+++
|
+++
|
||||||
title = "¿Lost in Translation? Explora las capacidades multilingües de tabi"
|
title = "¿Lost in Translation? Explora las capacidades multilingües de tabi"
|
||||||
date = 2023-09-12
|
date = 2023-09-12
|
||||||
updated = 2024-08-18
|
updated = 2025-09-14
|
||||||
description = "Descubre cómo tabi te ayuda a conectar con una audiencia global gracias a sus funciones multilingües. Aprende a cambiar el idioma por defecto, añadir más idiomas y aportar tus propias traducciones."
|
description = "Descubre cómo tabi te ayuda a conectar con una audiencia global gracias a sus funciones multilingües. Aprende a cambiar el idioma por defecto, añadir más idiomas y aportar tus propias traducciones."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
|
@ -30,6 +30,7 @@ tabi admite los siguientes idiomas:
|
||||||
- Coreano
|
- Coreano
|
||||||
- Español
|
- Español
|
||||||
- Estonio
|
- Estonio
|
||||||
|
- Finlandés
|
||||||
- Francés
|
- Francés
|
||||||
- Hindi
|
- Hindi
|
||||||
- Inglés
|
- Inglés
|
||||||
|
@ -106,6 +107,19 @@ Por lo tanto, si creas `i18n/en.toml` en tu directorio base, tabi leerá las cad
|
||||||
|
|
||||||
Asegúrate de copiar todo el archivo para ese idioma primero, o el tema usará el inglés para las claves faltantes.
|
Asegúrate de copiar todo el archivo para ese idioma primero, o el tema usará el inglés para las claves faltantes.
|
||||||
|
|
||||||
|
## ¿Cómo personalizo los formatos de fecha para diferentes idiomas?
|
||||||
|
|
||||||
|
Puedes establecer formatos de fecha específicos por idioma en tu `config.toml` usando la matriz `date_formats`:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
date_formats = [
|
||||||
|
{ lang = "es", long = "%d de %B de %Y", short = "%-d %b %Y", archive = "%d de %b" },
|
||||||
|
{ lang = "de", long = "%d. %B %Y", short = "%d.%m.%Y", archive = "%d. %b" },
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
Esto permite que cada idioma muestre las fechas según las convenciones locales. Por ejemplo, el español mostrará «3 de febrero de 2024» mientras que el alemán mostrará «3. Februar 2024». Si no se define un formato específico para un idioma, tabi usará la configuración global `long_date_format`, `short_date_format` y `archive_date_format`.
|
||||||
|
|
||||||
## ¿Qué pasa si falta una traducción o está incompleta?
|
## ¿Qué pasa si falta una traducción o está incompleta?
|
||||||
|
|
||||||
Si una cadena no se encuentra en el archivo de idioma, tabi recurrirá a la cadena predeterminada en inglés.
|
Si una cadena no se encuentra en el archivo de idioma, tabi recurrirá a la cadena predeterminada en inglés.
|
||||||
|
@ -133,3 +147,7 @@ Si lo hiciste, tendrás que actualizar manualmente las traducciones. Puedes hace
|
||||||
## ¿tabi traduce el contenido de mi sitio?
|
## ¿tabi traduce el contenido de mi sitio?
|
||||||
|
|
||||||
No. tabi sólo traduce el tema. Los posts deberás traducirlos tú mismo.
|
No. tabi sólo traduce el tema. Los posts deberás traducirlos tú mismo.
|
||||||
|
|
||||||
|
## ¿Cómo puedo mostrar el código del idioma actual en el conmutador de idioma?
|
||||||
|
|
||||||
|
Añade `show_selected_language_code_in_language_switcher = true` en la sección `[extra]` de tu `config.toml`.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
+++
|
+++
|
||||||
title = "Lost in Translation? Not with tabi's Multilingual Capabilities"
|
title = "Lost in Translation? Not with tabi's Multilingual Capabilities"
|
||||||
date = 2023-09-12
|
date = 2023-09-12
|
||||||
updated = 2024-03-01
|
updated = 2025-09-14
|
||||||
description = "Master the art of serving a global audience through tabi's built-in multilingual features. Learn how to change the default language, add multilingual support, and contribute your own translations."
|
description = "Master the art of serving a global audience through tabi's built-in multilingual features. Learn how to change the default language, add multilingual support, and contribute your own translations."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
|
@ -29,6 +29,7 @@ tabi supports the following languages:
|
||||||
- Chinese (Traditional)
|
- Chinese (Traditional)
|
||||||
- English
|
- English
|
||||||
- Estonian
|
- Estonian
|
||||||
|
- Finnish
|
||||||
- French
|
- French
|
||||||
- German
|
- German
|
||||||
- Hindi
|
- Hindi
|
||||||
|
@ -107,6 +108,19 @@ So if you create `i18n/en.toml` in your base directory, tabi will read the stri
|
||||||
|
|
||||||
Make sure to copy the entire file for that language first, or the theme will fall back to the default English strings.
|
Make sure to copy the entire file for that language first, or the theme will fall back to the default English strings.
|
||||||
|
|
||||||
|
## How do I customize date formats for different languages?
|
||||||
|
|
||||||
|
You can set language-specific date formats in your `config.toml` using the `date_formats` array:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
date_formats = [
|
||||||
|
{ lang = "es", long = "%d de %B de %Y", short = "%-d %b %Y", archive = "%d de %b" },
|
||||||
|
{ lang = "de", long = "%d. %B %Y", short = "%d.%m.%Y", archive = "%d. %b" },
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
This allows each language to display dates according to local conventions. For example, Spanish will show "3 de febrero de 2024" while German will show "3. Februar 2024". If no language-specific format is defined, tabi will use the global `long_date_format`, `short_date_format` and `archive_date_format` settings.
|
||||||
|
|
||||||
## What happens if a translation is missing or incomplete?
|
## What happens if a translation is missing or incomplete?
|
||||||
|
|
||||||
If a string is not found in the language file, tabi will fall back to the default English string.
|
If a string is not found in the language file, tabi will fall back to the default English string.
|
||||||
|
@ -134,3 +148,7 @@ If you did, you will need to manually update the translations. You can do this b
|
||||||
## Does tabi translate my content?
|
## Does tabi translate my content?
|
||||||
|
|
||||||
No. tabi only translates the theme's text strings. You will need to translate your content yourself.
|
No. tabi only translates the theme's text strings. You will need to translate your content yourself.
|
||||||
|
|
||||||
|
# How to show current language code on the language switcher?
|
||||||
|
|
||||||
|
Add `show_selected_language_code_in_language_switcher = true` in your config extras.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
+++
|
+++
|
||||||
title = "Sense JavaScript obligatori"
|
title = "Sense JavaScript obligatori"
|
||||||
date = 2023-01-06
|
date = 2023-01-06
|
||||||
updated = 2025-02-15
|
updated = 2025-02-21
|
||||||
description = "JavaScript només s'utilitza quan HTML i CSS no són suficients."
|
description = "JavaScript només s'utilitza quan HTML i CSS no són suficients."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
+++
|
+++
|
||||||
title = "Sin JavaScript obligatorio"
|
title = "Sin JavaScript obligatorio"
|
||||||
date = 2023-01-06
|
date = 2023-01-06
|
||||||
updated = 2025-02-15
|
updated = 2025-02-21
|
||||||
description = "JavaScript solo se utiliza cuando HTML y CSS no son suficientes."
|
description = "JavaScript solo se utiliza cuando HTML y CSS no son suficientes."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
+++
|
+++
|
||||||
title = "No mandatory JavaScript"
|
title = "No mandatory JavaScript"
|
||||||
date = 2023-01-06
|
date = 2023-01-06
|
||||||
updated = 2025-02-15
|
updated = 2025-02-21
|
||||||
description = "JavaScript is only used when HTML and CSS aren't enough."
|
description = "JavaScript is only used when HTML and CSS aren't enough."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
+++
|
+++
|
||||||
title = "Exemples de Markdown"
|
title = "Exemples de Markdown"
|
||||||
date = 2023-01-31
|
date = 2023-01-31
|
||||||
updated = 2024-11-23
|
updated = 2025-02-21
|
||||||
description = "Aquesta publicació mostra alguns exemples de format en Markdown, incloent-hi una taula, blocs de codi i etiquetes, citacions, taules i notes a peu de pàgina."
|
description = "Aquesta publicació mostra alguns exemples de format en Markdown, incloent-hi una taula, blocs de codi i etiquetes, citacions, taules i notes a peu de pàgina."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
+++
|
+++
|
||||||
title = "Ejemplos de Markdown"
|
title = "Ejemplos de Markdown"
|
||||||
date = 2023-01-31
|
date = 2023-01-31
|
||||||
updated = 2024-11-23
|
updated = 2025-02-21
|
||||||
description = "Esta publicación muestra algunos ejemplos de formato Markdown, incluyendo una tabla, bloques de código y etiquetas, citas, tablas y notas al pie de página."
|
description = "Esta publicación muestra algunos ejemplos de formato Markdown, incluyendo una tabla, bloques de código y etiquetas, citas, tablas y notas al pie de página."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
+++
|
+++
|
||||||
title = "Markdown examples"
|
title = "Markdown examples"
|
||||||
date = 2023-01-31
|
date = 2023-01-31
|
||||||
updated = 2024-11-23
|
updated = 2025-02-21
|
||||||
description = "This post showcases some examples of Markdown formatting, including a table, code blocks and tags, quotes, tables, and footnotes."
|
description = "This post showcases some examples of Markdown formatting, including a table, code blocks and tags, quotes, tables, and footnotes."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
|
|
BIN
content/blog/mastering-tabi-settings/img/webmention_dark.webp
Normal file
BIN
content/blog/mastering-tabi-settings/img/webmention_dark.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 38 KiB |
BIN
content/blog/mastering-tabi-settings/img/webmention_light.webp
Normal file
BIN
content/blog/mastering-tabi-settings/img/webmention_light.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 38 KiB |
|
@ -1,7 +1,7 @@
|
||||||
+++
|
+++
|
||||||
title = "Domina la configuració de tabi: guia completa"
|
title = "Domina la configuració de tabi: guia completa"
|
||||||
date = 2023-09-18
|
date = 2023-09-18
|
||||||
updated = 2025-02-16
|
updated = 2025-08-07
|
||||||
description = "Descobreix les múltiples maneres en què pots personalitzar tabi."
|
description = "Descobreix les múltiples maneres en què pots personalitzar tabi."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
|
@ -223,7 +223,7 @@ Les skins («pells») de tabi canvien el color principal del lloc web. Pots conf
|
||||||
|
|
||||||
{{ image_toggler(default_src="blog/customise-tabi/skins/lavender_light.webp", toggled_src="blog/customise-tabi/skins/lavender_dark.webp", default_alt="pell lavender en mode clar", toggled_alt="pell lavender en mode fosc", full_width=true) }}
|
{{ image_toggler(default_src="blog/customise-tabi/skins/lavender_light.webp", toggled_src="blog/customise-tabi/skins/lavender_dark.webp", default_alt="pell lavender en mode clar", toggled_alt="pell lavender en mode fosc", full_width=true) }}
|
||||||
|
|
||||||
Explora les skins disponibles i aprèn com crear la teva pròpia consultant [la documentació](/ca/blog/customise-tabi/#skins).
|
Explora les skins disponibles i aprèn com crear la teva pròpia consultant [la documentació](@/blog/customise-tabi/index.ca.md#skins).
|
||||||
|
|
||||||
### Font sans serif (pal sec)
|
### Font sans serif (pal sec)
|
||||||
|
|
||||||
|
@ -780,6 +780,35 @@ Si has activat un sistema de forma global i vols desactivar-lo per a una pàgina
|
||||||
|
|
||||||
Llegeix la [documentació](@/blog/comments/index.ca.md) per a més informació sobre els sistemes disponibles i la seva configuració.
|
Llegeix la [documentació](@/blog/comments/index.ca.md) per a més informació sobre els sistemes disponibles i la seva configuració.
|
||||||
|
|
||||||
|
### Botons d'iine {#iine}
|
||||||
|
|
||||||
|
| Pàgina | Secció | `config.toml` | Segueix la jerarquia | Requereix JavaScript |
|
||||||
|
|:------:|:------:|:-------------:|:--------------------:|:--------------------:|
|
||||||
|
| ✅ | ✅ | ✅ | ✅ | ❌ |
|
||||||
|
|
||||||
|
tabi permet botons d'[iine](https://iine.to/) per mostrar apreciació anònima pel teu contingut. Aquests botons centrats en la privadesa funcionen sense JavaScript i no rastegen usuaris.
|
||||||
|
|
||||||
|
Per activar els botons iine globalment:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[extra]
|
||||||
|
iine = true
|
||||||
|
```
|
||||||
|
|
||||||
|
Pots personalitzar la icona usada als botons (segueix la jerarquia):
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[extra]
|
||||||
|
iine_icon = "thumbs_up" # Opcions: "heart", "thumbs_up", "upvote", o qualsevol emoji
|
||||||
|
```
|
||||||
|
|
||||||
|
Per a llocs multilingües, pots unificar els recomptes de likes entre versions en diferents idiomes del mateix contingut (configuració només de config; valor per defecte és `true`):
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[extra]
|
||||||
|
iine_unified_languages = true # Els likes a /ca/blog/hello/ compten cap a /blog/hello/
|
||||||
|
```
|
||||||
|
|
||||||
### Anàlisi web
|
### Anàlisi web
|
||||||
|
|
||||||
| Pàgina | Secció | `config.toml` | Segueix la jerarquia | Requereix JavaScript |
|
| Pàgina | Secció | `config.toml` | Segueix la jerarquia | Requereix JavaScript |
|
||||||
|
@ -802,6 +831,8 @@ Pots configurar-los en la secció `[extra.analytics]` del teu arxiu `config.toml
|
||||||
- Per a Umami: `"https://umami.example.com"`
|
- Per a Umami: `"https://umami.example.com"`
|
||||||
- Per a Plausible: `"https://plausible.example.com"`
|
- Per a Plausible: `"https://plausible.example.com"`
|
||||||
|
|
||||||
|
- `do_not_track`: (només per a Umami) opcional. Quan s'estableix com a `true`, es desactiva el seguiment per als usuaris els navegadors dels quals envien una capçalera "Do Not Track".
|
||||||
|
|
||||||
Un exemple de configuració per a GoatCounter no auto-allotjada seria:
|
Un exemple de configuració per a GoatCounter no auto-allotjada seria:
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
|
@ -937,12 +968,25 @@ Per defecte, la data es mostra sota el títol de la publicació. Pots amagar-la
|
||||||
|:------:|:-------:|:-------------:|:---------------------:|:-------------------:|
|
|:------:|:-------:|:-------------:|:---------------------:|:-------------------:|
|
||||||
| ❌ | ❌ | ✅ | ❌ | ❌ |
|
| ❌ | ❌ | ✅ | ❌ | ❌ |
|
||||||
|
|
||||||
tabi té dos formats de data: `long_date_format` i `short_date_format`. El format curt s'utilitza a les metadades d'una publicació, mentre que el format llarg s'utilitza al llistar les publicacions (és a dir, a la [secció de blog](/ca/blog/) o a la [pàgina principal](/ca/)).
|
tabi té tres formats de data: `long_date_format`, `short_date_format` i `archive_data_format`. El format curt s'utilitza a les metadades d'una publicació, mentre que el format llarg s'utilitza al llistar les publicacions (és a dir, a la [secció de blog](/ca/blog/) o a la [pàgina principal](/ca/)). El format d'arxiu s'utilitza per mostrar el dia i el mes a la pàgina d'arxiu.
|
||||||
|
|
||||||
Per defecte és "6th July 2049" per a ambdós formats en anglès. Per a altres idiomes, el predeterminat és `"%d %B %Y"` per al format llarg i `"%-d %b %Y"` per al format curt.
|
Per defecte és "6th July 2049" per als formats curt i llarg en anglès. Per a altres idiomes, el predeterminat és `"%d %B %Y"` per al format llarg i `"%-d %b %Y"` per al format curt. El format d'arxiu predeterminat universal és `"%d %b"`.
|
||||||
|
|
||||||
A Zola, la sintaxi per al format de temps està inspirada en strftime. Una referència completa està disponible a la [documentació de chrono](https://docs.rs/chrono/0.4.31/chrono/format/strftime/index.html).
|
A Zola, la sintaxi per al format de temps està inspirada en strftime. Una referència completa està disponible a la [documentació de chrono](https://docs.rs/chrono/0.4.31/chrono/format/strftime/index.html).
|
||||||
|
|
||||||
|
#### Formats de data per idioma
|
||||||
|
|
||||||
|
Pots personalitzar els formats de data per idiomes específics utilitzant la matriu `date_formats` a `config.toml`:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
date_formats = [
|
||||||
|
{ lang = "es", long = "%d de %B de %Y", short = "%-d %b %Y", archive = "%d de %b" },
|
||||||
|
{ lang = "de", long = "%d. %B %Y", short = "%d.%m.%Y", archive = "%d. %b" },
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
Això permet que diferents idiomes utilitzin formats de data culturalment apropiats (per exemple, "6. Juli 2049" per a alemany VS "6 de julio de 2049" per a espanyol).
|
||||||
|
|
||||||
### Separador personalitzat
|
### Separador personalitzat
|
||||||
|
|
||||||
| Pàgina | Secció | `config.toml` | Segueix la jerarquia | Requereix JavaScript |
|
| Pàgina | Secció | `config.toml` | Segueix la jerarquia | Requereix JavaScript |
|
||||||
|
@ -1007,6 +1051,66 @@ Per a més informació, consulta la [pàgina de documentació de CSP](@/blog/sec
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Indieweb
|
||||||
|
|
||||||
|
### Webmentions
|
||||||
|
|
||||||
|
| Pàgina | Secció | `config.toml` | Segueix jerarquia | Requereix JavaScript |
|
||||||
|
|:------:|:------:|:-------------:|:-----------------:|:--------------------:|
|
||||||
|
| ❓ | ❓ | ✅ | ❓ | ✅ |
|
||||||
|
|
||||||
|
Com es descriu en l'estàndard W3C recomanat, [Webmention](https://www.w3.org/TR/webmention/#abstract-p-1) és una manera senzilla de notificar qualsevol URL quan la menciones al teu lloc web. Des de la perspectiva del receptor, és una manera de sol·licitar notificacions quan altres llocs web la mencionen.
|
||||||
|
|
||||||
|
Per a llocs web estàtics, [webmention.io](https://webmention.io/) allotja un punt final de webmention que es pot utilitzar per rebre webmentions. Aquesta funcionalitat recupera les webmentions emmagatzemades a webmention.io i les mostra per a una pàgina. Hauràs de configurar un compte per al teu lloc web a webmention.io. Quan habilitis la funcionalitat de webmention, anunciarà el teu punt final de webmention.io i mostrarà les webmentions per a qualsevol pàgina.
|
||||||
|
|
||||||
|
Habilita les webmentions per al teu lloc web afegint el següent al teu fitxer `config.toml`.
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[extra.webmentions]
|
||||||
|
enable = true
|
||||||
|
# Especifica el domini registrat amb webmention.io.
|
||||||
|
domain = "www.example.com"
|
||||||
|
```
|
||||||
|
|
||||||
|
❓: Per desactivar les webmentions per a una secció o pàgina específica, estableix `webmentions = false` a la secció `[extra]` del front matter d'aquesta secció o pàgina.
|
||||||
|
|
||||||
|
La secció de webmentions es veu així:
|
||||||
|
|
||||||
|
{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/webmention_light.webp", dark_src="blog/mastering-tabi-settings/img/webmention_dark.webp" alt="Captura de pantalla de webmentions mostrant republications, m'agrada, marcadors i comentaris", full_width=true) }}
|
||||||
|
|
||||||
|
### h-card representativa
|
||||||
|
|
||||||
|
| Pàgina | Secció | `config.toml` | Segueix la jerarquia | Requereix JavaScript |
|
||||||
|
| :--: | :-----: | :-----------: | :---------------: | :-----------------: |
|
||||||
|
| ❌ | ❌ | ✅ | ❌ | ❌ |
|
||||||
|
|
||||||
|
Per defecte, tabi afegeix una h-card representativa [h-card](https://microformats.org/wiki/h-card) **oculta** a la pàgina d'inici. Tot i que és invisible per als visitants, està disponible per als analitzadors de microformats. Pots comprovar la validesa de la targeta amb l'eina [Indiewebify.me](https://indiewebify.me/validate-h-card/).
|
||||||
|
|
||||||
|
Per desactivar l'h-card, estableix `enable = false` a la secció `[extra.hcard]` de `config.toml`.
|
||||||
|
|
||||||
|
L'h-card predeterminada inclou el teu nom, l'URL del lloc web i els enllaços a les xarxes socials.
|
||||||
|
|
||||||
|
Pots establir una imatge de perfil i una petita biografia amb els paràmetres `avatar` i `biography`.
|
||||||
|
|
||||||
|
Totes les altres [propietats h-card](https://microformats.org/wiki/h-card#Properties) es poden afegir llistant-les a la secció `[extra.hcard]` del fitxer de configuració. Simplement substitueix tots els caràcters `-` per `_`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Estenent elements HTML a tabi
|
||||||
|
|
||||||
|
Alguns elements HTML a tabi es poden estendre per admetre casos d'ús addicionals, com ara afegir JavaScript personalitzat per a comportaments a tot el lloc al final de l'etiqueta `<body>` o incloure contingut addicional al final de l'element `<head>` que no estigui suportat per altres configuracions de tabi.
|
||||||
|
|
||||||
|
Consulta la taula a continuació per veure els elements que es poden estendre:
|
||||||
|
|
||||||
|
| Element | Plantilla |
|
||||||
|
| :------: | :-------------------------------: |
|
||||||
|
| `<head>` | `templates/tabi/extend_head.html` |
|
||||||
|
| `<body>` | `templates/tabi/extend_body.html` |
|
||||||
|
|
||||||
|
No hi ha configuracions explícites que hagis d'establir per al teu lloc o pàgines. Simplement crea el fitxer de plantilla corresponent per al teu lloc, i tabi l'inclourà automàticament.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
[^1]: Si estàs utilitzant un repositori Git remot, potser voldràs automatitzar el procés d'actualització del camp `updated`. Aquí tens una guia per a això: [Zola Git Hook: actualitzant les dates de les publicacions](https://osc.garden/ca/blog/zola-date-git-hook/).
|
[^1]: Si estàs utilitzant un repositori Git remot, potser voldràs automatitzar el procés d'actualització del camp `updated`. Aquí tens una guia per a això: [Zola Git Hook: actualitzant les dates de les publicacions](https://osc.garden/ca/blog/zola-date-git-hook/).
|
||||||
|
|
||||||
[^2]: Per a codificar el teu correu electrònic en base64 pots utilitzar [eines en línia](https://www.base64encode.org/) o, al teu terminal, executar: `printf 'mail@example.com' | base64`
|
[^2]: Per a codificar el teu correu electrònic en base64 pots utilitzar [eines en línia](https://www.base64encode.org/) o, al teu terminal, executar: `printf 'mail@example.com' | base64`
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
+++
|
+++
|
||||||
title = "Domina la configuración de tabi: guía completa"
|
title = "Domina la configuración de tabi: guía completa"
|
||||||
date = 2023-09-18
|
date = 2023-09-18
|
||||||
updated = 2025-02-16
|
updated = 2025-08-07
|
||||||
description = "Descubre las múltiples maneras en que puedes personalizar tabi."
|
description = "Descubre las múltiples maneras en que puedes personalizar tabi."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
|
@ -224,7 +224,7 @@ Las pieles de tabi cambian el color principal del sitio. Puedes configurar la pi
|
||||||
|
|
||||||
{{ image_toggler(default_src="blog/customise-tabi/skins/lavender_light.webp", toggled_src="blog/customise-tabi/skins/lavender_dark.webp", default_alt="piel lavender en modo claro", toggled_alt="piel lavender en modo oscuro", full_width=true) }}
|
{{ image_toggler(default_src="blog/customise-tabi/skins/lavender_light.webp", toggled_src="blog/customise-tabi/skins/lavender_dark.webp", default_alt="piel lavender en modo claro", toggled_alt="piel lavender en modo oscuro", full_width=true) }}
|
||||||
|
|
||||||
Explora las pieles disponibles y aprende cómo crear la tuya propia consultando [la documentación](/es/blog/customise-tabi/#skins).
|
Explora las pieles disponibles y aprende cómo crear la tuya propia consultando [la documentación](@/blog/customise-tabi/index.es.md#skins).
|
||||||
|
|
||||||
### Fuente sans serif (paloseco)
|
### Fuente sans serif (paloseco)
|
||||||
|
|
||||||
|
@ -781,6 +781,37 @@ Si has activado un sistema globalmente, pero quieres desactivarlo en una página
|
||||||
|
|
||||||
Lee la [documentación](@/blog/comments/index.es.md) para obtener más información sobre los sistemas disponibles y su configuración.
|
Lee la [documentación](@/blog/comments/index.es.md) para obtener más información sobre los sistemas disponibles y su configuración.
|
||||||
|
|
||||||
|
### Botones de iine {#iine}
|
||||||
|
|
||||||
|
| Página | Sección | `config.toml` | Sigue la jerarquía | Requiere JavaScript |
|
||||||
|
|:------:|:-------:|:-------------:|:-------------------:|:-------------------:|
|
||||||
|
| ✅ | ✅ | ✅ | ✅ | ❌ |
|
||||||
|
|
||||||
|
tabi soporta botones de [iine](https://iine.to/) para mostrar apreciación anónima por tu contenido. Estos botones centrados en la privacidad funcionan sin JavaScript y no rastrean usuarios.
|
||||||
|
|
||||||
|
Para activar los botones iine globalmente:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[extra]
|
||||||
|
iine = true
|
||||||
|
```
|
||||||
|
|
||||||
|
Puedes personalizar el icono usado en los botones (esta configuración sigue la jerarquía):
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[extra]
|
||||||
|
iine_icon = "thumbs_up" # Opciones: "heart", "thumbs_up", "upvote", o cualquier emoji
|
||||||
|
```
|
||||||
|
|
||||||
|
Para sitios multilingües, puedes unificar los conteos de likes entre versiones en diferentes idiomas del mismo contenido (configuración solo de config; valor predeterminado: `true`):
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[extra]
|
||||||
|
iine_unified_languages = true # Los likes en /es/blog/hello/ cuentan hacia /blog/hello/
|
||||||
|
```
|
||||||
|
|
||||||
|
También puedes activar los botones iine en páginas o secciones individuales estableciendo `iine = true` en su front matter, o personalizar el icono con `iine_icon = "🚀"`.
|
||||||
|
|
||||||
### Análisis web
|
### Análisis web
|
||||||
|
|
||||||
| Página | Sección | `config.toml` | Sigue Jerarquía | Requiere JavaScript |
|
| Página | Sección | `config.toml` | Sigue Jerarquía | Requiere JavaScript |
|
||||||
|
@ -803,6 +834,8 @@ Puedes configurarlos en la sección `[extra.analytics]` de tu archivo `config.to
|
||||||
- Para Umami: `"https://umami.example.com"`
|
- Para Umami: `"https://umami.example.com"`
|
||||||
- Para Plausible: `"https://plausible.example.com"`
|
- Para Plausible: `"https://plausible.example.com"`
|
||||||
|
|
||||||
|
- `do_not_track`: (sólo para Umami) opcional. Cuando se establece en `true`, se desactiva el seguimiento para los usuarios cuyos navegadores envían un encabezado "Do Not Track".
|
||||||
|
|
||||||
Un ejemplo de configuración para GoatCounter no auto-alojada sería:
|
Un ejemplo de configuración para GoatCounter no auto-alojada sería:
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
|
@ -940,12 +973,25 @@ Por defecto, la fecha se muestra debajo del título de la publicación. Puedes o
|
||||||
|:------:|:-------:|:-------------:|:------------------:|:-------------------:|
|
|:------:|:-------:|:-------------:|:------------------:|:-------------------:|
|
||||||
| ❌ | ❌ | ✅ | ❌ | ❌ |
|
| ❌ | ❌ | ✅ | ❌ | ❌ |
|
||||||
|
|
||||||
tabi tiene dos formatos de fecha: `long_date_format` y `short_date_format`. El formato corto se utiliza en los metadatos de una publicación, mientras que el formato largo se utiliza al listar las publicaciones (es decir, en la [sección de blog](/es/blog/) o en la [página principal](/es/)).
|
tabi tiene tres formatos de fecha: `long_date_format`, `short_date_format` y `archive_date_format`. El formato corto se utiliza en los metadatos de una publicación, mientras que el formato largo se utiliza al listar las publicaciones (es decir, en la [sección de blog](/es/blog/) o en la [página principal](/es/)). El formato de archivo se usa para mostrar el día y el mes en la página de archivo.
|
||||||
|
|
||||||
Por defecto es "6th July 2049" para ambos formatos en inglés. Para otros idiomas, el predeterminado es `"%d %B %Y"` para el formato largo y `"%-d %b %Y"` para el formato corto.
|
Por defecto es "6th July 2049" para los formatos corto y largo en inglés. Para otros idiomas, el predeterminado es `"%d %B %Y"` para el formato largo y `"%-d %b %Y"` para el formato corto. El formato de archivo predeterminado universal es `"%d %b"`.
|
||||||
|
|
||||||
En Zola, la sintaxis para el formateo de tiempo está inspirada en strftime. Una referencia completa está disponible en la [documentación de chrono](https://docs.rs/chrono/0.4.31/chrono/format/strftime/index.html).
|
En Zola, la sintaxis para el formateo de tiempo está inspirada en strftime. Una referencia completa está disponible en la [documentación de chrono](https://docs.rs/chrono/0.4.31/chrono/format/strftime/index.html).
|
||||||
|
|
||||||
|
#### Formatos de fecha por idioma
|
||||||
|
|
||||||
|
Puedes personalizar los formatos de fecha para idiomas específicos usando la matriz `date_formats` en `config.toml`:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
date_formats = [
|
||||||
|
{ lang = "es", long = "%d de %B de %Y", short = "%-d %b %Y", archive = "%d de %b" },
|
||||||
|
{ lang = "de", long = "%d. %B %Y", short = "%d.%m.%Y", archive = "%d. %b" },
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
Esto permite que diferentes idiomas usen formatos de fecha culturalmente apropiados (por ejemplo, "6 de julio de 2049" en español o "6. Juli 2049" en alemán).
|
||||||
|
|
||||||
### Separador personalizado
|
### Separador personalizado
|
||||||
|
|
||||||
| Página | Sección | `config.toml` | Sigue la jerarquía | Requiere JavaScript |
|
| Página | Sección | `config.toml` | Sigue la jerarquía | Requiere JavaScript |
|
||||||
|
@ -1008,6 +1054,66 @@ Para obtener más información, consulta la [página de documentación de CSP](@
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Indieweb
|
||||||
|
|
||||||
|
### Webmentions
|
||||||
|
|
||||||
|
| Página | Sección | `config.toml` | Sigue la jerarquía | Requiere JavaScript |
|
||||||
|
|:------:|:-------:|:-------------:|:---------------:|:-------------------:|
|
||||||
|
| ❓ | ❓ | ✅ | ❓ | ✅ |
|
||||||
|
|
||||||
|
Como se describe en el estándar W3C recomendado, [Webmention](https://www.w3.org/TR/webmention/#abstract-p-1) es una manera sencilla de notificar cualquier URL cuando la mencionas en tu sitio web. Desde la perspectiva del receptor, es una forma de solicitar notificaciones cuando otros sitios web la mencionan.
|
||||||
|
|
||||||
|
Para sitios web estáticos, [webmention.io](https://webmention.io/) aloja un punto final de webmention que se puede utilizar para recibir webmentions. Esta función recupera las webmentions almacenadas en webmention.io y las muestra para una página. Necesitarás configurar una cuenta para tu sitio web en webmention.io. Cuando habilites la función, anunciará tu punto final de webmention.io y mostrará las webmentions para cualquier página.
|
||||||
|
|
||||||
|
Habilita las webmentions para tu sitio web agregando lo siguiente a tu archivo `config.toml`.
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[extra.webmentions]
|
||||||
|
enable = true
|
||||||
|
# Especifica el dominio registrado con webmention.io.
|
||||||
|
domain = "www.example.com"
|
||||||
|
```
|
||||||
|
|
||||||
|
❓: Para desactivar las webmentions para una sección o página específica, establece `webmentions = false` en la sección `[extra]` del front matter de esa sección o página.
|
||||||
|
|
||||||
|
La sección de webmentions se ve así:
|
||||||
|
|
||||||
|
{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/webmention_light.webp", dark_src="blog/mastering-tabi-settings/img/webmention_dark.webp" alt="Captura de pantalla de webmentions mostrando reposts, me gusta, marcadores y comentarios", full_width=true) }}
|
||||||
|
|
||||||
|
### h-card representativa
|
||||||
|
|
||||||
|
| Página | Sección | `config.toml` | Sigue Jerarquía | Requiere JavaScript |
|
||||||
|
| :--: | :-----: | :-----------: | :---------------: | :-----------------: |
|
||||||
|
| ❌ | ❌ | ✅ | ❌ | ❌ |
|
||||||
|
|
||||||
|
Por defecto, tabi añade una [h-card](https://microformats.org/wiki/h-card) representativa **oculta** a la página de inicio. Aunque es invisible para los visitantes, está disponible para los analizadores de microformatos. Puedes comprobar la validez de la tarjeta con la herramienta [Indiewebify.me](https://indiewebify.me/validate-h-card/).
|
||||||
|
|
||||||
|
Para desactivar la h-card, establece `enable = false` en la sección `[extra.hcard]` de `config.toml`.
|
||||||
|
|
||||||
|
La h-card predeterminada incluye tu nombre, la URL del sitio web y los enlaces a redes sociales.
|
||||||
|
|
||||||
|
Puedes establecer una imagen de perfil y una pequeña biografía con los ajustes `avatar` y `biography`.
|
||||||
|
|
||||||
|
Todas las demás [propiedades de h-card](https://microformats.org/wiki/h-card#Properties) se pueden añadir listándolas en la sección `[extra.hcard]` del archivo de configuración. Simplemente reemplaza todos los caracteres `-` por `_`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Extendiendo elementos HTML en tabi
|
||||||
|
|
||||||
|
Algunos elementos HTML en tabi pueden extenderse para admitir casos de uso adicionales, como agregar JavaScript personalizado para comportamientos en todo el sitio al final de la etiqueta `<body>` o incluir contenido adicional al final del elemento `<head>` que no esté soportado por otras configuraciones de tabi.
|
||||||
|
|
||||||
|
Consulta la tabla a continuación para ver los elementos que pueden extenderse:
|
||||||
|
|
||||||
|
| Elemento | Plantilla |
|
||||||
|
| :------: | :-------------------------------: |
|
||||||
|
| `<head>` | `templates/tabi/extend_head.html` |
|
||||||
|
| `<body>` | `templates/tabi/extend_body.html` |
|
||||||
|
|
||||||
|
No hay configuraciones explícitas que debas establecer para tu sitio o páginas. Simplemente crea el archivo de plantilla correspondiente para tu sitio, y tabi lo incluirá automáticamente.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
[^1]: Si estás utilizando un repositorio Git remoto, es posible que quieras automatizar el proceso de actualización del campo `updated`. Aquí tienes una guía para eso: [Zola Git Hook: actualizando las fechas de las publicaciones](https://osc.garden/es/blog/zola-date-git-hook/).
|
[^1]: Si estás utilizando un repositorio Git remoto, es posible que quieras automatizar el proceso de actualización del campo `updated`. Aquí tienes una guía para eso: [Zola Git Hook: actualizando las fechas de las publicaciones](https://osc.garden/es/blog/zola-date-git-hook/).
|
||||||
|
|
||||||
[^2]: Para codificar tu correo electrónico en base64 puedes utilizar [herramientas en línea](https://www.base64encode.org/) o, en tu terminal, ejecutar: `printf 'mail@example.com' | base64`
|
[^2]: Para codificar tu correo electrónico en base64 puedes utilizar [herramientas en línea](https://www.base64encode.org/) o, en tu terminal, ejecutar: `printf 'mail@example.com' | base64`
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
+++
|
+++
|
||||||
title = "Mastering tabi Settings: A Comprehensive Guide"
|
title = "Mastering tabi Settings: A Comprehensive Guide"
|
||||||
date = 2023-09-18
|
date = 2023-09-18
|
||||||
updated = 2025-02-16
|
updated = 2025-08-07
|
||||||
description = "Discover the many ways you can customise your tabi site."
|
description = "Discover the many ways you can customise your tabi site."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
|
@ -228,7 +228,7 @@ tabi's skins change the main colour of the site. You can set the skin in `config
|
||||||
|
|
||||||
{{ image_toggler(default_src="blog/customise-tabi/skins/lavender_light.webp", toggled_src="blog/customise-tabi/skins/lavender_dark.webp", default_alt="lavender skin in light mode", toggled_alt="lavender skin in dark mode", full_width=true) }}
|
{{ image_toggler(default_src="blog/customise-tabi/skins/lavender_light.webp", toggled_src="blog/customise-tabi/skins/lavender_dark.webp", default_alt="lavender skin in light mode", toggled_alt="lavender skin in dark mode", full_width=true) }}
|
||||||
|
|
||||||
Explore the available skins and learn how to create your own reading [the documentation](/blog/customise-tabi/#skins).
|
Explore the available skins and learn how to create your own reading [the documentation](@/blog/customise-tabi/index.md#skins).
|
||||||
|
|
||||||
### Sans-serif Font
|
### Sans-serif Font
|
||||||
|
|
||||||
|
@ -789,6 +789,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.
|
Read [the docs](@/blog/comments/index.md) for more information on the available systems and their setup.
|
||||||
|
|
||||||
|
### iine Like Buttons {#iine}
|
||||||
|
|
||||||
|
| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
|
||||||
|
|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
|
||||||
|
| ✅ | ✅ | ✅ | ✅ | ❌ |
|
||||||
|
|
||||||
|
tabi supports [iine](https://iine.to/) like buttons for anonymous appreciation of your content. These privacy-focused buttons work without JavaScript and don't track users.
|
||||||
|
|
||||||
|
To enable iine buttons globally:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[extra]
|
||||||
|
iine = true
|
||||||
|
```
|
||||||
|
|
||||||
|
You can customise the icon used for the buttons (follows the hierarchy):
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[extra]
|
||||||
|
iine_icon = "thumbs_up" # Options: "heart", "thumbs_up", "upvote", or any emoji
|
||||||
|
```
|
||||||
|
|
||||||
|
For multilingual sites, you can unify like counts across language versions of the same content (config-only setting; true by default):
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[extra]
|
||||||
|
iine_unified_languages = true # Likes on /es/blog/hello/ count towards /blog/hello/
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also enable iine buttons on individual pages or sections by setting `iine = true` in their front matter, or override the icon with `iine_icon = "🚀"`.
|
||||||
|
|
||||||
### Analytics
|
### Analytics
|
||||||
|
|
||||||
| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
|
| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
|
||||||
|
@ -811,6 +842,8 @@ You can set them up in the `[extra.analytics]` section of your `config.toml`.
|
||||||
- For Umami: `"https://umami.example.com"`
|
- For Umami: `"https://umami.example.com"`
|
||||||
- For Plausible: `"https://plausible.example.com"`
|
- For Plausible: `"https://plausible.example.com"`
|
||||||
|
|
||||||
|
- `do_not_track`: (Umami only) Optional. When set to `true`, the generated tracking script will include the `data-do-not-track="true"` attribute, which disables tracking for users whose browsers send a "Do Not Track" header.
|
||||||
|
|
||||||
An example configuration for non-self-hosted GoatCounter would look like this:
|
An example configuration for non-self-hosted GoatCounter would look like this:
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
|
@ -950,12 +983,25 @@ By default, the date is shown below the post title. You can hide it with `show_d
|
||||||
|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
|
|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
|
||||||
| ❌ | ❌ | ✅ | ❌ | ❌ |
|
| ❌ | ❌ | ✅ | ❌ | ❌ |
|
||||||
|
|
||||||
tabi has two date formats: `long_date_format` and `short_date_format`. The short format is used in a post's metadata, while the long format is used when listing posts (i.e. on the [blog section](@/blog/_index.md) or the [main page](@/_index.md)).
|
tabi has three date formats: `long_date_format`, `short_date_format` and `archive_date_format`. The short format is used in a post's metadata, while the long format is used when listing posts (i.e. on the [blog section](@/blog/_index.md) or the [main page](@/_index.md)). The archive format is used to display day and month on the archive page.
|
||||||
|
|
||||||
The default is "6th July 2049" for both formats in English. For other languages, the defaut is `"%d %B %Y"` for the long format and `"%-d %b %Y"` for the short format.
|
The default is "6th July 2049" for `long_date_format` and `short_date_format` in English. For other languages, the defaut is `"%d %B %Y"` for the long format and `"%-d %b %Y"` for the short format. The universal default for the archive format is `"%d %b"`.
|
||||||
|
|
||||||
In Zola, time formatting syntax is inspired fom strftime. A full reference is available in the [chrono docs](https://docs.rs/chrono/0.4.31/chrono/format/strftime/index.html).
|
In Zola, time formatting syntax is inspired fom strftime. A full reference is available in the [chrono docs](https://docs.rs/chrono/0.4.31/chrono/format/strftime/index.html).
|
||||||
|
|
||||||
|
#### Per-language date formats
|
||||||
|
|
||||||
|
You can customise date formats for specific languages using the `date_formats` array in `config.toml`:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
date_formats = [
|
||||||
|
{ lang = "es", long = "%d de %B de %Y", short = "%-d %b %Y", archive = "%d de %b" },
|
||||||
|
{ lang = "de", long = "%d. %B %Y", short = "%d.%m.%Y", archive = "%d. %b" },
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
This allows different languages to use culturally appropriate date formatting (e.g. Spanish "3 de febrero de 2024" vs German "3. Februar 2024").
|
||||||
|
|
||||||
### Custom Separator
|
### Custom Separator
|
||||||
|
|
||||||
| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
|
| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
|
||||||
|
@ -1018,6 +1064,66 @@ See the [CSP documentation page](@/blog/security/index.md) for more information.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Indieweb
|
||||||
|
|
||||||
|
### Webmentions
|
||||||
|
|
||||||
|
| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
|
||||||
|
|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
|
||||||
|
| ❓ | ❓ | ✅ | ❓ | ✅ |
|
||||||
|
|
||||||
|
As described by the recommended W3C standard [Webmention](https://www.w3.org/TR/webmention/#abstract-p-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](https://webmention.io/) 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 all posts.
|
||||||
|
|
||||||
|
Enable webmentions for your site by adding the following to your `config.toml` file.
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[extra.webmentions]
|
||||||
|
enable = true
|
||||||
|
# Specify the domain registered with webmention.io.
|
||||||
|
domain = "www.example.com"
|
||||||
|
```
|
||||||
|
|
||||||
|
❓: To disable webmentions for a specific section or page, set `webmentions = false` in the `[extra]` section of that section or page's front matter.
|
||||||
|
|
||||||
|
The webmentions section looks like this:
|
||||||
|
|
||||||
|
{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/webmention_light.webp", dark_src="blog/mastering-tabi-settings/img/webmention_dark.webp" alt="Webmentions screenshot showing reposts, likes, bookmarks, and comments", full_width=true) }}
|
||||||
|
|
||||||
|
### Representative h-card
|
||||||
|
|
||||||
|
| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
|
||||||
|
| :--: | :-----: | :-----------: | :---------------: | :-----------------: |
|
||||||
|
| ❌ | ❌ | ✅ | ❌ | ❌ |
|
||||||
|
|
||||||
|
By default, tabi adds a **hidden** representative [h-card](https://microformats.org/wiki/h-card) to the homepage. While invisible to visitors, it's available to microformat parsers. You can check the validity of the card with the [Indiewebify.me](https://indiewebify.me/validate-h-card/) tool.
|
||||||
|
|
||||||
|
To disable the h-card, set `enable = false` in the `[extra.hcard]` section of `config.toml`.
|
||||||
|
|
||||||
|
The default h-card includes your name, website url and social media links.
|
||||||
|
|
||||||
|
You can set a profile picture and a small bio with the `avatar` and `biography` settings.
|
||||||
|
|
||||||
|
All other [h-card properties](https://microformats.org/wiki/h-card#Properties) can be added by listing them under the `[extra.hcard]`section of the config file. Simply replace all `-` characters by `_`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Extending HTML Elements in tabi
|
||||||
|
|
||||||
|
Some HTML elements in tabi can be extended to support additional use cases such as adding custom JavaScript for site-wide behavior at the end of the `<body>` tag or including additional content at the end of the `<head>` element that is not otherwise supported by other tabi settings.
|
||||||
|
|
||||||
|
See the table below for elements that can be extended:
|
||||||
|
|
||||||
|
| Element | Template |
|
||||||
|
| :------: | :-------------------------------: |
|
||||||
|
| `<head>` | `templates/tabi/extend_head.html` |
|
||||||
|
| `<body>` | `templates/tabi/extend_body.html` |
|
||||||
|
|
||||||
|
There are no explicit settings to configure for your site or pages. Simply create the relevant template file for your site, and tabi will automatically include it.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
[^1]: If you're using a remote Git repository, you might want to automate the process of updating the `updated` field. Here's a guide for that: [Zola Git Pre-Commit Hook: Updating Post Dates](https://osc.garden/blog/zola-date-git-hook/).
|
[^1]: If you're using a remote Git repository, you might want to automate the process of updating the `updated` field. Here's a guide for that: [Zola Git Pre-Commit Hook: Updating Post Dates](https://osc.garden/blog/zola-date-git-hook/).
|
||||||
|
|
||||||
[^2]: To encode your email in base64 you can use [online tools](https://www.base64encode.org/) or, on your terminal, run: `printf 'mail@example.com' | base64`.
|
[^2]: To encode your email in base64 you can use [online tools](https://www.base64encode.org/) or, on your terminal, run: `printf 'mail@example.com' | base64`.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
+++
|
+++
|
||||||
title = "Seguretat per defecte"
|
title = "Seguretat per defecte"
|
||||||
date = 2023-02-22
|
date = 2023-02-22
|
||||||
updated = 2024-08-28
|
updated = 2025-02-21
|
||||||
description = "tabi té una Política de Seguretat de Contingut (CSP) fàcilment personalitzable amb valors segurs per defecte. Obtingues tranquil·litat i un A+ en l'Observatori de Mozilla."
|
description = "tabi té una Política de Seguretat de Contingut (CSP) fàcilment personalitzable amb valors segurs per defecte. Obtingues tranquil·litat i un A+ en l'Observatori de Mozilla."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
+++
|
+++
|
||||||
title = "Seguro por defecto"
|
title = "Seguro por defecto"
|
||||||
date = 2023-02-22
|
date = 2023-02-22
|
||||||
updated = 2024-08-28
|
updated = 2025-02-21
|
||||||
description = "tabi tiene una Política de Seguridad de Contenido (CSP) fácilmente personalizable con configuraciones seguras. Obtén tranquilidad y una calificación de A+ en Mozilla Observatory."
|
description = "tabi tiene una Política de Seguridad de Contenido (CSP) fácilmente personalizable con configuraciones seguras. Obtén tranquilidad y una calificación de A+ en Mozilla Observatory."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
+++
|
+++
|
||||||
title = "Secure by default"
|
title = "Secure by default"
|
||||||
date = 2023-02-22
|
date = 2023-02-22
|
||||||
updated = 2024-08-28
|
updated = 2025-02-21
|
||||||
description = "tabi has an easily customizable Content Security Policy (CSP) with safe defaults. Get peace of mind and an A+ on Mozilla Observatory."
|
description = "tabi has an easily customizable Content Security Policy (CSP) with safe defaults. Get peace of mind and an A+ on Mozilla Observatory."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
+++
|
+++
|
||||||
title = "Guia completa sobre sèries"
|
title = "Guia completa sobre sèries"
|
||||||
date = 2024-11-08
|
date = 2024-11-08
|
||||||
updated = 2025-02-15
|
updated = 2025-02-21
|
||||||
description = "Aprèn a organitzar les teves publicacions en sèries seqüencials, perfectes per a tutorials, cursos i històries de diverses parts."
|
description = "Aprèn a organitzar les teves publicacions en sèries seqüencials, perfectes per a tutorials, cursos i històries de diverses parts."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
+++
|
+++
|
||||||
title = "Guía completa sobre series"
|
title = "Guía completa sobre series"
|
||||||
date = 2024-11-08
|
date = 2024-11-08
|
||||||
updated = 2025-02-15
|
updated = 2025-02-21
|
||||||
description = "Aprende a organizar tus publicaciones en series secuenciales, perfectas para tutoriales, cursos e historias de varias partes."
|
description = "Aprende a organizar tus publicaciones en series secuenciales, perfectas para tutoriales, cursos e historias de varias partes."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
+++
|
+++
|
||||||
title = "A Complete Guide to Series"
|
title = "A Complete Guide to Series"
|
||||||
date = 2024-11-08
|
date = 2024-11-08
|
||||||
updated = 2025-02-15
|
updated = 2025-02-21
|
||||||
description = "Learn how to organize your posts into sequential series, perfect for tutorials, courses, and multi-part stories."
|
description = "Learn how to organize your posts into sequential series, perfect for tutorials, courses, and multi-part stories."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
+++
|
+++
|
||||||
title = "Shortcodes personalitzats"
|
title = "Shortcodes personalitzats"
|
||||||
date = 2023-02-19
|
date = 2023-02-19
|
||||||
updated = 2025-02-15
|
updated = 2025-08-01
|
||||||
description = "Aquest tema inclou alguns shortcodes personalitzats útils que pots utilitzar per millorar les teves publicacions. Ja sigui per mostrar imatges que s'adapten als temes clar i fosc, o per donar format a una secció de referències amb un aspecte professional, aquests shortcodes personalitzats t'ajudaran."
|
description = "Aquest tema inclou alguns shortcodes personalitzats útils que pots utilitzar per millorar les teves publicacions. Ja sigui per mostrar imatges que s'adapten als temes clar i fosc, o per donar format a una secció de referències amb un aspecte professional, aquests shortcodes personalitzats t'ajudaran."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
|
@ -187,6 +187,28 @@ Tots els altres shortcodes d'imatges poden utilizar l'amplada completa assignant
|
||||||
{{/* full_width_image(src="img/amsterdam_by_oskerwyld.webp", alt="Fotografia d'un canal a Àmsterdam") */}}
|
{{/* full_width_image(src="img/amsterdam_by_oskerwyld.webp", alt="Fotografia d'un canal a Àmsterdam") */}}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Shortcodes socials
|
||||||
|
|
||||||
|
### iine
|
||||||
|
|
||||||
|
{{ aside(text="Per afegir-lo a totes les publicacions, estableix `iine = true` a la secció `[extra]` del teu `config.toml`.") }}
|
||||||
|
|
||||||
|
Aquest shortcode et permet afegir botons addicionals d'[iine.to](https://iine.to) a les teves publicacions, com aquest:
|
||||||
|
|
||||||
|
{{ iine(slug="/blog/shortcodes/demo-button") }}
|
||||||
|
|
||||||
|
#### Ús
|
||||||
|
|
||||||
|
```
|
||||||
|
{{/* iine(icon="heart", slug="/post/el-meu-slug-de-post/like", label="M'agrada aquesta publicació") */}}
|
||||||
|
```
|
||||||
|
|
||||||
|
El shortcode accepta els següents paràmetres opcionals:
|
||||||
|
|
||||||
|
- `icon`: La icona a mostrar. Pot ser `heart`, `thumbs_up`, `upvote`, o qualsevol emoji.
|
||||||
|
- `slug`: Un identificador únic. Per defecte és la ruta de la pàgina actual. Útil si vols més d'un botó a la mateixa pàgina.
|
||||||
|
- `label`: L'etiqueta d'accessibilitat per al botó. Per defecte és "M'agrada aquesta publicació".
|
||||||
|
|
||||||
## Shortcodes de codi
|
## Shortcodes de codi
|
||||||
|
|
||||||
### Mostrar ruta o URL
|
### Mostrar ruta o URL
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
+++
|
+++
|
||||||
title = "Shortcodes personalizados"
|
title = "Shortcodes personalizados"
|
||||||
date = 2023-02-19
|
date = 2023-02-19
|
||||||
updated = 2025-02-15
|
updated = 2025-08-01
|
||||||
description = "Este tema incluye algunos shortcodes personalizados útiles que puedes utilizar para mejorar tus publicaciones. Puedes mostrar imágenes que se adapten a los temas claro y oscuro, dar formato a una sección de referencias con un aspecto profesional, y más."
|
description = "Este tema incluye algunos shortcodes personalizados útiles que puedes utilizar para mejorar tus publicaciones. Puedes mostrar imágenes que se adapten a los temas claro y oscuro, dar formato a una sección de referencias con un aspecto profesional, y más."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
|
@ -186,6 +186,28 @@ Todos los otros shortcodes de imágenes pueden usar el ancho completo asignando
|
||||||
{{/* full_width_image(src="img/amsterdam_by_oskerwyld.webp", alt="Fotografía de un canal en Ámsterdam") */}}
|
{{/* full_width_image(src="img/amsterdam_by_oskerwyld.webp", alt="Fotografía de un canal en Ámsterdam") */}}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Shortcodes sociales
|
||||||
|
|
||||||
|
### iine
|
||||||
|
|
||||||
|
{{ aside(text="Para añadirlo a todas las publicaciones, establece `iine = true` en la sección `[extra]` de tu `config.toml`.") }}
|
||||||
|
|
||||||
|
Este shortcode te permite añadir botones adicionales de [iine.to](https://iine.to) a tus publicaciones, como este:
|
||||||
|
|
||||||
|
{{ iine(slug="/blog/shortcodes/demo-button") }}
|
||||||
|
|
||||||
|
#### Uso
|
||||||
|
|
||||||
|
```
|
||||||
|
{{/* iine(icon="heart", slug="/post/mi-slug-de-post/like", label="Me gusta esta publicación") */}}
|
||||||
|
```
|
||||||
|
|
||||||
|
El shortcode acepta los siguientes parámetros opcionales:
|
||||||
|
|
||||||
|
- `icon`: El icono a mostrar. Puede ser `heart`, `thumbs_up`, `upvote`, o cualquier emoji.
|
||||||
|
- `slug`: Un identificador único. Por defecto es la ruta de la página actual. Útil si quieres más de un botón en la misma página.
|
||||||
|
- `label`: La etiqueta de accesibilidad para el botón. Por defecto es "Me gusta esta publicación".
|
||||||
|
|
||||||
## Shortcodes de código
|
## Shortcodes de código
|
||||||
|
|
||||||
### Mostrar ruta o URL
|
### Mostrar ruta o URL
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
+++
|
+++
|
||||||
title = "Custom shortcodes"
|
title = "Custom shortcodes"
|
||||||
date = 2023-02-19
|
date = 2023-02-19
|
||||||
updated = 2025-02-15
|
updated = 2025-07-26
|
||||||
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."
|
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]
|
[taxonomies]
|
||||||
|
@ -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") }}
|
{{ dual_theme_image(light_src="img/paris_day.webp", dark_src="img/paris_night.webp" alt="The Eiffel tower") }}
|
||||||
|
|
||||||
#### Usage
|
#### Usage
|
||||||
|
|
||||||
```
|
```
|
||||||
{{/* dual_theme_image(light_src="img/paris_day.webp", dark_src="img/paris_night.webp" alt="The Eiffel tower") */}}
|
{{/* 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
|
### 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") }}
|
{{ image_hover(default_src="img/edited.webp", hovered_src="img/raw.webp", default_alt="Edited picture", hovered_alt="Original shot") }}
|
||||||
|
|
||||||
|
@ -187,6 +188,28 @@ All other image shortcodes can be made into full-width by setting the optional p
|
||||||
{{/* full_width_image(src="img/amsterdam_by_oskerwyld.webp", alt="Photograph of a canal in Amsterdam") */}}
|
{{/* full_width_image(src="img/amsterdam_by_oskerwyld.webp", alt="Photograph of a canal in Amsterdam") */}}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Engagement shortcodes
|
||||||
|
|
||||||
|
### iine
|
||||||
|
|
||||||
|
{{ aside(text="To add it to all posts, set `iine = true` in the `[extra]` section of your `config.toml`.") }}
|
||||||
|
|
||||||
|
This shortcode allows you to add extra [iine.to](https://iine.to) buttons to your posts, like this:
|
||||||
|
|
||||||
|
{{ iine(slug="/blog/shortcodes/demo-button") }}
|
||||||
|
|
||||||
|
#### Usage
|
||||||
|
|
||||||
|
```
|
||||||
|
{{/* iine(icon="heart", slug="/post/my-post-slug/like", label="Like this post") */}}
|
||||||
|
```
|
||||||
|
|
||||||
|
The shortcode takes the following optional parameters:
|
||||||
|
|
||||||
|
- `icon`: The icon to display. Can be `heart`, `thumbs_up`, `upvote`, or any emoji.
|
||||||
|
- `slug`: A unique identifier. Defaults to the current page's path. Useful if you want more than one button on the same page.
|
||||||
|
- `label`: The accessibility label for the button. Defaults to "Like this post".
|
||||||
|
|
||||||
## Code shortcodes
|
## Code shortcodes
|
||||||
|
|
||||||
### Show source or path
|
### Show source or path
|
||||||
|
@ -264,7 +287,7 @@ Using the content body and setting the position to right:
|
||||||
A longer note that
|
A longer note that
|
||||||
can span multiple lines.
|
can span multiple lines.
|
||||||
|
|
||||||
*Markdown* is supported.
|
_Markdown_ is supported.
|
||||||
{%/* end */%}
|
{%/* end */%}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -352,12 +375,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:
|
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
|
#### 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
|
### References with hanging indent
|
||||||
|
@ -439,10 +462,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".
|
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") %}
|
{% force_text_direction(direction="rtl") %}
|
||||||
|
|
||||||
```python
|
```python
|
||||||
def مرحبا_بالعالم():
|
def مرحبا_بالعالم():
|
||||||
print("مرحبا بالعالم!")
|
print("مرحبا بالعالم!")
|
||||||
```
|
```
|
||||||
|
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
#### Usage
|
#### Usage
|
||||||
|
|
|
@ -8,4 +8,5 @@ insert_anchor_links = "left"
|
||||||
social_media_card = "projects/projects.jpg"
|
social_media_card = "projects/projects.jpg"
|
||||||
show_reading_time = false
|
show_reading_time = false
|
||||||
quick_navigation_buttons = true
|
quick_navigation_buttons = true
|
||||||
|
iine_icon = 'heart'
|
||||||
+++
|
+++
|
||||||
|
|
BIN
content/projects/iine/iine_logo.webp
Normal file
BIN
content/projects/iine/iine_logo.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 39 KiB |
52
content/projects/iine/index.ca.md
Normal file
52
content/projects/iine/index.ca.md
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
+++
|
||||||
|
title = "iine"
|
||||||
|
description = "Botons d'apreciació centrats en la privadesa i accessibles per a la web petita/independent."
|
||||||
|
weight = 15
|
||||||
|
|
||||||
|
[taxonomies]
|
||||||
|
tags = ["web", "JavaScript", "privadesa", "backend"]
|
||||||
|
|
||||||
|
[extra]
|
||||||
|
local_image = "projects/iine/iine_logo.webp"
|
||||||
|
social_media_card = "social_cards/projects_iine.jpg"
|
||||||
|
canonical_url = "https://osc.garden/projects/iine/"
|
||||||
|
+++
|
||||||
|
|
||||||
|
Botons d'apreciació per al teu blog, jardí digital, portafoli… No cal compte. Sense seguiment.
|
||||||
|
|
||||||
|
#### [GitHub](https://github.com/welpo/iine) • [Web](https://iine.to) {.centered-text}
|
||||||
|
|
||||||
|
## Característiques
|
||||||
|
|
||||||
|
- Sense marques de temps, sense IPs, sense seguiment
|
||||||
|
- ~3KB de JavaScript vanilla
|
||||||
|
- Funciona sense JavaScript
|
||||||
|
- Diverses icones: cor, polze amunt, vot positiu, o qualsevol emoji
|
||||||
|
- Construït per a la web petita/independent
|
||||||
|
- Gratuït per sempre
|
||||||
|
- Accessible per disseny
|
||||||
|
- Auto-hostejable
|
||||||
|
|
||||||
|
## Inici ràpid
|
||||||
|
|
||||||
|
Afegeix botons d'apreciació al teu lloc amb dues línies. Carrega l'script:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<script defer src="https://cdn.jsdelivr.net/gh/welpo/iine@main/iine.mini.js"></script>
|
||||||
|
```
|
||||||
|
|
||||||
|
Afegeix el botó:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<button class="iine-button" aria-hidden="true"></button>
|
||||||
|
```
|
||||||
|
|
||||||
|
Fet. Els teus visitants ja poden mostrar apreciació anònima pel teu contingut.
|
||||||
|
|
||||||
|
## Per què iine?
|
||||||
|
|
||||||
|
Volia afegir botons de m'agrada/felicitacions/alegria/apreciació al [meu blog](https://osc.garden) sense registrar-me a res, i assegurant-me que els meus visitants no fossin rastrejats.
|
||||||
|
|
||||||
|
Esperant que altres ho trobin útil, vaig fer el servei públic (codi obert) i gratuït per sempre (almenys fins que doni suport a més de 100k llocs web).
|
||||||
|
|
||||||
|
Construït per a blogs, portafolis, jardins digitals, i qualsevol que cregui que la web hauria de ser més humana.
|
52
content/projects/iine/index.es.md
Normal file
52
content/projects/iine/index.es.md
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
+++
|
||||||
|
title = "iine"
|
||||||
|
description = "Botones de apreciación centrados en la privacidad y accesibles para la web pequeña."
|
||||||
|
weight = 15
|
||||||
|
|
||||||
|
[taxonomies]
|
||||||
|
tags = ["web", "JavaScript", "privacidad", "backend"]
|
||||||
|
|
||||||
|
[extra]
|
||||||
|
local_image = "projects/iine/iine_logo.webp"
|
||||||
|
social_media_card = "social_cards/projects_iine.jpg"
|
||||||
|
canonical_url = "https://osc.garden/projects/iine/"
|
||||||
|
+++
|
||||||
|
|
||||||
|
Botones de apreciación para tu blog, jardín digital, portafolio… Sin cuenta requerida. Sin seguimiento.
|
||||||
|
|
||||||
|
#### [GitHub](https://github.com/welpo/iine) • [Sitio web](https://iine.to) {.centered-text}
|
||||||
|
|
||||||
|
## Características
|
||||||
|
|
||||||
|
- Sin marcas de tiempo, sin IPs, sin seguimiento
|
||||||
|
- ~3KB de JavaScript vanilla
|
||||||
|
- Funciona sin JavaScript
|
||||||
|
- Varios iconos: corazón, pulgar arriba, voto positivo, o cualquier emoji
|
||||||
|
- Construido para la web pequeña/independiente
|
||||||
|
- Gratis para siempre
|
||||||
|
- Accesible por diseño
|
||||||
|
- Auto-hosteable
|
||||||
|
|
||||||
|
## Inicio rápido
|
||||||
|
|
||||||
|
Añade botones de apreciación a tu sitio con dos líneas. Carga el script:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<script defer src="https://cdn.jsdelivr.net/gh/welpo/iine@main/iine.mini.js"></script>
|
||||||
|
```
|
||||||
|
|
||||||
|
Añade el botón:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<button class="iine-button" aria-hidden="true"></button>
|
||||||
|
```
|
||||||
|
|
||||||
|
Listo. Tus visitantes ya pueden mostrar apreciación anónima por tu contenido.
|
||||||
|
|
||||||
|
## ¿Por qué iine?
|
||||||
|
|
||||||
|
Quería añadir botones de me gusta/felicitaciones/alegría/apreciación a [mi blog](https://osc.garden) sin registrarme en nada, y asegurándome de que mis visitantes no fueran rastreados.
|
||||||
|
|
||||||
|
Esperando que otros lo encuentren útil, hice el servicio público (código abierto) y gratis para siempre (al menos hasta que soporte más de 100k sitios web).
|
||||||
|
|
||||||
|
Construido para blogs, portafolios, jardines digitales, y cualquiera que crea que la web debería ser más humana.
|
52
content/projects/iine/index.md
Normal file
52
content/projects/iine/index.md
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
+++
|
||||||
|
title = "iine"
|
||||||
|
description = "Privacy-focused & accessible like buttons for the small web."
|
||||||
|
weight = 15
|
||||||
|
|
||||||
|
[taxonomies]
|
||||||
|
tags = ["web", "JavaScript", "privacy", "backend"]
|
||||||
|
|
||||||
|
[extra]
|
||||||
|
local_image = "projects/iine/iine_logo.webp"
|
||||||
|
social_media_card = "social_cards/projects_iine.jpg"
|
||||||
|
canonical_url = "https://osc.garden/projects/iine/"
|
||||||
|
+++
|
||||||
|
|
||||||
|
Appreciation buttons for your blog, digital garden, portfolio… No account required. No tracking.
|
||||||
|
|
||||||
|
#### [GitHub](https://github.com/welpo/iine) • [Website](https://iine.to) {.centered-text}
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- No timestamps, no IPs, no tracking
|
||||||
|
- ~3KB of vanilla JavaScript
|
||||||
|
- Works without JavaScript
|
||||||
|
- Various icons: heart, thumbs up, upvote, or any emoji
|
||||||
|
- Built for the small/indie web
|
||||||
|
- Free forever
|
||||||
|
- Accessible by design
|
||||||
|
- Self-hostable
|
||||||
|
|
||||||
|
## Quick start
|
||||||
|
|
||||||
|
Add appreciation buttons to your site with two lines. Load the script:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<script defer src="https://cdn.jsdelivr.net/gh/welpo/iine@main/iine.mini.js"></script>
|
||||||
|
```
|
||||||
|
|
||||||
|
Add the button:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<button class="iine-button" aria-hidden="true"></button>
|
||||||
|
```
|
||||||
|
|
||||||
|
Done. Your visitors can now show anonymous appreciation for your content.
|
||||||
|
|
||||||
|
## Why iine?
|
||||||
|
|
||||||
|
I wanted to add like/kudos/cheers/appreciation buttons to [my blog](https://osc.garden) without signing up for anything, and making sure my visitors weren't tracked.
|
||||||
|
|
||||||
|
Hoping others find it useful, I made the service public (open source) and free forever (at least until it supports over 100k websites).
|
||||||
|
|
||||||
|
Built for blogs, portfolios, digital gardens, and anyone who believes the web should be more human.
|
BIN
content/projects/iine/social_cards/projects_iine.jpg
Normal file
BIN
content/projects/iine/social_cards/projects_iine.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 105 KiB |
|
@ -10,6 +10,7 @@ tags = ["Japonès", "interactiu", "web app", "web", "PWA", "JavaScript"]
|
||||||
local_image = "projects/ramu/ramu_logo.webp"
|
local_image = "projects/ramu/ramu_logo.webp"
|
||||||
canonical_url = "https://osc.garden/ca/projects/ramu/"
|
canonical_url = "https://osc.garden/ca/projects/ramu/"
|
||||||
social_media_card = "social_cards/projects_ramu.jpg"
|
social_media_card = "social_cards/projects_ramu.jpg"
|
||||||
|
iine_icon = '🐏'
|
||||||
+++
|
+++
|
||||||
|
|
||||||
<ruby>ラ<rt>ra</rt>ム<rt>mu</rt></ruby> és una aplicació web progressiva per practicar la lectura i comprensió auditiva de nombres en japonès. El nom reflecteix el seu propòsit: aconseguir accès aleatori (RAM; memòria d'accés aleatori) als nombres, en contraposició a una memòria seqüencial (1, 2, 3…).
|
<ruby>ラ<rt>ra</rt>ム<rt>mu</rt></ruby> és una aplicació web progressiva per practicar la lectura i comprensió auditiva de nombres en japonès. El nom reflecteix el seu propòsit: aconseguir accès aleatori (RAM; memòria d'accés aleatori) als nombres, en contraposició a una memòria seqüencial (1, 2, 3…).
|
||||||
|
|
|
@ -10,6 +10,7 @@ tags = ["Japonés", "interactivo", "web app", "web", "PWA", "JavaScript"]
|
||||||
local_image = "projects/ramu/ramu_logo.webp"
|
local_image = "projects/ramu/ramu_logo.webp"
|
||||||
canonical_url = "https://osc.garden/es/projects/ramu/"
|
canonical_url = "https://osc.garden/es/projects/ramu/"
|
||||||
social_media_card = "social_cards/projects_ramu.jpg"
|
social_media_card = "social_cards/projects_ramu.jpg"
|
||||||
|
iine_icon = '🐏'
|
||||||
+++
|
+++
|
||||||
|
|
||||||
<ruby>ラ<rt>ra</rt>ム<rt>mu</rt></ruby> es una aplicación web progresiva para practicar la lectura y comprensión auditiva de números en japonés. El nombre refleja su propósito: lograr acceso aleatorio (RAM; memoria de acceso aleatorio) a los números, en contraposición a una memoria secuencial (1, 2, 3…).
|
<ruby>ラ<rt>ra</rt>ム<rt>mu</rt></ruby> es una aplicación web progresiva para practicar la lectura y comprensión auditiva de números en japonés. El nombre refleja su propósito: lograr acceso aleatorio (RAM; memoria de acceso aleatorio) a los números, en contraposición a una memoria secuencial (1, 2, 3…).
|
||||||
|
|
|
@ -10,6 +10,7 @@ tags = ["Japanese", "interactive", "web app", "web", "PWA", "JavaScript"]
|
||||||
local_image = "projects/ramu/ramu_logo.webp"
|
local_image = "projects/ramu/ramu_logo.webp"
|
||||||
canonical_url = "https://osc.garden/projects/ramu/"
|
canonical_url = "https://osc.garden/projects/ramu/"
|
||||||
social_media_card = "social_cards/projects_ramu.jpg"
|
social_media_card = "social_cards/projects_ramu.jpg"
|
||||||
|
iine_icon = '🐏'
|
||||||
+++
|
+++
|
||||||
|
|
||||||
<ruby>ラ<rt>ra</rt>ム<rt>mu</rt></ruby> is a Progressive Web App to practice reading and listening to Japanese numbers. The name reflects its purpose: achieving RAM (Random Access Memory) to numbers, as opposed to sequential memory (1, 2, 3…).
|
<ruby>ラ<rt>ra</rt>ム<rt>mu</rt></ruby> is a Progressive Web App to practice reading and listening to Japanese numbers. The name reflects its purpose: achieving RAM (Random Access Memory) to numbers, as opposed to sequential memory (1, 2, 3…).
|
||||||
|
|
|
@ -23,6 +23,7 @@ local_image = "projects/tabi/tabi.webp"
|
||||||
- سمتان داكنة وفاتحة، مع التبديل التلقائي حسب إعدادات النظام
|
- سمتان داكنة وفاتحة، مع التبديل التلقائي حسب إعدادات النظام
|
||||||
- [دعم التعليقات](https://welpo.github.io/tabi/blog/comments/) باستخدام giscus أو utterances أو Hyvor Talk أو Isso
|
- [دعم التعليقات](https://welpo.github.io/tabi/blog/comments/) باستخدام giscus أو utterances أو Hyvor Talk أو Isso
|
||||||
- [دعم KaTeX](https://katex.org/) للمعادلات الرياضية
|
- [دعم KaTeX](https://katex.org/) للمعادلات الرياضية
|
||||||
|
- [دعم Indieweb](https://indieweb.org/) مع microformats وh-card وwebmentions
|
||||||
- [دعم Mermaid](https://welpo.github.io/tabi/blog/shortcodes/#mermaid-diagrams) لإنشاء المخططات
|
- [دعم Mermaid](https://welpo.github.io/tabi/blog/shortcodes/#mermaid-diagrams) لإنشاء المخططات
|
||||||
- [بحث محلي](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#search) متعدد اللغات
|
- [بحث محلي](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#search) متعدد اللغات
|
||||||
- تصميم متجاوب يعمل على جميع الأجهزة
|
- تصميم متجاوب يعمل على جميع الأجهزة
|
||||||
|
|
|
@ -10,6 +10,7 @@ tags = ["web", "JavaScript"]
|
||||||
local_image = "projects/tabi/tabi.webp"
|
local_image = "projects/tabi/tabi.webp"
|
||||||
canonical_url = "https://osc.garden/ca/projects/tabi/"
|
canonical_url = "https://osc.garden/ca/projects/tabi/"
|
||||||
social_media_card = "social_cards/ca_projects_tabi.jpg"
|
social_media_card = "social_cards/ca_projects_tabi.jpg"
|
||||||
|
iine_icon = '🌱'
|
||||||
+++
|
+++
|
||||||
|
|
||||||
[**tabi**](https://github.com/welpo/tabi) és un tema modern i ric en funcionalitat per a [Zola](https://www.getzola.org/), un generador de llocs web estàtics molt ràpid.
|
[**tabi**](https://github.com/welpo/tabi) és un tema modern i ric en funcionalitat per a [Zola](https://www.getzola.org/), un generador de llocs web estàtics molt ràpid.
|
||||||
|
@ -26,7 +27,9 @@ social_media_card = "social_cards/ca_projects_tabi.jpg"
|
||||||
- [Suport multilingüe complet](https://welpo.github.io/tabi/ca/blog/faq-languages/#com-gestiona-tabi-el-suport-multilingue). Afegeix tants idiomes com vulguis i deixa que els teus usuaris triin amb el selector d'idioma.
|
- [Suport multilingüe complet](https://welpo.github.io/tabi/ca/blog/faq-languages/#com-gestiona-tabi-el-suport-multilingue). Afegeix tants idiomes com vulguis i deixa que els teus usuaris triin amb el selector d'idioma.
|
||||||
- [Suport per a sèries](https://welpo.github.io/tabi/ca/blog/series/) per crear contingut seqüencial com tutorials, cursos i històries multipart.
|
- [Suport per a sèries](https://welpo.github.io/tabi/ca/blog/series/) per crear contingut seqüencial com tutorials, cursos i històries multipart.
|
||||||
- Puntuació perfecta en Lighthouse (Rendiment, Accessibilitat, Millors Pràctiques i SEO).
|
- Puntuació perfecta en Lighthouse (Rendiment, Accessibilitat, Millors Pràctiques i SEO).
|
||||||
|
- Suport per a [Indieweb](https://indieweb.org/) amb microformats, suport per a [hcard](https://welpo.github.io/tabi/ca/blog/mastering-tabi-settings/#h-card-representativa) i [webmentions](https://welpo.github.io/tabi/ca/blog/mastering-tabi-settings/#webmentions).
|
||||||
- Suport per a [diagrames de Mermaid](https://welpo.github.io/tabi/ca/blog/shortcodes/#diagrames-de-mermaid) per a crear diagrames i gràfics amb text.
|
- Suport per a [diagrames de Mermaid](https://welpo.github.io/tabi/ca/blog/shortcodes/#diagrames-de-mermaid) per a crear diagrames i gràfics amb text.
|
||||||
|
- Botons de «m'agrada» d'[iine](https://iine.to/) per mostrar apreciació anònima pel teu contingut.
|
||||||
- Ressaltat de sintaxi de codi amb colors basats en [Catppuccin](https://github.com/catppuccin/catppuccin) Frappé.
|
- Ressaltat de sintaxi de codi amb colors basats en [Catppuccin](https://github.com/catppuccin/catppuccin) Frappé.
|
||||||
- Suport per a [comentaris usant giscus, utterances, Hyvor Talk o Isso](https://welpo.github.io/tabi/ca/blog/comments/).
|
- Suport per a [comentaris usant giscus, utterances, Hyvor Talk o Isso](https://welpo.github.io/tabi/ca/blog/comments/).
|
||||||
- [Cerca local](https://welpo.github.io/tabi/ca/blog/mastering-tabi-settings/#cerca) amb una interfície accessible i multilingüe.
|
- [Cerca local](https://welpo.github.io/tabi/ca/blog/mastering-tabi-settings/#cerca) amb una interfície accessible i multilingüe.
|
||||||
|
|
|
@ -10,6 +10,7 @@ tags = ["web", "JavaScript"]
|
||||||
local_image = "projects/tabi/tabi.webp"
|
local_image = "projects/tabi/tabi.webp"
|
||||||
canonical_url = "https://osc.garden/es/projects/tabi/"
|
canonical_url = "https://osc.garden/es/projects/tabi/"
|
||||||
social_media_card = "social_cards/es_projects_tabi.jpg"
|
social_media_card = "social_cards/es_projects_tabi.jpg"
|
||||||
|
iine_icon = '🌱'
|
||||||
+++
|
+++
|
||||||
|
|
||||||
[**tabi**](https://github.com/welpo/tabi) es un tema moderno y rico en funcionalidad para [Zola](https://www.getzola.org/), un generador de sitios web estáticos muy rápido.
|
[**tabi**](https://github.com/welpo/tabi) es un tema moderno y rico en funcionalidad para [Zola](https://www.getzola.org/), un generador de sitios web estáticos muy rápido.
|
||||||
|
@ -26,6 +27,8 @@ social_media_card = "social_cards/es_projects_tabi.jpg"
|
||||||
- Tema claro y oscuro. Se adapta a la configuración del sistema operativo, con un interruptor en la barra de navegación.
|
- Tema claro y oscuro. Se adapta a la configuración del sistema operativo, con un interruptor en la barra de navegación.
|
||||||
- [Soporte para series](https://welpo.github.io/tabi/es/blog/series/) para crear contenido secuencial como tutoriales, cursos e historias en varias partes.
|
- [Soporte para series](https://welpo.github.io/tabi/es/blog/series/) para crear contenido secuencial como tutoriales, cursos e historias en varias partes.
|
||||||
- Puntuación perfecta en Lighthouse (Rendimiento, Accesibilidad, Mejores Prácticas y SEO).
|
- Puntuación perfecta en Lighthouse (Rendimiento, Accesibilidad, Mejores Prácticas y SEO).
|
||||||
|
- Soporte para [Indieweb](https://indieweb.org/) con microformatos, soporte para [hcard](https://welpo.github.io/tabi/es/blog/mastering-tabi-settings/#h-card-representativa) y [webmentions](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#webmentions).
|
||||||
|
- Botones de «me gusta» de [iine](https://iine.to/) para mostrar aprecio anónimo por tu contenido.
|
||||||
- Soporte para [diagramas de Mermaid](https://welpo.github.io/tabi/es/blog/shortcodes/#diagramas-de-mermaid) para crear diagramas y gráficos con texto.
|
- Soporte para [diagramas de Mermaid](https://welpo.github.io/tabi/es/blog/shortcodes/#diagramas-de-mermaid) para crear diagramas y gráficos con texto.
|
||||||
- Resaltado de sintaxis de código con colores basados en [Catppuccin](https://github.com/catppuccin/catppuccin) Frappé.
|
- Resaltado de sintaxis de código con colores basados en [Catppuccin](https://github.com/catppuccin/catppuccin) Frappé.
|
||||||
- Soporte para [comentarios usando giscus, utterances, Hyvor Talk o Isso](https://welpo.github.io/tabi/es/blog/comments/).
|
- Soporte para [comentarios usando giscus, utterances, Hyvor Talk o Isso](https://welpo.github.io/tabi/es/blog/comments/).
|
||||||
|
|
|
@ -9,6 +9,7 @@ tags = ["web", "JavaScript"]
|
||||||
[extra]
|
[extra]
|
||||||
local_image = "projects/tabi/tabi.webp"
|
local_image = "projects/tabi/tabi.webp"
|
||||||
social_media_card = "social_cards/projects_tabi.jpg"
|
social_media_card = "social_cards/projects_tabi.jpg"
|
||||||
|
iine_icon = '🌱'
|
||||||
+++
|
+++
|
||||||
|
|
||||||
[**tabi**](https://github.com/welpo/tabi) is a modern, feature-rich theme for [Zola](https://www.getzola.org/), a fast static site generator.
|
[**tabi**](https://github.com/welpo/tabi) is a modern, feature-rich theme for [Zola](https://www.getzola.org/), a fast static site generator.
|
||||||
|
@ -27,7 +28,9 @@ social_media_card = "social_cards/projects_tabi.jpg"
|
||||||
- Perfect Lighthouse score (Performance, Accessibility, Best Practices and SEO).
|
- Perfect Lighthouse score (Performance, Accessibility, Best Practices and SEO).
|
||||||
- [Comprehensive multi-language support](https://welpo.github.io/tabi/blog/faq-languages/#how-does-tabi-handle-multilingual-support). Add as many languages as you wish.
|
- [Comprehensive multi-language support](https://welpo.github.io/tabi/blog/faq-languages/#how-does-tabi-handle-multilingual-support). Add as many languages as you wish.
|
||||||
- Support for [comments using giscus, utterances, Hyvor Talk, or Isso](https://welpo.github.io/tabi/blog/comments/).
|
- Support for [comments using giscus, utterances, Hyvor Talk, or Isso](https://welpo.github.io/tabi/blog/comments/).
|
||||||
|
- [Indieweb](https://indieweb.org/) ready with microformats, [hcard](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#representative-h-card) and [webmentions](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#webmentions) support.
|
||||||
- Code syntax highlighting with colours based on [Catppuccin](https://github.com/catppuccin/catppuccin) Frappé.
|
- Code syntax highlighting with colours based on [Catppuccin](https://github.com/catppuccin/catppuccin) Frappé.
|
||||||
|
- [iine like buttons](https://iine.to/) for anonymous appreciation of your content.
|
||||||
- [Mermaid support](https://welpo.github.io/tabi/blog/shortcodes/#mermaid-diagrams) to create diagrams and charts with text.
|
- [Mermaid support](https://welpo.github.io/tabi/blog/shortcodes/#mermaid-diagrams) to create diagrams and charts with text.
|
||||||
- [Local search](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#search) with an accessible, multi-lingual interface.
|
- [Local search](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#search) with an accessible, multi-lingual interface.
|
||||||
- [Custom Twitter card](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#social-media-cards) and automatic Open Graph tags.
|
- [Custom Twitter card](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#social-media-cards) and automatic Open Graph tags.
|
||||||
|
|
|
@ -30,6 +30,7 @@ few_results = "تم العثور على $NUMBER نتائج" # for 3 to 10 searc
|
||||||
many_results = "تم العثور على $NUMBER نتيجة" # 11 or more search results.
|
many_results = "تم العثور على $NUMBER نتيجة" # 11 or more search results.
|
||||||
|
|
||||||
# Navigation.
|
# Navigation.
|
||||||
|
skip_to_content = "الإنتقال إلى المحتوى"
|
||||||
pinned = "مثبتة"
|
pinned = "مثبتة"
|
||||||
jump_to_posts = "الإنتقال إلى التدوينات"
|
jump_to_posts = "الإنتقال إلى التدوينات"
|
||||||
read_more = "إقرأ المزيد"
|
read_more = "إقرأ المزيد"
|
||||||
|
@ -83,6 +84,9 @@ load_comments = "إظهار التعليقات"
|
||||||
copied = "تم النسخ!"
|
copied = "تم النسخ!"
|
||||||
copy_code_to_clipboard = "نسخ الشِفرة إلى الحافظة"
|
copy_code_to_clipboard = "نسخ الشِفرة إلى الحافظة"
|
||||||
|
|
||||||
|
# iine appreciation button.
|
||||||
|
like_this_post = "أعجبني"
|
||||||
|
|
||||||
# Footer: Powered by Zola and tabi.
|
# Footer: Powered by Zola and tabi.
|
||||||
powered_by = "مُشَغل بواسطة"
|
powered_by = "مُشَغل بواسطة"
|
||||||
and = "و"
|
and = "و"
|
||||||
|
|
|
@ -23,6 +23,7 @@ one_results = "$NUMBER resultat" # "1 result"
|
||||||
many_results = "$NUMBER resultats" # "3 results"
|
many_results = "$NUMBER resultats" # "3 results"
|
||||||
|
|
||||||
# Navigation.
|
# Navigation.
|
||||||
|
skip_to_content = "Saltar al contingut"
|
||||||
pinned = "Fixada"
|
pinned = "Fixada"
|
||||||
jump_to_posts = "Saltar als articles"
|
jump_to_posts = "Saltar als articles"
|
||||||
read_more = "Llegir més"
|
read_more = "Llegir més"
|
||||||
|
@ -68,6 +69,9 @@ load_comments = "Carregar comentaris"
|
||||||
copied = "Copiat!"
|
copied = "Copiat!"
|
||||||
copy_code_to_clipboard = "Copia el codi al porta-retalls"
|
copy_code_to_clipboard = "Copia el codi al porta-retalls"
|
||||||
|
|
||||||
|
# iine appreciation button.
|
||||||
|
like_this_post = "M'agrada aquesta publicació"
|
||||||
|
|
||||||
# Footer: Powered by Zola and tabi.
|
# Footer: Powered by Zola and tabi.
|
||||||
powered_by = "Propulsat per"
|
powered_by = "Propulsat per"
|
||||||
and = "i"
|
and = "i"
|
||||||
|
|
|
@ -27,6 +27,7 @@ one_results = "$NUMBER Ergebnis" # "1 result"
|
||||||
many_results = "$NUMBER Ergebnisse" # "3 results"
|
many_results = "$NUMBER Ergebnisse" # "3 results"
|
||||||
|
|
||||||
# Navigation.
|
# Navigation.
|
||||||
|
skip_to_content = "Zum Inhalt springen"
|
||||||
pinned = "Angeheftet"
|
pinned = "Angeheftet"
|
||||||
jump_to_posts = "Zu den Beiträgen springen"
|
jump_to_posts = "Zu den Beiträgen springen"
|
||||||
read_more = "Weiterlesen"
|
read_more = "Weiterlesen"
|
||||||
|
@ -72,6 +73,9 @@ load_comments = "Kommentare laden"
|
||||||
copied = "Kopiert!"
|
copied = "Kopiert!"
|
||||||
copy_code_to_clipboard = "Code in die Zwischenablage kopieren"
|
copy_code_to_clipboard = "Code in die Zwischenablage kopieren"
|
||||||
|
|
||||||
|
# iine appreciation button.
|
||||||
|
like_this_post = "Dieser Beitrag gefällt mir"
|
||||||
|
|
||||||
# Footer.
|
# Footer.
|
||||||
powered_by = "Angetrieben von"
|
powered_by = "Angetrieben von"
|
||||||
and = "und"
|
and = "und"
|
||||||
|
|
|
@ -23,6 +23,7 @@ one_results = "$NUMBER result" # "1 result"
|
||||||
many_results = "$NUMBER results" # "3 results"
|
many_results = "$NUMBER results" # "3 results"
|
||||||
|
|
||||||
# Navigation.
|
# Navigation.
|
||||||
|
skip_to_content = "Skip to content"
|
||||||
pinned = "Pinned"
|
pinned = "Pinned"
|
||||||
jump_to_posts = "Jump to posts"
|
jump_to_posts = "Jump to posts"
|
||||||
read_more = "Read more"
|
read_more = "Read more"
|
||||||
|
@ -68,6 +69,9 @@ load_comments = "Load comments"
|
||||||
copied = "Copied!"
|
copied = "Copied!"
|
||||||
copy_code_to_clipboard = "Copy code to clipboard"
|
copy_code_to_clipboard = "Copy code to clipboard"
|
||||||
|
|
||||||
|
# iine appreciation button.
|
||||||
|
like_this_post = "Like this post"
|
||||||
|
|
||||||
# Footer: Powered by Zola and tabi.
|
# Footer: Powered by Zola and tabi.
|
||||||
powered_by = "Powered by"
|
powered_by = "Powered by"
|
||||||
and = "&"
|
and = "&"
|
||||||
|
|
|
@ -23,6 +23,7 @@ one_results = "$NUMBER resultado"
|
||||||
many_results = "$NUMBER resultados"
|
many_results = "$NUMBER resultados"
|
||||||
|
|
||||||
# Navigation.
|
# Navigation.
|
||||||
|
skip_to_content = "Saltar al contenido"
|
||||||
pinned = "Fijada"
|
pinned = "Fijada"
|
||||||
jump_to_posts = "Saltar a las entradas"
|
jump_to_posts = "Saltar a las entradas"
|
||||||
read_more = "Leer más"
|
read_more = "Leer más"
|
||||||
|
@ -68,6 +69,9 @@ load_comments = "Cargar comentarios"
|
||||||
copied = "Copiado!"
|
copied = "Copiado!"
|
||||||
copy_code_to_clipboard = "Copiar código al portapapeles"
|
copy_code_to_clipboard = "Copiar código al portapapeles"
|
||||||
|
|
||||||
|
# iine appreciation button.
|
||||||
|
like_this_post = "Me gusta esta publicación"
|
||||||
|
|
||||||
# Footer: Powered by Zola and tabi.
|
# Footer: Powered by Zola and tabi.
|
||||||
powered_by = "Impulsado por"
|
powered_by = "Impulsado por"
|
||||||
and = "y"
|
and = "y"
|
||||||
|
|
|
@ -23,6 +23,7 @@ one_results = "$NUMBER tulemus" # "1 result"
|
||||||
many_results = "$NUMBER tulemust" # "3 results"
|
many_results = "$NUMBER tulemust" # "3 results"
|
||||||
|
|
||||||
# Navigation.
|
# Navigation.
|
||||||
|
skip_to_content = "Hüppa sisu juurde"
|
||||||
pinned = "Kinnitatud"
|
pinned = "Kinnitatud"
|
||||||
jump_to_posts = "Hüppa postitusteni"
|
jump_to_posts = "Hüppa postitusteni"
|
||||||
read_more = "Loe edasi"
|
read_more = "Loe edasi"
|
||||||
|
@ -68,6 +69,9 @@ load_comments = "Lae kommentaarid"
|
||||||
copied = "Kopeeritud!"
|
copied = "Kopeeritud!"
|
||||||
copy_code_to_clipboard = "Kopeeri kood lõikelauale"
|
copy_code_to_clipboard = "Kopeeri kood lõikelauale"
|
||||||
|
|
||||||
|
# iine appreciation button.
|
||||||
|
like_this_post = "Mulle meeldib see postitus"
|
||||||
|
|
||||||
# Footer: Powered by Zola and tabi.
|
# Footer: Powered by Zola and tabi.
|
||||||
powered_by = "Toetab"
|
powered_by = "Toetab"
|
||||||
and = "ja"
|
and = "ja"
|
||||||
|
|
|
@ -23,6 +23,7 @@ one_results = "$NUMBER نتیجه" # "1 result"
|
||||||
many_results = "$NUMBER نتیجه" # "3 results"
|
many_results = "$NUMBER نتیجه" # "3 results"
|
||||||
|
|
||||||
# Navigation.
|
# Navigation.
|
||||||
|
skip_to_content = "پرش به محتوا"
|
||||||
pinned = "سنجاقشده"
|
pinned = "سنجاقشده"
|
||||||
jump_to_posts = "پرش به نوشتهها"
|
jump_to_posts = "پرش به نوشتهها"
|
||||||
read_more = "ادامه مطلب"
|
read_more = "ادامه مطلب"
|
||||||
|
@ -69,6 +70,9 @@ load_comments = "بارگذاری نظرات"
|
||||||
copied = "کپی شد!"
|
copied = "کپی شد!"
|
||||||
copy_code_to_clipboard = "کپی کد به کلیپبورد"
|
copy_code_to_clipboard = "کپی کد به کلیپبورد"
|
||||||
|
|
||||||
|
# iine appreciation button.
|
||||||
|
like_this_post = "این مقاله را دوست دارم"
|
||||||
|
|
||||||
# Footer: Powered by Zola and tabi.
|
# Footer: Powered by Zola and tabi.
|
||||||
powered_by = "قدرت گرفته از"
|
powered_by = "قدرت گرفته از"
|
||||||
and = "و"
|
and = "و"
|
||||||
|
|
103
i18n/fi.toml
Normal file
103
i18n/fi.toml
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
language_name = "suomi" # Shown in language picker for multi-language sites.
|
||||||
|
date_locale = "fi_FI"
|
||||||
|
full_stop = "." # Used at the end of a sentence.
|
||||||
|
|
||||||
|
# Menu items.
|
||||||
|
# Should match the names in config.extra.menu and config.extra.footer_menu.
|
||||||
|
blog = "blogi"
|
||||||
|
archive = "arkisto"
|
||||||
|
tags = "tunnisteet"
|
||||||
|
projects = "projektit"
|
||||||
|
diagrams = "kaaviot"
|
||||||
|
about = "minusta"
|
||||||
|
contact = "yhteystiedot"
|
||||||
|
privacy = "tietosuojakäytäntö"
|
||||||
|
site_statistics = "tilastot"
|
||||||
|
sitemap = "sivustokartta"
|
||||||
|
|
||||||
|
# Search.
|
||||||
|
search = "Hae"
|
||||||
|
search_icon_title = "Paina $SHORTCUT avataksesi haun" # $SHORTCUT will be replaced with the actual keyboard shortcut.
|
||||||
|
clear_search = "Tyhjennä haku" # Title of the X icon next to search input.
|
||||||
|
zero_results = "Ei tuloksia"
|
||||||
|
one_results = "$NUMBER tulos" # "1 result"
|
||||||
|
many_results = "$NUMBER tulosta" # "3 results"
|
||||||
|
|
||||||
|
# Navigation.
|
||||||
|
skip_to_content = "Siirry sisältöön"
|
||||||
|
# Some will prefer artikkeli (=article) instead of julkaisu (=publication), but this is more general
|
||||||
|
pinned = "Kiinnitetty"
|
||||||
|
jump_to_posts = "Siirry julkaisuihin"
|
||||||
|
read_more = "Lue lisää"
|
||||||
|
one_posts = "$NUMBER julkaisu"
|
||||||
|
many_posts = "$NUMBER julkaisua" # "3 posts"
|
||||||
|
prev = "Edellinen" # As in "Previous" page.
|
||||||
|
next = "Seuraava" # As in "Next" page.
|
||||||
|
of = "/" # E.g. Page 1 "of" 3
|
||||||
|
all_posts = "Kaikki julkaisut"
|
||||||
|
all_tags = "Kaikki tunnisteet"
|
||||||
|
all_projects = "Kaikki projektit"
|
||||||
|
featured_projects = "Esittelyprojektit"
|
||||||
|
language_selection = "Kielivalinta"
|
||||||
|
toggle_mode = "Vaihda $MODE" # $MODE will be replaced by a value (or both) below. Literally "Change $MODE"
|
||||||
|
# The declension assumes that both values are used. e.g. "Change dark mode" wouldn't work and would need the "to" preposition
|
||||||
|
# It also omits the "mode" word: "Change dark/light mode" instead of "Change dark mode/light mode"
|
||||||
|
dark = "tumma"
|
||||||
|
light = "vaalea tila"
|
||||||
|
reset_mode = "Palauta oletustilaan"
|
||||||
|
|
||||||
|
# Quick navigation buttons.
|
||||||
|
toggle_toc = "Sisällysluettelo päälle/pois"
|
||||||
|
go_to_top = "Siirry sivun alkuun"
|
||||||
|
go_to_comments = "Siirry kommenttiosioon"
|
||||||
|
|
||||||
|
# Post metadata.
|
||||||
|
by_author = "Kirjoittanut $AUTHOR" # $AUTHOR will be replaced by the author(s). Literally "Written by $AUTHOR"
|
||||||
|
author_separator = ", " # For multiple authors. Ensure spacing where necessary.
|
||||||
|
author_conjunction = " ja " # For multiple authors. Ensure spacing where necessary.
|
||||||
|
draft = "LUONNOS"
|
||||||
|
zero_min_read = "<1 min. lukuaika"
|
||||||
|
one_min_read = "$NUMBER min. lukuaika"
|
||||||
|
many_min_read = "$NUMBER min. lukuaika"
|
||||||
|
zero_words = "Ei sanoja"
|
||||||
|
one_words = "$NUMBER sana"
|
||||||
|
many_words = "$NUMBER sanaa"
|
||||||
|
last_updated_on = "Päivitetty $DATE"
|
||||||
|
see_changes = "Katso muutokset"
|
||||||
|
|
||||||
|
# Post body.
|
||||||
|
table_of_contents = "Sisällysluettelo"
|
||||||
|
load_comments = "Lataa kommentit"
|
||||||
|
|
||||||
|
# Copy code block button.
|
||||||
|
copied = "Kopioitu!"
|
||||||
|
copy_code_to_clipboard = "Kopioi koodi leikepöydälle"
|
||||||
|
|
||||||
|
# iine appreciation button.
|
||||||
|
like_this_post = "Pidän tästä kirjoituksesta"
|
||||||
|
|
||||||
|
# Footer: Powered by Zola and tabi.
|
||||||
|
powered_by = "Pyörii ohjelmilla" # "Works using the software"
|
||||||
|
and = "&"
|
||||||
|
site_source = "Sivuston lähdekoodi"
|
||||||
|
|
||||||
|
# 404 error.
|
||||||
|
# https://welpo.github.io/tabi/404.html
|
||||||
|
page_missing = "Pyytämääsi sivua ei löydy"
|
||||||
|
translation_missing = "tai sitä ei ole vielä käännetty kielellesi"
|
||||||
|
check_url = "Tarkista URL-osoitteesta mahdolliset virheet tai"
|
||||||
|
go_home = "palaa etusivulle"
|
||||||
|
|
||||||
|
# For multilingual quote shortcode.
|
||||||
|
# https://welpo.github.io/tabi/blog/shortcodes/#multilingual-quotes
|
||||||
|
show_original_quote = "Näytä alkuperäinen lainaus"
|
||||||
|
show_translation = "Näytä käännös"
|
||||||
|
open_quotation_mark = "“"
|
||||||
|
close_quotation_mark = "”"
|
||||||
|
|
||||||
|
# Translations for stylised Atom feed.
|
||||||
|
# https://welpo.github.io/tabi/atom.xml
|
||||||
|
# Must contain "About Feeds"; it will become a link.
|
||||||
|
about_feeds = "Tämä on verkkosyöte, joka tunnetaan myös nimellä Atom-syöte. Tilaa kopioimalla URL-osoite osoitepalkista uutislukijaasi. Käy sivulla About Feeds saadaksesi lisätietoja ja aloittaakeksi. Se on ilmaista."
|
||||||
|
visit_the_site = "Vieraile sivustolla"
|
||||||
|
recent_posts = "Viimeisimmät julkaisut"
|
|
@ -23,6 +23,7 @@ one_results = "$NUMBER résultat" # "1 result"
|
||||||
many_results = "$NUMBER résultats" # "3 results"
|
many_results = "$NUMBER résultats" # "3 results"
|
||||||
|
|
||||||
# Navigation.
|
# Navigation.
|
||||||
|
skip_to_content = "Passer au contenu"
|
||||||
pinned = "Épinglé"
|
pinned = "Épinglé"
|
||||||
jump_to_posts = "Aller aux articles"
|
jump_to_posts = "Aller aux articles"
|
||||||
read_more = "Lire plus"
|
read_more = "Lire plus"
|
||||||
|
@ -68,6 +69,9 @@ load_comments = "Afficher les commentaires"
|
||||||
copied = "Copié !"
|
copied = "Copié !"
|
||||||
copy_code_to_clipboard = "Copier le code dans le presse-papier"
|
copy_code_to_clipboard = "Copier le code dans le presse-papier"
|
||||||
|
|
||||||
|
# iine appreciation button.
|
||||||
|
like_this_post = "J'aime cet article"
|
||||||
|
|
||||||
# Footer: Powered by Zola and tabi.
|
# Footer: Powered by Zola and tabi.
|
||||||
powered_by = "Propulsé par"
|
powered_by = "Propulsé par"
|
||||||
and = "et"
|
and = "et"
|
||||||
|
|
|
@ -25,6 +25,7 @@ one_results = "$NUMBER परिणाम" # "1 result"
|
||||||
many_results = "$NUMBER परिणाम" # "3 results"
|
many_results = "$NUMBER परिणाम" # "3 results"
|
||||||
|
|
||||||
# Navigation.
|
# Navigation.
|
||||||
|
skip_to_content = "सामग्री पर जाएं"
|
||||||
pinned = "पिन किया गया"
|
pinned = "पिन किया गया"
|
||||||
jump_to_posts = "पोस्ट पर जाएं"
|
jump_to_posts = "पोस्ट पर जाएं"
|
||||||
read_more = "और पढ़ें"
|
read_more = "और पढ़ें"
|
||||||
|
@ -70,6 +71,9 @@ load_comments = "कमेंट्स लोड करें"
|
||||||
copied = "कॉपी किया गया!"
|
copied = "कॉपी किया गया!"
|
||||||
copy_code_to_clipboard = "कोड क्लिपबोर्ड में कॉपी करें"
|
copy_code_to_clipboard = "कोड क्लिपबोर्ड में कॉपी करें"
|
||||||
|
|
||||||
|
# iine appreciation button.
|
||||||
|
like_this_post = "मुझे यह पोस्ट पसंद है"
|
||||||
|
|
||||||
# Footer: Powered by Zola and tabi.
|
# Footer: Powered by Zola and tabi.
|
||||||
powered_by = "चालित द्वारा"
|
powered_by = "चालित द्वारा"
|
||||||
and = "और"
|
and = "और"
|
||||||
|
|
|
@ -23,6 +23,7 @@ one_results = "$NUMBER risultato"
|
||||||
many_results = "$NUMBER risultati"
|
many_results = "$NUMBER risultati"
|
||||||
|
|
||||||
# Navigation.
|
# Navigation.
|
||||||
|
skip_to_content = "Salta al contenuto"
|
||||||
pinned = "In evidenza"
|
pinned = "In evidenza"
|
||||||
jump_to_posts = "Vai ai post"
|
jump_to_posts = "Vai ai post"
|
||||||
read_more = "Leggi di più"
|
read_more = "Leggi di più"
|
||||||
|
@ -68,6 +69,9 @@ load_comments = "Carica commenti"
|
||||||
copied = "Copiato!"
|
copied = "Copiato!"
|
||||||
copy_code_to_clipboard = "Copia codice negli appunti"
|
copy_code_to_clipboard = "Copia codice negli appunti"
|
||||||
|
|
||||||
|
# iine appreciation button.
|
||||||
|
like_this_post = "Mi piace questo post"
|
||||||
|
|
||||||
# Footer: Powered by Zola and tabi.
|
# Footer: Powered by Zola and tabi.
|
||||||
powered_by = "Alimentato da"
|
powered_by = "Alimentato da"
|
||||||
and = "e"
|
and = "e"
|
||||||
|
|
|
@ -27,6 +27,7 @@ one_results = "$NUMBER 結果" # "1 result"
|
||||||
many_results = "$NUMBER 結果" # "3 results"
|
many_results = "$NUMBER 結果" # "3 results"
|
||||||
|
|
||||||
# Navigation.
|
# Navigation.
|
||||||
|
skip_to_content = "コンテンツにスキップ"
|
||||||
pinned = "固定"
|
pinned = "固定"
|
||||||
jump_to_posts = "投稿へジャンプ"
|
jump_to_posts = "投稿へジャンプ"
|
||||||
read_more = "続きを読む"
|
read_more = "続きを読む"
|
||||||
|
@ -72,6 +73,9 @@ load_comments = "コメントを読む"
|
||||||
copied = "コピーしました!"
|
copied = "コピーしました!"
|
||||||
copy_code_to_clipboard = "コードをクリップボードにコピー"
|
copy_code_to_clipboard = "コードをクリップボードにコピー"
|
||||||
|
|
||||||
|
# iine appreciation button.
|
||||||
|
like_this_post = "いいね!"
|
||||||
|
|
||||||
# Footer: Powered by Zola and tabi.
|
# Footer: Powered by Zola and tabi.
|
||||||
powered_by = "Powered by"
|
powered_by = "Powered by"
|
||||||
and = "と"
|
and = "と"
|
||||||
|
|
|
@ -27,6 +27,7 @@ one_results = "$NUMBER 결과" # "1 result"
|
||||||
many_results = "$NUMBER 결과" # "3 results"
|
many_results = "$NUMBER 결과" # "3 results"
|
||||||
|
|
||||||
# Navigation.
|
# Navigation.
|
||||||
|
skip_to_content = "콘텐츠로 건너뛰기"
|
||||||
pinned = "고정됨"
|
pinned = "고정됨"
|
||||||
jump_to_posts = "게시물로 이동"
|
jump_to_posts = "게시물로 이동"
|
||||||
read_more = "더 읽기"
|
read_more = "더 읽기"
|
||||||
|
@ -72,6 +73,9 @@ load_comments = "댓글 불러오기"
|
||||||
copied = "복사됨!"
|
copied = "복사됨!"
|
||||||
copy_code_to_clipboard = "코드를 클립보드에 복사"
|
copy_code_to_clipboard = "코드를 클립보드에 복사"
|
||||||
|
|
||||||
|
# iine appreciation button.
|
||||||
|
like_this_post = "이 글이 좋아요"
|
||||||
|
|
||||||
# Footer: Powered by Zola and tabi.
|
# Footer: Powered by Zola and tabi.
|
||||||
powered_by = "제공됨"
|
powered_by = "제공됨"
|
||||||
and = "&"
|
and = "&"
|
||||||
|
|
|
@ -23,6 +23,7 @@ one_results = "$NUMBER resultaat" # "1 result"
|
||||||
many_results = "$NUMBER resultaten" # "3 results"
|
many_results = "$NUMBER resultaten" # "3 results"
|
||||||
|
|
||||||
# Navigation.
|
# Navigation.
|
||||||
|
skip_to_content = "Naar inhoud springen"
|
||||||
pinned = "Vastgezet"
|
pinned = "Vastgezet"
|
||||||
jump_to_posts = "Naar berichten springen"
|
jump_to_posts = "Naar berichten springen"
|
||||||
read_more = "Lees meer"
|
read_more = "Lees meer"
|
||||||
|
@ -68,6 +69,9 @@ load_comments = "Laad opmerkingen"
|
||||||
copied = "Gekopieerd!"
|
copied = "Gekopieerd!"
|
||||||
copy_code_to_clipboard = "Kopieer code naar klembord"
|
copy_code_to_clipboard = "Kopieer code naar klembord"
|
||||||
|
|
||||||
|
# iine appreciation button.
|
||||||
|
like_this_post = "Vind ik leuk"
|
||||||
|
|
||||||
# Footer: Powered by Zola and tabi.
|
# Footer: Powered by Zola and tabi.
|
||||||
powered_by = "Aangedreven door"
|
powered_by = "Aangedreven door"
|
||||||
and = "&"
|
and = "&"
|
||||||
|
|
|
@ -23,6 +23,7 @@ one_results = "$NUMBER ପରିଣାମ" # "1 result"
|
||||||
many_results = "$NUMBER ପରିଣାମଗୁଡ଼ିକ" # "3 results"
|
many_results = "$NUMBER ପରିଣାମଗୁଡ଼ିକ" # "3 results"
|
||||||
|
|
||||||
# Navigation.
|
# Navigation.
|
||||||
|
skip_to_content = "ବିଷୟବସ୍ତୁକୁ ଯାଆନ୍ତୁ"
|
||||||
pinned = "ପିନ୍ କରାଯାଇଛି"
|
pinned = "ପିନ୍ କରାଯାଇଛି"
|
||||||
jump_to_posts = "ପୋଷ୍ଟକୁ ଯାଆନ୍ତୁ"
|
jump_to_posts = "ପୋଷ୍ଟକୁ ଯାଆନ୍ତୁ"
|
||||||
read_more = "ଆହୁରି ପଢ଼ନ୍ତୁ"
|
read_more = "ଆହୁରି ପଢ଼ନ୍ତୁ"
|
||||||
|
@ -68,6 +69,9 @@ load_comments = "ମତାମତ ଲୋଡ କରନ୍ତୁ"
|
||||||
copied = "କପି ହେଲା!"
|
copied = "କପି ହେଲା!"
|
||||||
copy_code_to_clipboard = "କ୍ଲିପବୋର୍ଡକୁ କପି କରନ୍ତୁ"
|
copy_code_to_clipboard = "କ୍ଲିପବୋର୍ଡକୁ କପି କରନ୍ତୁ"
|
||||||
|
|
||||||
|
# iine appreciation button.
|
||||||
|
like_this_post = "ମୋର ଏହି ପୋସ୍ଟ ଭଲ ଲାଗେ"
|
||||||
|
|
||||||
# Footer: Powered by Zola and tabi.
|
# Footer: Powered by Zola and tabi.
|
||||||
powered_by = "ଚାଳିତ ଦ୍ୱାରା"
|
powered_by = "ଚାଳିତ ଦ୍ୱାରା"
|
||||||
and = "ଏବଂ"
|
and = "ଏବଂ"
|
||||||
|
|
|
@ -23,6 +23,7 @@ one_results = "$NUMBER resultado" # "1 result"
|
||||||
many_results = "$NUMBER resultados" # "3 results"
|
many_results = "$NUMBER resultados" # "3 results"
|
||||||
|
|
||||||
# Navigation.
|
# Navigation.
|
||||||
|
skip_to_content = "Pular para o conteúdo"
|
||||||
pinned = "Fixado"
|
pinned = "Fixado"
|
||||||
jump_to_posts = "Ir para as publicações"
|
jump_to_posts = "Ir para as publicações"
|
||||||
read_more = "Ler mais"
|
read_more = "Ler mais"
|
||||||
|
@ -68,6 +69,9 @@ load_comments = "Carregar comentários"
|
||||||
copied = "Copiado!"
|
copied = "Copiado!"
|
||||||
copy_code_to_clipboard = "Copiar código para a área de transferência"
|
copy_code_to_clipboard = "Copiar código para a área de transferência"
|
||||||
|
|
||||||
|
# iine appreciation button.
|
||||||
|
like_this_post = "Gosto desta publicação"
|
||||||
|
|
||||||
# Footer: Powered by Zola and tabi.
|
# Footer: Powered by Zola and tabi.
|
||||||
powered_by = "Impulsionado por"
|
powered_by = "Impulsionado por"
|
||||||
and = "e"
|
and = "e"
|
||||||
|
|
|
@ -28,6 +28,7 @@ few_results = "$NUMBER результата" # 2, 3, 4 but not 12-14
|
||||||
many_results = "$NUMBER результатов" # 5-9, 0, 11-14, and others
|
many_results = "$NUMBER результатов" # 5-9, 0, 11-14, and others
|
||||||
|
|
||||||
# Navigation.
|
# Navigation.
|
||||||
|
skip_to_content = "Перейти к содержанию"
|
||||||
pinned = "Закреплено"
|
pinned = "Закреплено"
|
||||||
jump_to_posts = "Перейти к записям"
|
jump_to_posts = "Перейти к записям"
|
||||||
read_more = "Читать далее"
|
read_more = "Читать далее"
|
||||||
|
@ -77,6 +78,9 @@ load_comments = "Загрузить комментарии"
|
||||||
copied = "Скопировано!"
|
copied = "Скопировано!"
|
||||||
copy_code_to_clipboard = "Скопировать код в буфер обмена"
|
copy_code_to_clipboard = "Скопировать код в буфер обмена"
|
||||||
|
|
||||||
|
# iine appreciation button.
|
||||||
|
like_this_post = "Мне нравится эта статья"
|
||||||
|
|
||||||
# Footer: Powered by Zola and tabi.
|
# Footer: Powered by Zola and tabi.
|
||||||
powered_by = "Под управлением"
|
powered_by = "Под управлением"
|
||||||
and = "&"
|
and = "&"
|
||||||
|
|
|
@ -33,6 +33,7 @@ few_results = "$NUMBER результати"
|
||||||
many_results = "$NUMBER результатів"
|
many_results = "$NUMBER результатів"
|
||||||
|
|
||||||
# Navigation.
|
# Navigation.
|
||||||
|
skip_to_content = "Перейти до вмісту"
|
||||||
pinned = "Закріплено"
|
pinned = "Закріплено"
|
||||||
jump_to_posts = "Перейти до дописів"
|
jump_to_posts = "Перейти до дописів"
|
||||||
read_more = "Читати далі"
|
read_more = "Читати далі"
|
||||||
|
@ -81,6 +82,9 @@ load_comments = "Завантажити коментарі"
|
||||||
copied = "Скопійовано!"
|
copied = "Скопійовано!"
|
||||||
copy_code_to_clipboard = "Копіювати код у буфер обміну"
|
copy_code_to_clipboard = "Копіювати код у буфер обміну"
|
||||||
|
|
||||||
|
# iine appreciation button.
|
||||||
|
like_this_post = "Мені подобається ця стаття"
|
||||||
|
|
||||||
# Footer: Powered by Zola and tabi.
|
# Footer: Powered by Zola and tabi.
|
||||||
powered_by = "Під управлінням"
|
powered_by = "Під управлінням"
|
||||||
and = "та"
|
and = "та"
|
||||||
|
|
|
@ -23,6 +23,7 @@ one_results = "$NUMBER 个结果"
|
||||||
many_results = "$NUMBER 个结果"
|
many_results = "$NUMBER 个结果"
|
||||||
|
|
||||||
# Navigation.
|
# Navigation.
|
||||||
|
skip_to_content = "跳到内容"
|
||||||
pinned = "置顶"
|
pinned = "置顶"
|
||||||
jump_to_posts = "跳转到文章"
|
jump_to_posts = "跳转到文章"
|
||||||
read_more = "阅读全文"
|
read_more = "阅读全文"
|
||||||
|
@ -68,6 +69,9 @@ load_comments = "载入留言"
|
||||||
copied = "已复制!" # Machine translated.
|
copied = "已复制!" # Machine translated.
|
||||||
copy_code_to_clipboard = "复制代码到剪贴板" # Machine translated.
|
copy_code_to_clipboard = "复制代码到剪贴板" # Machine translated.
|
||||||
|
|
||||||
|
# iine appreciation button.
|
||||||
|
like_this_post = "喜欢这篇文章"
|
||||||
|
|
||||||
# Footer: Powered by Zola and tabi.
|
# Footer: Powered by Zola and tabi.
|
||||||
powered_by = "网站基于"
|
powered_by = "网站基于"
|
||||||
and = "和"
|
and = "和"
|
||||||
|
|
|
@ -23,6 +23,7 @@ one_results = "$NUMBER 個結果"
|
||||||
many_results = "$NUMBER 個結果"
|
many_results = "$NUMBER 個結果"
|
||||||
|
|
||||||
# Navigation.
|
# Navigation.
|
||||||
|
skip_to_content = "跳到內容"
|
||||||
pinned = "釘選"
|
pinned = "釘選"
|
||||||
jump_to_posts = "跳轉到文章"
|
jump_to_posts = "跳轉到文章"
|
||||||
read_more = "閱讀全文"
|
read_more = "閱讀全文"
|
||||||
|
@ -68,6 +69,9 @@ load_comments = "載入留言"
|
||||||
copied = "已复制!" # Machine translated.
|
copied = "已复制!" # Machine translated.
|
||||||
copy_code_to_clipboard = "复制代码到剪贴板" # Machine translated.
|
copy_code_to_clipboard = "复制代码到剪贴板" # Machine translated.
|
||||||
|
|
||||||
|
# iine appreciation button.
|
||||||
|
like_this_post = "喜歡這篇文章"
|
||||||
|
|
||||||
# Footer: Powered by Zola and tabi.
|
# Footer: Powered by Zola and tabi.
|
||||||
powered_by = "網站基於"
|
powered_by = "網站基於"
|
||||||
and = "和"
|
and = "和"
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
@use 'parts/_header-anchor.scss';
|
@use 'parts/_header-anchor.scss';
|
||||||
@use 'parts/_header.scss';
|
@use 'parts/_header.scss';
|
||||||
@use 'parts/_home-banner.scss';
|
@use 'parts/_home-banner.scss';
|
||||||
|
@use 'parts/_iine.scss';
|
||||||
@use 'parts/_image-hover.scss';
|
@use 'parts/_image-hover.scss';
|
||||||
@use 'parts/_image-toggler.scss';
|
@use 'parts/_image-toggler.scss';
|
||||||
@use 'parts/_image.scss';
|
@use 'parts/_image.scss';
|
||||||
|
@ -22,6 +23,7 @@
|
||||||
@use 'parts/_table.scss';
|
@use 'parts/_table.scss';
|
||||||
@use 'parts/_tags.scss';
|
@use 'parts/_tags.scss';
|
||||||
@use 'parts/_theme-switch.scss';
|
@use 'parts/_theme-switch.scss';
|
||||||
|
@use 'parts/_webmention.scss';
|
||||||
@use 'parts/_zola-error.scss';
|
@use 'parts/_zola-error.scss';
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
|
@ -196,7 +198,7 @@ article {
|
||||||
}
|
}
|
||||||
|
|
||||||
.section-title {
|
.section-title {
|
||||||
display: block;
|
display: flex;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
margin-top: -0.15em;
|
margin-top: -0.15em;
|
||||||
color: var(--text-color-high-contrast);
|
color: var(--text-color-high-contrast);
|
||||||
|
|
|
@ -45,6 +45,7 @@ code {
|
||||||
|
|
||||||
a:hover code {
|
a:hover code {
|
||||||
background-color: inherit;
|
background-color: inherit;
|
||||||
|
padding-block: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
pre {
|
pre {
|
||||||
|
|
|
@ -98,11 +98,11 @@ header {
|
||||||
.tag {
|
.tag {
|
||||||
margin-inline-end: 0;
|
margin-inline-end: 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.separator {
|
.separator {
|
||||||
margin-inline-end: 0.2rem;
|
margin-inline-end: 0.2rem;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.language-switcher {
|
.language-switcher {
|
||||||
|
@ -125,6 +125,28 @@ header {
|
||||||
background: var(--meta-color);
|
background: var(--meta-color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.language-switcher-icon-with-code {
|
||||||
|
margin-inline-end: 0.3rem;
|
||||||
|
width: 0.7rem;
|
||||||
|
height: 0.7rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.language-switcher-icon-code {
|
||||||
|
position: absolute;
|
||||||
|
top: -0.15rem;
|
||||||
|
z-index: 10;
|
||||||
|
inset-inline-start: 0.7rem;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
color: var(--text-color);
|
||||||
|
font-size: 0.5rem;
|
||||||
|
text-transform: uppercase;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: var(--meta-color);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.dropdown {
|
.dropdown {
|
||||||
|
|
37
sass/parts/_iine.scss
Normal file
37
sass/parts/_iine.scss
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
.iine-button {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 5px;
|
||||||
|
transition: background-color 0.2s ease, color 0.2s ease, border-color 0.2s ease;
|
||||||
|
cursor: pointer;
|
||||||
|
border: none;
|
||||||
|
background: transparent;
|
||||||
|
color: inherit;
|
||||||
|
font-family: var(--sans-serif-font);
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
appearance: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-size: inherit;
|
||||||
|
line-height: inherit;
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.counter {
|
||||||
|
margin-left: .2rem;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
svg {
|
||||||
|
width: 1em;
|
||||||
|
height: 1em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.iine-auto-buttons {
|
||||||
|
margin-top: 2rem;
|
||||||
|
padding: 1rem 0;
|
||||||
|
}
|
|
@ -48,6 +48,9 @@ ul {
|
||||||
|
|
||||||
.title-container {
|
.title-container {
|
||||||
padding-bottom: 8px;
|
padding-bottom: 8px;
|
||||||
|
.social {
|
||||||
|
margin-inline-start: 0.5rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.bottom-divider {
|
.bottom-divider {
|
||||||
|
@ -85,30 +88,21 @@ a {
|
||||||
// External link styles with `external_links_class = "external"`.
|
// External link styles with `external_links_class = "external"`.
|
||||||
main {
|
main {
|
||||||
--external-link-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M11 5h-6v14h14v-6'/%3E%3Cpath d='M13 11l7 -7'/%3E%3Cpath d='M21 3h-6M21 3v6'/%3E%3C/g%3E%3C/svg%3E");
|
--external-link-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M11 5h-6v14h14v-6'/%3E%3Cpath d='M13 11l7 -7'/%3E%3Cpath d='M21 3h-6M21 3v6'/%3E%3C/g%3E%3C/svg%3E");
|
||||||
a.external:not(:has(img, svg, video, picture, figure)) {
|
|
||||||
display: inline-block;
|
|
||||||
padding-inline-end: 0.9em;
|
|
||||||
}
|
|
||||||
|
|
||||||
a.external:not(:has(img, svg, video, picture, figure))::after {
|
a.external:not(:has(img, svg, video, picture, figure))::after {
|
||||||
-webkit-mask-image: var(--external-link-icon);
|
|
||||||
-webkit-mask-size: 100% 100%;
|
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
position: absolute;
|
vertical-align: -0.05em;
|
||||||
top: 50%;
|
margin-inline-start: 0.1em;
|
||||||
transform: translateY(-50%);
|
|
||||||
mask-image: var(--external-link-icon);
|
|
||||||
mask-size: 100% 100%;
|
|
||||||
margin-inline-start: 0.2em;
|
|
||||||
inset-inline-end: 0;
|
|
||||||
background-color: currentColor;
|
background-color: currentColor;
|
||||||
width: 0.8em;
|
width: 0.8em;
|
||||||
height: 0.8em;
|
height: 0.8em;
|
||||||
content: '';
|
content: '';
|
||||||
|
-webkit-mask-image: var(--external-link-icon);
|
||||||
|
-webkit-mask-size: 100% 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:dir(rtl) a.external:not(:has(img, svg, video, picture, figure))::after {
|
&:dir(rtl) a.external:not(:has(img, svg, video, picture, figure))::after {
|
||||||
transform: translateY(-50%) rotate(-90deg);
|
transform: rotate(-90deg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.meta a.external:not(:has(img, svg, video, picture, figure))::after {
|
.meta a.external:not(:has(img, svg, video, picture, figure))::after {
|
||||||
|
@ -334,3 +328,28 @@ details summary {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#skip-link {
|
||||||
|
position: absolute;
|
||||||
|
top: -40px;
|
||||||
|
left: 0;
|
||||||
|
transform: translateY(-100%);
|
||||||
|
opacity: 0;
|
||||||
|
z-index: 9999;
|
||||||
|
transition: all 0.1s ease;
|
||||||
|
border-radius: 0 0 5px 0;
|
||||||
|
background-color: var(--primary-color);
|
||||||
|
padding: 4px 8px;
|
||||||
|
color: var(--hover-color);
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#skip-link:focus {
|
||||||
|
top: 0;
|
||||||
|
transform: translateY(0);
|
||||||
|
opacity: 1;
|
||||||
|
outline: 2px solid var(--text-color);
|
||||||
|
outline-offset: 2px;
|
||||||
|
}
|
||||||
|
|
|
@ -126,7 +126,7 @@ $padding: 2.5rem;
|
||||||
|
|
||||||
@media only screen and (max-width: 1100px) {
|
@media only screen and (max-width: 1100px) {
|
||||||
.bloglist-container {
|
.bloglist-container {
|
||||||
grid-template-columns: 1fr;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pinned-label svg {
|
.pinned-label svg {
|
||||||
|
|
149
sass/parts/_webmention.scss
Normal file
149
sass/parts/_webmention.scss
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
#webmentions {
|
||||||
|
position: relative;
|
||||||
|
z-index: 100;
|
||||||
|
margin: 0;
|
||||||
|
background-color: var(--background-color);
|
||||||
|
color: var(--text-color);
|
||||||
|
line-height: 1.2em;
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
margin-bottom: 1.5em;
|
||||||
|
font-size: 1.1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
font-size: 0.9em;
|
||||||
|
|
||||||
|
svg {
|
||||||
|
margin-inline-end: 0.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.svg-icon,
|
||||||
|
span {
|
||||||
|
margin-inline-end: .3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ol {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
li,
|
||||||
|
p {
|
||||||
|
font-family: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.likes {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
margin-top: 0.5rem;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
|
||||||
|
li {
|
||||||
|
position: relative;
|
||||||
|
transition: transform 0.8s ease-out, z-index 0s linear 0.4s;
|
||||||
|
margin-bottom: .375rem;
|
||||||
|
margin-inline-start: -.75rem;
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
margin-inline-start: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: scale(1.3) translateY(-4px);
|
||||||
|
z-index: 10;
|
||||||
|
transition: transform 0.05s ease-out, z-index 0s linear 0s;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
display: block;
|
||||||
|
border: 2px solid var(--background-color, white);
|
||||||
|
border-radius: 50%;
|
||||||
|
aspect-ratio: 1/1;
|
||||||
|
width: 2.5rem;
|
||||||
|
height: 2.5rem;
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
border-radius: 10px;
|
||||||
|
background: var(--bg-0);
|
||||||
|
padding: 1rem;
|
||||||
|
overflow: hidden;
|
||||||
|
font-size: 80%;
|
||||||
|
|
||||||
|
div {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin-bottom: 0;
|
||||||
|
line-height: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.p-author {
|
||||||
|
font-style: bold;
|
||||||
|
font-size: 1.3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.u-url {
|
||||||
|
font-style: italic;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.u-author {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
img {
|
||||||
|
display: block;
|
||||||
|
margin-inline-end: .625rem;
|
||||||
|
width: 2rem;
|
||||||
|
max-width: 100%;
|
||||||
|
height: 2rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
form {
|
||||||
|
input {
|
||||||
|
flex: 1;
|
||||||
|
border: 1px solid var(--divider-color);
|
||||||
|
border-radius: 20px 0px 0px 20px;
|
||||||
|
background-color: var(--input-background-color);
|
||||||
|
padding-inline: 1rem 1rem;
|
||||||
|
padding-block: .75rem;
|
||||||
|
width: calc(60% - 2rem);
|
||||||
|
color: var(--text-color);
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
flex: 1;
|
||||||
|
border: 1px solid var(--divider-color);
|
||||||
|
border-radius: 0px 20px 20px 0px;
|
||||||
|
background-color: var(--input-background-color);
|
||||||
|
padding-inline: 0.7rem 0.7rem;
|
||||||
|
padding-block: .75rem;
|
||||||
|
width: 7rem;
|
||||||
|
color: var(--text-color);
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:hover {
|
||||||
|
cursor: pointer;
|
||||||
|
background-color: var(--primary-color);
|
||||||
|
color: var(--hover-color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1 +1 @@
|
||||||
Subproject commit a128adaf967bdb232bf65a021d97b9d20e90d960
|
Subproject commit 8e0a56e333ad53b01a6036744facaab21404d329
|
|
@ -81,7 +81,14 @@ get_latest_version_github() {
|
||||||
|
|
||||||
get_local_mermaid_version() {
|
get_local_mermaid_version() {
|
||||||
local version
|
local version
|
||||||
|
# Old format.
|
||||||
version=$(grep -o '[A-Za-z]\+t="[0-9]\+\.[0-9]\+\.[0-9]\+"' "$MERMAID_PATH" | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+' || true)
|
version=$(grep -o '[A-Za-z]\+t="[0-9]\+\.[0-9]\+\.[0-9]\+"' "$MERMAID_PATH" | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+' || true)
|
||||||
|
|
||||||
|
# New format.
|
||||||
|
if [ -z "$version" ]; then
|
||||||
|
version=$(grep -o 'version:"[0-9]\+\.[0-9]\+\.[0-9]\+"' "$MERMAID_PATH" | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+' || true)
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -z "$version" ]; then
|
if [ -z "$version" ]; then
|
||||||
exit_with_message "Could not detect local Mermaid.js version"
|
exit_with_message "Could not detect local Mermaid.js version"
|
||||||
fi
|
fi
|
||||||
|
|
2
static/js/katex.min.js
vendored
2
static/js/katex.min.js
vendored
File diff suppressed because one or more lines are too long
2067
static/js/mermaid.min.js
vendored
2067
static/js/mermaid.min.js
vendored
File diff suppressed because one or more lines are too long
412
static/js/webmention.js
Normal file
412
static/js/webmention.js
Normal file
|
@ -0,0 +1,412 @@
|
||||||
|
/* webmention.js
|
||||||
|
|
||||||
|
Simple thing for embedding webmentions from webmention.io into a page, client-side.
|
||||||
|
|
||||||
|
(c)2018-2022 fluffy (http://beesbuzz.biz)
|
||||||
|
2025 mmai (https://misc.rhumbs.fr)
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
Basic usage:
|
||||||
|
|
||||||
|
<script src="/path/to/webmention.js" data-param="val" ... async />
|
||||||
|
<div id="webmentions"></div>
|
||||||
|
|
||||||
|
Allowed parameters:
|
||||||
|
|
||||||
|
page-url:
|
||||||
|
|
||||||
|
The base URL to use for this page. Defaults to window.location
|
||||||
|
|
||||||
|
add-urls:
|
||||||
|
|
||||||
|
Additional URLs to check, separated by |s
|
||||||
|
|
||||||
|
id:
|
||||||
|
|
||||||
|
The HTML ID for the object to fill in with the webmention data.
|
||||||
|
Defaults to "webmentions"
|
||||||
|
|
||||||
|
wordcount:
|
||||||
|
|
||||||
|
The maximum number of words to render in reply mentions.
|
||||||
|
|
||||||
|
max-webmentions:
|
||||||
|
|
||||||
|
The maximum number of mentions to retrieve. Defaults to 30.
|
||||||
|
|
||||||
|
prevent-spoofing:
|
||||||
|
|
||||||
|
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").
|
||||||
|
|
||||||
|
sort-by:
|
||||||
|
|
||||||
|
What to order the responses by; defaults to 'published'. See
|
||||||
|
https://github.com/aaronpk/webmention.io#api
|
||||||
|
|
||||||
|
sort-dir:
|
||||||
|
|
||||||
|
The order to sort the responses by; defaults to 'up' (i.e. oldest
|
||||||
|
first). See https://github.com/aaronpk/webmention.io#api
|
||||||
|
|
||||||
|
comments-are-reactions:
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
A more detailed example:
|
||||||
|
|
||||||
|
<!-- If you want to translate the UI -->
|
||||||
|
<script src="/path/to/umd/i18next.js"></script>
|
||||||
|
<script>
|
||||||
|
// Setup i18next as described in https://www.i18next.com/overview/getting-started#basic-sample
|
||||||
|
</script>
|
||||||
|
<!-- Otherwise, only using the following is fine -->
|
||||||
|
<script src="/path/to/webmention.min.js"
|
||||||
|
data-id="webmentionContainer"
|
||||||
|
data-wordcount="30"
|
||||||
|
data-prevent-spoofing="true"
|
||||||
|
data-comments-are-reactions="true"
|
||||||
|
/>
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Begin LibreJS code licensing
|
||||||
|
// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
// Shim i18next
|
||||||
|
window.i18next = window.i18next || {
|
||||||
|
t: function t(/** @type {string} */key) { return key; }
|
||||||
|
}
|
||||||
|
const t = window.i18next.t.bind(window.i18next);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read the configuration value.
|
||||||
|
*
|
||||||
|
* @param {string} key The configuration key.
|
||||||
|
* @param {string} dfl The default value.
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
function getCfg(key, dfl) {
|
||||||
|
return document.currentScript.getAttribute("data-" + key) || dfl;
|
||||||
|
}
|
||||||
|
|
||||||
|
const refurl = getCfg("page-url", window.location.href.replace(/#.*$/, ""));
|
||||||
|
const addurls = getCfg("add-urls", undefined);
|
||||||
|
const containerID = getCfg("id", "webmentions");
|
||||||
|
/** @type {Number} */
|
||||||
|
const textMaxWords = getCfg("wordcount");
|
||||||
|
const maxWebmentions = getCfg("max-webmentions", 30);
|
||||||
|
const mentionSource = getCfg("prevent-spoofing") ? "wm-source" : "url";
|
||||||
|
const sortBy = getCfg("sort-by", "published");
|
||||||
|
const sortDir = getCfg("sort-dir", "up");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Strip the protocol off a URL.
|
||||||
|
*
|
||||||
|
* @param {string} url The URL to strip protocol off.
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
function stripurl(url) {
|
||||||
|
return url.substr(url.indexOf('//'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deduplicate multiple mentions from the same source URL.
|
||||||
|
*
|
||||||
|
* @param {Array<Reaction>} mentions Mentions of the source URL.
|
||||||
|
* @return {Array<Reaction>}
|
||||||
|
*/
|
||||||
|
function dedupe(mentions) {
|
||||||
|
/** @type {Array<Reaction>} */
|
||||||
|
const filtered = [];
|
||||||
|
/** @type {Record<string, boolean>} */
|
||||||
|
const seen = {};
|
||||||
|
|
||||||
|
mentions.forEach(function (r) {
|
||||||
|
// Strip off the protocol (i.e. treat http and https the same)
|
||||||
|
const source = stripurl(r.url);
|
||||||
|
if (!seen[source]) {
|
||||||
|
filtered.push(r);
|
||||||
|
seen[source] = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return filtered;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Format comments as HTML.
|
||||||
|
*
|
||||||
|
* @param {Array<Reaction>} comments The comments to format.
|
||||||
|
* @returns string
|
||||||
|
*/
|
||||||
|
function formatComments(type, comments) {
|
||||||
|
|
||||||
|
let html = `
|
||||||
|
<div class="webcomments">
|
||||||
|
<h3 id="replies-header">` + getIcon('comment') + ` <span>` + comments.length + `</span> ` + type + `s </h3>
|
||||||
|
<ol aria-labelledby="replies-header" role="list">`;
|
||||||
|
comments.forEach(function (comment) {
|
||||||
|
let content = '';
|
||||||
|
if (comment.hasOwnProperty('content')) {
|
||||||
|
if (comment.content.hasOwnProperty('html')) {
|
||||||
|
content = comment.content.html;
|
||||||
|
} else if (comment.content.hasOwnProperty('text')) {
|
||||||
|
content = comment.content.text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
html += `
|
||||||
|
<li class="comment h-entry">
|
||||||
|
<div>
|
||||||
|
<a class="comment_author u-author"
|
||||||
|
href="`+ comment.author.url + `"
|
||||||
|
target="_blank"
|
||||||
|
title="`+ comment.author.name + `"
|
||||||
|
rel="noreferrer">
|
||||||
|
<img
|
||||||
|
src="`+ comment.author.photo + `"
|
||||||
|
alt=""
|
||||||
|
class="u-photo"
|
||||||
|
loading="lazy"
|
||||||
|
decoding="async"
|
||||||
|
width="48"
|
||||||
|
height="48"
|
||||||
|
>
|
||||||
|
<span class="p-author">`+ comment.author.name + `</span>
|
||||||
|
</a>`;
|
||||||
|
if (comment.published) {
|
||||||
|
const published = new Date(comment.published);
|
||||||
|
html += `
|
||||||
|
<time class="dt-published" datetime="`+ comment.published + `">` + published.toLocaleString(undefined, { dateStyle: "medium", timeStyle: "short" }) + `</time>`;
|
||||||
|
}
|
||||||
|
html += `
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="e-entry">`+ content + `
|
||||||
|
<a class="u-url"
|
||||||
|
href="`+ comment.url + `"
|
||||||
|
target="_blank"
|
||||||
|
rel="noreferrer">
|
||||||
|
source
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
`;
|
||||||
|
});
|
||||||
|
html += `
|
||||||
|
</ol >
|
||||||
|
</div >
|
||||||
|
`;
|
||||||
|
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} Reaction
|
||||||
|
* @property {string} url
|
||||||
|
* @property {Object?} author
|
||||||
|
* @property {string?} author.name
|
||||||
|
* @property {string?} author.photo
|
||||||
|
* @property {Object?} content
|
||||||
|
* @property {string?} content.text
|
||||||
|
* @property {RSVPEmoji?} rsvp
|
||||||
|
* @property {MentionType?} wm-property
|
||||||
|
* @property {string?} wm-source
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getIcon(name) {
|
||||||
|
|
||||||
|
if (name == 'like') {
|
||||||
|
return `<svg focusable = "false" width = "24" height = "24" viewBox = "0 0 192 192" xmlns = "http://www.w3.org/2000/svg" > <path d="M95.997 41.986l-.026-.035C85.746 28.36 68.428 21.423 51.165 24.881 30.138 29.094 15.004 47.558 15 69.003c0 24.413 14.906 47.964 39.486 70.086 8.43 7.586 17.437 14.468 26.444 20.533.728.49 1.444.967 2.148 1.43l1.39.909 1.355.872 1.317.835.645.403 1.259.78 1.194.726 1.032.619 1.38.807.418.236a6 6 0 005.864 0l1.138-.654 1.154-.684 1.118-.675.614-.376 1.26-.779a212 212 0 00.644-.403l1.317-.835 1.355-.872 1.39-.909c.704-.463 1.42-.94 2.148-1.43 9.007-6.065 18.015-12.947 26.444-20.533C162.094 116.967 177 93.416 177 69.004c-.004-21.446-15.138-39.91-36.165-44.123-17.07-3.42-34.174 3.323-44.43 16.568l-.408.537zm42.48-5.338c15.421 3.09 26.52 16.63 26.523 32.357 0 19.607-12.438 39.847-33.532 59.357l-1.316 1.205c-.22.201-.443.402-.666.603-7.977 7.18-16.548 13.727-25.118 19.498l-.745.5c-.74.494-1.466.973-2.177 1.437l-1.402.906-1.359.864-.662.416-1.292.8-.732.446-.73-.446-1.292-.8-.662-.416-1.36-.864-1.4-.906a235.406 235.406 0 01-2.923-1.937c-8.57-5.77-17.14-12.319-25.118-19.498l-.666-.603-1.316-1.205C39.438 108.852 27 88.612 27 69.004c.003-15.726 11.102-29.267 26.523-32.356 15.253-3.056 30.565 4.954 36.756 19.208l.204.478c2.084 4.878 9.009 4.85 11.053-.045 6.062-14.511 21.52-22.73 36.941-19.641z" fill="currentColor" /></svg> `;
|
||||||
|
} else if (name == 'repost') {
|
||||||
|
return `<svg focusable = "false" width = "24" height = "24" viewBox = "0 0 192 192" xmlns = "http://www.w3.org/2000/svg" > <path d="M18.472 146.335l-.075-.184a5.968 5.968 0 01-.216-.684l-.014-.056a5.643 5.643 0 01-.082-.397l-.013-.083a5.886 5.886 0 01-.072-.96V144c0-.157.006-.313.018-.467l.006-.075c.012-.132.028-.261.048-.39l.016-.095c.008-.05.017-.1.027-.149.005-.019.008-.038.012-.058.028-.133.06-.264.096-.393l.026-.088a5.86 5.86 0 01.482-1.159l.043-.077a5.642 5.642 0 01.31-.49l.015-.022.076-.104.044-.059a3.856 3.856 0 01.165-.208l.052-.061c.102-.12.21-.236.321-.348l18-18a6 6 0 018.661 8.303l-.175.183L38.484 138H120c23.196 0 42-18.804 42-42a6 6 0 0112 0c0 29.525-23.696 53.516-53.107 53.993L120 150H38.486l7.757 7.757a6 6 0 01.175 8.303l-.175.183a6 6 0 01-8.303.175l-.183-.175-18-18-.145-.151a6.036 6.036 0 01-.829-1.125l-.058-.105a4.08 4.08 0 01-.06-.114l-.04-.077a4.409 4.409 0 01-.139-.3l-.014-.036zM154.06 25.582l.183.175 18 18a6.036 6.036 0 01.974 1.276l.058.105c.02.035.038.07.056.105l.043.086a4.411 4.411 0 01.14.3l.014.036a5.965 5.965 0 01.291.868l.014.056c.032.13.059.263.082.397l.013.083a5.886 5.886 0 01.067.692v.014a6.11 6.11 0 01-.013.692l-.006.075a5.856 5.856 0 01-.048.39l-.016.095c-.008.05-.017.1-.027.149-.005.019-.008.038-.012.058-.028.133-.06.264-.096.393l-.026.088a5.86 5.86 0 01-.482 1.159l-.043.077-.052.09-.029.048a6.006 6.006 0 01-.32.478l-.044.059a3.857 3.857 0 01-.165.208l-.052.061a6.34 6.34 0 01-.176.197l-.145.15-18 18a6 6 0 01-8.661-8.302l.175-.183L153.514 54H72c-23.196 0-42 18.804-42 42a6 6 0 11-12 0c0-29.525 23.696-53.516 53.107-53.993L72 42h81.516l-7.759-7.757a6 6 0 01-.175-8.303l.175-.183a6 6 0 018.303-.175z" fill="currentColor" /></svg> `;
|
||||||
|
} else if (name == 'comment') {
|
||||||
|
return `<svg width = "24" height = "24" viewBox = "0 0 150 150" xmlns = "http://www.w3.org/2000/svg" > <path d="M75-.006a75 75 0 0174.997 74.31l.003.69c0 41.422-33.579 75-75 75H11.75c-6.49 0-11.75-5.26-11.75-11.75v-63.25a75 75 0 0175-75zm0 12a63 63 0 00-63 63v63h63c34.446 0 62.435-27.645 62.992-61.93l.008-1.041-.003-.633A63 63 0 0075 11.994zm21 72a6 6 0 01.225 11.996l-.225.004H51a6 6 0 01-.225-11.996l.225-.004h45zm0-24a6 6 0 01.225 11.996l-.225.004H51a6 6 0 01-.225-11.996l.225-.004h45z" fill="currentColor" /></svg> `;
|
||||||
|
} else if (name == 'bookmark') {
|
||||||
|
return `<svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" width="24" height="24" viewBox="0 0 24 24">
|
||||||
|
<path d="M 6.0097656 2 C 4.9143111 2 4.0097656 2.9025988 4.0097656 3.9980469 L 4 22 L 12 19 L 20 22 L 20 20.556641 L 20 4 C 20 2.9069372 19.093063 2 18 2 L 6.0097656 2 z M 6.0097656 4 L 18 4 L 18 19.113281 L 12 16.863281 L 6.0019531 19.113281 L 6.0097656 4 z" fill="currentColor"></path>
|
||||||
|
</svg>`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formats a list of reactions as HTML.
|
||||||
|
*
|
||||||
|
* @param {Array<Reaction>} reacts List of reactions to format
|
||||||
|
* @returns string
|
||||||
|
*/
|
||||||
|
function formatReactions(type, reacts) {
|
||||||
|
let html = `
|
||||||
|
<div class="color--primary" >
|
||||||
|
<h3 id=`+ type + ` - header"> ` + getIcon(type) + ` <span>` + reacts.length + `</span> ` + type + `s </h3>
|
||||||
|
|
||||||
|
<ol class="likes" role = "list" aria - labelledby="`+ type + `-header"> `;
|
||||||
|
|
||||||
|
reacts.forEach(function (react) {
|
||||||
|
html += `
|
||||||
|
<li class="h-card">
|
||||||
|
<a class="u-url"
|
||||||
|
href="`+ react.author.url + `
|
||||||
|
target="_blank"
|
||||||
|
rel = "noreferrer"
|
||||||
|
title = "`+ react.author.name + `" >
|
||||||
|
<img
|
||||||
|
alt=""
|
||||||
|
class="lazy mentions__image u-photo"
|
||||||
|
src="`+ react.author.photo + `"
|
||||||
|
loading="lazy"
|
||||||
|
decoding="async"
|
||||||
|
width="48"
|
||||||
|
height="48"
|
||||||
|
>
|
||||||
|
<span class="p-author visually-hidden" aria-hidden="true">{{ author }}</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
`;
|
||||||
|
});
|
||||||
|
|
||||||
|
html += `
|
||||||
|
</ol >
|
||||||
|
</div >
|
||||||
|
`;
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef WebmentionResponse
|
||||||
|
* @type {Object}
|
||||||
|
* @property {Array<Reaction>} children
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register event listener.
|
||||||
|
*/
|
||||||
|
window.addEventListener("load", async function () {
|
||||||
|
const container = document.getElementById(containerID);
|
||||||
|
if (!container) {
|
||||||
|
// no container, so do nothing
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const pages = [stripurl(refurl)];
|
||||||
|
if (!!addurls) {
|
||||||
|
addurls.split('|').forEach(function (url) {
|
||||||
|
pages.push(stripurl(url));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
let apiURL = `https://webmention.io/api/mentions.jf2?per-page=${maxWebmentions}&sort-by=${sortBy}&sort-dir=${sortDir}`;
|
||||||
|
|
||||||
|
pages.forEach(function (path) {
|
||||||
|
apiURL += `&target[]=${encodeURIComponent('http:' + path)}&target[]=${encodeURIComponent('https:' + path)}`;
|
||||||
|
});
|
||||||
|
|
||||||
|
// apiURL = 'http://127.0.0.1:1111/test_webmentions.jf2';
|
||||||
|
/** @type {WebmentionResponse} */
|
||||||
|
let json = {};
|
||||||
|
try {
|
||||||
|
// const response = await window.fetch(apiURL);
|
||||||
|
const response = await window.fetch(apiURL);
|
||||||
|
if (response.status >= 200 && response.status < 300) {
|
||||||
|
json = await response.json();
|
||||||
|
} else {
|
||||||
|
console.error("Could not parse response");
|
||||||
|
new Error(response.statusText);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
// Purposefully not escalate further, i.e. no UI update
|
||||||
|
console.error("Request failed", error);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @type {Array<Reaction>} */
|
||||||
|
let comments = [];
|
||||||
|
/** @type {Array<Reaction>} */
|
||||||
|
let mentions = [];
|
||||||
|
/** @type {Array<Reaction>} */
|
||||||
|
const bookmarks = [];
|
||||||
|
/** @type {Array<Reaction>} */
|
||||||
|
const likes = [];
|
||||||
|
/** @type {Array<Reaction>} */
|
||||||
|
const reposts = [];
|
||||||
|
/** @type {Array<Reaction>} */
|
||||||
|
const follows = [];
|
||||||
|
|
||||||
|
/** @type {Record<MentionType, Array<Reaction>>} */
|
||||||
|
const mapping = {
|
||||||
|
"in-reply-to": comments,
|
||||||
|
"like-of": likes,
|
||||||
|
"repost-of": reposts,
|
||||||
|
"bookmark-of": bookmarks,
|
||||||
|
"follow-of": follows,
|
||||||
|
"mention-of": mentions,
|
||||||
|
"rsvp": comments
|
||||||
|
};
|
||||||
|
|
||||||
|
json.children.forEach(function (child) {
|
||||||
|
// Map each mention into its respective container
|
||||||
|
const store = mapping[child['wm-property']];
|
||||||
|
if (store) {
|
||||||
|
store.push(child);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// format the comment-type things
|
||||||
|
let formattedMentions = '';
|
||||||
|
if (mentions.length > 0) {
|
||||||
|
formattedMentions = formatComments('mention', dedupe(mentions));
|
||||||
|
}
|
||||||
|
|
||||||
|
let formattedComments = '';
|
||||||
|
if (comments.length > 0) {
|
||||||
|
formattedComments = formatComments('comment', dedupe(comments));
|
||||||
|
}
|
||||||
|
|
||||||
|
// format likes
|
||||||
|
let likesStr = '';
|
||||||
|
if (likes.length > 0) {
|
||||||
|
likesStr = formatReactions('like', dedupe(likes));
|
||||||
|
}
|
||||||
|
|
||||||
|
// format reposts
|
||||||
|
let repostsStr = '';
|
||||||
|
if (reposts.length > 0) {
|
||||||
|
repostsStr = formatReactions('repost', dedupe(reposts));
|
||||||
|
}
|
||||||
|
|
||||||
|
// format bookmarks
|
||||||
|
let bookmarksStr = '';
|
||||||
|
if (bookmarks.length > 0) {
|
||||||
|
bookmarksStr = formatReactions('bookmark', dedupe(bookmarks));
|
||||||
|
}
|
||||||
|
|
||||||
|
container.innerHTML = `<div id="webmentions">${repostsStr}${likesStr}${bookmarksStr}${formattedComments}${formattedMentions}</div>`;
|
||||||
|
});
|
||||||
|
}());
|
||||||
|
|
||||||
|
// End-of-file marker for LibreJS
|
||||||
|
// @license-end
|
66
static/js/webmention.min.js
vendored
Normal file
66
static/js/webmention.min.js
vendored
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
(()=>{function t(t,e){return document.currentScript.getAttribute("data-"+t)||e}window.i18next=window.i18next||{t:function(t){return t}},window.i18next.t.bind(window.i18next);let m=t("page-url",window.location.href.replace(/#.*$/,"")),f=t("add-urls",void 0),e=t("id","webmentions"),g=(t("wordcount"),t("max-webmentions",30)),v=(t("prevent-spoofing"),t("sort-by","published")),b=t("sort-dir","up");function y(t){return t.substr(t.indexOf("//"))}function x(t){let l=[],a={};return t.forEach(function(t){var e=y(t.url);a[e]||(l.push(t),a[e]=!0)}),l}function L(t,e){let a=`
|
||||||
|
<div class="webcomments">
|
||||||
|
<h3 id="replies-header">`+o("comment")+" <span>"+e.length+"</span> "+t+`s </h3>
|
||||||
|
<ol aria-labelledby="replies-header" role="list">`;return e.forEach(function(t){let e="";var l;t.hasOwnProperty("content")&&(t.content.hasOwnProperty("html")?e=t.content.html:t.content.hasOwnProperty("text")&&(e=t.content.text)),a+=`
|
||||||
|
<li class="comment h-entry">
|
||||||
|
<div>
|
||||||
|
<a class="comment_author u-author"
|
||||||
|
href="`+t.author.url+`"
|
||||||
|
target="_blank"
|
||||||
|
title="`+t.author.name+`"
|
||||||
|
rel="noreferrer">
|
||||||
|
<img
|
||||||
|
src="`+t.author.photo+`"
|
||||||
|
alt=""
|
||||||
|
class="u-photo"
|
||||||
|
loading="lazy"
|
||||||
|
decoding="async"
|
||||||
|
width="48"
|
||||||
|
height="48"
|
||||||
|
>
|
||||||
|
<span class="p-author">`+t.author.name+`</span>
|
||||||
|
</a>`,t.published&&(l=new Date(t.published),a+=`
|
||||||
|
<time class="dt-published" datetime="`+t.published+'">'+l.toLocaleString(void 0,{dateStyle:"medium",timeStyle:"short"})+"</time>"),a+=`
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="e-entry">`+e+`
|
||||||
|
<a class="u-url"
|
||||||
|
href="`+t.url+`"
|
||||||
|
target="_blank"
|
||||||
|
rel="noreferrer">
|
||||||
|
source
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
`}),a+=`
|
||||||
|
</ol >
|
||||||
|
</div >
|
||||||
|
`}function o(t){return"like"==t?'<svg focusable = "false" width = "24" height = "24" viewBox = "0 0 192 192" xmlns = "http://www.w3.org/2000/svg" > <path d="M95.997 41.986l-.026-.035C85.746 28.36 68.428 21.423 51.165 24.881 30.138 29.094 15.004 47.558 15 69.003c0 24.413 14.906 47.964 39.486 70.086 8.43 7.586 17.437 14.468 26.444 20.533.728.49 1.444.967 2.148 1.43l1.39.909 1.355.872 1.317.835.645.403 1.259.78 1.194.726 1.032.619 1.38.807.418.236a6 6 0 005.864 0l1.138-.654 1.154-.684 1.118-.675.614-.376 1.26-.779a212 212 0 00.644-.403l1.317-.835 1.355-.872 1.39-.909c.704-.463 1.42-.94 2.148-1.43 9.007-6.065 18.015-12.947 26.444-20.533C162.094 116.967 177 93.416 177 69.004c-.004-21.446-15.138-39.91-36.165-44.123-17.07-3.42-34.174 3.323-44.43 16.568l-.408.537zm42.48-5.338c15.421 3.09 26.52 16.63 26.523 32.357 0 19.607-12.438 39.847-33.532 59.357l-1.316 1.205c-.22.201-.443.402-.666.603-7.977 7.18-16.548 13.727-25.118 19.498l-.745.5c-.74.494-1.466.973-2.177 1.437l-1.402.906-1.359.864-.662.416-1.292.8-.732.446-.73-.446-1.292-.8-.662-.416-1.36-.864-1.4-.906a235.406 235.406 0 01-2.923-1.937c-8.57-5.77-17.14-12.319-25.118-19.498l-.666-.603-1.316-1.205C39.438 108.852 27 88.612 27 69.004c.003-15.726 11.102-29.267 26.523-32.356 15.253-3.056 30.565 4.954 36.756 19.208l.204.478c2.084 4.878 9.009 4.85 11.053-.045 6.062-14.511 21.52-22.73 36.941-19.641z" fill="currentColor" /></svg> ':"repost"==t?'<svg focusable = "false" width = "24" height = "24" viewBox = "0 0 192 192" xmlns = "http://www.w3.org/2000/svg" > <path d="M18.472 146.335l-.075-.184a5.968 5.968 0 01-.216-.684l-.014-.056a5.643 5.643 0 01-.082-.397l-.013-.083a5.886 5.886 0 01-.072-.96V144c0-.157.006-.313.018-.467l.006-.075c.012-.132.028-.261.048-.39l.016-.095c.008-.05.017-.1.027-.149.005-.019.008-.038.012-.058.028-.133.06-.264.096-.393l.026-.088a5.86 5.86 0 01.482-1.159l.043-.077a5.642 5.642 0 01.31-.49l.015-.022.076-.104.044-.059a3.856 3.856 0 01.165-.208l.052-.061c.102-.12.21-.236.321-.348l18-18a6 6 0 018.661 8.303l-.175.183L38.484 138H120c23.196 0 42-18.804 42-42a6 6 0 0112 0c0 29.525-23.696 53.516-53.107 53.993L120 150H38.486l7.757 7.757a6 6 0 01.175 8.303l-.175.183a6 6 0 01-8.303.175l-.183-.175-18-18-.145-.151a6.036 6.036 0 01-.829-1.125l-.058-.105a4.08 4.08 0 01-.06-.114l-.04-.077a4.409 4.409 0 01-.139-.3l-.014-.036zM154.06 25.582l.183.175 18 18a6.036 6.036 0 01.974 1.276l.058.105c.02.035.038.07.056.105l.043.086a4.411 4.411 0 01.14.3l.014.036a5.965 5.965 0 01.291.868l.014.056c.032.13.059.263.082.397l.013.083a5.886 5.886 0 01.067.692v.014a6.11 6.11 0 01-.013.692l-.006.075a5.856 5.856 0 01-.048.39l-.016.095c-.008.05-.017.1-.027.149-.005.019-.008.038-.012.058-.028.133-.06.264-.096.393l-.026.088a5.86 5.86 0 01-.482 1.159l-.043.077-.052.09-.029.048a6.006 6.006 0 01-.32.478l-.044.059a3.857 3.857 0 01-.165.208l-.052.061a6.34 6.34 0 01-.176.197l-.145.15-18 18a6 6 0 01-8.661-8.302l.175-.183L153.514 54H72c-23.196 0-42 18.804-42 42a6 6 0 11-12 0c0-29.525 23.696-53.516 53.107-53.993L72 42h81.516l-7.759-7.757a6 6 0 01-.175-8.303l.175-.183a6 6 0 018.303-.175z" fill="currentColor" /></svg> ':"comment"==t?'<svg width = "24" height = "24" viewBox = "0 0 150 150" xmlns = "http://www.w3.org/2000/svg" > <path d="M75-.006a75 75 0 0174.997 74.31l.003.69c0 41.422-33.579 75-75 75H11.75c-6.49 0-11.75-5.26-11.75-11.75v-63.25a75 75 0 0175-75zm0 12a63 63 0 00-63 63v63h63c34.446 0 62.435-27.645 62.992-61.93l.008-1.041-.003-.633A63 63 0 0075 11.994zm21 72a6 6 0 01.225 11.996l-.225.004H51a6 6 0 01-.225-11.996l.225-.004h45zm0-24a6 6 0 01.225 11.996l-.225.004H51a6 6 0 01-.225-11.996l.225-.004h45z" fill="currentColor" /></svg> ':"bookmark"==t?`<svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" width="24" height="24" viewBox="0 0 24 24">
|
||||||
|
<path d="M 6.0097656 2 C 4.9143111 2 4.0097656 2.9025988 4.0097656 3.9980469 L 4 22 L 12 19 L 20 22 L 20 20.556641 L 20 4 C 20 2.9069372 19.093063 2 18 2 L 6.0097656 2 z M 6.0097656 4 L 18 4 L 18 19.113281 L 12 16.863281 L 6.0019531 19.113281 L 6.0097656 4 z" fill="currentColor"></path>
|
||||||
|
</svg>`:void 0}function k(t,e){let l=`
|
||||||
|
<div class="color--primary" >
|
||||||
|
<h3 id=`+t+' - header"> '+o(t)+" <span>"+e.length+"</span> "+t+`s </h3>
|
||||||
|
|
||||||
|
<ol class="likes" role = "list" aria - labelledby="`+t+'-header"> ';return e.forEach(function(t){l+=`
|
||||||
|
<li class="h-card">
|
||||||
|
<a class="u-url"
|
||||||
|
href="`+t.author.url+`
|
||||||
|
target="_blank"
|
||||||
|
rel = "noreferrer"
|
||||||
|
title = "`+t.author.name+`" >
|
||||||
|
<img
|
||||||
|
alt=""
|
||||||
|
class="lazy mentions__image u-photo"
|
||||||
|
src="`+t.author.photo+`"
|
||||||
|
loading="lazy"
|
||||||
|
decoding="async"
|
||||||
|
width="48"
|
||||||
|
height="48"
|
||||||
|
>
|
||||||
|
<span class="p-author visually-hidden" aria-hidden="true">{{ author }}</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
`}),l+=`
|
||||||
|
</ol >
|
||||||
|
</div >
|
||||||
|
`}window.addEventListener("load",async function(){var c=document.getElementById(e);if(c){let e=[y(m)],l=(f&&f.split("|").forEach(function(t){e.push(y(t))}),`https://webmention.io/api/mentions.jf2?per-page=${g}&sort-by=${v}&sort-dir=`+b),t=(e.forEach(function(t){l+=`&target[]=${encodeURIComponent("http:"+t)}&target[]=`+encodeURIComponent("https:"+t)}),{});try{200<=(h=await window.fetch(l)).status&&h.status<300?t=await h.json():(console.error("Could not parse response"),new Error(h.statusText))}catch(t){console.error("Request failed",t)}var h,d=[],u=[],p=[],w=[];let a={"in-reply-to":h=[],"like-of":p,"repost-of":w,"bookmark-of":u,"follow-of":[],"mention-of":d,rsvp:h},o=(t.children.forEach(function(t){var e=a[t["wm-property"]];e&&e.push(t)}),""),n=(0<d.length&&(o=L("mention",x(d))),""),r=(0<h.length&&(n=L("comment",x(h))),""),i=(0<p.length&&(r=k("like",x(p))),""),s=(0<w.length&&(i=k("repost",x(w))),"");0<u.length&&(s=k("bookmark",x(u))),c.innerHTML=`<div id="webmentions">${i}${r}${s}${n}${o}</div>`}})})();
|
2
static/katex.min.css
vendored
2
static/katex.min.css
vendored
File diff suppressed because one or more lines are too long
3
static/social_icons/codeberg.svg
Normal file
3
static/social_icons/codeberg.svg
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 4.233 4.233">
|
||||||
|
<path d="M0 2.265c0 .398.112.788.323 1.125l1.765-2.281c.013-.016.044-.016.057 0l.737.953h-.528l.011.042h.549l.156.201h-.648l.018.066h.681l.137.177H2.49l.024.085h.81l.122.158h-.888l.029.104h.939l.107.139H2.625l.032.115h1.065l.099.128H2.693l.032.115H3.91c.211-.337.323-.727.323-1.125 0-1.169-.947-2.116-2.117-2.116S0 1.096 0 2.265zm2.761 1.253l.032.115h.939l.091-.115zm.068.243l.032.115h.628l.126-.115zm.067.243l.032.114h.212l.184-.114z" paint-order="markers fill stroke"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 573 B |
1
static/social_icons/itchio.svg
Normal file
1
static/social_icons/itchio.svg
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="235.452" width="261.728" viewBox="0 0 245.371 220.736"><path d="M31.99 1.365C21.287 7.72.2 31.945 0 38.298v10.516C0 62.144 12.46 73.86 23.773 73.86c13.584 0 24.902-11.258 24.903-24.62 0 13.362 10.93 24.62 24.515 24.62 13.586 0 24.165-11.258 24.165-24.62 0 13.362 11.622 24.62 25.207 24.62h.246c13.586 0 25.208-11.258 25.208-24.62 0 13.362 10.58 24.62 24.164 24.62 13.585 0 24.515-11.258 24.515-24.62 0 13.362 11.32 24.62 24.903 24.62 11.313 0 23.773-11.714 23.773-25.046V38.298c-.2-6.354-21.287-30.58-31.988-36.933C180.118.197 157.056-.005 122.685 0c-34.37.003-81.228.54-90.697 1.365zm65.194 66.217a28.025 28.025 0 0 1-4.78 6.155c-5.128 5.014-12.157 8.122-19.906 8.122a28.482 28.482 0 0 1-19.948-8.126c-1.858-1.82-3.27-3.766-4.563-6.032l-.006.004c-1.292 2.27-3.092 4.215-4.954 6.037a28.5 28.5 0 0 1-19.948 8.12c-.934 0-1.906-.258-2.692-.528-1.092 11.372-1.553 22.24-1.716 30.164l-.002.045c-.02 4.024-.04 7.333-.06 11.93.21 23.86-2.363 77.334 10.52 90.473 19.964 4.655 56.7 6.775 93.555 6.788h.006c36.854-.013 73.59-2.133 93.554-6.788 12.883-13.14 10.31-66.614 10.52-90.474-.022-4.596-.04-7.905-.06-11.93l-.003-.045c-.162-7.926-.623-18.793-1.715-30.165-.786.27-1.757.528-2.692.528a28.5 28.5 0 0 1-19.948-8.12c-1.862-1.822-3.662-3.766-4.955-6.037l-.006-.004c-1.294 2.266-2.705 4.213-4.563 6.032a28.48 28.48 0 0 1-19.947 8.125c-7.748 0-14.778-3.11-19.906-8.123a28.025 28.025 0 0 1-4.78-6.155 27.99 27.99 0 0 1-4.736 6.155 28.49 28.49 0 0 1-19.95 8.124c-.27 0-.54-.012-.81-.02h-.007c-.27.008-.54.02-.813.02a28.49 28.49 0 0 1-19.95-8.123 27.992 27.992 0 0 1-4.736-6.155zm-20.486 26.49l-.002.01h.015c8.113.017 15.32 0 24.25 9.746 7.028-.737 14.372-1.105 21.722-1.094h.006c7.35-.01 14.694.357 21.723 1.094 8.93-9.747 16.137-9.73 24.25-9.746h.014l-.002-.01c3.833 0 19.166 0 29.85 30.007L210 165.244c8.504 30.624-2.723 31.373-16.727 31.4-20.768-.773-32.267-15.855-32.267-30.935-11.496 1.884-24.907 2.826-38.318 2.827h-.006c-13.412 0-26.823-.943-38.318-2.827 0 15.08-11.5 30.162-32.267 30.935-14.004-.027-25.23-.775-16.726-31.4L46.85 124.08C57.534 94.073 72.867 94.073 76.7 94.073zm45.985 23.582v.006c-.02.02-21.863 20.08-25.79 27.215l14.304-.573v12.474c0 .584 5.74.346 11.486.08h.006c5.744.266 11.485.504 11.485-.08v-12.474l14.304.573c-3.928-7.135-25.79-27.215-25.79-27.215v-.006l-.003.002z" color="#000"/></svg>
|
After Width: | Height: | Size: 2.3 KiB |
|
@ -7,6 +7,18 @@
|
||||||
{# Set locale for date #}
|
{# Set locale for date #}
|
||||||
{% set date_locale = macros_translate::translate(key="date_locale", default="en_GB", language_strings=language_strings) %}
|
{% set date_locale = macros_translate::translate(key="date_locale", default="en_GB", language_strings=language_strings) %}
|
||||||
|
|
||||||
|
{#- Check for language-specific date formats -#}
|
||||||
|
{%- set language_format = "" -%}
|
||||||
|
{%- if config.extra.date_formats -%}
|
||||||
|
{%- for format_config in config.extra.date_formats -%}
|
||||||
|
{%- if format_config.lang == lang -%}
|
||||||
|
{%- if format_config.archive -%}
|
||||||
|
{%- set_global language_format = format_config.archive -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- endfor -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
<div class="archive">
|
<div class="archive">
|
||||||
<ul class="list-with-title">
|
<ul class="list-with-title">
|
||||||
{%- set source_paths = section.extra.section_path | default(value="blog/") -%}
|
{%- set source_paths = section.extra.section_path | default(value="blog/") -%}
|
||||||
|
@ -55,7 +67,13 @@
|
||||||
<li class="listing-item">
|
<li class="listing-item">
|
||||||
<div class="post-time">
|
<div class="post-time">
|
||||||
<span class="date">
|
<span class="date">
|
||||||
|
{%- if language_format -%}
|
||||||
|
{{ post.date | date(format=language_format, locale=date_locale) }}
|
||||||
|
{%- elif config.extra.archive_date_format -%}
|
||||||
|
{{ post.date | date(format=config.extra.archive_date_format, locale=date_locale) }}
|
||||||
|
{%- else -%}
|
||||||
{{ post.date | date(format="%d %b", locale=date_locale) }}
|
{{ post.date | date(format="%d %b", locale=date_locale) }}
|
||||||
|
{%- endif -%}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<a href="{{ post.permalink }}" title="{{ post.title }}">{{ post.title | markdown(inline=true) | safe }}</a>
|
<a href="{{ post.permalink }}" title="{{ post.title }}">{{ post.title | markdown(inline=true) | safe }}</a>
|
||||||
|
|
|
@ -66,7 +66,9 @@
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
" rel="alternate" type="text/html"/>
|
" rel="alternate" type="text/html"/>
|
||||||
<generator uri="https://www.getzola.org/">Zola</generator>
|
<generator uri="https://www.getzola.org/">Zola</generator>
|
||||||
|
{%- if last_updated -%}
|
||||||
<updated>{{ last_updated | date(format="%+") }}</updated>
|
<updated>{{ last_updated | date(format="%+") }}</updated>
|
||||||
|
{%- endif -%}
|
||||||
<id>{{ feed_url | safe }}</id>
|
<id>{{ feed_url | safe }}</id>
|
||||||
{%- for page in pages %}
|
{%- for page in pages %}
|
||||||
{%- if macros_settings::evaluate_setting_priority(setting="hide_from_feed", page=page, default_global_value=false) == "true" -%}
|
{%- if macros_settings::evaluate_setting_priority(setting="hide_from_feed", page=page, default_global_value=false) == "true" -%}
|
||||||
|
@ -98,10 +100,10 @@
|
||||||
{% if config.extra.full_content_in_feed %}
|
{% if config.extra.full_content_in_feed %}
|
||||||
<content type="html">{{ page.content }}</content>
|
<content type="html">{{ page.content }}</content>
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
{% if page.summary -%}
|
{% if page.description -%}
|
||||||
<summary type="html">{{ page.summary | striptags | trim_end_matches(pat=".") | safe }}…</summary>
|
|
||||||
{% elif page.description -%}
|
|
||||||
<summary type="html">{{ page.description }}</summary>
|
<summary type="html">{{ page.description }}</summary>
|
||||||
|
{% elif page.summary -%}
|
||||||
|
<summary type="html">{{ page.summary | striptags | trim_end_matches(pat=".") | safe }}…</summary>
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
</entry>
|
</entry>
|
||||||
{%- endfor %}
|
{%- endfor %}
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
|
{% import "macros/feed_utils.html" as feed_utils %}
|
||||||
{% import "macros/format_date.html" as macros_format_date %}
|
{% import "macros/format_date.html" as macros_format_date %}
|
||||||
{% import "macros/list_posts.html" as macros_list_posts %}
|
{% import "macros/list_posts.html" as macros_list_posts %}
|
||||||
{% import "macros/page_header.html" as macros_page_header %}
|
{% import "macros/page_header.html" as macros_page_header %}
|
||||||
{% import "macros/rel_attributes.html" as macros_rel_attributes %}
|
{% import "macros/rel_attributes.html" as macros_rel_attributes %}
|
||||||
|
{% import "macros/series_page.html" as macros_series_page %}
|
||||||
{% import "macros/settings.html" as macros_settings %}
|
{% import "macros/settings.html" as macros_settings %}
|
||||||
{% import "macros/table_of_contents.html" as macros_toc %}
|
{% import "macros/table_of_contents.html" as macros_toc %}
|
||||||
|
{% import "macros/target_attribute.html" as macros_target_attribute %}
|
||||||
{% import "macros/translate.html" as macros_translate %}
|
{% import "macros/translate.html" as macros_translate %}
|
||||||
{% import "macros/series_page.html" as macros_series_page %}
|
|
||||||
|
|
||||||
{# Load the internationalisation data for the current language from
|
{# Load the internationalisation data for the current language from
|
||||||
the .toml files in the user's '/i18n' folder, falling back to the theme's.
|
the .toml files in the user's '/i18n' folder, falling back to the theme's.
|
||||||
|
@ -32,8 +34,9 @@ This variable will hold all the text strings for the language #}
|
||||||
{% include "partials/header.html" %}
|
{% include "partials/header.html" %}
|
||||||
|
|
||||||
<body{% if lang in rtl_languages %} dir="rtl"{% endif %}{% if config.extra.override_serif_with_sans %} class="use-sans-serif"{% endif %}>
|
<body{% if lang in rtl_languages %} dir="rtl"{% endif %}{% if config.extra.override_serif_with_sans %} class="use-sans-serif"{% endif %}>
|
||||||
|
<a href="#main-content" id="skip-link">{{ macros_translate::translate(key="skip_to_content", default="Skip to content", language_strings=language_strings) }}</a>
|
||||||
{% include "partials/nav.html" %}
|
{% include "partials/nav.html" %}
|
||||||
<div class="content">
|
<div class="content" id="main-content">
|
||||||
|
|
||||||
{# Post page is the default #}
|
{# Post page is the default #}
|
||||||
{% block main_content %}
|
{% block main_content %}
|
||||||
|
@ -41,6 +44,9 @@ This variable will hold all the text strings for the language #}
|
||||||
{% endblock main_content %}
|
{% endblock main_content %}
|
||||||
</div>
|
</div>
|
||||||
{% include "partials/footer.html" %}
|
{% include "partials/footer.html" %}
|
||||||
|
|
||||||
|
{# Users can optionally provide this template to add content to the body element. #}
|
||||||
|
{% include "tabi/extend_body.html" ignore missing %}
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
17
templates/macros/feed_utils.html
Normal file
17
templates/macros/feed_utils.html
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{#- Feed utility macros -#}
|
||||||
|
|
||||||
|
{#- Zola 0.19.0 uses `generate_feeds`. Prior versions use `generate_feed` -#}
|
||||||
|
{%- macro get_generate_feed() -%}
|
||||||
|
{{- config.generate_feeds | default(value=config.generate_feed) -}}
|
||||||
|
{%- endmacro get_generate_feed -%}
|
||||||
|
|
||||||
|
{%- macro get_feed_url() -%}
|
||||||
|
{{- config.feed_filenames[0] | default(value=(config.feed_filename)) -}}
|
||||||
|
{%- endmacro get_feed_url -%}
|
||||||
|
|
||||||
|
{#- Check footer feed icon conditions -#}
|
||||||
|
{%- macro should_show_footer_feed_icon() -%}
|
||||||
|
{%- set generate_feed = feed_utils::get_generate_feed() == "true" -%}
|
||||||
|
{%- set feed_url = feed_utils::get_feed_url() -%}
|
||||||
|
{{- generate_feed and config.extra.feed_icon and feed_url -}}
|
||||||
|
{%- endmacro should_show_footer_feed_icon -%}
|
|
@ -3,7 +3,23 @@
|
||||||
{#- Set locale -#}
|
{#- Set locale -#}
|
||||||
{%- set date_locale = macros_translate::translate(key="date_locale", default="en_GB", language_strings=language_strings) -%}
|
{%- set date_locale = macros_translate::translate(key="date_locale", default="en_GB", language_strings=language_strings) -%}
|
||||||
|
|
||||||
{%- if config.extra.short_date_format and short -%}
|
{#- Check for language-specific date formats -#}
|
||||||
|
{%- set language_format = "" -%}
|
||||||
|
{%- if config.extra.date_formats -%}
|
||||||
|
{%- for format_config in config.extra.date_formats -%}
|
||||||
|
{%- if format_config.lang == lang -%}
|
||||||
|
{%- if short and format_config.short -%}
|
||||||
|
{%- set_global language_format = format_config.short -%}
|
||||||
|
{%- elif not short and format_config.long -%}
|
||||||
|
{%- set_global language_format = format_config.long -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- endfor -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{%- if language_format -%}
|
||||||
|
{{ date | date(format=language_format, locale=date_locale) }}
|
||||||
|
{%- elif config.extra.short_date_format and short -%}
|
||||||
{{ date | date(format=config.extra.short_date_format, locale=date_locale) }}
|
{{ date | date(format=config.extra.short_date_format, locale=date_locale) }}
|
||||||
{%- elif config.extra.long_date_format and not short -%}
|
{%- elif config.extra.long_date_format and not short -%}
|
||||||
{{ date | date(format=config.extra.long_date_format, locale=date_locale) }}
|
{{ date | date(format=config.extra.long_date_format, locale=date_locale) }}
|
||||||
|
|
|
@ -83,7 +83,7 @@
|
||||||
<li class="date">{{- macros_format_date::format_date(date=post.date, short=false, language_strings=language_strings) -}}</li>
|
<li class="date">{{- macros_format_date::format_date(date=post.date, short=false, language_strings=language_strings) -}}</li>
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
{%- if show_date and show_updated -%}
|
{%- if show_date and show_updated -%}
|
||||||
<li class="mobile-only">{{- separator -}}</li>
|
<li class="mobile-only separator">{{- separator -}}</li>
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
{%- if show_updated -%}
|
{%- if show_updated -%}
|
||||||
{%- set last_updated_str = macros_translate::translate(key="last_updated_on", default="Updated on $DATE", language_strings=language_strings) -%}
|
{%- set last_updated_str = macros_translate::translate(key="last_updated_on", default="Updated on $DATE", language_strings=language_strings) -%}
|
||||||
|
@ -142,9 +142,9 @@
|
||||||
|
|
||||||
<div class="description">
|
<div class="description">
|
||||||
{% if post.description %}
|
{% if post.description %}
|
||||||
<p>{{ post.description }}</p>
|
<p>{{ post.description | markdown(inline=true) | safe }}</p>
|
||||||
{% elif post.summary %}
|
{% elif post.summary %}
|
||||||
<p>{{ post.summary | striptags | trim_end_matches(pat=".") | safe }}…</p>
|
<p>{{ post.summary | markdown(inline=true) | trim_end_matches(pat=".") | safe }}…</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<a class="readmore" href="{{ post.permalink }}">{{ macros_translate::translate(key="read_more", default="Read more", language_strings=language_strings) }} <span class="arrow">→</span></a>
|
<a class="readmore" href="{{ post.permalink }}">{{ macros_translate::translate(key="read_more", default="Read more", language_strings=language_strings) }} <span class="arrow">→</span></a>
|
||||||
|
|
|
@ -1,5 +1,18 @@
|
||||||
{% macro page_header(title) %}
|
{% macro page_header(title, show_feed_icon=false) %}
|
||||||
|
|
||||||
|
{% set rel_attributes = macros_rel_attributes::rel_attributes() | trim %}
|
||||||
|
|
||||||
|
|
||||||
|
{%- set blank_target = macros_target_attribute::target_attribute(new_tab=config.markdown.external_links_target_blank) -%}
|
||||||
|
|
||||||
<h1 class="title-container section-title bottom-divider">
|
<h1 class="title-container section-title bottom-divider">
|
||||||
{{ title }}
|
{{ title -}}
|
||||||
|
{% if show_feed_icon %}
|
||||||
|
{%- set feed_url = feed_utils::get_feed_url() -%}
|
||||||
|
<a class="no-hover-padding social" rel="{{ rel_attributes }}" {{ blank_target }} href="{{ get_url(path=term.path ~ feed_url, lang=lang, trailing_slash=false) | safe }}">
|
||||||
|
<img loading="lazy" alt="feed" title="feed" src="{{ get_url(path='/social_icons/rss.svg') }}">
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
{% endmacro page_header %}
|
{% endmacro page_header %}
|
||||||
|
|
11
templates/macros/target_attribute.html
Normal file
11
templates/macros/target_attribute.html
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{% macro target_attribute(new_tab) %}
|
||||||
|
|
||||||
|
{%- set blank_target = "" -%}
|
||||||
|
|
||||||
|
{%- if new_tab -%}
|
||||||
|
{%- set blank_target = "target=_blank" -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{{ blank_target }}
|
||||||
|
|
||||||
|
{% endmacro target_attribute %}
|
|
@ -5,11 +5,7 @@
|
||||||
|
|
||||||
{%- set rel_attributes = macros_rel_attributes::rel_attributes() | trim -%}
|
{%- set rel_attributes = macros_rel_attributes::rel_attributes() | trim -%}
|
||||||
|
|
||||||
{%- if config.markdown.external_links_target_blank -%}
|
{%- set blank_target = macros_target_attribute::target_attribute(new_tab=config.markdown.external_links_target_blank) -%}
|
||||||
{%- set blank_target = "target=_blank" -%}
|
|
||||||
{%- else -%}
|
|
||||||
{%- set blank_target = "" -%}
|
|
||||||
{%- endif -%}
|
|
||||||
|
|
||||||
{# Debugging #}
|
{# Debugging #}
|
||||||
{# <div><pre>
|
{# <div><pre>
|
||||||
|
@ -61,6 +57,8 @@ Current section extra: {% if current_section %}{{ current_section.extra | json_e
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
{% set settings_to_test = [
|
{% set settings_to_test = [
|
||||||
|
"iine",
|
||||||
|
"iine_icon",
|
||||||
"enable_cards_tag_filtering",
|
"enable_cards_tag_filtering",
|
||||||
"footnote_backlinks",
|
"footnote_backlinks",
|
||||||
"add_src_to_code_block",
|
"add_src_to_code_block",
|
||||||
|
@ -102,14 +100,16 @@ Current section extra: {% if current_section %}{{ current_section.extra | json_e
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div> #}
|
</div> #}
|
||||||
|
|
||||||
{# {{ __tera_context }} #}
|
{# {{ __tera_context }} #}
|
||||||
{# End debugging #}
|
{# End debugging #}
|
||||||
|
|
||||||
<main>
|
<main>
|
||||||
<article>
|
<article class="h-entry">
|
||||||
<h1 class="article-title">
|
<h1 class="p-name article-title">
|
||||||
{{ page.title | markdown(inline=true) | safe }}
|
{{ page.title | markdown(inline=true) | safe }}
|
||||||
</h1>
|
</h1>
|
||||||
|
<a class="u-url u-uid" href="{{ page.permalink | safe }}"></a>
|
||||||
|
|
||||||
<ul class="meta">
|
<ul class="meta">
|
||||||
{#- Draft indicator -#}
|
{#- Draft indicator -#}
|
||||||
|
@ -118,7 +118,7 @@ Current section extra: {% if current_section %}{{ current_section.extra | json_e
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{#- Author(s) -#}
|
{#- Author(s) -#}
|
||||||
{% if page.authors or config.author and macros_settings::evaluate_setting_priority(setting="show_author", page=page, default_global_value=false) == "true" %}
|
{%- if page.authors or config.author and macros_settings::evaluate_setting_priority(setting="show_author", page=page, default_global_value=false) == "true" -%}
|
||||||
{%- if page.authors -%}
|
{%- if page.authors -%}
|
||||||
{%- set author_list = page.authors -%}
|
{%- set author_list = page.authors -%}
|
||||||
{%- else -%}
|
{%- else -%}
|
||||||
|
@ -126,29 +126,36 @@ Current section extra: {% if current_section %}{{ current_section.extra | json_e
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
|
|
||||||
{%- if author_list | length == 1 -%}
|
{%- if author_list | length == 1 -%}
|
||||||
{%- set author_string = author_list.0 -%}
|
{%- set author_string = '<span class="p-author">' ~ author_list.0 ~ '</span>' -%}
|
||||||
{%- else -%}
|
{%- else -%}
|
||||||
{%- set last_author = author_list | last -%}
|
{%- set last_author = author_list | last -%}
|
||||||
{%- set other_authors = author_list | slice(end=-1) -%}
|
{%- set other_authors = author_list | slice(end=-1) -%}
|
||||||
{%- set author_separator = macros_translate::translate(key="author_separator", default=", ", language_strings=language_strings) -%}
|
{%- set author_separator = macros_translate::translate(key="author_separator", default=", ", language_strings=language_strings) -%}
|
||||||
|
{%- set author_separator = '</span>' ~ author_separator ~ '<span class="p-author">' -%}
|
||||||
{%- set conjunction = macros_translate::translate(key="author_conjunction", default=" and ", language_strings=language_strings) -%}
|
{%- set conjunction = macros_translate::translate(key="author_conjunction", default=" and ", language_strings=language_strings) -%}
|
||||||
|
{%- set conjunction = '</span>' ~ conjunction ~ '<span class="p-author">' -%}
|
||||||
{%- set author_string = other_authors | join(sep=author_separator) -%}
|
{%- set author_string = other_authors | join(sep=author_separator) -%}
|
||||||
{%- set author_string = author_string ~ conjunction ~ last_author -%}
|
{%- set author_string = author_string ~ conjunction ~ last_author -%}
|
||||||
|
{%- set author_string = '<span class="p-author">' ~ author_string ~ '</span>' -%}
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
|
|
||||||
{%- set by_author = macros_translate::translate(key="by_author", default="By $AUTHOR", language_strings=language_strings) -%}
|
{%- set by_author = macros_translate::translate(key="by_author", default="By $AUTHOR", language_strings=language_strings) -%}
|
||||||
<li>{{ by_author | replace(from="$AUTHOR", to=author_string) }}</li>
|
<li>{{ by_author | replace(from="$AUTHOR", to=author_string) | safe }}</li>
|
||||||
{%- set previous_visible = true -%}
|
{%- set previous_visible = true -%}
|
||||||
{% endif %}
|
{%- endif -%}
|
||||||
|
|
||||||
|
{%- if config.extra.hcard and config.extra.hcard.enable and ( not author_list or author_list is containing(config.author)) -%}
|
||||||
|
{% include "partials/hcard_small.html" %}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
{%- set separator_with_class = "<span class='separator' aria-hidden='true'>" ~ separator ~ "</span>"-%}
|
{%- set separator_with_class = "<span class='separator' aria-hidden='true'>" ~ separator ~ "</span>"-%}
|
||||||
|
|
||||||
{#- Date -#}
|
{#- Date -#}
|
||||||
{% if page.date and macros_settings::evaluate_setting_priority(setting="show_date", page=page, default_global_value=true) == "true" %}
|
{%- if page.date and macros_settings::evaluate_setting_priority(setting="show_date", page=page, default_global_value=true) == "true" -%}
|
||||||
<li>{%- if previous_visible -%}{{ separator_with_class | safe }}{%- endif -%}{{ macros_format_date::format_date(date=page.date, short=true, language_strings=language_strings) }}</li>
|
<li><time class="dt-published" datetime="{{ page.date }}">{%- if previous_visible -%}{{ separator_with_class | safe }}{%- endif -%}{{ macros_format_date::format_date(date=page.date, short=true, language_strings=language_strings) }}</time></li>
|
||||||
{#- Variable to keep track of whether we've shown a section, to avoid separators as the first element -#}
|
{#- Variable to keep track of whether we've shown a section, to avoid separators as the first element -#}
|
||||||
{%- set previous_visible = true -%}
|
{%- set previous_visible = true -%}
|
||||||
{% endif %}
|
{%- endif -%}
|
||||||
|
|
||||||
{#- Reading time -#}
|
{#- Reading time -#}
|
||||||
{%- if macros_settings::evaluate_setting_priority(setting="show_reading_time", page=page, default_global_value=true) == "true" -%}
|
{%- if macros_settings::evaluate_setting_priority(setting="show_reading_time", page=page, default_global_value=true) == "true" -%}
|
||||||
|
@ -160,7 +167,7 @@ Current section extra: {% if current_section %}{{ current_section.extra | json_e
|
||||||
{%- if page.taxonomies and page.taxonomies.tags -%}
|
{%- if page.taxonomies and page.taxonomies.tags -%}
|
||||||
<li class="tag">{%- if previous_visible -%}{{ separator_with_class | safe }}{%- endif -%}{{- macros_translate::translate(key="tags", default="tags", language_strings=language_strings) | capitalize -}}: </li>
|
<li class="tag">{%- if previous_visible -%}{{ separator_with_class | safe }}{%- endif -%}{{- macros_translate::translate(key="tags", default="tags", language_strings=language_strings) | capitalize -}}: </li>
|
||||||
{%- for tag in page.taxonomies.tags -%}
|
{%- for tag in page.taxonomies.tags -%}
|
||||||
<li class="tag"><a href="{{ get_taxonomy_url(kind='tags', name=tag, lang=lang) | safe }}">{{ tag }}</a>
|
<li class="tag"><a class="p-category" href="{{ get_taxonomy_url(kind='tags', name=tag, lang=lang) | safe }}">{{ tag }}</a>
|
||||||
{%- if not loop.last -%}
|
{%- if not loop.last -%}
|
||||||
,
|
,
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
|
@ -175,7 +182,7 @@ Current section extra: {% if current_section %}{{ current_section.extra | json_e
|
||||||
{%- set formatted_date = macros_format_date::format_date(date=page.updated, short=true, language_strings=language_strings) -%}
|
{%- 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 updated_str = last_updated_str | replace(from="$DATE", to=formatted_date) -%}
|
||||||
{%- set previous_visible = true -%}
|
{%- set previous_visible = true -%}
|
||||||
</ul><ul class="meta last-updated"><li>{{ updated_str }}</li>
|
</ul><ul class="meta last-updated"><li><time class="dt-updated" datetime="{{ page.updated }}">{{ updated_str }}</time></li>
|
||||||
{#- Show link to remote changes if enabled -#}
|
{#- 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 config.extra.remote_repository_url and macros_settings::evaluate_setting_priority(setting="show_remote_changes", page=page, default_global_value=true) == "true" -%}
|
||||||
<li>{%- if previous_visible -%}{{ separator_with_class | safe }}{%- endif -%}<a class="external" href="{% include "partials/history_url.html" %}" {{ blank_target }} rel="{{ rel_attributes }}">{{ macros_translate::translate(key="see_changes", default="See changes", language_strings=language_strings) }}</a></li>
|
<li>{%- if previous_visible -%}{{ separator_with_class | safe }}{%- endif -%}<a class="external" href="{% include "partials/history_url.html" %}" {{ blank_target }} rel="{{ rel_attributes }}">{{ macros_translate::translate(key="see_changes", default="See changes", language_strings=language_strings) }}</a></li>
|
||||||
|
@ -227,7 +234,13 @@ Current section extra: {% if current_section %}{{ current_section.extra | json_e
|
||||||
{{ macros_toc::toc(page=page, header=true, language_strings=language_strings) }}
|
{{ macros_toc::toc(page=page, header=true, language_strings=language_strings) }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<section class="body">
|
{#- Optional Summary paragraph for readers -#}
|
||||||
|
{% if page.description %}
|
||||||
|
<p class="p-summary" hidden>{{ page.description }}</p>
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
|
||||||
|
<section class="e-content body">
|
||||||
{#- Replace series_intro placeholder -#}
|
{#- Replace series_intro placeholder -#}
|
||||||
{%- set content_with_intro = page.content -%}
|
{%- set content_with_intro = page.content -%}
|
||||||
{%- if "<!-- series_intro -->" in page.content -%}
|
{%- if "<!-- series_intro -->" in page.content -%}
|
||||||
|
@ -263,6 +276,11 @@ Current section extra: {% if current_section %}{{ current_section.extra | json_e
|
||||||
{{ processed_content | replace(from="<!-- toc -->", to=macros_toc::toc(page=page, header=false, language_strings=language_strings)) | safe }}
|
{{ processed_content | replace(from="<!-- toc -->", to=macros_toc::toc(page=page, header=false, language_strings=language_strings)) | safe }}
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
{#- iine button -#}
|
||||||
|
{%- if macros_settings::evaluate_setting_priority(setting="iine", page=page, default_global_value=false) == "true" -%}
|
||||||
|
{% include "partials/iine_button.html" %}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
{% if macros_settings::evaluate_setting_priority(setting="show_previous_next_article_links", page=page, default_global_value=true) == "true" %}
|
{% if macros_settings::evaluate_setting_priority(setting="show_previous_next_article_links", page=page, default_global_value=true) == "true" %}
|
||||||
{%- if page.lower or page.higher -%}
|
{%- if page.lower or page.higher -%}
|
||||||
{% set next_label = macros_translate::translate(key="next", default="Next", language_strings=language_strings) %}
|
{% set next_label = macros_translate::translate(key="next", default="Next", language_strings=language_strings) %}
|
||||||
|
@ -334,6 +352,14 @@ Current section extra: {% if current_section %}{{ current_section.extra | json_e
|
||||||
{% include "partials/comments.html" %}
|
{% include "partials/comments.html" %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
{#- Webmentions -#}
|
||||||
|
{%- set global_webmentions_enabled = config.extra.webmentions.enable | default(value=false) -%}
|
||||||
|
{%- set page_webmentions_enabled = page.extra.webmentions | default(value=global_webmentions_enabled) -%}
|
||||||
|
{%- set webmentions_enabled = global_webmentions_enabled and page_webmentions_enabled != false or page_webmentions_enabled == true -%}
|
||||||
|
{%- if webmentions_enabled -%}
|
||||||
|
{%- include "partials/webmentions.html" -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
</article>
|
</article>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
data-website-id="{{ analytics_id }}"
|
data-website-id="{{ analytics_id }}"
|
||||||
src="https://cloud.umami.is/script.js"
|
src="https://cloud.umami.is/script.js"
|
||||||
{% endif %}
|
{% endif %}
|
||||||
data-do-not-track="true">
|
{% if config.extra.analytics.do_not_track %}data-do-not-track="true"{% endif %}>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{% elif analytics_service == "plausible" %}
|
{% elif analytics_service == "plausible" %}
|
||||||
|
|
|
@ -7,11 +7,7 @@
|
||||||
{% break %}
|
{% break %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{# Determine which URL to use, default is page.permalink #}
|
{# Determine which URL to use, default is page.permalink #}
|
||||||
{%- if page.extra.link_to and config.markdown.external_links_target_blank -%}
|
{%- set blank_target = macros_target_attribute::target_attribute(new_tab=config.markdown.external_links_target_blank and page.extra.link_to) -%}
|
||||||
{%- set blank_target = "target=_blank" -%}
|
|
||||||
{%- else -%}
|
|
||||||
{%- set blank_target = "" -%}
|
|
||||||
{%- endif -%}
|
|
||||||
|
|
||||||
{% set target_url = page.extra.link_to | default(value=page.permalink) %}
|
{% set target_url = page.extra.link_to | default(value=page.permalink) %}
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,9 @@ content="default-src 'self'
|
||||||
{%- set giscus_enabled = config.extra.giscus.enabled_for_all_posts or page.extra.giscus -%}
|
{%- set giscus_enabled = config.extra.giscus.enabled_for_all_posts or page.extra.giscus -%}
|
||||||
{%- set hyvortalk_enabled = config.extra.hyvortalk.enabled_for_all_posts or page.extra.hyvortalk -%}
|
{%- set hyvortalk_enabled = config.extra.hyvortalk.enabled_for_all_posts or page.extra.hyvortalk -%}
|
||||||
{%- set isso_enabled = config.extra.isso.enabled_for_all_posts or page.extra.isso -%}
|
{%- set isso_enabled = config.extra.isso.enabled_for_all_posts or page.extra.isso -%}
|
||||||
|
{%- if page -%}
|
||||||
|
{%- set iine_enabled = macros_settings::evaluate_setting_priority(setting="iine", page=page, default_global_value=false) == "true" -%}
|
||||||
|
{%- endif -%}
|
||||||
{%- if page -%}
|
{%- if page -%}
|
||||||
{%- set mermaid_enabled = macros_settings::evaluate_setting_priority(setting="mermaid", page=page, default_global_value=false) == "true" -%}
|
{%- set mermaid_enabled = macros_settings::evaluate_setting_priority(setting="mermaid", page=page, default_global_value=false) == "true" -%}
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
|
@ -50,10 +53,20 @@ content="default-src 'self'
|
||||||
{%- set script_src = script_src ~ " " ~ " utteranc.es" -%}
|
{%- set script_src = script_src ~ " " ~ " utteranc.es" -%}
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
|
|
||||||
{%- if mermaid_enabled and not serve_local_mermaid -%}
|
{%- if (mermaid_enabled and not serve_local_mermaid) or iine_enabled -%}
|
||||||
{%- set script_src = script_src ~ " " ~ " cdn.jsdelivr.net" -%}
|
{%- set script_src = script_src ~ " " ~ " cdn.jsdelivr.net" -%}
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
|
|
||||||
|
{#- Check if a webmention system is enabled to allow the necessary domains and directives -#}
|
||||||
|
{%- if config.extra.webmentions.enable -%}
|
||||||
|
{%- set connect_src = connect_src ~ " webmention.io" -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{#- Check if iine like buttons are enabled to allow the necessary domains -#}
|
||||||
|
{%- if iine_enabled -%}
|
||||||
|
{%- set connect_src = connect_src ~ " vhiweeypifbwacashxjz.supabase.co" -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
{#- Append WebSocket for Zola serve mode -#}
|
{#- Append WebSocket for Zola serve mode -#}
|
||||||
{%- if config.mode == "serve" -%}
|
{%- if config.mode == "serve" -%}
|
||||||
{%- set connect_src = connect_src ~ " ws:" -%}
|
{%- set connect_src = connect_src ~ " ws:" -%}
|
||||||
|
@ -61,19 +74,19 @@ content="default-src 'self'
|
||||||
|
|
||||||
{%- for domain in config.extra.allowed_domains -%}
|
{%- for domain in config.extra.allowed_domains -%}
|
||||||
{%- if domain.directive == "connect-src" -%}
|
{%- if domain.directive == "connect-src" -%}
|
||||||
{%- set configured_connect_src = domain.domains | join(sep=' ') -%}
|
{%- set configured_connect_src = domain.domains | join(sep=' ') | safe -%}
|
||||||
{%- set_global connect_src = connect_src ~ " " ~ configured_connect_src -%}
|
{%- set_global connect_src = connect_src ~ " " ~ configured_connect_src -%}
|
||||||
{%- continue -%}
|
{%- continue -%}
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
|
|
||||||
{%- if domain.directive == "script-src" -%}
|
{%- if domain.directive == "script-src" -%}
|
||||||
{%- set configured_script_src = domain.domains | join(sep=' ') -%}
|
{%- set configured_script_src = domain.domains | join(sep=' ') | safe -%}
|
||||||
{%- set_global script_src = script_src ~ " " ~ configured_script_src -%}
|
{%- set_global script_src = script_src ~ " " ~ configured_script_src -%}
|
||||||
{%- continue -%}
|
{%- continue -%}
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
|
|
||||||
{#- Handle directives that are not connect-src -#}
|
{#- Handle directives that are not connect-src -#}
|
||||||
{{ domain.directive }} {{ domain.domains | join(sep=' ') -}}
|
{{ domain.directive }} {{ domain.domains | join(sep=' ') | safe -}}
|
||||||
|
|
||||||
{%- if domain.directive == "style-src" -%}
|
{%- if domain.directive == "style-src" -%}
|
||||||
{%- if utterances_enabled or hyvortalk_enabled or mermaid_enabled %} 'unsafe-inline'
|
{%- if utterances_enabled or hyvortalk_enabled or mermaid_enabled %} 'unsafe-inline'
|
||||||
|
|
|
@ -21,9 +21,16 @@
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{# Button to go to the comment section #}
|
{# Button to go to the comment/webmentions section #}
|
||||||
{% if comment_system %}
|
{% if comment_system or config.extra.webmentions.enable %}
|
||||||
<a href="#comments" id="comments-button" class="no-hover-padding" title="{{ macros_translate::translate(key="go_to_comments", default="Go to comments section", language_strings=language_strings) }}">
|
{%- if comment_system -%}
|
||||||
|
{#- Comments are shown above webmentions -#}
|
||||||
|
{%- set comments_id = "comments" -%}
|
||||||
|
{%- else -%}
|
||||||
|
{%- set comments_id = "webmentions" -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
<a href="#{{- comments_id -}}" id="comments-button" class="no-hover-padding" title="{{ macros_translate::translate(key="go_to_comments", default="Go to comments section", language_strings=language_strings) }}">
|
||||||
<svg viewBox="0 0 20 20" fill="currentColor"><path d="M18 10c0 3.866-3.582 7-8 7a8.841 8.841 0 01-4.083-.98L2 17l1.338-3.123C2.493 12.767 2 11.434 2 10c0-3.866 3.582-7 8-7s8 3.134 8 7zM7 9H5v2h2V9zm8 0h-2v2h2V9zM9 9h2v2H9V9z" clip-rule="evenodd" fill-rule="evenodd"/></svg>
|
<svg viewBox="0 0 20 20" fill="currentColor"><path d="M18 10c0 3.866-3.582 7-8 7a8.841 8.841 0 01-4.083-.98L2 17l1.338-3.123C2.493 12.767 2 11.434 2 10c0-3.866 3.582-7 8-7s8 3.134 8 7zM7 9H5v2h2V9zm8 0h-2v2h2V9zM9 9h2v2H9V9z" clip-rule="evenodd" fill-rule="evenodd"/></svg>
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -74,3 +81,8 @@
|
||||||
{%- if macros_settings::evaluate_setting_priority(setting="footnote_backlinks", page=page_s, section=section_s, default_global_value=false) == "true" -%}
|
{%- if macros_settings::evaluate_setting_priority(setting="footnote_backlinks", page=page_s, section=section_s, default_global_value=false) == "true" -%}
|
||||||
<script defer src="{{ get_url(path='js/footnoteBacklinks.min.js', trailing_slash=false | safe )}}"></script>
|
<script defer src="{{ get_url(path='js/footnoteBacklinks.min.js', trailing_slash=false | safe )}}"></script>
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
|
|
||||||
|
{# Add iine.js for the like button #}
|
||||||
|
{%- if macros_settings::evaluate_setting_priority(setting="iine", page=page_s, section=section_s, default_global_value=false) == "true" -%}
|
||||||
|
<script defer src="https://cdn.jsdelivr.net/gh/welpo/iine@main/iine.mini.js"></script>
|
||||||
|
{%- endif -%}
|
||||||
|
|
|
@ -2,17 +2,11 @@
|
||||||
|
|
||||||
{%- set rel_attributes = macros_rel_attributes::rel_attributes() | trim -%}
|
{%- set rel_attributes = macros_rel_attributes::rel_attributes() | trim -%}
|
||||||
|
|
||||||
{%- if config.markdown.external_links_target_blank -%}
|
{%- set blank_target = macros_target_attribute::target_attribute(new_tab=config.markdown.external_links_target_blank) -%}
|
||||||
{%- set blank_target = "target=_blank" -%}
|
|
||||||
{%- else -%}
|
|
||||||
{%- set blank_target = "" -%}
|
|
||||||
{%- endif -%}
|
|
||||||
|
|
||||||
{#- Feed icon -#}
|
{#- Feed icon -#}
|
||||||
{#- Zola 0.19.0 uses `generate_feeds`. Prior versions use `generate_feed` -#}
|
{%- set feed_url = feed_utils::get_feed_url() -%}
|
||||||
{%- set generate_feed = config.generate_feeds | default(value=config.generate_feed) -%}
|
{%- set should_show_feed = feed_utils::should_show_footer_feed_icon() == "true" -%}
|
||||||
{%- set feed_url = config.feed_filenames[0] | default(value=(config.feed_filename)) -%}
|
|
||||||
{%- set should_show_feed = generate_feed and config.extra.feed_icon and feed_url -%}
|
|
||||||
|
|
||||||
{%- set should_show_footer_icons = should_show_feed or config.extra.socials or config.extra.email -%}
|
{%- set should_show_footer_icons = should_show_feed or config.extra.socials or config.extra.email -%}
|
||||||
|
|
||||||
|
|
75
templates/partials/hcard.html
Normal file
75
templates/partials/hcard.html
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
{%- set hcard = config.extra.hcard -%}
|
||||||
|
|
||||||
|
{% set full_name = config.author %}
|
||||||
|
{% if hcard.full_name %}
|
||||||
|
{% set full_name = hcard.full_name %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{%- set homepage = config.base_url -%}
|
||||||
|
{% if hcard.homepage %}
|
||||||
|
{%- set homepage = hcard.homepage -%}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if hcard.enable %}
|
||||||
|
<div class="h-card hidden">
|
||||||
|
<div>
|
||||||
|
{%- if hcard.avatar -%}
|
||||||
|
<img
|
||||||
|
class="u-photo"
|
||||||
|
src="{{ get_url(path=hcard.avatar, cachebust=true) }}"
|
||||||
|
width="200"
|
||||||
|
height="200"
|
||||||
|
alt="{{ full_name }}"
|
||||||
|
/>
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
<span class="p-name" rel="me">{{ full_name }}</span>
|
||||||
|
|
||||||
|
{% if hcard.p_nickname %}
|
||||||
|
( <span class="p-nickname">{{ hcard.p_nickname }}</span> )
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if hcard.biography %}
|
||||||
|
<p class="p-note">{{ hcard.biography }}</p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{# links #}
|
||||||
|
<div>
|
||||||
|
{%- if hcard.with_mail and config.extra.email and not config.extra.encode_plaintext_email -%}
|
||||||
|
<span>
|
||||||
|
<a class="u-email" href="mailto:{{ config.extra.email | safe }}">email</a>
|
||||||
|
</span> -
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
<span>
|
||||||
|
<a class="u-url u-id" href="{{ homepage }}">homepage</a>
|
||||||
|
</span> -
|
||||||
|
|
||||||
|
{%- if hcard.with_social_links and config.extra.socials %}
|
||||||
|
{% for social in config.extra.socials %}
|
||||||
|
<span>
|
||||||
|
<a class="p-url" rel="me" href="{{ social.url | safe }}">{{ social.name }}</a>
|
||||||
|
</span> -
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{# additional properties #}
|
||||||
|
{% set dl_started = false %}
|
||||||
|
{% for key, value in hcard %}
|
||||||
|
{% if key not in ['enable', 'with_mail', 'with_social_links', 'homepage', 'full_name', 'avatar', 'biography', 'p_nickname'] %}
|
||||||
|
{% if not dl_started %}
|
||||||
|
<dl>
|
||||||
|
{% set_global dl_started = true %}
|
||||||
|
{% endif %}
|
||||||
|
<dt>{{ key | replace(from="p_", to="") | replace(from="u_", to="") | replace(from="dt_", to="") | replace(from="_", to=" ") | capitalize }}</dt>
|
||||||
|
<dd class="{{ key | replace(from="_", to="-") }}">{{ value }}</dd>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% if dl_started %}
|
||||||
|
</dl>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
26
templates/partials/hcard_small.html
Normal file
26
templates/partials/hcard_small.html
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
{%- set hcard = config.extra.hcard -%}
|
||||||
|
|
||||||
|
{%- set full_name = config.author -%}
|
||||||
|
{%- if hcard.full_name -%}
|
||||||
|
{%- set full_name = hcard.full_name -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{%- set homepage = config.base_url -%}
|
||||||
|
{%- if hcard.homepage -%}
|
||||||
|
{%- set homepage = hcard.homepage -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{%- set icon_attr = "" -%}
|
||||||
|
{%- if hcard.avatar -%}
|
||||||
|
{%- set icon_attr = "author-icon" -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
<span class="hidden p-author h-card">
|
||||||
|
<a rel="author" href="{{ homepage }}" class="u-url {{ icon_attr }}" title="{{ full_name }}">
|
||||||
|
{%- if hcard.avatar -%}
|
||||||
|
<img class="u-photo" src="{{ get_url(path=hcard.avatar, cachebust=true) }}" alt="{{ full_name }}" />
|
||||||
|
{%- else -%}
|
||||||
|
{{ full_name }}
|
||||||
|
{%- endif -%}
|
||||||
|
</a>
|
||||||
|
</span>
|
|
@ -177,4 +177,6 @@
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
|
|
||||||
|
{# Users can optionally provide this template to add content to the head element. #}
|
||||||
|
{% include "tabi/extend_head.html" ignore missing %}
|
||||||
</head>
|
</head>
|
||||||
|
|
33
templates/partials/iine_button.html
Normal file
33
templates/partials/iine_button.html
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
{% import "macros/settings.html" as macros_settings %}
|
||||||
|
{%- set button_icon = button_icon | default(value=macros_settings::evaluate_setting_priority(setting="iine_icon", page=page | default(value=""), section=section | default(value=""), default_global_value="heart")) -%}
|
||||||
|
{%- if config.extra.iine_unified_languages and lang != config.default_language -%}
|
||||||
|
{%- set unified_slug = page.path | replace(from='/' ~ lang ~ '/', to='/') -%}
|
||||||
|
{%- set slug = slug | default(value=unified_slug) -%}
|
||||||
|
{%- else -%}
|
||||||
|
{%- set slug = slug | default(value=page.path) -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- if label -%}
|
||||||
|
{%- set final_label = label -%}
|
||||||
|
{%- elif language_strings -%}
|
||||||
|
{%- set final_label = macros_translate::translate(key="like_this_post", default="Like this post", language_strings=language_strings) -%}
|
||||||
|
{%- else -%}
|
||||||
|
{%- set final_label = "Like this post" -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{%- if button_icon == "heart" -%}
|
||||||
|
{%- set icon_display = "♥️" -%}
|
||||||
|
{%- elif button_icon == "thumbs_up" -%}
|
||||||
|
{%- set icon_display = "👍" -%}
|
||||||
|
{%- elif button_icon == "upvote" -%}
|
||||||
|
{%- set icon_display = "⬆️" -%}
|
||||||
|
{%- else -%}
|
||||||
|
{%- set icon_display = button_icon -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
<form method="post" action="https://vhiweeypifbwacashxjz.supabase.co/rest/v1/rpc/increment_hits?apikey=sb_publishable_EoB7MFJhCmb6PiAk-GPJ4w_PGhQ44Ru" class="iine-form">
|
||||||
|
<input type="hidden" name="page_slug" value="{%- if slug -%}{{ slug }}{%- else -%}{{ current_url | default(value=page.path) }}{%- endif -%}">
|
||||||
|
<button class="iine-button" type="submit"
|
||||||
|
{%- if slug %} data-slug="{{ slug }}"{% endif %}
|
||||||
|
{%- if button_icon %} data-icon="{{ button_icon }}"{% endif %}
|
||||||
|
aria-label="{{ final_label }}" title="{{ final_label }}">{{ icon_display }}</button>
|
||||||
|
</form>
|
|
@ -1,7 +1,12 @@
|
||||||
<li class="language-switcher">
|
<li class="language-switcher">
|
||||||
<details class="dropdown">
|
<details class="dropdown">
|
||||||
<summary role="button" aria-haspopup="true" title="{{ macros_translate::translate(key="language_selection", default="Language selection", language_strings=language_strings) }}" aria-label="{{ macros_translate::translate(key="language_selection", default="Language selection", language_strings=language_strings) }}">
|
<summary role="button" aria-haspopup="true" title="{{ macros_translate::translate(key="language_selection", default="Language selection", language_strings=language_strings) }}" aria-label="{{ macros_translate::translate(key="language_selection", default="Language selection", language_strings=language_strings) }}">
|
||||||
|
{%- if config.extra.show_selected_language_code_in_language_switcher -%}
|
||||||
|
<div class="language-switcher-icon language-switcher-icon-with-code"></div>
|
||||||
|
<div class="language-switcher-icon-code">{{lang}}</div>
|
||||||
|
{%- else -%}
|
||||||
<div class="language-switcher-icon"></div>
|
<div class="language-switcher-icon"></div>
|
||||||
|
{%- endif -%}
|
||||||
</summary>
|
</summary>
|
||||||
<div class="dropdown-content" role="menu">
|
<div class="dropdown-content" role="menu">
|
||||||
{#- Display the current language first in the dropdown -#}
|
{#- Display the current language first in the dropdown -#}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<header>
|
<header>
|
||||||
<nav class="navbar">
|
<nav class="navbar">
|
||||||
<div class="nav-title">
|
<div class="nav-title">
|
||||||
<a class="home-title" href="{{ get_url(path='/', lang=lang) }}">{{ config.title }}</a>
|
<a class="home-title" href="{{ get_url(path='/', lang=lang, trailing_slash=(lang == config.default_language)) }}">{{ config.title }}</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{%- if config.extra.menu %}
|
{%- if config.extra.menu %}
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
{#- Setup -#}
|
{#- Setup -#}
|
||||||
|
{% if not config.title %}
|
||||||
|
{{ throw(message="ERROR: No `title` set in `config.toml`. tabi requires a title to function.") }}
|
||||||
|
{% endif %}
|
||||||
{%- set prefix = config.title | safe -%}
|
{%- set prefix = config.title | safe -%}
|
||||||
{%- set custom_separator = config.extra.separator | default(value="•") -%}
|
{%- set custom_separator = config.extra.separator | default(value="•") -%}
|
||||||
{%- set separator = " " ~ custom_separator ~ " " -%}
|
{%- set separator = " " ~ custom_separator ~ " " -%}
|
||||||
|
|
51
templates/partials/webmentions.html
Normal file
51
templates/partials/webmentions.html
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
{# 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. #}
|
||||||
|
|
||||||
|
<link rel="webmention" href="https://webmention.io/{{ config.extra.webmentions.domain }}/webmention" />
|
||||||
|
|
||||||
|
{# 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 %}
|
||||||
|
|
||||||
|
<script async src="{{ get_url(path='js/webmention.min.js', trailing_slash=false, cachebust=true) | safe }}" {{ script_data }}>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="webmentions-container" id="webmentions"></div>
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue