diff --git a/README.md b/README.md index eb2fd4875..46a054a41 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,8 @@ tabi has a perfect score on Google's Lighthouse audit: - [X] Support for [comments using giscus, utterances, Hyvor Talk, or Isso](https://welpo.github.io/tabi/blog/comments/). - [X] Code syntax highlighting with colours based on [Catppuccin](https://github.com/catppuccin/catppuccin) Frappé. - [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 sitemap](https://welpo.github.io/tabi/sitemap.xml). - [X] [Mail encoding](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#encoded-email) for spam protection. - [X] All JavaScript can be [fully disabled](https://welpo.github.io/tabi/blog/javascript/). - [X] [Customizable Table of Contents](https://welpo.github.io/tabi/blog/toc/). @@ -40,7 +42,6 @@ tabi has a perfect score on Google's Lighthouse audit: - [X] Responsive design. - [X] [Projects page](https://welpo.github.io/tabi/projects/). - [X] [Archive page](https://welpo.github.io/tabi/archive/). -- [X] [Stylized feed](https://welpo.github.io/tabi/atom.xml). - [X] [Social links](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#social-media-icons). - [X] [Tags](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#tags). diff --git a/content/projects/tabi/index.ca.md b/content/projects/tabi/index.ca.md index d3d7eb305..4f1f29c09 100644 --- a/content/projects/tabi/index.ca.md +++ b/content/projects/tabi/index.ca.md @@ -26,7 +26,9 @@ social_media_card = "social_cards/ca_projects_tabi.jpg" - Suport per a [comentaris usant giscus, utterances, Hyvor Talk o Isso](https://welpo.github.io/tabi/ca/blog/comments/). - Tot el JavaScript es pot [deshabilitar completament](https://welpo.github.io/tabi/ca/blog/javascript/). - [Codificació de correu](https://welpo.github.io/tabi/ca/blog/mastering-tabi-settings/#correu-electronic-codificat) per a protecció contra spam. +- [Mapa del lloc estilitzat i llegible per humans](https://welpo.github.io/tabi/sitemap.xml). - [Capçaleres de seguretat personalitzables](https://welpo.github.io/tabi/ca/blog/security/). +- [Feed Atom estilitzat i llegible per humans](https://welpo.github.io/tabi/ca/atom.xml). - [Enllaços de retrocés per a notes al peu](https://welpo.github.io/tabi/ca/blog/mastering-tabi-settings/#enllacos-de-retorn-a-les-notes-a-peu-de-pagina). - [Taula de continguts personalitzable](https://welpo.github.io/tabi/ca/blog/toc/). - [Avís de drets d'autor personalitzat](https://welpo.github.io/tabi/ca/blog/mastering-tabi-settings/#copyright). @@ -41,7 +43,6 @@ social_media_card = "social_cards/ca_projects_tabi.jpg" - Suport de [KaTeX](https://katex.org/). - [Enllaços socials](https://welpo.github.io/tabi/ca/blog/mastering-tabi-settings/#icones-de-xarxes-socials). - [Pàgina d'arxiu](https://welpo.github.io/tabi/ca/archive/). -- [Feed estilitzat](https://welpo.github.io/tabi/ca/atom.xml). - [Etiquetes](https://welpo.github.io/tabi/ca/blog/mastering-tabi-settings/#etiquetes). ## Pràctiques de desenvolupament diff --git a/content/projects/tabi/index.es.md b/content/projects/tabi/index.es.md index 6a10c57fd..9a3d5a488 100644 --- a/content/projects/tabi/index.es.md +++ b/content/projects/tabi/index.es.md @@ -26,6 +26,8 @@ social_media_card = "social_cards/es_projects_tabi.jpg" - Soporte para [comentarios usando giscus, utterances, Hyvor Talk o Isso](https://welpo.github.io/tabi/es/blog/comments/). - Todo el JavaScript se puede [deshabilitar completamente](https://welpo.github.io/tabi/es/blog/javascript/). - [Codificación de correo](https://welpo.github.io/tabi/es/blog/mastering-tabi-settings/#encoded-email) para protección contra spam. +- [Mapa de sitio web estilizado y legible por humanos](https://welpo.github.io/tabi/sitemap.xml). +- [Feed de Atom estilizado y legible por humanos](https://welpo.github.io/tabi/es/atom.xml). - [Aviso de derechos de autor personalizado](https://welpo.github.io/tabi/es/blog/mastering-tabi-settings/#copyright). - [Cabeceras de seguridad personalizables](https://welpo.github.io/tabi/es/blog/security/). - [Botón de copiar para bloques de código](https://welpo.github.io/tabi/es/blog/mastering-tabi-settings/#boton-de-copiar-en-bloques-de-codigo). @@ -41,7 +43,6 @@ social_media_card = "social_cards/es_projects_tabi.jpg" - Soporte de [KaTeX](https://katex.org/). - [Página de archivo](https://welpo.github.io/tabi/es/archive/). - [Enlaces sociales](https://welpo.github.io/tabi/es/blog/mastering-tabi-settings/#iconos-de-redes-sociales). -- [Feed estilizado](https://welpo.github.io/tabi/es/atom.xml). - [Etiquetas](https://welpo.github.io/tabi/es/blog/mastering-tabi-settings/#tags). ## Prácticas de desarrollo diff --git a/content/projects/tabi/index.md b/content/projects/tabi/index.md index 895ed2505..372d2378b 100644 --- a/content/projects/tabi/index.md +++ b/content/projects/tabi/index.md @@ -26,6 +26,8 @@ social_media_card = "social_cards/projects_tabi.jpg" - Support for [comments using giscus, utterances, Hyvor Talk, or Isso](https://welpo.github.io/tabi/blog/comments/). - Code syntax highlighting with colours based on [Catppuccin](https://github.com/catppuccin/catppuccin) Frappé. - [KaTeX](https://katex.org/) support for mathematical notation. +- [Stylized and human readable Atom feed](https://welpo.github.io/tabi/atom.xml). +- [Stylized and human readable sitemap](https://welpo.github.io/tabi/sitemap.xml). - [Mail encoding](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#encoded-email) for spam protection. - All JavaScript can be [fully disabled](https://welpo.github.io/tabi/blog/javascript/). - [Customizable Table of Contents](https://welpo.github.io/tabi/blog/toc/). @@ -41,7 +43,6 @@ social_media_card = "social_cards/projects_tabi.jpg" - Responsive design. - [Projects page](https://welpo.github.io/tabi/projects/). - [Archive page](https://welpo.github.io/tabi/archive/). -- [Stylized feed](https://welpo.github.io/tabi/atom.xml). - [Social links](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#social-media-icons). - [Tags](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#tags). diff --git a/static/js/sortTable.js b/static/js/sortTable.js new file mode 100644 index 000000000..7a3740e03 --- /dev/null +++ b/static/js/sortTable.js @@ -0,0 +1,50 @@ +var table = document.querySelector("#sitemapTable"); +var headers = Array.from(table.querySelectorAll("th")); + +headers.forEach(function (header, index) { + header.classList.add('sortable'); + header.sortDirection = 'asc'; + header.addEventListener("click", function () { + sortTable(index); + }); +}); + +headers[0].innerText += ' ▲'; +headers[0].sortDirection = 'desc'; + +function sortTable(index) { + var header = headers[index]; + var direction = header.sortDirection; + var arrow = direction === 'asc' ? '▲' : '▼'; + var existingArrow = header.innerText.match(/▲|▼/); + if (existingArrow) { + header.innerText = header.innerText.replace(existingArrow, ''); + } + header.innerText = header.innerText + ' ' + arrow; + + var rows = Array.from(table.querySelectorAll("tbody tr")); + rows.sort(function (rowA, rowB) { + var cellA = rowA.querySelectorAll("td")[index].innerText; + var cellB = rowB.querySelectorAll("td")[index].innerText; + var comparison = cellA.localeCompare(cellB); + return direction === 'asc' ? comparison : -comparison; + }); + + var fragment = new DocumentFragment(); + rows.forEach(function (row) { + fragment.appendChild(row); + }); + table.querySelector("tbody").appendChild(fragment); + + // Hide arrows on other columns. + headers.forEach(function (header, i) { + if (i !== index) { + var existingArrow = header.innerText.match(/▲|▼/); + if (existingArrow) { + header.innerText = header.innerText.replace(existingArrow, ''); + } + } + }); + + header.sortDirection = direction === 'asc' ? 'desc' : 'asc'; +} diff --git a/static/js/sortTable.min.js b/static/js/sortTable.min.js new file mode 100644 index 000000000..1eaa11cbd --- /dev/null +++ b/static/js/sortTable.min.js @@ -0,0 +1 @@ +var table=document.querySelector("#sitemapTable"),headers=Array.from(table.querySelectorAll("th"));function sortTable(t){var e=headers[t],n=e.sortDirection,r="asc"===n?"▲":"▼",a=e.innerText.match(/▲|▼/),a=(a&&(e.innerText=e.innerText.replace(a,"")),e.innerText=e.innerText+" "+r,Array.from(table.querySelectorAll("tbody tr"))),c=(a.sort(function(e,r){e=e.querySelectorAll("td")[t].innerText,r=r.querySelectorAll("td")[t].innerText,e=e.localeCompare(r);return"asc"===n?e:-e}),new DocumentFragment);a.forEach(function(e){c.appendChild(e)}),table.querySelector("tbody").appendChild(c),headers.forEach(function(e,r){r!==t&&(r=e.innerText.match(/▲|▼/))&&(e.innerText=e.innerText.replace(r,""))}),e.sortDirection="asc"===n?"desc":"asc"}headers.forEach(function(e,r){e.classList.add("sortable"),e.sortDirection="asc",e.addEventListener("click",function(){sortTable(r)})}),headers[0].innerText+=" ▲",headers[0].sortDirection="desc"; diff --git a/static/sitemap_style.xsl b/static/sitemap_style.xsl new file mode 100644 index 000000000..4bef081b6 --- /dev/null +++ b/static/sitemap_style.xsl @@ -0,0 +1,45 @@ + + + + + + + + Sitemap + + + + +
+

Sitemap

+

Number of URLs:

+ + + + + + + + + + + + + + + +
URLLast modification
+ + + + + +
+
+ + +
+
diff --git a/templates/sitemap.xml b/templates/sitemap.xml new file mode 100644 index 000000000..480759fe6 --- /dev/null +++ b/templates/sitemap.xml @@ -0,0 +1,12 @@ + + + + {%- for sitemap_entry in entries %} + + {{ sitemap_entry.permalink | escape_xml | safe }} + {%- if sitemap_entry.updated %} + {{ sitemap_entry.updated }} + {%- endif %} + + {%- endfor %} +