diff --git a/config.toml b/config.toml
index 7dbafba8..bba002fa 100644
--- a/config.toml
+++ b/config.toml
@@ -292,7 +292,9 @@ menu = [
{ name = "projects", url = "projects", trailing_slash = true },
]
-# The RSS icon will be shown if (1) it's enabled and (2) the following variable is set to true.
+# The RSS icon will be shown if (1) it's enabled and (2) the following variable is set.
+# Set to true to use the default "rss" icon, or specify a custom icon name (e.g. "square-rss").
+# The icon must exist in static/social_icons/ (without the .svg extension).
# Note for Zola 0.19.X users: when `feed_filenames` has two filenames, only the first one will be linked in the footer.
feed_icon = true
diff --git a/content/blog/markdown/index.ar.md b/content/blog/markdown/index.ar.md
index 9322dc44..4f25678e 100644
--- a/content/blog/markdown/index.ar.md
+++ b/content/blog/markdown/index.ar.md
@@ -1,7 +1,7 @@
+++
title = "أمثلة على ماركداون"
date = 2023-01-31
-updated = 2023-09-01
+updated = 2026-01-01
description = "تعرض هذه التدوينة بعض الأمثلة على تنسيق ماركداون، بما في ذلك الجداول، والشِفرات البرمجية والوسوم، والاقتباسات، والهوامش."
[taxonomies]
@@ -31,7 +31,7 @@ katex = true
على سبيل المثال، `\\[ r = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i - \bar{x})^2}\sqrt{\sum_{i=1}^{n}(y_i - \bar{y})^2}} \\]` سيظهر هكذا: \\[ r = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i - \bar{x})^2}\sqrt{\sum_{i=1}^{n}(y_i - \bar{y})^2}} \\]
-لتفعيل $\KaTeX$ لتدوينة أو قسم كامل، أضف `katex = true` داخل قسم `[extra]` في المقدمة. على سبيل المثال:
+فعّل $\KaTeX$ بإضافة `katex = true` في `[extra]`:
```toml,hl_lines=5-6
title = "تجربة KaTeX"
@@ -41,12 +41,20 @@ date = 2002-11-30
katex = true
```
-يمكنك أيضاً تفعيله بشكل عام عن طريق تعيين `katex = true` في قسم `[extra]` في ملف `config.toml` الخاص بك.
+يعمل في: مقدمة الصفحة، `_index.md` للقسم، أو عالمياً في `config.toml`.
لتحسين الأداء والأمان، يتم استضافة ملفات جافا سكريبت و CSS والخطوط الخاصة بـ $\KaTeX$ محلياً.
**ملاحظة**: بعد تفعيل $\KaTeX$، إذا أردت استخدام \$ بدون عرض تعبير رياضي، استخدم شرطة مائلة للخلف قبلها: `\$`.
+### الصيغ الكيميائية
+
+الصيغ الكيميائية مدعومة عبر [امتداد mhchem](https://mhchem.github.io/MathJax-mhchem/)، الذي يُحمّل تلقائياً عند استخدام `\ce{}` أو `\pu{}`.
+
+`\ce{}` للكيمياء: $\ce{H2O}$، $\ce{CO2 + H2O -> H2CO3}$
+
+`\pu{}` للوحدات: $\pu{25 °C}$، $\pu{1.2 mol/L}$
+
## جدول
هذا مثال على جدول[^1]. تتغير ألوانه حسب سمة التدوينة.
diff --git a/content/blog/markdown/index.ca.md b/content/blog/markdown/index.ca.md
index 16cf1657..d3d9d329 100644
--- a/content/blog/markdown/index.ca.md
+++ b/content/blog/markdown/index.ca.md
@@ -1,7 +1,7 @@
+++
title = "Exemples de Markdown"
date = 2023-01-31
-updated = 2025-02-21
+updated = 2026-01-01
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]
@@ -24,7 +24,7 @@ Per mostrar l'expressió **en una línia pròpia i centrada**, embolcalla-la amb
Per exemple, `\\[ r = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i - \bar{x})^2}\sqrt{\sum_{i=1}^{n}(y_i - \bar{y})^2}} \\]` es renderitzarà com: \\[ r = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i - \bar{x})^2}\sqrt{\sum_{i=1}^{n}(y_i - \bar{y})^2}} \\]
-Per activar $\KaTeX$ en una publicació o secció sencera, inclou `katex = true` dins de la secció `[extra]` de les metadades. Per exemple:
+Activa $\KaTeX$ afegint `katex = true` a `[extra]`:
```toml,hl_lines=5-6
title = "Provant KaTeX"
@@ -34,12 +34,20 @@ date = 2002-11-30
katex = true
```
-Per activar-lo globalment, afeigeix `katex = true` a la secció `[extra]` del teu `config.toml`.
+Funciona a: metadades de pàgina, `_index.md` de secció, o globalment a `config.toml`.
Per obtenir un millor rendiment i seguretat, els fitxers JavaScript, CSS i les tipografies de $\KaTeX$ s'allotgen localment.
**Nota**: Després d'activar $\KaTeX$, si vols utilitzar el caràcter \$ sense renderitzar-lo com a expressió matemàtica, escapa'l amb una barra inversa: `\$`.
+### Fórmules químiques
+
+Les fórmules químiques estan suportades mitjançant l'[extensió mhchem](https://mhchem.github.io/MathJax-mhchem/), que es carrega automàticament en utilitzar `\ce{}` o `\pu{}`.
+
+`\ce{}` per química: $\ce{H2O}$, $\ce{CO2 + H2O -> H2CO3}$
+
+`\pu{}` per unitats: $\pu{25 °C}$, $\pu{1.2 mol/L}$
+
## Taula
Aquí tens un exemple de taula[^1]. Els seus colors canvien en funció del tema actual.
diff --git a/content/blog/markdown/index.es.md b/content/blog/markdown/index.es.md
index af38f477..12bd65bb 100644
--- a/content/blog/markdown/index.es.md
+++ b/content/blog/markdown/index.es.md
@@ -1,7 +1,7 @@
+++
title = "Ejemplos de Markdown"
date = 2023-01-31
-updated = 2025-02-21
+updated = 2026-01-01
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]
@@ -24,7 +24,7 @@ Para mostrar la expresión **en su propia línea y centrada**, envuélvela entre
Por ejemplo, `\\[ r = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i - \bar{x})^2}\sqrt{\sum_{i=1}^{n}(y_i - \bar{y})^2}} \\]` se mostraría como: \\[ r = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i - \bar{x})^2}\sqrt{\sum_{i=1}^{n}(y_i - \bar{y})^2}} \\]
-Para activar $\KaTeX$ en una publicación o sección entera, incluye `katex = true` dentro de la sección `[extra]` del encabezado. Por ejemplo:
+Activa $\KaTeX$ añadiendo `katex = true` en `[extra]`:
```toml,hl_lines=5-6
title = "Probando KaTeX"
@@ -34,12 +34,20 @@ date = 2002-11-30
katex = true
```
-Para activarlo globalmente, añade `katex = true` en la sección `[extra]` de tu `config.toml`.
+Funciona en: encabezado de página, `_index.md` de sección, o globalmente en `config.toml`.
Para un mejor rendimiento y seguridad, el JavaScript, CSS y las fuentes de $\KaTeX$ se alojan localmente.
**Nota**: Después de habilitar $\KaTeX$, si deseas usar \$ sin representar una expresión matemática, escápalo con una sola barra invertida: `\$`.
+### Fórmulas químicas
+
+Las fórmulas químicas están soportadas mediante la [extensión mhchem](https://mhchem.github.io/MathJax-mhchem/), que se carga automáticamente al usar `\ce{}` o `\pu{}`.
+
+`\ce{}` para química: $\ce{H2O}$, $\ce{CO2 + H2O -> H2CO3}$
+
+`\pu{}` para unidades: $\pu{25 °C}$, $\pu{1.2 mol/L}$
+
## Tabla
Aquí tienes un ejemplo de una tabla[^1]. Los colores cambian dependiendo del tema actual.
diff --git a/content/blog/markdown/index.md b/content/blog/markdown/index.md
index ca2f4cfd..1b5584de 100644
--- a/content/blog/markdown/index.md
+++ b/content/blog/markdown/index.md
@@ -1,7 +1,7 @@
+++
title = "Markdown examples"
date = 2023-01-31
-updated = 2025-02-21
+updated = 2026-01-01
description = "This post showcases some examples of Markdown formatting, including a table, code blocks and tags, quotes, tables, and footnotes."
[taxonomies]
@@ -24,7 +24,7 @@ To display the expression **on its own line and centered**, wrap it around `$$`
For example, `\\[ r = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i - \bar{x})^2}\sqrt{\sum_{i=1}^{n}(y_i - \bar{y})^2}} \\]` renders: \\[ r = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i - \bar{x})^2}\sqrt{\sum_{i=1}^{n}(y_i - \bar{y})^2}} \\]
-To activate $\KaTeX$ for a post or an entire section, include `katex = true` within the `[extra]` section of the front matter. For exemple:
+Enable $\KaTeX$ by setting `katex = true` in `[extra]`:
```toml,hl_lines=5-6
title = "Testing KaTeX"
@@ -34,12 +34,20 @@ date = 2002-11-30
katex = true
```
-You may enable it globally as well, by setting `katex = true` in the `[extra]` section of your `config.toml`.
+Works in: page front matter, section `_index.md`, or globally in `config.toml`.
For enhanced performance and security, the $\KaTeX$ JavaScript, CSS, and fonts are hosted locally.
**Note**: After enabling $\KaTeX$, if you want to use \$ without rendering a mathematical expression, escape it with a single backslash: `\$`.
+### Chemistry formulas
+
+Chemistry formulas are supported via the [mhchem extension](https://mhchem.github.io/MathJax-mhchem/), which loads automatically when using `\ce{}` or `\pu{}`.
+
+`\ce{}` for chemistry: $\ce{H2O}$, $\ce{CO2 + H2O -> H2CO3}$
+
+`\pu{}` for units: $\pu{25 °C}$, $\pu{1.2 mol/L}$
+
## Table
Here's an example of a table[^1]. Its colours change depending on the current theme.
diff --git a/content/blog/mastering-tabi-settings/index.ca.md b/content/blog/mastering-tabi-settings/index.ca.md
index 2cadcc54..4058f1c0 100644
--- a/content/blog/mastering-tabi-settings/index.ca.md
+++ b/content/blog/mastering-tabi-settings/index.ca.md
@@ -1,7 +1,7 @@
+++
title = "Domina la configuració de tabi: guia completa"
date = 2023-09-18
-updated = 2025-12-27
+updated = 2026-01-01
description = "Descobreix les múltiples maneres en què pots personalitzar tabi."
[taxonomies]
@@ -884,6 +884,8 @@ Per utilitzar una icona personalitzada, pots afegir-la al directori `static/soci
Pots afegir un enllaç al teu feed RSS/Atom al peu de pàgina amb `feed_icon = true`.
+Per utilitzar una icona personalitzada, estableix `feed_icon` amb el nom de la icona (per exemple, `feed_icon = "square-rss"`). La icona ha d'existir a `static/social_icons/` (sense l'extensió `.svg`).
+
Nota pels usuaris de Zola 0.19.X: quan hi ha dos noms de fitxer a `feed_filenames`, només s'enllaçarà el primer al peu de pàgina.
#### Menú de peu de pàgina
diff --git a/content/blog/mastering-tabi-settings/index.es.md b/content/blog/mastering-tabi-settings/index.es.md
index 9f0a8186..cb42b027 100644
--- a/content/blog/mastering-tabi-settings/index.es.md
+++ b/content/blog/mastering-tabi-settings/index.es.md
@@ -1,7 +1,7 @@
+++
title = "Domina la configuración de tabi: guía completa"
date = 2023-09-18
-updated = 2025-12-27
+updated = 2026-01-01
description = "Descubre las múltiples maneras en que puedes personalizar tabi."
[taxonomies]
@@ -889,6 +889,8 @@ Para usar un icono personalizado, puedes añadirlo al directorio `static/social_
Puedes añadir un enlace a tu feed RSS/Atom en el pie de página con `feed_icon = true`.
+Para usar un icono personalizado, establece `feed_icon` con el nombre del icono (por ejemplo, `feed_icon = "square-rss"`). El icono debe existir en `static/social_icons/` (sin la extensión `.svg`).
+
Nota para usuarios de Zola 0.19.X: cuando hay dos nombres de archivo en `feed_filenames`, solo se enlazará el primero en el pie de página.
### Menú de pie de página
diff --git a/content/blog/mastering-tabi-settings/index.md b/content/blog/mastering-tabi-settings/index.md
index 1adfa5b1..c7dffe55 100644
--- a/content/blog/mastering-tabi-settings/index.md
+++ b/content/blog/mastering-tabi-settings/index.md
@@ -1,7 +1,7 @@
+++
title = "Mastering tabi Settings: A Comprehensive Guide"
date = 2023-09-18
-updated = 2025-12-27
+updated = 2026-01-01
description = "Discover the many ways you can customise your tabi site."
[taxonomies]
@@ -898,6 +898,8 @@ To use a custom icon, you can add it to your site's `static/social_icons` direct
You can add a link to your RSS/Atom feed to the footer with `feed_icon = true`.
+To use a custom icon, set `feed_icon` to the icon name (e.g. `feed_icon = "square-rss"`). The icon must exist in `static/social_icons/` (without the `.svg` extension).
+
Note for Zola 0.19.X users: when there are two filenames in `feed_filenames`, only the first one will be linked in the footer.
### Footer Menu
diff --git a/content/projects/bunbu/bunbu_logo.webp b/content/projects/bunbu/bunbu_logo.webp
new file mode 100644
index 00000000..72b4789a
Binary files /dev/null and b/content/projects/bunbu/bunbu_logo.webp differ
diff --git a/content/projects/bunbu/index.ca.md b/content/projects/bunbu/index.ca.md
new file mode 100644
index 00000000..98bd25de
--- /dev/null
+++ b/content/projects/bunbu/index.ca.md
@@ -0,0 +1,32 @@
++++
+title = "bunbu"
+description = "Analitza la freqüència de paraules en textos japonesos."
+weight = 34
+
+[taxonomies]
+tags = ["Japonès", "web app", "web", "JavaScript", "PWA"]
+
+[extra]
+local_image = "projects/bunbu/bunbu_logo.webp"
+canonical_url = "https://osc.garden/es/projects/bunbu/"
+social_media_card = "social_cards/projects_bunbu.jpg"
++++
+
+**bunbu** és una aplicació web progressiva per analitzar la freqüència de paraules en textos en japonès. Enganxa o carrega qualsevol text en japonès i bunbu el desglossarà en paraules individuals i et mostrarà amb quina freqüència apareix cadascuna.
+
+#### [Prova-la ara](https://bunbu.osc.garden) • [GitHub](https://github.com/welpo/bunbu) {.centered-text}
+
+## Característiques
+
+- Anàlisi morfològica de text japonès impulsada per [Goya](https://github.com/Leko/goya)
+- Taula de freqüència de paraules amb recomptes, percentatges i categories gramaticals
+- Furigana per als kanjis
+- Enllaços a diccionaris en línia (Jisho, Weblio, Kotobank, Goo, Wiktionary)
+- Referències de pronunciació (Forvo, YouGlish, ImmersionKit) i text a veu
+- Filtra els resultats per categoria gramatical (substantius, verbs, adjectius…)
+- Múltiples mètodes d'entrada: enganxar, escriure o importar fitxers
+- Processament 100% local: el teu text mai surt del teu dispositiu
+- Funciona fora de línia com a aplicació web progressiva (PWA)
+- Instal·lable en mòbils i escriptori
+
+[](https://bunbu.osc.garden)
diff --git a/content/projects/bunbu/index.es.md b/content/projects/bunbu/index.es.md
new file mode 100644
index 00000000..3de14dd3
--- /dev/null
+++ b/content/projects/bunbu/index.es.md
@@ -0,0 +1,32 @@
++++
+title = "bunbu"
+description = "Analiza la frecuencia de palabras en textos japoneses."
+weight = 34
+
+[taxonomies]
+tags = ["Japonés", "web app", "web", "JavaScript", "PWA"]
+
+[extra]
+local_image = "projects/bunbu/bunbu_logo.webp"
+canonical_url = "https://osc.garden/es/projects/bunbu/"
+social_media_card = "social_cards/projects_bunbu.jpg"
++++
+
+**bunbu** es una aplicación web progresiva (PWA) para analizar la frecuencia de palabras en textos en japonés. Pega o carga cualquier texto en japonés y bunbu lo desglosará en palabras individuales, mostrándote con qué frecuencia aparece cada una.
+
+#### [Pruébala ahora](https://bunbu.osc.garden) • [GitHub](https://github.com/welpo/bunbu) {.centered-text}
+
+## Características
+
+- Análisis morfológico de texto japonés impulsado por [Goya](https://github.com/Leko/goya)
+- Tabla de frecuencia de palabras con conteos, porcentajes y categorías gramaticales
+- Furigana para los kanjis
+- Enlaces a diccionarios online (Jisho, Weblio, Kotobank, Goo, Wiktionary)
+- Referencias de pronunciación (Forvo, YouGlish, ImmersionKit) y texto a voz
+- Filtrado de resultados por categoría gramatical (sustantivos, verbos, adjetivos…)
+- Múltiples métodos de entrada: pegar, escribir o importar archivos
+- Procesamiento 100% local: tu texto nunca sale de tu dispositivo
+- Funciona sin conexión como aplicación web progresiva (PWA)
+- Instalable en móviles y escritorio
+
+[](https://bunbu.osc.garden)
diff --git a/content/projects/bunbu/index.md b/content/projects/bunbu/index.md
new file mode 100644
index 00000000..eeef04c7
--- /dev/null
+++ b/content/projects/bunbu/index.md
@@ -0,0 +1,32 @@
++++
+title = "bunbu"
+description = "Word frequency analysis of Japanese text."
+weight = 34
+
+[taxonomies]
+tags = ["Japanese", "web app", "web", "JavaScript", "PWA"]
+
+[extra]
+local_image = "projects/bunbu/bunbu_logo.webp"
+canonical_url = "https://osc.garden/projects/bunbu/"
+social_media_card = "social_cards/projects_bunbu.jpg"
++++
+
+**bunbu** is a Progressive Web App to analyse word frequency in Japanese text. Paste or load any Japanese text and bunbu will break it down into individual words, showing you how often each one appears.
+
+#### [Try it now](https://bunbu.osc.garden) • [GitHub](https://github.com/welpo/bunbu) {.centered-text}
+
+## Features
+
+- Morphological analysis of Japanese text powered by [Goya](https://github.com/Leko/goya)
+- Word frequency table with counts, percentages, and parts of speech
+- Furigana for kanji
+- Links to online dictionaries (Jisho, Weblio, Kotobank, Goo, Wiktionary)
+- Pronunciation references (Forvo, YouGlish, ImmersionKit) and text-to-speech
+- Filter results by part of speech (nouns, verbs, adjectives…)
+- Multiple input methods: paste, type, or import files
+- 100% local processing—your text never leaves your device
+- Works offline as a Progressive Web App
+- Installable on mobile and desktop
+
+[](https://bunbu.osc.garden)
diff --git a/content/projects/bunbu/social_cards/projects_bunbu.jpg b/content/projects/bunbu/social_cards/projects_bunbu.jpg
new file mode 100644
index 00000000..59014591
Binary files /dev/null and b/content/projects/bunbu/social_cards/projects_bunbu.jpg differ
diff --git a/scripts/upgrade-deps b/scripts/upgrade-deps
index 62a5d529..5944995b 100755
--- a/scripts/upgrade-deps
+++ b/scripts/upgrade-deps
@@ -9,8 +9,10 @@ KATEX_CSS_DIR="static"
KATEX_FONTS_DIR="static/fonts/KaTeX"
KATEX_JS_FILE="katex.min.js"
KATEX_CSS_FILE="katex.min.css"
+KATEX_MHCHEM_FILE="mhchem.min.js"
KATEX_JS_PATH="${KATEX_JS_DIR}/${KATEX_JS_FILE}"
KATEX_CSS_PATH="${KATEX_CSS_DIR}/${KATEX_CSS_FILE}"
+KATEX_MHCHEM_PATH="${KATEX_JS_DIR}/${KATEX_MHCHEM_FILE}"
UGLIFY_ITERATIONS=5
CURL_RETRIES=3
@@ -287,7 +289,13 @@ EOM
local css_comparison_result
css_comparison_result=$(compare_md5 "${TEMP_DIR}/${KATEX_CSS_FILE}" "${KATEX_CSS_PATH}")
- if [ "$js_comparison_result" = "same" ] && [ "$css_comparison_result" = "same" ]; then
+ # mhchem extension.
+ cp "${TEMP_DIR}/katex/contrib/mhchem.min.js" "${TEMP_DIR}/${KATEX_MHCHEM_FILE}"
+ uglify_file "${TEMP_DIR}/${KATEX_MHCHEM_FILE}" "$UGLIFY_ITERATIONS"
+ local mhchem_comparison_result
+ mhchem_comparison_result=$(compare_md5 "${TEMP_DIR}/${KATEX_MHCHEM_FILE}" "${KATEX_MHCHEM_PATH}")
+
+ if [ "$js_comparison_result" = "same" ] && [ "$css_comparison_result" = "same" ] && [ "$mhchem_comparison_result" = "same" ]; then
echo "KaTeX: New version is the same as current version. No update needed."
return 0
fi
@@ -306,6 +314,12 @@ EOM
changes_made=true
fi
+ if [ "$mhchem_comparison_result" != "same" ]; then
+ echo "KaTeX mhchem: New version differs from current version. Proceeding with update."
+ mv "${TEMP_DIR}/${KATEX_MHCHEM_FILE}" "${KATEX_MHCHEM_PATH}"
+ changes_made=true
+ fi
+
rm -rf "${KATEX_FONTS_DIR}"
mkdir -p "${KATEX_FONTS_DIR}"
cp -r "${TEMP_DIR}/katex/fonts"/* "${KATEX_FONTS_DIR}/"
@@ -317,7 +331,7 @@ EOM
echo "KaTeX updated successfully!"
echo "Preparing to commit changes…"
- git add "${KATEX_JS_PATH}" "${KATEX_CSS_PATH}" "${KATEX_FONTS_DIR}"
+ git add "${KATEX_JS_PATH}" "${KATEX_CSS_PATH}" "${KATEX_MHCHEM_PATH}" "${KATEX_FONTS_DIR}"
local commit_msg
commit_msg=$(generate_commit_message "$commit_msg_template" "$latest_version")
git commit -m "${commit_msg}"
diff --git a/static/js/mhchem.min.js b/static/js/mhchem.min.js
new file mode 100644
index 00000000..7f0881fd
--- /dev/null
+++ b/static/js/mhchem.min.js
@@ -0,0 +1 @@
+!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e(require("katex"));else if("function"==typeof define&&define.amd)define(["katex"],e);else{var n,o="object"==typeof exports?e(require("katex")):e(t.katex);for(n in o)("object"==typeof exports?exports:t)[n]=o[n]}}("undefined"!=typeof self?self:this,function(r){return function(){"use strict";var n={757:function(t){t.exports=r}},o={};function a(t){var e=o[t];return void 0===e&&(e=o[t]={exports:{}},n[t](e,e.exports,a)),e.exports}a.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return a.d(e,{a:e}),e},a.d=function(t,e){for(var n in e)a.o(e,n)&&!a.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},a.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)};var t=a(757),e=((t=a.n(t))().__defineMacro("\\ce",function(t){return e(t.consumeArgs(1)[0],"ce")}),t().__defineMacro("\\pu",function(t){return e(t.consumeArgs(1)[0],"pu")}),t().__defineMacro("\\tripledash","{\\vphantom{-}\\raisebox{2.56mu}{$\\mkern2mu\\tiny\\text{-}\\mkern1mu\\text{-}\\mkern1mu\\text{-}\\mkern2mu$}}"),function(t,e){for(var n="",o=t.length&&t[t.length-1].loc.start,a=t.length-1;0<=a;a--)t[a].loc.start>o&&(n+=" ",o=t[a].loc.start),n+=t[a].text,o+=t[a].text.length;return i.go(l.go(n,e))}),l={go:function(t,e){if(!t)return[];void 0===e&&(e="ce");var n,o="0",a={parenthesisLevel:0};t=(t=(t=t.replace(/\n/g," ")).replace(/[\u2212\u2013\u2014\u2010]/g,"-")).replace(/[\u2026]/g,"...");for(var r=10,i=[];;){n!==t?(r=10,n=t):r--;for(var c=l.stateMachines[e],p=c.transitions[o]||c.transitions["*"],u=0;u
":/^[=<>]/,"#":/^[#\u2261]/,"+":/^\+/,"-$":/^-(?=[\s_},;\]/]|$|\([a-z]+\))/,"-9":/^-(?=[0-9])/,"- orbital overlap":/^-(?=(?:[spd]|sp)(?:$|[\s,;\)\]\}]))/,"-":/^-/,"pm-operator":/^(?:\\pm|\$\\pm\$|\+-|\+\/-)/,operator:/^(?:\+|(?:[\-=<>]|<<|>>|\\approx|\$\\approx\$)(?=\s|$|-?[0-9]))/,arrowUpDown:/^(?:v|\(v\)|\^|\(\^\))(?=$|[\s,;\)\]\}])/,"\\bond{(...)}":function(t){return l.patterns.findObserveGroups(t,"\\bond{","","","}")},"->":/^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\u2192\u27F6\u21CC])/,CMT:/^[CMT](?=\[)/,"[(...)]":function(t){return l.patterns.findObserveGroups(t,"[","","","]")},"1st-level escape":/^(&|\\\\|\\hline)\s*/,"\\,":/^(?:\\[,\ ;:])/,"\\x{}{}":function(t){return l.patterns.findObserveGroups(t,"",/^\\[a-zA-Z]+\{/,"}","","","{","}","",!0)},"\\x{}":function(t){return l.patterns.findObserveGroups(t,"",/^\\[a-zA-Z]+\{/,"}","")},"\\ca":/^\\ca(?:\s+|(?![a-zA-Z]))/,"\\x":/^(?:\\[a-zA-Z]+\s*|\\[_&{}%])/,orbital:/^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/,others:/^[\/~|]/,"\\frac{(...)}":function(t){return l.patterns.findObserveGroups(t,"\\frac{","","","}","{","","","}")},"\\overset{(...)}":function(t){return l.patterns.findObserveGroups(t,"\\overset{","","","}","{","","","}")},"\\underset{(...)}":function(t){return l.patterns.findObserveGroups(t,"\\underset{","","","}","{","","","}")},"\\underbrace{(...)}":function(t){return l.patterns.findObserveGroups(t,"\\underbrace{","","","}_","{","","","}")},"\\color{(...)}0":function(t){return l.patterns.findObserveGroups(t,"\\color{","","","}")},"\\color{(...)}{(...)}1":function(t){return l.patterns.findObserveGroups(t,"\\color{","","","}","{","","","}")},"\\color(...){(...)}2":function(t){return l.patterns.findObserveGroups(t,"\\color","\\","",/^(?=\{)/,"{","","","}")},"\\ce{(...)}":function(t){return l.patterns.findObserveGroups(t,"\\ce{","","","}")},oxidation$:/^(?:[+-][IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,"d-oxidation$":/^(?:[+-]?\s?[IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,"roman numeral":/^[IVX]+/,"1/2$":/^[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+(?:\$[a-z]\$|[a-z])?$/,amount:function(t){var e,n;return(e=t.match(/^(?:(?:(?:\([+\-]?[0-9]+\/[0-9]+\)|[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+|[+\-]?[0-9]+[.,][0-9]+|[+\-]?\.[0-9]+|[+\-]?[0-9]+)(?:[a-z](?=\s*[A-Z]))?)|[+\-]?[a-z](?=\s*[A-Z])|\+(?!\s))/))||(n=l.patterns.findObserveGroups(t,"","$","$",""))&&(e=n.match_.match(/^\$(?:\(?[+\-]?(?:[0-9]*[a-z]?[+\-])?[0-9]*[a-z](?:[+\-][0-9]*[a-z]?)?\)?|\+|-)\$$/))?{match_:e[0],remainder:t.substr(e[0].length)}:null},amount2:function(t){return this.amount(t)},"(KV letters),":/^(?:[A-Z][a-z]{0,2}|i)(?=,)/,formula$:function(t){var e;return!t.match(/^\([a-z]+\)$/)&&(e=t.match(/^(?:[a-z]|(?:[0-9\ \+\-\,\.\(\)]+[a-z])+[0-9\ \+\-\,\.\(\)]*|(?:[a-z][0-9\ \+\-\,\.\(\)]+)+[a-z]?)$/))?{match_:e[0],remainder:t.substr(e[0].length)}:null},uprightEntities:/^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/,"/":/^\s*(\/)\s*/,"//":/^\s*(\/\/)\s*/,"*":/^\s*[*.]\s*/},findObserveGroups:function(t,e,n,o,a,r,i,c,p,u){function s(t,e){return"string"==typeof e?0!==t.indexOf(e)?null:e:(t=t.match(e))?t[0]:null}return null===(e=s(t,e))||null===(e=s(t=t.substr(e.length),n))||null===(n=function(t,e,n){for(var o=0;e":{"0|1|2|3":{action_:"r=",nextState:"r"},"a|as":{action_:["output","r="],nextState:"r"},"*":{action_:["output","r="],nextState:"r"}},"+":{o:{action_:"d= kv",nextState:"d"},"d|D":{action_:"d=",nextState:"d"},q:{action_:"d=",nextState:"qd"},"qd|qD":{action_:"d=",nextState:"qd"},dq:{action_:["output","d="],nextState:"d"},3:{action_:["sb=false","output","operator"],nextState:"0"}},amount:{"0|2":{action_:"a=",nextState:"a"}},"pm-operator":{"0|1|2|a|as":{action_:["sb=false","output",{type_:"operator",option:"\\pm"}],nextState:"0"}},operator:{"0|1|2|a|as":{action_:["sb=false","output","operator"],nextState:"0"}},"-$":{"o|q":{action_:["charge or bond","output"],nextState:"qd"},d:{action_:"d=",nextState:"d"},D:{action_:["output",{type_:"bond",option:"-"}],nextState:"3"},q:{action_:"d=",nextState:"qd"},qd:{action_:"d=",nextState:"qd"},"qD|dq":{action_:["output",{type_:"bond",option:"-"}],nextState:"3"}},"-9":{"3|o":{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"3"}},"- orbital overlap":{o:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"},d:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"}},"-":{"0|1|2":{action_:[{type_:"output",option:1},"beginsWithBond=true",{type_:"bond",option:"-"}],nextState:"3"},3:{action_:{type_:"bond",option:"-"}},a:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"},as:{action_:[{type_:"output",option:2},{type_:"bond",option:"-"}],nextState:"3"},b:{action_:"b="},o:{action_:{type_:"- after o/d",option:!1},nextState:"2"},q:{action_:{type_:"- after o/d",option:!1},nextState:"2"},"d|qd|dq":{action_:{type_:"- after o/d",option:!0},nextState:"2"},"D|qD|p":{action_:["output",{type_:"bond",option:"-"}],nextState:"3"}},amount2:{"1|3":{action_:"a=",nextState:"a"}},letters:{"0|1|2|3|a|as|b|p|bp|o":{action_:"o=",nextState:"o"},"q|dq":{action_:["output","o="],nextState:"o"},"d|D|qd|qD":{action_:"o after d",nextState:"o"}},digits:{o:{action_:"q=",nextState:"q"},"d|D":{action_:"q=",nextState:"dq"},q:{action_:["output","o="],nextState:"o"},a:{action_:"o=",nextState:"o"}},"space A":{"b|p|bp":{}},space:{a:{nextState:"as"},0:{action_:"sb=false"},"1|2":{action_:"sb=true"},"r|rt|rd|rdt|rdq":{action_:"output",nextState:"0"},"*":{action_:["output","sb=true"],nextState:"1"}},"1st-level escape":{"1|2":{action_:["output",{type_:"insert+p1",option:"1st-level escape"}]},"*":{action_:["output",{type_:"insert+p1",option:"1st-level escape"}],nextState:"0"}},"[(...)]":{"r|rt":{action_:"rd=",nextState:"rd"},"rd|rdt":{action_:"rq=",nextState:"rdq"}},"...":{"o|d|D|dq|qd|qD":{action_:["output",{type_:"bond",option:"..."}],nextState:"3"},"*":{action_:[{type_:"output",option:1},{type_:"insert",option:"ellipsis"}],nextState:"1"}},". |* ":{"*":{action_:["output",{type_:"insert",option:"addition compound"}],nextState:"1"}},"state of aggregation $":{"*":{action_:["output","state of aggregation"],nextState:"1"}},"{[(":{"a|as|o":{action_:["o=","output","parenthesisLevel++"],nextState:"2"},"0|1|2|3":{action_:["o=","output","parenthesisLevel++"],nextState:"2"},"*":{action_:["output","o=","output","parenthesisLevel++"],nextState:"2"}},")]}":{"0|1|2|3|b|p|bp|o":{action_:["o=","parenthesisLevel--"],nextState:"o"},"a|as|d|D|q|qd|qD|dq":{action_:["output","o=","parenthesisLevel--"],nextState:"o"}},", ":{"*":{action_:["output","comma"],nextState:"0"}},"^_":{"*":{}},"^{(...)}|^($...$)":{"0|1|2|as":{action_:"b=",nextState:"b"},p:{action_:"b=",nextState:"bp"},"3|o":{action_:"d= kv",nextState:"D"},q:{action_:"d=",nextState:"qD"},"d|D|qd|qD|dq":{action_:["output","d="],nextState:"D"}},"^a|^\\x{}{}|^\\x{}|^\\x|'":{"0|1|2|as":{action_:"b=",nextState:"b"},p:{action_:"b=",nextState:"bp"},"3|o":{action_:"d= kv",nextState:"d"},q:{action_:"d=",nextState:"qd"},"d|qd|D|qD":{action_:"d="},dq:{action_:["output","d="],nextState:"d"}},"_{(state of aggregation)}$":{"d|D|q|qd|qD|dq":{action_:["output","q="],nextState:"q"}},"_{(...)}|_($...$)|_9|_\\x{}{}|_\\x{}|_\\x":{"0|1|2|as":{action_:"p=",nextState:"p"},b:{action_:"p=",nextState:"bp"},"3|o":{action_:"q=",nextState:"q"},"d|D":{action_:"q=",nextState:"dq"},"q|qd|qD|dq":{action_:["output","q="],nextState:"q"}},"=<>":{"0|1|2|3|a|as|o|q|d|D|qd|qD|dq":{action_:[{type_:"output",option:2},"bond"],nextState:"3"}},"#":{"0|1|2|3|a|as|o":{action_:[{type_:"output",option:2},{type_:"bond",option:"#"}],nextState:"3"}},"{}":{"*":{action_:{type_:"output",option:1},nextState:"1"}},"{...}":{"0|1|2|3|a|as|b|p|bp":{action_:"o=",nextState:"o"},"o|d|D|q|qd|qD|dq":{action_:["output","o="],nextState:"o"}},"$...$":{a:{action_:"a="},"0|1|2|3|as|b|p|bp|o":{action_:"o=",nextState:"o"},"as|o":{action_:"o="},"q|d|D|qd|qD|dq":{action_:["output","o="],nextState:"o"}},"\\bond{(...)}":{"*":{action_:[{type_:"output",option:2},"bond"],nextState:"3"}},"\\frac{(...)}":{"*":{action_:[{type_:"output",option:1},"frac-output"],nextState:"3"}},"\\overset{(...)}":{"*":{action_:[{type_:"output",option:2},"overset-output"],nextState:"3"}},"\\underset{(...)}":{"*":{action_:[{type_:"output",option:2},"underset-output"],nextState:"3"}},"\\underbrace{(...)}":{"*":{action_:[{type_:"output",option:2},"underbrace-output"],nextState:"3"}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:[{type_:"output",option:2},"color-output"],nextState:"3"}},"\\color{(...)}0":{"*":{action_:[{type_:"output",option:2},"color0-output"]}},"\\ce{(...)}":{"*":{action_:[{type_:"output",option:2},"ce"],nextState:"3"}},"\\,":{"*":{action_:[{type_:"output",option:1},"copy"],nextState:"1"}},"\\x{}{}|\\x{}|\\x":{"0|1|2|3|a|as|b|p|bp|o|c0":{action_:["o=","output"],nextState:"3"},"*":{action_:["output","o=","output"],nextState:"3"}},others:{"*":{action_:[{type_:"output",option:1},"copy"],nextState:"3"}},else2:{a:{action_:"a to o",nextState:"o",revisit:!0},as:{action_:["output","sb=true"],nextState:"1",revisit:!0},"r|rt|rd|rdt|rdq":{action_:["output"],nextState:"0",revisit:!0},"*":{action_:["output","copy"],nextState:"3"}}}),actions:{"o after d":function(t,e){var n,o;return(t.d||"").match(/^[0-9]+$/)?(o=t.d,t.d=void 0,n=this.output(t),t.b=o):n=this.output(t),l.actions["o="](t,e),n},"d= kv":function(t,e){t.d=e,t.dType="kv"},"charge or bond":function(t,e){var n;if(t.beginsWithBond)return l.concatArray(n=[],this.output(t)),l.concatArray(n,l.actions.bond(t,e,"-")),n;t.d=e},"- after o/d":function(t,e,n){var o=l.patterns.match_("orbital",t.o||""),a=l.patterns.match_("one lowercase greek letter $",t.o||""),r=l.patterns.match_("one lowercase latin letter $",t.o||""),i=l.patterns.match_("$one lowercase latin letter$ $",t.o||""),i=(!(a="-"===e&&(o&&""===o.remainder||a||r||i))||t.a||t.b||t.p||t.d||t.q||o||!r||(t.o="$"+t.o+"$"),[]);return a?(l.concatArray(i,this.output(t)),i.push({type_:"hyphen"})):(o=l.patterns.match_("digits",t.d||""),n&&o&&""===o.remainder?(l.concatArray(i,l.actions["d="](t,e)),l.concatArray(i,this.output(t))):(l.concatArray(i,this.output(t)),l.concatArray(i,l.actions.bond(t,e,"-")))),i},"a to o":function(t){t.o=t.a,t.a=void 0},"sb=true":function(t){t.sb=!0},"sb=false":function(t){t.sb=!1},"beginsWithBond=true":function(t){t.beginsWithBond=!0},"beginsWithBond=false":function(t){t.beginsWithBond=!1},"parenthesisLevel++":function(t){t.parenthesisLevel++},"parenthesisLevel--":function(t){t.parenthesisLevel--},"state of aggregation":function(t,e){return{type_:"state of aggregation",p1:l.go(e,"o")}},comma:function(t,e){var n=e.replace(/\s*$/,"");return n!==e&&0===t.parenthesisLevel?{type_:"comma enumeration L",p1:n}:{type_:"comma enumeration M",p1:n}},output:function(t,e,n){var o,a,r;for(r in t.r?(o="M"===t.rdt?l.go(t.rd,"tex-math"):"T"===t.rdt?[{type_:"text",p1:t.rd||""}]:l.go(t.rd),a="M"===t.rqt?l.go(t.rq,"tex-math"):"T"===t.rqt?[{type_:"text",p1:t.rq||""}]:l.go(t.rq),o={type_:"arrow",r:t.r,rd:o,rq:a}):(o=[],(t.a||t.b||t.p||t.o||t.q||t.d||n)&&(t.sb&&o.push({type_:"entitySkip"}),t.o||t.q||t.d||t.b||t.p||2===n?t.o||t.q||t.d||!t.b&&!t.p?t.o&&"kv"===t.dType&&l.patterns.match_("d-oxidation$",t.d||"")?t.dType="oxidation":t.o&&"kv"===t.dType&&!t.q&&(t.dType=void 0):(t.o=t.a,t.d=t.b,t.q=t.p,t.a=t.b=t.p=void 0):(t.o=t.a,t.a=void 0),o.push({type_:"chemfive",a:l.go(t.a,"a"),b:l.go(t.b,"bd"),p:l.go(t.p,"pq"),o:l.go(t.o,"o"),q:l.go(t.q,"pq"),d:l.go(t.d,"oxidation"===t.dType?"oxidation":"bd"),dType:t.dType}))),t)"parenthesisLevel"!==r&&"beginsWithBond"!==r&&delete t[r];return o},"oxidation-output":function(t,e){var n=["{"];return l.concatArray(n,l.go(e,"oxidation")),n.push("}"),n},"frac-output":function(t,e){return{type_:"frac-ce",p1:l.go(e[0]),p2:l.go(e[1])}},"overset-output":function(t,e){return{type_:"overset",p1:l.go(e[0]),p2:l.go(e[1])}},"underset-output":function(t,e){return{type_:"underset",p1:l.go(e[0]),p2:l.go(e[1])}},"underbrace-output":function(t,e){return{type_:"underbrace",p1:l.go(e[0]),p2:l.go(e[1])}},"color-output":function(t,e){return{type_:"color",color1:e[0],color2:l.go(e[1])}},"r=":function(t,e){t.r=e},"rdt=":function(t,e){t.rdt=e},"rd=":function(t,e){t.rd=e},"rqt=":function(t,e){t.rqt=e},"rq=":function(t,e){t.rq=e},operator:function(t,e,n){return{type_:"operator",kind_:n||e}}}},a:{transitions:l.createTransitions({empty:{"*":{}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"1",revisit:!0}},"$(...)$":{"*":{action_:"tex-math tight",nextState:"1"}},",":{"*":{action_:{type_:"insert",option:"commaDecimal"}}},else2:{"*":{action_:"copy"}}}),actions:{}},o:{transitions:l.createTransitions({empty:{"*":{}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"1",revisit:!0}},letters:{"*":{action_:"rm"}},"\\ca":{"*":{action_:{type_:"insert",option:"circa"}}},"\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"{text}"}},else2:{"*":{action_:"copy"}}}),actions:{}},text:{transitions:l.createTransitions({empty:{"*":{action_:"output"}},"{...}":{"*":{action_:"text="}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"\\greek":{"*":{action_:["output","rm"]}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:["output","copy"]}},else:{"*":{action_:"text="}}}),actions:{output:function(t){if(t.text_){var e,n={type_:"text",p1:t.text_};for(e in t)delete t[e];return n}}}},pq:{transitions:l.createTransitions({empty:{"*":{}},"state of aggregation $":{"*":{action_:"state of aggregation"}},i$:{0:{nextState:"!f",revisit:!0}},"(KV letters),":{0:{action_:"rm",nextState:"0"}},formula$:{0:{nextState:"f",revisit:!0}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"!f",revisit:!0}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"text"}},"a-z":{f:{action_:"tex-math"}},letters:{"*":{action_:"rm"}},"-9.,9":{"*":{action_:"9,9"}},",":{"*":{action_:{type_:"insert+p1",option:"comma enumeration S"}}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:"color-output"}},"\\color{(...)}0":{"*":{action_:"color0-output"}},"\\ce{(...)}":{"*":{action_:"ce"}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},else2:{"*":{action_:"copy"}}}),actions:{"state of aggregation":function(t,e){return{type_:"state of aggregation subscript",p1:l.go(e,"o")}},"color-output":function(t,e){return{type_:"color",color1:e[0],color2:l.go(e[1],"pq")}}}},bd:{transitions:l.createTransitions({empty:{"*":{}},x$:{0:{nextState:"!f",revisit:!0}},formula$:{0:{nextState:"f",revisit:!0}},else:{0:{nextState:"!f",revisit:!0}},"-9.,9 no missing 0":{"*":{action_:"9,9"}},".":{"*":{action_:{type_:"insert",option:"electron dot"}}},"a-z":{f:{action_:"tex-math"}},x:{"*":{action_:{type_:"insert",option:"KV x"}}},letters:{"*":{action_:"rm"}},"'":{"*":{action_:{type_:"insert",option:"prime"}}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"text"}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:"color-output"}},"\\color{(...)}0":{"*":{action_:"color0-output"}},"\\ce{(...)}":{"*":{action_:"ce"}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},else2:{"*":{action_:"copy"}}}),actions:{"color-output":function(t,e){return{type_:"color",color1:e[0],color2:l.go(e[1],"bd")}}}},oxidation:{transitions:l.createTransitions({empty:{"*":{}},"roman numeral":{"*":{action_:"roman-numeral"}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},else:{"*":{action_:"copy"}}}),actions:{"roman-numeral":function(t,e){return{type_:"roman numeral",p1:e||""}}}},"tex-math":{transitions:l.createTransitions({empty:{"*":{action_:"output"}},"\\ce{(...)}":{"*":{action_:["output","ce"]}},"{...}|\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"o="}},else:{"*":{action_:"o="}}}),actions:{output:function(t){if(t.o){var e,n={type_:"tex-math",p1:t.o};for(e in t)delete t[e];return n}}}},"tex-math tight":{transitions:l.createTransitions({empty:{"*":{action_:"output"}},"\\ce{(...)}":{"*":{action_:["output","ce"]}},"{...}|\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"o="}},"-|+":{"*":{action_:"tight operator"}},else:{"*":{action_:"o="}}}),actions:{"tight operator":function(t,e){t.o=(t.o||"")+"{"+e+"}"},output:function(t){if(t.o){var e,n={type_:"tex-math",p1:t.o};for(e in t)delete t[e];return n}}}},"9,9":{transitions:l.createTransitions({empty:{"*":{}},",":{"*":{action_:"comma"}},else:{"*":{action_:"copy"}}}),actions:{comma:function(){return{type_:"commaDecimal"}}}},pu:{transitions:l.createTransitions({empty:{"*":{action_:"output"}},space$:{"*":{action_:["output","space"]}},"{[(|)]}":{"0|a":{action_:"copy"}},"(-)(9)^(-9)":{0:{action_:"number^",nextState:"a"}},"(-)(9.,9)(e)(99)":{0:{action_:"enumber",nextState:"a"}},space:{"0|a":{}},"pm-operator":{"0|a":{action_:{type_:"operator",option:"\\pm"},nextState:"0"}},operator:{"0|a":{action_:"copy",nextState:"0"}},"//":{d:{action_:"o=",nextState:"/"}},"/":{d:{action_:"o=",nextState:"/"}},"{...}|else":{"0|d":{action_:"d=",nextState:"d"},a:{action_:["space","d="],nextState:"d"},"/|q":{action_:"q=",nextState:"q"}}}),actions:{enumber:function(t,e){var n=[];return"+-"===e[0]||"+/-"===e[0]?n.push("\\pm "):e[0]&&n.push(e[0]),e[1]&&(l.concatArray(n,l.go(e[1],"pu-9,9")),e[2]&&(e[2].match(/[,.]/)?l.concatArray(n,l.go(e[2],"pu-9,9")):n.push(e[2])),e[3]=e[4]||e[3],e[3])&&(e[3]=e[3].trim(),"e"===e[3]||"*"===e[3].substr(0,1)?n.push({type_:"cdot"}):n.push({type_:"times"})),e[3]&&n.push("10^{"+e[5]+"}"),n},"number^":function(t,e){var n=[];return"+-"===e[0]||"+/-"===e[0]?n.push("\\pm "):e[0]&&n.push(e[0]),l.concatArray(n,l.go(e[1],"pu-9,9")),n.push("^{"+e[2]+"}"),n},operator:function(t,e,n){return{type_:"operator",kind_:n||e}},space:function(){return{type_:"pu-space-1"}},output:function(t){var e,n,o=l.patterns.match_("{(...)}",t.d||"");for(n in o&&""===o.remainder&&(t.d=o.match_),(o=l.patterns.match_("{(...)}",t.q||""))&&""===o.remainder&&(t.q=o.match_),t.d&&(t.d=t.d.replace(/\u00B0C|\^oC|\^{o}C/g,"{}^{\\circ}C"),t.d=t.d.replace(/\u00B0F|\^oF|\^{o}F/g,"{}^{\\circ}F")),t.q?(t.q=t.q.replace(/\u00B0C|\^oC|\^{o}C/g,"{}^{\\circ}C"),t.q=t.q.replace(/\u00B0F|\^oF|\^{o}F/g,"{}^{\\circ}F"),o={d:l.go(t.d,"pu"),q:l.go(t.q,"pu")},"//"===t.o?e={type_:"pu-frac",p1:o.d,p2:o.q}:(1<(e=o.d).length||1":case"→":case"⟶":return"rightarrow";case"<-":return"leftarrow";case"<->":return"leftrightarrow";case"<--\x3e":return"rightleftarrows";case"<=>":case"⇌":return"rightleftharpoons";case"<=>>":return"rightequilibrium";case"<<=>":return"leftequilibrium";default:throw["MhchemBugT","mhchem bug T. Please report."]}},_getBond:function(t){switch(t){case"-":case"1":return"{-}";case"=":case"2":return"{=}";case"#":case"3":return"{\\equiv}";case"~":return"{\\tripledash}";case"~-":return"{\\mathrlap{\\raisebox{-.1em}{$-$}}\\raisebox{.1em}{$\\tripledash$}}";case"~=":case"~--":return"{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$\\tripledash$}}-}";case"-~-":return"{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$-$}}\\tripledash}";case"...":return"{{\\cdot}{\\cdot}{\\cdot}}";case"....":return"{{\\cdot}{\\cdot}{\\cdot}{\\cdot}}";case"->":return"{\\rightarrow}";case"<-":return"{\\leftarrow}";case"<":return"{<}";case">":return"{>}";default:throw["MhchemBugT","mhchem bug T. Please report."]}},_getOperator:function(t){switch(t){case"+":return" {}+{} ";case"-":return" {}-{} ";case"=":return" {}={} ";case"<":return" {}<{} ";case">":return" {}>{} ";case"<<":return" {}\\ll{} ";case">>":return" {}\\gg{} ";case"\\pm":return" {}\\pm{} ";case"\\approx":case"$\\approx$":return" {}\\approx{} ";case"v":case"(v)":return" \\downarrow{} ";case"^":case"(^)":return" \\uparrow{} ";default:throw["MhchemBugT","mhchem bug T. Please report."]}}});return{}.default}()});
diff --git a/static/social_icons/square-rss.svg b/static/social_icons/square-rss.svg
new file mode 100644
index 00000000..d846e029
--- /dev/null
+++ b/static/social_icons/square-rss.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/templates/macros/feed_utils.html b/templates/macros/feed_utils.html
index ff351940..40bcc2af 100644
--- a/templates/macros/feed_utils.html
+++ b/templates/macros/feed_utils.html
@@ -15,3 +15,12 @@
{%- set feed_url = feed_utils::get_feed_url() -%}
{{- generate_feed and config.extra.feed_icon and feed_url -}}
{%- endmacro should_show_footer_feed_icon -%}
+
+{#- Get feed icon name: string value or "rss" for true, empty for false -#}
+{%- macro get_feed_icon_name() -%}
+ {%- if config.extra.feed_icon is string -%}
+ {{- config.extra.feed_icon -}}
+ {%- elif config.extra.feed_icon -%}
+ {{- "rss" -}}
+ {%- endif -%}
+{%- endmacro get_feed_icon_name -%}
diff --git a/templates/macros/page_header.html b/templates/macros/page_header.html
index daa8d020..668ea010 100644
--- a/templates/macros/page_header.html
+++ b/templates/macros/page_header.html
@@ -9,8 +9,9 @@
{{ title -}}
{% if show_feed_icon %}
{%- set feed_url = feed_utils::get_feed_url() -%}
+ {%- set feed_icon_name = feed_utils::get_feed_icon_name() -%}
-
+
{% endif %}
diff --git a/templates/partials/extra_features.html b/templates/partials/extra_features.html
index 37c0da92..d24457c0 100644
--- a/templates/partials/extra_features.html
+++ b/templates/partials/extra_features.html
@@ -46,6 +46,10 @@
{%- if macros_settings::evaluate_setting_priority(setting="katex", page=page_s, section=section_s, default_global_value=false) == "true" -%}
+ {# Load mhchem extension if chemistry formulas detected #}
+ {%- if page and page.content and ("\ce{" in page.content or "\pu{" in page.content) -%}
+
+ {%- endif -%}
{%- endif -%}
{# Load mermaid.js #}
diff --git a/templates/partials/footer.html b/templates/partials/footer.html
index db4bd859..76d7f1ac 100644
--- a/templates/partials/footer.html
+++ b/templates/partials/footer.html
@@ -6,6 +6,7 @@
{#- Feed icon -#}
{%- set feed_url = feed_utils::get_feed_url() -%}
+{%- set feed_icon_name = feed_utils::get_feed_icon_name() -%}
{%- set should_show_feed = feed_utils::should_show_footer_feed_icon() == "true" -%}
{%- set should_show_footer_icons = should_show_feed or config.extra.socials or config.extra.email -%}
@@ -18,7 +19,7 @@
{%- if should_show_feed -%}
{%- endif -%}
diff --git a/theme.toml b/theme.toml
index dfe51611..c48f287c 100644
--- a/theme.toml
+++ b/theme.toml
@@ -240,7 +240,9 @@ menu = [
{ name = "projects", url = "projects", trailing_slash = true },
]
-# The RSS icon will be shown if (1) it's enabled and (2) the following variable is set to true.
+# The RSS icon will be shown if (1) it's enabled and (2) the following variable is set.
+# Set to true to use the default "rss" icon, or specify a custom icon name (e.g. "square-rss").
+# The icon must exist in static/social_icons/ (without the .svg extension).
# Note for Zola 0.19.X users: when `feed_filenames` has two filenames, only the first one will be linked in the footer.
feed_icon = true