@@ -26,7 +26,13 @@ lint: ## Ensure code consistency | |||
@echo "${GREEN}🤖 Linting code${NC}" | |||
@ruff site.py --fix | |||
@black . --quiet | |||
@djlint david/templates/base_2020.html --reformat --quiet --format-js --format-css | |||
@djlint david/templates/article_2020.html \ | |||
david/templates/base_2020.html \ | |||
david/templates/blogroll.html \ | |||
david/templates/profil.html \ | |||
david/templates/recherche.html \ | |||
david/templates/tag_2021.html \ | |||
--reformat --quiet --format-js --format-css | |||
.PHONY: build |
@@ -3,64 +3,73 @@ | |||
{% block title %}{{ page.title }}{% endblock %} | |||
{% block description %}{{ page.extract|striptags }}{% endblock %} | |||
{% block content %} | |||
<article> | |||
<header> | |||
<h1>{{ page.title }}</h1> | |||
</header> | |||
<nav> | |||
<p class="center"> | |||
{% if prev and not prev.is_draft %}<a rel="prev" href="{{ prev.url }}" title="Publication précédente : {{ prev.title }}">← Précédent</a> •{% endif %} | |||
<nobr> | |||
<a href="/david/" title="Aller à l’accueil" rel="up" | |||
><svg class="icon icon-home"> | |||
<use | |||
xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-home" | |||
></use> | |||
</svg> | |||
Accueil</a | |||
> | |||
</nobr> | |||
• | |||
<nobr> | |||
<a href="/david/recherche/" title="Aller à la page de recherche" rel="search" | |||
><svg class="icon icon-search"> | |||
<use | |||
xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-search" | |||
></use> | |||
</svg> | |||
Recherche</a | |||
> | |||
</nobr> | |||
{% if next and not next.is_draft %} • <a rel="next" href="{{ next.url }}" title="Publication suivante : {{ next.title }}">Suivant →</a>{% endif %} | |||
</p> | |||
</nav> | |||
<hr> | |||
{{ page.content }} | |||
{% if page.tags %} | |||
<nav> | |||
<p> | |||
{% for tag in page.tags %} | |||
<a href="/david/2023/{{ slugify(tag) }}/" | |||
title="Liste de tous les articles 2023 associés à cette étiquette" | |||
rel="tag" | |||
>#{{ tag }}</a> | |||
{% endfor %} | |||
<a href="/david/#tags-2023" | |||
title="Liste de toutes les étiquettes 2023" | |||
><svg class="icon icon-tags"> | |||
<use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-tags"></use> | |||
</svg> | |||
tous ?</a | |||
> | |||
</p> | |||
</nav> | |||
{% endif%} | |||
<nav> | |||
<p class="center"> | |||
{% if prev and not prev.is_draft %}<a rel="prev" href="{{ prev.url }}" title="Publication précédente : {{ prev.title }}">← Précédent</a> •{% endif %} | |||
<a href="/david/2023/" title="Liste des publications récentes">↑ En 2023</a> | |||
{% if next and not next.is_draft %} • <a rel="next" href="{{ next.url }}" title="Publication suivante : {{ next.title }}">Suivant →</a>{% endif %} | |||
</p> | |||
</nav> | |||
</article> | |||
<article> | |||
<header> | |||
<h1>{{ page.title }}</h1> | |||
</header> | |||
<nav> | |||
<p class="center"> | |||
{% if prev and not prev.is_draft %} | |||
<a rel="prev" | |||
href="{{ prev.url }}" | |||
title="Publication précédente : {{ prev.title }}">← Précédent</a> • | |||
{% endif %} | |||
<nobr> | |||
<a href="/david/" title="Aller à l’accueil" rel="up"> | |||
<svg class="icon icon-home"> | |||
<use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-home"></use> | |||
</svg> | |||
Accueil</a> | |||
</nobr> | |||
• | |||
<nobr> | |||
<a href="/david/recherche/" | |||
title="Aller à la page de recherche" | |||
rel="search"> | |||
<svg class="icon icon-search"> | |||
<use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-search"></use> | |||
</svg> | |||
Recherche</a> | |||
</nobr> | |||
{% if next and not next.is_draft %} | |||
• <a rel="next" | |||
href="{{ next.url }}" | |||
title="Publication suivante : {{ next.title }}">Suivant →</a> | |||
{% endif %} | |||
</p> | |||
</nav> | |||
<hr> | |||
{{ page.content }} | |||
{% if page.tags %} | |||
<nav> | |||
<p> | |||
{% for tag in page.tags %} | |||
<a href="/david/2023/{{ slugify(tag) }}/" | |||
title="Liste de tous les articles 2023 associés à cette étiquette" | |||
rel="tag">#{{ tag }}</a> | |||
{% endfor %} | |||
<a href="/david/#tags-2023" title="Liste de toutes les étiquettes 2023"> | |||
<svg class="icon icon-tags"> | |||
<use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-tags"></use> | |||
</svg> | |||
tous ?</a> | |||
</p> | |||
</nav> | |||
{% endif %} | |||
<nav> | |||
<p class="center"> | |||
{% if prev and not prev.is_draft %} | |||
<a rel="prev" | |||
href="{{ prev.url }}" | |||
title="Publication précédente : {{ prev.title }}">← Précédent</a> • | |||
{% endif %} | |||
<a href="/david/2023/" title="Liste des publications récentes">↑ En 2023</a> | |||
{% if next and not next.is_draft %} | |||
• <a rel="next" | |||
href="{{ next.url }}" | |||
title="Publication suivante : {{ next.title }}">Suivant →</a> | |||
{% endif %} | |||
</p> | |||
</nav> | |||
</article> | |||
{% endblock content %} |
@@ -3,42 +3,33 @@ | |||
{% block title %}Blogroll{% endblock %} | |||
{% block description %}Les sites des ami·es.{% endblock %} | |||
{% block content %} | |||
<article> | |||
<header> | |||
<h1>Blogroll : les sites des ami·es</h1> | |||
</header> | |||
<p> | |||
Pour ne pas être totalement auto-centré, voici quelques portes ouvertes vers le Web que j’aime. | |||
</p> | |||
<nav> | |||
<ul> | |||
{% for website in website_list -%} | |||
<li> | |||
<a href="{{ website.url }}">{{ website.name }}</a> | |||
(<a href="{{ website.feed }}">flux</a>) | |||
</li> | |||
<article> | |||
<header> | |||
<h1>Blogroll : les sites des ami·es</h1> | |||
</header> | |||
<p>Pour ne pas être totalement auto-centré, voici quelques portes ouvertes vers le Web que j’aime.</p> | |||
<nav> | |||
<ul> | |||
{% for website in website_list -%} | |||
<li> | |||
<a href="{{ website.url }}">{{ website.name }}</a> | |||
(<a href="{{ website.feed }}">flux</a>) | |||
</li> | |||
{% endfor %} | |||
</ul> | |||
</nav> | |||
<p>N’hésitez pas à me contacter si vous ne souhaitez pas figurer dans cette liste.</p> | |||
<h2>Leurs dernières publications</h2> | |||
{% for entry in entry_list -%} | |||
<dl> | |||
<dt> | |||
<a href="{{ entry.link }}">{{ entry.title }}</a> | |||
(<a href="{{ entry.website.url }}">{{ entry.website.name }}</a>) | |||
</dt> | |||
<dd> | |||
{{ entry.summary|striptags|truncate(400, killwords=False, end="…") }} | |||
</dd> | |||
</dl> | |||
{% endfor %} | |||
</ul> | |||
</nav> | |||
<p> | |||
N’hésitez pas à me contacter si vous ne souhaitez pas figurer dans cette liste. | |||
</p> | |||
<h2>Leurs dernières publications</h2> | |||
{% for entry in entry_list -%} | |||
<dl> | |||
<dt> | |||
<a href="{{ entry.link }}">{{ entry.title }}</a> | |||
(<a href="{{ entry.website.url }}">{{ entry.website.name }}</a>) | |||
</dt> | |||
<dd> | |||
{{ entry.summary|striptags|truncate(400, killwords=False, end="…") }} | |||
</dd> | |||
</dl> | |||
{% endfor %} | |||
</article> | |||
</article> | |||
{% endblock content %} |
@@ -3,237 +3,228 @@ | |||
{% block title %}Accueil{% endblock %} | |||
{% block description %}Voici l’espace personnel de David Larlet sur le Web.{% endblock %} | |||
{% block content %} | |||
<article> | |||
<header> | |||
<h1>Bienvenue</h1> | |||
</header> | |||
<p> | |||
Voici l’espace personnel de David Larlet sur le Web. | |||
Il se veut modeste, accueillant et pérenne. | |||
Il fixe mes pensées et parfois engage des échanges. | |||
J’essaye de tenir et lier des propos bienveillants. | |||
Je vous souhaite une jolie promenade. | |||
</p> | |||
<p lang="en"> | |||
For an English profile, check out | |||
<a href="http://larlet.com" data-instant>this page 🇨🇦</a>. | |||
</p> | |||
<h2>Publications 2023</h2> | |||
<p>Liste des publications récentes en ordre anté-chronologique :</p> | |||
<nav> | |||
<p> | |||
{% for page in page_list -%} | |||
<a href="{{ page.url }}">{{ page.title }}</a> | |||
{%- if not loop.last %}, {% else %}.{% endif %} | |||
{% endfor %} | |||
</p> | |||
</nav> | |||
<p id="tags-2023">Ou par étiquettes :</p> | |||
<nav> | |||
<p> | |||
{% for slug, title, count in tags -%} | |||
<a href="/david/2023/{{ slug }}/" rel="tag">#{{ title }} ({{ count }})</a> | |||
{%- if not loop.last %}, {% else %}.{% endif %} | |||
{% endfor %} | |||
</p> | |||
</nav> | |||
<p> | |||
Les <a href="/david/blogroll/">liens des ami·es</a> avec leurs dernières publications 🤗. | |||
</p> | |||
<h2>Publications sporadiques 2022</h2> | |||
<p>Liste des publications en ordre chronologique :</p> | |||
<nav> | |||
<p> | |||
<a href="/david/2022/01/19/">Négatif</a>, | |||
<a href="/david/2022/02/17/">Envie</a>, | |||
<a href="/david/2022/03/04/">Régime</a>, | |||
<a href="/david/2022/03/18/">Temps</a>, | |||
<a href="/david/2022/03/23/">Open-source</a>, | |||
<a href="/david/2022/04/02/">Recherche</a>, | |||
<a href="/david/2022/04/14/">Ressenti</a>, | |||
<a href="/david/2022/04/23/">Quarantaine</a>, | |||
<a href="/david/2022/04/26/">R&Day</a>, | |||
<a href="/david/2022/05/13/">Aurore</a>, | |||
<a href="/david/2022/05/15/">Rédemption</a>, | |||
<a href="/david/2022/05/17/">Outils</a>, | |||
<a href="/david/2022/05/30/">Méditation</a>, | |||
<a href="/david/2022/06/06/">Hommes</a>, | |||
<a href="/david/2022/06/24/">Bouddhisme</a>, | |||
<a href="/david/2022/06/30/">Valeur(s)</a>, | |||
<a href="/david/2022/07/06/">Regard</a>, | |||
<a href="/david/2022/07/08/">LudoviCovid</a>, | |||
<a href="/david/2022/07/14/">Vingt</a>, | |||
<a href="/david/2022/07/23/">Origines</a>, | |||
<a href="/david/2022/08/24/">Silence</a>, | |||
<a href="/david/2022/09/03/">Bifurquer</a>, | |||
<a href="/david/2022/10/18/">Esclavage</a>, | |||
<a href="/david/2022/11/12/">Mastodon</a>, | |||
<a href="/david/2022/11/27/">Neuf</a>, | |||
<a href="/david/2022/12/19/">Traces</a>, | |||
<a href="/david/2022/12/22/">Marcher</a>. | |||
</p> | |||
</nav> | |||
<p> | |||
J’ai aussi ouvert trois nouveaux espaces en 2022 : | |||
</p> | |||
<ul> | |||
<li><a href="https://media.larlet.fr/">Des photos/media plus ou moins récents</a></li> | |||
<li><a href="https://code.larlet.fr/">Des morceaux de code et d’apprentissages</a></li> | |||
<li><a href="https://nature.larlet.fr/">Des bribes/expériences de nature</a></li> | |||
</ul> | |||
<p> | |||
En plus de publier des bêtises | |||
<a href="https://fedi.larlet.fr/@david" rel="me">sur Mastodon</a>. | |||
</p> | |||
<h2 id="tags"> | |||
Publications <a href="/david/2021/" title="Voir la liste de toutes les publications 2021">2021</a> par tags <svg class="icon icon-tags"> | |||
<use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-tags"></use> | |||
</svg> | |||
</h2> | |||
<nav> | |||
<p> | |||
<a href="/david/2021/accessibilite/" rel="tag">#accessibilité (17)</a> | |||
<a href="/david/2021/accompagnement/" rel="tag">#accompagnement (21)</a> | |||
<a href="/david/2021/allie/" rel="tag">#allié (12)</a> | |||
<a href="/david/2021/alterego/" rel="tag">#alterego (7)</a> | |||
<a href="/david/2021/anarchisme/" rel="tag">#anarchisme (5)</a> | |||
<a href="/david/2021/anxiete/" rel="tag">#anxiété (35)</a> | |||
<a href="/david/2021/capitalocene/" rel="tag">#capitalocène (21)</a> | |||
<a href="/david/2021/climat/" rel="tag">#climat (13)</a> | |||
<a href="/david/2021/contemplation/" rel="tag">#contemplation (7)</a> | |||
<a href="/david/2021/cooperative/" rel="tag">#coopérative (7)</a> | |||
<a href="/david/2021/design/" rel="tag">#design (11)</a> | |||
<a href="/david/2021/echecs/" rel="tag">#échecs (5)</a> | |||
<a href="/david/2021/ecole/" rel="tag">#école (8)</a> | |||
<a href="/david/2021/ecriture/" rel="tag">#écriture (15)</a> | |||
<a href="/david/2021/etiquette/" rel="tag">#étiquette (5)</a> | |||
<a href="/david/2021/exploration/" rel="tag">#exploration (5)</a> | |||
<a href="/david/2021/feminisme/" rel="tag">#féminisme (4)</a> | |||
<a href="/david/2021/foret/" rel="tag">#forêt (40)</a> | |||
<a href="/david/2021/frugalite/" rel="tag">#frugalité (6)</a> | |||
<a href="/david/2021/gafam/" rel="tag">#gafam (15)</a> | |||
<a href="/david/2021/gratitude/" rel="tag">#gratitude (18)</a> | |||
<a href="/david/2021/inclassable/" rel="tag">#inclassable (4)</a> | |||
<a href="/david/2021/incompetence/" rel="tag">#incompétence (35)</a> | |||
<a href="/david/2021/lecture/" rel="tag">#lecture (11)</a> | |||
<a href="/david/2021/materiel/" rel="tag">#matériel (4)</a> | |||
<a href="/david/2021/misanthropie/" rel="tag">#misanthropie (23)</a> | |||
<a href="/david/2021/neige/" rel="tag">#neige (7)</a> | |||
<a href="/david/2021/open-source/" rel="tag">#open-source (12)</a> | |||
<a href="/david/2021/pandemie/" rel="tag">#pandémie (44)</a> | |||
<a href="/david/2021/parentalite/" rel="tag">#parentalité (11)</a> | |||
<a href="/david/2021/partage/" rel="tag">#partage (23)</a> | |||
<a href="/david/2021/pharmakon/" rel="tag">#pharmakon (11)</a> | |||
<a href="/david/2021/poesie/" rel="tag">#poésie (5)</a> | |||
<a href="/david/2021/premieres-nations/" rel="tag">#premières-nations (4)</a> | |||
<a href="/david/2021/produit/" rel="tag">#produit (17)</a> | |||
<a href="/david/2021/protopie/" rel="tag">#protopie (5)</a> | |||
<a href="/david/2021/publication/" rel="tag">#publication (16)</a> | |||
<a href="/david/2021/recherche/" rel="tag">#recherche (29)</a> | |||
<a href="/david/2021/rythme/" rel="tag">#rythme (20)</a> | |||
<a href="/david/2021/scopyleft/" rel="tag">#scopyleft (5)</a> | |||
<a href="/david/2021/sociologie/" rel="tag">#sociologie (26)</a> | |||
<a href="/david/2021/technique/" rel="tag">#technique (47)</a> | |||
<a href="/david/2021/traces/" rel="tag">#traces (15)</a> | |||
<a href="/david/2021/transformation/" rel="tag">#transformation (49)</a> | |||
<a href="/david/2021/travail/" rel="tag">#travail (14)</a> | |||
<a href="/david/2021/utilisateur-ice/" rel="tag">#utilisateur·ice (5)</a> | |||
<a href="/david/2021/video/" rel="tag">#vidéo (21)</a> | |||
<a href="/david/2021/web/" rel="tag">#web (24)</a> | |||
</p> | |||
</nav> | |||
<h2>Publications hebdomadaires <a href="/david/2020/" title="Voir la liste de toutes les publications 2020">2020</a></h2> | |||
<p>Liste des publications en ordre chronologique :</p> | |||
<nav> | |||
<p> | |||
<a href="/david/2020/01/03/">Briques</a>, | |||
<a href="/david/2020/01/06/">Écriture</a>, | |||
<a href="/david/2020/01/10/">Travail</a>, | |||
<a href="/david/2020/01/15/">Futurs</a>, | |||
<a href="/david/2020/01/17/">Datagouv</a>, | |||
<a href="/david/2020/01/22/">Réponses</a>, | |||
<a href="/david/2020/01/29/">Sortie ski</a>, | |||
<a href="/david/2020/01/31/">Intentions</a>, | |||
<a href="/david/2020/02/07/">GAFAM+</a>, | |||
<a href="/david/2020/02/14/">Espoirs</a>, | |||
<a href="/david/2020/02/21/">Service</a>, | |||
<a href="/david/2020/03/13/">Technique</a>, | |||
<a href="/david/2020/03/20/">Rédemption</a>, | |||
<a href="/david/2020/03/27/">Exutoire</a>, | |||
<a href="/david/2020/04/03/">Patience</a>, | |||
<a href="/david/2020/04/10/">Résistance</a>, | |||
<a href="/david/2020/04/18/">Zam</a>, | |||
<a href="/david/2020/05/18/">Relance</a>, | |||
<a href="/david/2020/05/20/">Bikepacking</a>, | |||
<a href="/david/2020/05/26/">Covidoudou</a>, | |||
<a href="/david/2020/06/12/">Vrac</a>, | |||
<a href="/david/2020/06/18/">Mouvements</a>, | |||
<a href="/david/2020/06/25/">Ouvertance</a>, | |||
<a href="/david/2020/07/03/">Confetti</a>, | |||
<a href="/david/2020/07/13/">Bilan</a>, | |||
<a href="/david/2020/08/24/">Personnes</a>, | |||
<a href="/david/2020/09/01/">Rentrée</a>, | |||
<a href="/david/2020/09/07/">Rappels</a>, | |||
<a href="/david/2020/09/16/">Coupable</a>, | |||
<a href="/david/2020/10/08/">Parvenir</a>, | |||
<a href="/david/2020/10/22/">Grand-écart</a>, | |||
<a href="/david/2020/10/28/">Chaos</a>, | |||
<a href="/david/2020/11/27/">Perles</a>, | |||
<a href="/david/2020/12/01/">Compréhension</a>, | |||
<a href="/david/2020/12/13/">Publications</a>, | |||
<a href="/david/2020/12/15/">Vidéos</a>, | |||
<a href="/david/2020/12/18/">Arrakice</a>, | |||
<a href="/david/2020/12/21/">Livres</a>. | |||
</p> | |||
</nav> | |||
<h2>Recherche</h2> | |||
<p>Les contenus de ces dernières années sont indexés.</p> | |||
<form action="/david/recherche/" method="get"> | |||
<label for="input-search">Termes de votre recherche :</label> | |||
<input type="search" name="s" required> | |||
<button>Chercher</button> | |||
</form> | |||
<h2>Publications archéologiques</h2> | |||
<p> | |||
Vous pouvez consulter les différents | |||
<a href="/david/blog/">billets de blog</a> qui ont été rédigés de 2004 à 2019 | |||
ou les <a href="/david/stream/">entrées de journaux</a> relativement | |||
régulières entre 2009 et 2019. | |||
</p> | |||
<p> | |||
<em> | |||
Notez qu’avec un tel historique, certaines informations sont obsolètes et/ou | |||
plus cautionnées. | |||
</em> | |||
</p> | |||
<h2>Me contacter</h2> | |||
<p> | |||
Je réponds à <em>presque</em> tous les courriels reçus, exception faite de ceux que j’assimile à de la publicité ou du <code>spam</code>. Vous pouvez <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">m’écrire</a> sans trop de civilités et me tutoyer, je répondrai probablement de même. Si vous souhaitez correspondre de manière chiffrée, voici <a href="/static/david/david-larlet-pgp-public-key-1359EA98.asc" title="Clé publique de chiffrement">ma clé publique</a>. | |||
</p> | |||
</article> | |||
<article> | |||
<header> | |||
<h1>Bienvenue</h1> | |||
</header> | |||
<p> | |||
Voici l’espace personnel de David Larlet sur le Web. | |||
Il se veut modeste, accueillant et pérenne. | |||
Il fixe mes pensées et parfois engage des échanges. | |||
J’essaye de tenir et lier des propos bienveillants. | |||
Je vous souhaite une jolie promenade. | |||
</p> | |||
<p lang="en"> | |||
For an English profile, check out | |||
<a href="http://larlet.com" data-instant>this page 🇨🇦</a>. | |||
</p> | |||
<h2>Publications 2023</h2> | |||
<p>Liste des publications récentes en ordre anté-chronologique :</p> | |||
<nav> | |||
<p> | |||
{% for page in page_list -%} | |||
<a href="{{ page.url }}">{{ page.title }}</a> | |||
{%- if not loop.last %}, | |||
{% else %} | |||
. | |||
{% endif %} | |||
{% endfor %} | |||
</p> | |||
</nav> | |||
<p id="tags-2023">Ou par étiquettes :</p> | |||
<nav> | |||
<p> | |||
{% for slug, title, count in tags -%} | |||
<a href="/david/2023/{{ slug }}/" rel="tag">#{{ title }} ({{ count }})</a> | |||
{%- if not loop.last %}, | |||
{% else %} | |||
. | |||
{% endif %} | |||
{% endfor %} | |||
</p> | |||
</nav> | |||
<p> | |||
Les <a href="/david/blogroll/">liens des ami·es</a> avec leurs dernières publications 🤗. | |||
</p> | |||
<h2>Publications sporadiques 2022</h2> | |||
<p>Liste des publications en ordre chronologique :</p> | |||
<nav> | |||
<p> | |||
<a href="/david/2022/01/19/">Négatif</a>, | |||
<a href="/david/2022/02/17/">Envie</a>, | |||
<a href="/david/2022/03/04/">Régime</a>, | |||
<a href="/david/2022/03/18/">Temps</a>, | |||
<a href="/david/2022/03/23/">Open-source</a>, | |||
<a href="/david/2022/04/02/">Recherche</a>, | |||
<a href="/david/2022/04/14/">Ressenti</a>, | |||
<a href="/david/2022/04/23/">Quarantaine</a>, | |||
<a href="/david/2022/04/26/">R&Day</a>, | |||
<a href="/david/2022/05/13/">Aurore</a>, | |||
<a href="/david/2022/05/15/">Rédemption</a>, | |||
<a href="/david/2022/05/17/">Outils</a>, | |||
<a href="/david/2022/05/30/">Méditation</a>, | |||
<a href="/david/2022/06/06/">Hommes</a>, | |||
<a href="/david/2022/06/24/">Bouddhisme</a>, | |||
<a href="/david/2022/06/30/">Valeur(s)</a>, | |||
<a href="/david/2022/07/06/">Regard</a>, | |||
<a href="/david/2022/07/08/">LudoviCovid</a>, | |||
<a href="/david/2022/07/14/">Vingt</a>, | |||
<a href="/david/2022/07/23/">Origines</a>, | |||
<a href="/david/2022/08/24/">Silence</a>, | |||
<a href="/david/2022/09/03/">Bifurquer</a>, | |||
<a href="/david/2022/10/18/">Esclavage</a>, | |||
<a href="/david/2022/11/12/">Mastodon</a>, | |||
<a href="/david/2022/11/27/">Neuf</a>, | |||
<a href="/david/2022/12/19/">Traces</a>, | |||
<a href="/david/2022/12/22/">Marcher</a>. | |||
</p> | |||
</nav> | |||
<p>J’ai aussi ouvert trois nouveaux espaces en 2022 :</p> | |||
<ul> | |||
<li> | |||
<a href="https://media.larlet.fr/">Des photos/media plus ou moins récents</a> | |||
</li> | |||
<li> | |||
<a href="https://code.larlet.fr/">Des morceaux de code et d’apprentissages</a> | |||
</li> | |||
<li> | |||
<a href="https://nature.larlet.fr/">Des bribes/expériences de nature</a> | |||
</li> | |||
</ul> | |||
<p> | |||
En plus de publier des bêtises | |||
<a href="https://fedi.larlet.fr/@david" rel="me">sur Mastodon</a>. | |||
</p> | |||
<h2 id="tags"> | |||
Publications <a href="/david/2021/" | |||
title="Voir la liste de toutes les publications 2021">2021</a> par tags | |||
<svg class="icon icon-tags"> | |||
<use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-tags"></use> | |||
</svg> | |||
</h2> | |||
<nav> | |||
<p> | |||
<a href="/david/2021/accessibilite/" rel="tag">#accessibilité (17)</a> | |||
<a href="/david/2021/accompagnement/" rel="tag">#accompagnement (21)</a> | |||
<a href="/david/2021/allie/" rel="tag">#allié (12)</a> | |||
<a href="/david/2021/alterego/" rel="tag">#alterego (7)</a> | |||
<a href="/david/2021/anarchisme/" rel="tag">#anarchisme (5)</a> | |||
<a href="/david/2021/anxiete/" rel="tag">#anxiété (35)</a> | |||
<a href="/david/2021/capitalocene/" rel="tag">#capitalocène (21)</a> | |||
<a href="/david/2021/climat/" rel="tag">#climat (13)</a> | |||
<a href="/david/2021/contemplation/" rel="tag">#contemplation (7)</a> | |||
<a href="/david/2021/cooperative/" rel="tag">#coopérative (7)</a> | |||
<a href="/david/2021/design/" rel="tag">#design (11)</a> | |||
<a href="/david/2021/echecs/" rel="tag">#échecs (5)</a> | |||
<a href="/david/2021/ecole/" rel="tag">#école (8)</a> | |||
<a href="/david/2021/ecriture/" rel="tag">#écriture (15)</a> | |||
<a href="/david/2021/etiquette/" rel="tag">#étiquette (5)</a> | |||
<a href="/david/2021/exploration/" rel="tag">#exploration (5)</a> | |||
<a href="/david/2021/feminisme/" rel="tag">#féminisme (4)</a> | |||
<a href="/david/2021/foret/" rel="tag">#forêt (40)</a> | |||
<a href="/david/2021/frugalite/" rel="tag">#frugalité (6)</a> | |||
<a href="/david/2021/gafam/" rel="tag">#gafam (15)</a> | |||
<a href="/david/2021/gratitude/" rel="tag">#gratitude (18)</a> | |||
<a href="/david/2021/inclassable/" rel="tag">#inclassable (4)</a> | |||
<a href="/david/2021/incompetence/" rel="tag">#incompétence (35)</a> | |||
<a href="/david/2021/lecture/" rel="tag">#lecture (11)</a> | |||
<a href="/david/2021/materiel/" rel="tag">#matériel (4)</a> | |||
<a href="/david/2021/misanthropie/" rel="tag">#misanthropie (23)</a> | |||
<a href="/david/2021/neige/" rel="tag">#neige (7)</a> | |||
<a href="/david/2021/open-source/" rel="tag">#open-source (12)</a> | |||
<a href="/david/2021/pandemie/" rel="tag">#pandémie (44)</a> | |||
<a href="/david/2021/parentalite/" rel="tag">#parentalité (11)</a> | |||
<a href="/david/2021/partage/" rel="tag">#partage (23)</a> | |||
<a href="/david/2021/pharmakon/" rel="tag">#pharmakon (11)</a> | |||
<a href="/david/2021/poesie/" rel="tag">#poésie (5)</a> | |||
<a href="/david/2021/premieres-nations/" rel="tag">#premières-nations (4)</a> | |||
<a href="/david/2021/produit/" rel="tag">#produit (17)</a> | |||
<a href="/david/2021/protopie/" rel="tag">#protopie (5)</a> | |||
<a href="/david/2021/publication/" rel="tag">#publication (16)</a> | |||
<a href="/david/2021/recherche/" rel="tag">#recherche (29)</a> | |||
<a href="/david/2021/rythme/" rel="tag">#rythme (20)</a> | |||
<a href="/david/2021/scopyleft/" rel="tag">#scopyleft (5)</a> | |||
<a href="/david/2021/sociologie/" rel="tag">#sociologie (26)</a> | |||
<a href="/david/2021/technique/" rel="tag">#technique (47)</a> | |||
<a href="/david/2021/traces/" rel="tag">#traces (15)</a> | |||
<a href="/david/2021/transformation/" rel="tag">#transformation (49)</a> | |||
<a href="/david/2021/travail/" rel="tag">#travail (14)</a> | |||
<a href="/david/2021/utilisateur-ice/" rel="tag">#utilisateur·ice (5)</a> | |||
<a href="/david/2021/video/" rel="tag">#vidéo (21)</a> | |||
<a href="/david/2021/web/" rel="tag">#web (24)</a> | |||
</p> | |||
</nav> | |||
<h2> | |||
Publications hebdomadaires <a href="/david/2020/" | |||
title="Voir la liste de toutes les publications 2020">2020</a> | |||
</h2> | |||
<p>Liste des publications en ordre chronologique :</p> | |||
<nav> | |||
<p> | |||
<a href="/david/2020/01/03/">Briques</a>, | |||
<a href="/david/2020/01/06/">Écriture</a>, | |||
<a href="/david/2020/01/10/">Travail</a>, | |||
<a href="/david/2020/01/15/">Futurs</a>, | |||
<a href="/david/2020/01/17/">Datagouv</a>, | |||
<a href="/david/2020/01/22/">Réponses</a>, | |||
<a href="/david/2020/01/29/">Sortie ski</a>, | |||
<a href="/david/2020/01/31/">Intentions</a>, | |||
<a href="/david/2020/02/07/">GAFAM+</a>, | |||
<a href="/david/2020/02/14/">Espoirs</a>, | |||
<a href="/david/2020/02/21/">Service</a>, | |||
<a href="/david/2020/03/13/">Technique</a>, | |||
<a href="/david/2020/03/20/">Rédemption</a>, | |||
<a href="/david/2020/03/27/">Exutoire</a>, | |||
<a href="/david/2020/04/03/">Patience</a>, | |||
<a href="/david/2020/04/10/">Résistance</a>, | |||
<a href="/david/2020/04/18/">Zam</a>, | |||
<a href="/david/2020/05/18/">Relance</a>, | |||
<a href="/david/2020/05/20/">Bikepacking</a>, | |||
<a href="/david/2020/05/26/">Covidoudou</a>, | |||
<a href="/david/2020/06/12/">Vrac</a>, | |||
<a href="/david/2020/06/18/">Mouvements</a>, | |||
<a href="/david/2020/06/25/">Ouvertance</a>, | |||
<a href="/david/2020/07/03/">Confetti</a>, | |||
<a href="/david/2020/07/13/">Bilan</a>, | |||
<a href="/david/2020/08/24/">Personnes</a>, | |||
<a href="/david/2020/09/01/">Rentrée</a>, | |||
<a href="/david/2020/09/07/">Rappels</a>, | |||
<a href="/david/2020/09/16/">Coupable</a>, | |||
<a href="/david/2020/10/08/">Parvenir</a>, | |||
<a href="/david/2020/10/22/">Grand-écart</a>, | |||
<a href="/david/2020/10/28/">Chaos</a>, | |||
<a href="/david/2020/11/27/">Perles</a>, | |||
<a href="/david/2020/12/01/">Compréhension</a>, | |||
<a href="/david/2020/12/13/">Publications</a>, | |||
<a href="/david/2020/12/15/">Vidéos</a>, | |||
<a href="/david/2020/12/18/">Arrakice</a>, | |||
<a href="/david/2020/12/21/">Livres</a>. | |||
</p> | |||
</nav> | |||
<h2>Recherche</h2> | |||
<p>Les contenus de ces dernières années sont indexés.</p> | |||
<form action="/david/recherche/" method="get"> | |||
<label for="input-search">Termes de votre recherche :</label> | |||
<input type="search" name="s" required> | |||
<button>Chercher</button> | |||
</form> | |||
<h2>Publications archéologiques</h2> | |||
<p> | |||
Vous pouvez consulter les différents | |||
<a href="/david/blog/">billets de blog</a> qui ont été rédigés de 2004 à 2019 | |||
ou les <a href="/david/stream/">entrées de journaux</a> relativement | |||
régulières entre 2009 et 2019. | |||
</p> | |||
<p> | |||
<em> | |||
Notez qu’avec un tel historique, certaines informations sont obsolètes et/ou | |||
plus cautionnées. | |||
</em> | |||
</p> | |||
<h2>Me contacter</h2> | |||
<p> | |||
Je réponds à <em>presque</em> tous les courriels reçus, exception faite de ceux que j’assimile à de la publicité ou du <code>spam</code>. Vous pouvez <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">m’écrire</a> sans trop de civilités et me tutoyer, je répondrai probablement de même. Si vous souhaitez correspondre de manière chiffrée, voici <a href="/static/david/david-larlet-pgp-public-key-1359EA98.asc" | |||
title="Clé publique de chiffrement">ma clé publique</a>. | |||
</p> | |||
</article> | |||
{% endblock content %} |
@@ -3,371 +3,364 @@ | |||
{% block title %}Recherche{% endblock %} | |||
{% block description %}Voici l’espace personnel de David Larlet sur le Web.{% endblock %} | |||
{% block content %} | |||
<article> | |||
<header> | |||
<h1>Recherche</h1> | |||
</header> | |||
<nav> | |||
<p class="center"> | |||
<nobr> | |||
<a href="/david/" title="Aller à l’accueil" | |||
><svg class="icon icon-home"> | |||
<use | |||
xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-home" | |||
></use> | |||
</svg> | |||
Accueil</a | |||
> | |||
</nobr> | |||
</p> | |||
</nav> | |||
<hr> | |||
<form action="https://duckduckgo.com/" method="get" id="form-search"> | |||
<label for="input-search">Termes de votre recherche :</label> | |||
<input type="search" name="q" id="input-search" required> | |||
<input type="hidden" name="sites" value="larlet.fr"> | |||
<button>Chercher</button> | |||
<button type="reset">Annuler</button> | |||
</form> | |||
<p id="search-status" role="status"></p> | |||
<div id="search-results"></div> | |||
<hr> | |||
<p> | |||
Seuls les écrits de ces dernières années sont indexés. | |||
Vous pouvez aussi consulter les archives chronologiques de | |||
<a href="/david/2023/">2023</a>, | |||
<a href="/david/2022/">2022</a>, | |||
<a href="/david/2021/">2021</a>, | |||
<a href="/david/2020/">2020</a>, | |||
<a href="/david/blog/">etc</a>. | |||
</p> | |||
{% endblock content %} | |||
{% block extra_body %} | |||
<template id="search-result"> | |||
<h2> | |||
<a href="${url}">${title}</a> (${date}) | |||
</h2> | |||
<p>${content}</p> | |||
</template> | |||
<script id="search-index" type="application/json"> | |||
{{ search_index }} | |||
</script> | |||
<!-- French stopwords from https://github.com/stopwords-iso/stopwords-fr --> | |||
<script id="search-stop-words" type="application/json"> | |||
[ | |||
"a", "abord", "absolument", "afin", "ah", "ai", "aie", "aient", "aies", | |||
"ailleurs", "ainsi", "ait", "allaient", "allo", "allons", "allô", | |||
"alors", "anterieur", "anterieure", "anterieures", "apres", "après", | |||
"as", "assez", "attendu", "au", "aucun", "aucune", "aucuns", "aujourd", | |||
"aujourd'hui", "aupres", "auquel", "aura", "aurai", "auraient", "aurais", | |||
"aurait", "auras", "aurez", "auriez", "aurions", "aurons", "auront", | |||
"aussi", "autant", "autre", "autrefois", "autrement", "autres", "autrui", | |||
"aux", "auxquelles", "auxquels", "avaient", "avais", "avait", "avant", | |||
"avec", "avez", "aviez", "avions", "avoir", "avons", "ayant", "ayez", | |||
"ayons", "b", "bah", "bas", "basee", "bat", "beau", "beaucoup", "bien", | |||
"bigre", "bon", "boum", "bravo", "brrr", "c", "car", "ce", "ceci", | |||
"cela", "celle", "celle-ci", "celle-là", "celles", "celles-ci", | |||
"celles-là", "celui", "celui-ci", "celui-là", "celà", "cent", | |||
"cependant", "certain", "certaine", "certaines", "certains", "certes", | |||
"ces", "cet", "cette", "ceux", "ceux-ci", "ceux-là", "chacun", "chacune", | |||
"chaque", "cher", "chers", "chez", "chiche", "chut", "chère", "chères", | |||
"ci", "cinq", "cinquantaine", "cinquante", "cinquantième", "cinquième", | |||
"clac", "clic", "combien", "comme", "comment", "comparable", | |||
"comparables", "compris", "concernant", "contre", "couic", "crac", "d", | |||
"da", "dans", "de", "debout", "dedans", "dehors", "deja", "delà", | |||
"depuis", "dernier", "derniere", "derriere", "derrière", "des", | |||
"desormais", "desquelles", "desquels", "dessous", "dessus", "deux", | |||
"deuxième", "deuxièmement", "devant", "devers", "devra", "devrait", | |||
"different", "differentes", "differents", "différent", "différente", | |||
"différentes", "différents", "dire", "directe", "directement", "dit", | |||
"dite", "dits", "divers", "diverse", "diverses", "dix", "dix-huit", | |||
"dix-neuf", "dix-sept", "dixième", "doit", "doivent", "donc", "dont", | |||
"dos", "douze", "douzième", "dring", "droite", "du", "duquel", "durant", | |||
"dès", "début", "désormais", "e", "effet", "egale", "egalement", | |||
"egales", "eh", "elle", "elle-même", "elles", "elles-mêmes", "en", | |||
"encore", "enfin", "entre", "envers", "environ", "es", "essai", "est", | |||
"et", "etant", "etc", "etre", "eu", "eue", "eues", "euh", "eurent", | |||
"eus", "eusse", "eussent", "eusses", "eussiez", "eussions", "eut", "eux", | |||
"eux-mêmes", "exactement", "excepté", "extenso", "exterieur", "eûmes", | |||
"eût", "eûtes", "f", "fais", "faisaient", "faisant", "fait", "faites", | |||
"façon", "feront", "fi", "flac", "floc", "fois", "font", "force", | |||
"furent", "fus", "fusse", "fussent", "fusses", "fussiez", "fussions", | |||
"fut", "fûmes", "fût", "fûtes", "g", "gens", "h", "ha", "haut", "hein", | |||
"hem", "hep", "hi", "ho", "holà", "hop", "hormis", "hors", "hou", "houp", | |||
"hue", "hui", "huit", "huitième", "hum", "hurrah", "hé", "hélas", "i", | |||
"ici", "il", "ils", "importe", "j", "je", "jusqu", "jusque", "juste", | |||
"k", "l", "la", "laisser", "laquelle", "las", "le", "lequel", "les", | |||
"lesquelles", "lesquels", "leur", "leurs", "longtemps", "lors", | |||
"lorsque", "lui", "lui-meme", "lui-même", "là", "lès", "m", "ma", | |||
"maint", "maintenant", "mais", "malgre", "malgré", "maximale", "me", | |||
"meme", "memes", "merci", "mes", "mien", "mienne", "miennes", "miens", | |||
"mille", "mince", "mine", "minimale", "moi", "moi-meme", "moi-même", | |||
"moindres", "moins", "mon", "mot", "moyennant", "multiple", "multiples", | |||
"même", "mêmes", "n", "na", "naturel", "naturelle", "naturelles", "ne", | |||
"neanmoins", "necessaire", "necessairement", "neuf", "neuvième", "ni", | |||
"nombreuses", "nombreux", "nommés", "non", "nos", "notamment", "notre", | |||
"nous", "nous-mêmes", "nouveau", "nouveaux", "nul", "néanmoins", "nôtre", | |||
"nôtres", "o", "oh", "ohé", "ollé", "olé", "on", "ont", "onze", | |||
"onzième", "ore", "ou", "ouf", "ouias", "oust", "ouste", "outre", | |||
"ouvert", "ouverte", "ouverts", "o|", "où", "p", "paf", "pan", "par", | |||
"parce", "parfois", "parle", "parlent", "parler", "parmi", "parole", | |||
"parseme", "partant", "particulier", "particulière", "particulièrement", | |||
"pas", "passé", "pendant", "pense", "permet", "personne", "personnes", | |||
"peu", "peut", "peuvent", "peux", "pff", "pfft", "pfut", "pif", "pire", | |||
"pièce", "plein", "plouf", "plupart", "plus", "plusieurs", "plutôt", | |||
"possessif", "possessifs", "possible", "possibles", "pouah", "pour", | |||
"pourquoi", "pourrais", "pourrait", "pouvait", "prealable", | |||
"precisement", "premier", "première", "premièrement", "pres", "probable", | |||
"probante", "procedant", "proche", "près", "psitt", "pu", "puis", | |||
"puisque", "pur", "pure", "q", "qu", "quand", "quant", "quant-à-soi", | |||
"quanta", "quarante", "quatorze", "quatre", "quatre-vingt", "quatrième", | |||
"quatrièmement", "que", "quel", "quelconque", "quelle", "quelles", | |||
"quelqu'un", "quelque", "quelques", "quels", "qui", "quiconque", | |||
"quinze", "quoi", "quoique", "r", "rare", "rarement", "rares", | |||
"relative", "relativement", "remarquable", "rend", "rendre", "restant", | |||
"reste", "restent", "restrictif", "retour", "revoici", "revoilà", "rien", | |||
"s", "sa", "sacrebleu", "sait", "sans", "sapristi", "sauf", "se", "sein", | |||
"seize", "selon", "semblable", "semblaient", "semble", "semblent", | |||
"sent", "sept", "septième", "sera", "serai", "seraient", "serais", | |||
"serait", "seras", "serez", "seriez", "serions", "serons", "seront", | |||
"ses", "seul", "seule", "seulement", "si", "sien", "sienne", "siennes", | |||
"siens", "sinon", "six", "sixième", "soi", "soi-même", "soient", "sois", | |||
"soit", "soixante", "sommes", "son", "sont", "sous", "souvent", "soyez", | |||
"soyons", "specifique", "specifiques", "speculatif", "stop", | |||
"strictement", "subtiles", "suffisant", "suffisante", "suffit", "suis", | |||
"suit", "suivant", "suivante", "suivantes", "suivants", "suivre", | |||
"sujet", "superpose", "sur", "surtout", "t", "ta", "tac", "tandis", | |||
"tant", "tardive", "te", "tel", "telle", "tellement", "telles", "tels", | |||
"tenant", "tend", "tenir", "tente", "tes", "tic", "tien", "tienne", | |||
"tiennes", "tiens", "toc", "toi", "toi-même", "ton", "touchant", | |||
"toujours", "tous", "tout", "toute", "toutefois", "toutes", "treize", | |||
"trente", "tres", "trois", "troisième", "troisièmement", "trop", "très", | |||
"tsoin", "tsouin", "tu", "té", "u", "un", "une", "unes", "uniformement", | |||
"unique", "uniques", "uns", "v", "va", "vais", "valeur", "vas", "vers", | |||
"via", "vif", "vifs", "vingt", "vivat", "vive", "vives", "vlan", "voici", | |||
"voie", "voient", "voilà", "voire", "vont", "vos", "votre", "vous", | |||
"vous-mêmes", "vu", "vé", "vôtre", "vôtres", "w", "x", "y", "z", "zut", | |||
"à", "â", "ça", "ès", "étaient", "étais", "était", "étant", "état", | |||
"étiez", "étions", "été", "étée", "étées", "étés", "êtes", "être", "ô" | |||
] | |||
</script> | |||
<script type="text/javascript"> | |||
/* See: | |||
* https://gomakethings.com/how-to-create-a-search-page-for-a-static-website-with-vanilla-js/ | |||
* https://gomakethings.com/how-to-update-the-url-of-a-page-without-causing-a-reload-using-vanilla-javascript/ | |||
*/ | |||
;(function () { | |||
// Retrieving the search index and stopwords from JSON. | |||
// See https://v8.dev/blog/cost-of-javascript-2019#json | |||
let searchIndex = JSON.parse( | |||
document.getElementById('search-index').textContent | |||
) | |||
let stopWords = JSON.parse( | |||
document.getElementById('search-stop-words').textContent | |||
) | |||
// Get the DOM elements | |||
let form = document.querySelector('#form-search') | |||
let input = document.querySelector('#input-search') | |||
let resultList = document.querySelector('#search-results') | |||
let searchStatus = document.querySelector('#search-status') | |||
let searchResultTemplate = document.querySelector('#search-result') | |||
// Make sure required content exists | |||
if ( | |||
!form || | |||
!input || | |||
!resultList || | |||
!searchStatus || | |||
!searchIndex || | |||
!stopWords || | |||
!searchResultTemplate | |||
) | |||
return | |||
// Create a submit handler | |||
form.addEventListener('submit', function (event) { | |||
event.preventDefault() | |||
search(input.value) | |||
}) | |||
// Create a typeahead handler | |||
form.addEventListener('keyup', function (event) { | |||
search(input.value) | |||
}) | |||
<article> | |||
<header> | |||
<h1>Recherche</h1> | |||
</header> | |||
<nav> | |||
<p class="center"> | |||
<nobr> | |||
<a href="/david/" title="Aller à l’accueil"> | |||
<svg class="icon icon-home"> | |||
<use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-home"></use> | |||
</svg> | |||
Accueil</a> | |||
</nobr> | |||
</p> | |||
</nav> | |||
<hr> | |||
<form action="https://duckduckgo.com/" method="get" id="form-search"> | |||
<label for="input-search">Termes de votre recherche :</label> | |||
<input type="search" name="q" id="input-search" required> | |||
<input type="hidden" name="sites" value="larlet.fr"> | |||
<button>Chercher</button> | |||
<button type="reset">Annuler</button> | |||
</form> | |||
<p id="search-status" role="status"></p> | |||
<div id="search-results"></div> | |||
<hr> | |||
<p> | |||
Seuls les écrits de ces dernières années sont indexés. | |||
Vous pouvez aussi consulter les archives chronologiques de | |||
<a href="/david/2023/">2023</a>, | |||
<a href="/david/2022/">2022</a>, | |||
<a href="/david/2021/">2021</a>, | |||
<a href="/david/2020/">2020</a>, | |||
<a href="/david/blog/">etc</a>. | |||
</p> | |||
{% endblock content %} | |||
{% block extra_body %} | |||
<template id="search-result"> | |||
<h2> | |||
<a href="${url}">${title}</a> (${date}) | |||
</h2> | |||
<p>${content}</p> | |||
</template> | |||
{# djlint:off #} | |||
<script id="search-index" type="application/json">{{ search_index }}</script> | |||
{# djlint:on #} | |||
<!-- French stopwords from https://github.com/stopwords-iso/stopwords-fr --> | |||
<script id="search-stop-words" type="application/json"> | |||
[ | |||
"a", "abord", "absolument", "afin", "ah", "ai", "aie", "aient", "aies", | |||
"ailleurs", "ainsi", "ait", "allaient", "allo", "allons", "allô", | |||
"alors", "anterieur", "anterieure", "anterieures", "apres", "après", | |||
"as", "assez", "attendu", "au", "aucun", "aucune", "aucuns", "aujourd", | |||
"aujourd'hui", "aupres", "auquel", "aura", "aurai", "auraient", "aurais", | |||
"aurait", "auras", "aurez", "auriez", "aurions", "aurons", "auront", | |||
"aussi", "autant", "autre", "autrefois", "autrement", "autres", "autrui", | |||
"aux", "auxquelles", "auxquels", "avaient", "avais", "avait", "avant", | |||
"avec", "avez", "aviez", "avions", "avoir", "avons", "ayant", "ayez", | |||
"ayons", "b", "bah", "bas", "basee", "bat", "beau", "beaucoup", "bien", | |||
"bigre", "bon", "boum", "bravo", "brrr", "c", "car", "ce", "ceci", | |||
"cela", "celle", "celle-ci", "celle-là", "celles", "celles-ci", | |||
"celles-là", "celui", "celui-ci", "celui-là", "celà", "cent", | |||
"cependant", "certain", "certaine", "certaines", "certains", "certes", | |||
"ces", "cet", "cette", "ceux", "ceux-ci", "ceux-là", "chacun", "chacune", | |||
"chaque", "cher", "chers", "chez", "chiche", "chut", "chère", "chères", | |||
"ci", "cinq", "cinquantaine", "cinquante", "cinquantième", "cinquième", | |||
"clac", "clic", "combien", "comme", "comment", "comparable", | |||
"comparables", "compris", "concernant", "contre", "couic", "crac", "d", | |||
"da", "dans", "de", "debout", "dedans", "dehors", "deja", "delà", | |||
"depuis", "dernier", "derniere", "derriere", "derrière", "des", | |||
"desormais", "desquelles", "desquels", "dessous", "dessus", "deux", | |||
"deuxième", "deuxièmement", "devant", "devers", "devra", "devrait", | |||
"different", "differentes", "differents", "différent", "différente", | |||
"différentes", "différents", "dire", "directe", "directement", "dit", | |||
"dite", "dits", "divers", "diverse", "diverses", "dix", "dix-huit", | |||
"dix-neuf", "dix-sept", "dixième", "doit", "doivent", "donc", "dont", | |||
"dos", "douze", "douzième", "dring", "droite", "du", "duquel", "durant", | |||
"dès", "début", "désormais", "e", "effet", "egale", "egalement", | |||
"egales", "eh", "elle", "elle-même", "elles", "elles-mêmes", "en", | |||
"encore", "enfin", "entre", "envers", "environ", "es", "essai", "est", | |||
"et", "etant", "etc", "etre", "eu", "eue", "eues", "euh", "eurent", | |||
"eus", "eusse", "eussent", "eusses", "eussiez", "eussions", "eut", "eux", | |||
"eux-mêmes", "exactement", "excepté", "extenso", "exterieur", "eûmes", | |||
"eût", "eûtes", "f", "fais", "faisaient", "faisant", "fait", "faites", | |||
"façon", "feront", "fi", "flac", "floc", "fois", "font", "force", | |||
"furent", "fus", "fusse", "fussent", "fusses", "fussiez", "fussions", | |||
"fut", "fûmes", "fût", "fûtes", "g", "gens", "h", "ha", "haut", "hein", | |||
"hem", "hep", "hi", "ho", "holà", "hop", "hormis", "hors", "hou", "houp", | |||
"hue", "hui", "huit", "huitième", "hum", "hurrah", "hé", "hélas", "i", | |||
"ici", "il", "ils", "importe", "j", "je", "jusqu", "jusque", "juste", | |||
"k", "l", "la", "laisser", "laquelle", "las", "le", "lequel", "les", | |||
"lesquelles", "lesquels", "leur", "leurs", "longtemps", "lors", | |||
"lorsque", "lui", "lui-meme", "lui-même", "là", "lès", "m", "ma", | |||
"maint", "maintenant", "mais", "malgre", "malgré", "maximale", "me", | |||
"meme", "memes", "merci", "mes", "mien", "mienne", "miennes", "miens", | |||
"mille", "mince", "mine", "minimale", "moi", "moi-meme", "moi-même", | |||
"moindres", "moins", "mon", "mot", "moyennant", "multiple", "multiples", | |||
"même", "mêmes", "n", "na", "naturel", "naturelle", "naturelles", "ne", | |||
"neanmoins", "necessaire", "necessairement", "neuf", "neuvième", "ni", | |||
"nombreuses", "nombreux", "nommés", "non", "nos", "notamment", "notre", | |||
"nous", "nous-mêmes", "nouveau", "nouveaux", "nul", "néanmoins", "nôtre", | |||
"nôtres", "o", "oh", "ohé", "ollé", "olé", "on", "ont", "onze", | |||
"onzième", "ore", "ou", "ouf", "ouias", "oust", "ouste", "outre", | |||
"ouvert", "ouverte", "ouverts", "o|", "où", "p", "paf", "pan", "par", | |||
"parce", "parfois", "parle", "parlent", "parler", "parmi", "parole", | |||
"parseme", "partant", "particulier", "particulière", "particulièrement", | |||
"pas", "passé", "pendant", "pense", "permet", "personne", "personnes", | |||
"peu", "peut", "peuvent", "peux", "pff", "pfft", "pfut", "pif", "pire", | |||
"pièce", "plein", "plouf", "plupart", "plus", "plusieurs", "plutôt", | |||
"possessif", "possessifs", "possible", "possibles", "pouah", "pour", | |||
"pourquoi", "pourrais", "pourrait", "pouvait", "prealable", | |||
"precisement", "premier", "première", "premièrement", "pres", "probable", | |||
"probante", "procedant", "proche", "près", "psitt", "pu", "puis", | |||
"puisque", "pur", "pure", "q", "qu", "quand", "quant", "quant-à-soi", | |||
"quanta", "quarante", "quatorze", "quatre", "quatre-vingt", "quatrième", | |||
"quatrièmement", "que", "quel", "quelconque", "quelle", "quelles", | |||
"quelqu'un", "quelque", "quelques", "quels", "qui", "quiconque", | |||
"quinze", "quoi", "quoique", "r", "rare", "rarement", "rares", | |||
"relative", "relativement", "remarquable", "rend", "rendre", "restant", | |||
"reste", "restent", "restrictif", "retour", "revoici", "revoilà", "rien", | |||
"s", "sa", "sacrebleu", "sait", "sans", "sapristi", "sauf", "se", "sein", | |||
"seize", "selon", "semblable", "semblaient", "semble", "semblent", | |||
"sent", "sept", "septième", "sera", "serai", "seraient", "serais", | |||
"serait", "seras", "serez", "seriez", "serions", "serons", "seront", | |||
"ses", "seul", "seule", "seulement", "si", "sien", "sienne", "siennes", | |||
"siens", "sinon", "six", "sixième", "soi", "soi-même", "soient", "sois", | |||
"soit", "soixante", "sommes", "son", "sont", "sous", "souvent", "soyez", | |||
"soyons", "specifique", "specifiques", "speculatif", "stop", | |||
"strictement", "subtiles", "suffisant", "suffisante", "suffit", "suis", | |||
"suit", "suivant", "suivante", "suivantes", "suivants", "suivre", | |||
"sujet", "superpose", "sur", "surtout", "t", "ta", "tac", "tandis", | |||
"tant", "tardive", "te", "tel", "telle", "tellement", "telles", "tels", | |||
"tenant", "tend", "tenir", "tente", "tes", "tic", "tien", "tienne", | |||
"tiennes", "tiens", "toc", "toi", "toi-même", "ton", "touchant", | |||
"toujours", "tous", "tout", "toute", "toutefois", "toutes", "treize", | |||
"trente", "tres", "trois", "troisième", "troisièmement", "trop", "très", | |||
"tsoin", "tsouin", "tu", "té", "u", "un", "une", "unes", "uniformement", | |||
"unique", "uniques", "uns", "v", "va", "vais", "valeur", "vas", "vers", | |||
"via", "vif", "vifs", "vingt", "vivat", "vive", "vives", "vlan", "voici", | |||
"voie", "voient", "voilà", "voire", "vont", "vos", "votre", "vous", | |||
"vous-mêmes", "vu", "vé", "vôtre", "vôtres", "w", "x", "y", "z", "zut", | |||
"à", "â", "ça", "ès", "étaient", "étais", "était", "étant", "état", | |||
"étiez", "étions", "été", "étée", "étées", "étés", "êtes", "être", "ô" | |||
] | |||
</script> | |||
<script type="text/javascript"> | |||
/* See: | |||
* https://gomakethings.com/how-to-create-a-search-page-for-a-static-website-with-vanilla-js/ | |||
* https://gomakethings.com/how-to-update-the-url-of-a-page-without-causing-a-reload-using-vanilla-javascript/ | |||
*/ | |||
; | |||
(function() { | |||
// Retrieving the search index and stopwords from JSON. | |||
// See https://v8.dev/blog/cost-of-javascript-2019#json | |||
let searchIndex = JSON.parse( | |||
document.getElementById('search-index').textContent | |||
) | |||
let stopWords = JSON.parse( | |||
document.getElementById('search-stop-words').textContent | |||
) | |||
// Create a reset handler | |||
form.addEventListener('reset', function () { | |||
search('') | |||
searchStatus.innerHTML = '' | |||
}) | |||
// Get the DOM elements | |||
let form = document.querySelector('#form-search') | |||
let input = document.querySelector('#input-search') | |||
let resultList = document.querySelector('#search-results') | |||
let searchStatus = document.querySelector('#search-status') | |||
let searchResultTemplate = document.querySelector('#search-result') | |||
// Check for query strings onload | |||
onload() | |||
// Make sure required content exists | |||
if ( | |||
!form || | |||
!input || | |||
!resultList || | |||
!searchStatus || | |||
!searchIndex || | |||
!stopWords || | |||
!searchResultTemplate | |||
) | |||
return | |||
/** | |||
* If there's a query string search term, search it on page load | |||
*/ | |||
function onload() { | |||
let query = new URLSearchParams(window.location.search).get('s') | |||
if (!query) return | |||
input.value = query | |||
search(query) | |||
} | |||
// Create a submit handler | |||
form.addEventListener('submit', function(event) { | |||
event.preventDefault() | |||
search(input.value) | |||
}) | |||
/** | |||
* Search for matches | |||
* @param {String} query The term to search for | |||
*/ | |||
function search(query) { | |||
// Create a regex for each query | |||
let regMap = query | |||
.toLowerCase() | |||
.split(' ') | |||
.filter(function (word) { | |||
return word.length && !stopWords.includes(word) | |||
// Create a typeahead handler | |||
form.addEventListener('keyup', function(event) { | |||
search(input.value) | |||
}) | |||
.map(function (word) { | |||
return new RegExp(word, 'i') | |||
// Create a reset handler | |||
form.addEventListener('reset', function() { | |||
search('') | |||
searchStatus.innerHTML = '' | |||
}) | |||
// Get and sort the results | |||
let results = searchIndex | |||
.reduce(function (results, article, index) { | |||
// Setup priority count | |||
let priority = 0 | |||
// Check for query strings onload | |||
onload() | |||
// Assign priority | |||
for (let reg of regMap) { | |||
if (reg.test(article.title)) { | |||
priority += 100 | |||
} | |||
let occurences = article.content.match(reg) | |||
if (occurences) { | |||
priority += occurences.length | |||
} | |||
} | |||
/** | |||
* If there's a query string search term, search it on page load | |||
*/ | |||
function onload() { | |||
let query = new URLSearchParams(window.location.search).get('s') | |||
if (!query) return | |||
input.value = query | |||
search(query) | |||
} | |||
// If any matches, push to results | |||
if (priority > 0) { | |||
results.push({ | |||
priority: priority, | |||
article: article, | |||
/** | |||
* Search for matches | |||
* @param {String} query The term to search for | |||
*/ | |||
function search(query) { | |||
// Create a regex for each query | |||
let regMap = query | |||
.toLowerCase() | |||
.split(' ') | |||
.filter(function(word) { | |||
return word.length && !stopWords.includes(word) | |||
}) | |||
.map(function(word) { | |||
return new RegExp(word, 'i') | |||
}) | |||
} | |||
return results | |||
}, []) | |||
.sort(function (article1, article2) { | |||
return article2.priority - article1.priority | |||
}) | |||
// Get and sort the results | |||
let results = searchIndex | |||
.reduce(function(results, article, index) { | |||
// Setup priority count | |||
let priority = 0 | |||
// Display the results | |||
showResults(results, regMap) | |||
// Assign priority | |||
for (let reg of regMap) { | |||
if (reg.test(article.title)) { | |||
priority += 100 | |||
} | |||
let occurences = article.content.match(reg) | |||
if (occurences) { | |||
priority += occurences.length | |||
} | |||
} | |||
// Update the URL | |||
updateURL(query) | |||
} | |||
// If any matches, push to results | |||
if (priority > 0) { | |||
results.push({ | |||
priority: priority, | |||
article: article, | |||
}) | |||
} | |||
/** | |||
* Show the search results in the UI | |||
* @param {Array} results The results to display | |||
* @param {List} regMap Regular expressions for the highlights | |||
*/ | |||
function showResults(results, regMap) { | |||
let status = 'Aucune publication n’a été trouvée 😢' | |||
let searchResults = '' | |||
if (results.length) { | |||
const plural = results.length > 1 ? 's' : '' | |||
status = `${results.length} publication${plural} trouvée${plural} 🙌` | |||
searchResults = results | |||
.map(function (result) { | |||
return interpolate(searchResultTemplate.innerHTML, { | |||
url: result.article.url, | |||
title: highlightText(result.article.title, regMap), | |||
date: result.article.date, | |||
content: highlightText(result.article.content, regMap), | |||
return results | |||
}, []) | |||
.sort(function(article1, article2) { | |||
return article2.priority - article1.priority | |||
}) | |||
}) | |||
.join('') | |||
} | |||
searchStatus.innerHTML = status | |||
resultList.innerHTML = searchResults | |||
} | |||
/** | |||
* Get a template from a string | |||
* https://stackoverflow.com/a/41015840 | |||
* https://gomakethings.com/html-templates-with-vanilla-javascript/ | |||
* @param {String} str The string to interpolate | |||
* @param {Object} params The parameters | |||
* @return {String} The interpolated string | |||
*/ | |||
function interpolate(str, params) { | |||
let names = Object.keys(params) | |||
let vals = Object.values(params) | |||
return new Function(...names, `return \`${str}\``)(...vals) | |||
} | |||
// Display the results | |||
showResults(results, regMap) | |||
/** | |||
* Highlight the text in the UI | |||
* @param {String} text The content to highlight | |||
* @param {List} regMap Regular expressions for the highlights | |||
*/ | |||
function highlightText(text, regMap) { | |||
// TODO: deal with close matches when multiple words are looked for, | |||
// it does not look trivial because you have to memorize positions | |||
// then create extracts. | |||
// For instance: `microsoft github` | |||
const extractBoundariesSize = 100 | |||
const textLength = text.length | |||
let extracts = [] | |||
for (let reg of regMap) { | |||
const index = text.search(reg) | |||
if (index === -1) { | |||
continue | |||
// Update the URL | |||
updateURL(query) | |||
} | |||
let extract = text.substring( | |||
index - extractBoundariesSize, | |||
index + reg.source.length + extractBoundariesSize | |||
) | |||
// TODISCUSS: we replace with the source but in case there is | |||
// an uppercase letter it will disappear from the extract | |||
// (is that confusing or closer to what is expected?) | |||
extract = extract.replace(reg, `<mark>${reg.source}</mark>`) | |||
const prefixEllipsis = index - extractBoundariesSize >= 0 ? '…' : '' | |||
const suffixEllipsis = | |||
index + extractBoundariesSize <= textLength ? '…' : '' | |||
extracts.push(`${prefixEllipsis}${extract}${suffixEllipsis}`) | |||
} | |||
if (!extracts.length && textLength < 200) { | |||
// If there is no match but it's a short title, return it. | |||
return text | |||
} | |||
return extracts.join('') | |||
} | |||
/** | |||
* Update the URL with a query string for the search string | |||
* @param {String} query The search query | |||
*/ | |||
function updateURL(query) { | |||
// Create the properties | |||
let state = history.state | |||
let title = document.title | |||
let url = window.location.origin + window.location.pathname | |||
if (query) { | |||
url += '?s=' + encodeURI(query) | |||
} | |||
/** | |||
* Show the search results in the UI | |||
* @param {Array} results The results to display | |||
* @param {List} regMap Regular expressions for the highlights | |||
*/ | |||
function showResults(results, regMap) { | |||
let status = 'Aucune publication n’a été trouvée 😢' | |||
let searchResults = '' | |||
if (results.length) { | |||
const plural = results.length > 1 ? 's' : '' | |||
status = `${results.length} publication${plural} trouvée${plural} 🙌` | |||
searchResults = results | |||
.map(function(result) { | |||
return interpolate(searchResultTemplate.innerHTML, { | |||
url: result.article.url, | |||
title: highlightText(result.article.title, regMap), | |||
date: result.article.date, | |||
content: highlightText(result.article.content, regMap), | |||
}) | |||
}) | |||
.join('') | |||
} | |||
searchStatus.innerHTML = status | |||
resultList.innerHTML = searchResults | |||
} | |||
// Update the URL | |||
history.pushState(state, title, url) | |||
} | |||
})() | |||
/** | |||
* Get a template from a string | |||
* https://stackoverflow.com/a/41015840 | |||
* https://gomakethings.com/html-templates-with-vanilla-javascript/ | |||
* @param {String} str The string to interpolate | |||
* @param {Object} params The parameters | |||
* @return {String} The interpolated string | |||
*/ | |||
function interpolate(str, params) { | |||
let names = Object.keys(params) | |||
let vals = Object.values(params) | |||
return new Function(...names, `return \`${str}\``)(...vals) | |||
} | |||
</script> | |||
{% endblock %} | |||
/** | |||
* Highlight the text in the UI | |||
* @param {String} text The content to highlight | |||
* @param {List} regMap Regular expressions for the highlights | |||
*/ | |||
function highlightText(text, regMap) { | |||
// TODO: deal with close matches when multiple words are looked for, | |||
// it does not look trivial because you have to memorize positions | |||
// then create extracts. | |||
// For instance: `microsoft github` | |||
const extractBoundariesSize = 100 | |||
const textLength = text.length | |||
let extracts = [] | |||
for (let reg of regMap) { | |||
const index = text.search(reg) | |||
if (index === -1) { | |||
continue | |||
} | |||
let extract = text.substring( | |||
index - extractBoundariesSize, | |||
index + reg.source.length + extractBoundariesSize | |||
) | |||
// TODISCUSS: we replace with the source but in case there is | |||
// an uppercase letter it will disappear from the extract | |||
// (is that confusing or closer to what is expected?) | |||
extract = extract.replace(reg, `<mark>${reg.source}</mark>`) | |||
const prefixEllipsis = index - extractBoundariesSize >= 0 ? '…' : '' | |||
const suffixEllipsis = | |||
index + extractBoundariesSize <= textLength ? '…' : '' | |||
extracts.push(`${prefixEllipsis}${extract}${suffixEllipsis}`) | |||
} | |||
if (!extracts.length && textLength < 200) { | |||
// If there is no match but it's a short title, return it. | |||
return text | |||
} | |||
return extracts.join('') | |||
} | |||
/** | |||
* Update the URL with a query string for the search string | |||
* @param {String} query The search query | |||
*/ | |||
function updateURL(query) { | |||
// Create the properties | |||
let state = history.state | |||
let title = document.title | |||
let url = window.location.origin + window.location.pathname | |||
if (query) { | |||
url += '?s=' + encodeURI(query) | |||
} | |||
// Update the URL | |||
history.pushState(state, title, url) | |||
} | |||
})() | |||
</script> | |||
{% endblock %} |
@@ -2,31 +2,39 @@ | |||
{% block title %}Tag #{{ tag_name }}{% endblock %} | |||
{% block description %}Publications relatives au tag #{{ tag_name }}{% endblock %} | |||
{% block extra_head %} | |||
<style type="text/css"> | |||
details[open] summary { | |||
display: none; | |||
} | |||
</style> | |||
<style type="text/css"> | |||
details[open] summary { | |||
display: none; | |||
} | |||
</style> | |||
{% endblock %} | |||
{% block content %} | |||
<header> | |||
<h1>Publications relatives au tag #{{ tag_name }}</h1> | |||
</header> | |||
<nav> | |||
<p class="center"> | |||
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home"> | |||
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use> | |||
</svg> Accueil</a> | |||
• <a rel="tags" href="/david/#tags-2023" title="Liste de toutes les étiquettes"><svg class="icon icon-tags"> | |||
<header> | |||
<h1>Publications relatives au tag #{{ tag_name }}</h1> | |||
</header> | |||
<nav> | |||
<p class="center"> | |||
<a href="/david/" title="Aller à l’accueil"> | |||
<svg class="icon icon-home"> | |||
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use> | |||
</svg> | |||
Accueil</a> | |||
• <a rel="tags" | |||
href="/david/#tags-2023" | |||
title="Liste de toutes les étiquettes"> | |||
<svg class="icon icon-tags"> | |||
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-tags"></use> | |||
</svg> Étiquettes</a> | |||
</svg> | |||
Étiquettes</a> | |||
</p> | |||
</nav> | |||
<hr> | |||
<main> | |||
<p>Les plus récentes en premier, les 3 premières sont dépliées et ensuite c’est à la demande, bonne exploration !</p> | |||
{% for page in page_list %} | |||
<h2><a href="{{ page.url }}" title="Lien permanent vers cet article">{{ page.title }}</a> ({{ page.date }})</h2> | |||
<h2> | |||
<a href="{{ page.url }}" title="Lien permanent vers cet article">{{ page.title }}</a> ({{ page.date }}) | |||
</h2> | |||
{% if loop.index <= 3 %} | |||
{{ page.content }} | |||
{% else %} | |||
@@ -35,7 +43,6 @@ | |||
{{ page.content }} | |||
</details> | |||
{% endif %} | |||
{% endfor %} | |||
</main> | |||
{% endblock content %} |
@@ -40,7 +40,14 @@ show-source = true | |||
[tool.djlint] | |||
profile="jinja" | |||
files=["david/templates"] | |||
files=[ | |||
"david/templates/article_2020.html", | |||
"david/templates/blogroll.html", | |||
"david/templates/base_2020.html", | |||
"david/templates/profil.html", | |||
"david/templates/recherche.html", | |||
"david/templates/tag_2021.html" | |||
] | |||
indent=2 | |||
ignore="H031" | |||
format_css=true |