Browse Source

More djlinted templates

master
David Larlet 7 months ago
parent
commit
3ab8a0e622
Signed by: David Larlet <david@larlet.fr> GPG Key ID: 3E2953A359E7E7BD

+ 7
- 1
Makefile View File

@@ -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

+ 69
- 60
david/templates/article_2020.html View File

@@ -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 %}

+ 28
- 37
david/templates/blogroll.html View File

@@ -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 %}

+ 224
- 233
david/templates/profil.html View File

@@ -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&amp;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&amp;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 %}

+ 340
- 347
david/templates/recherche.html View File

@@ -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 %}

+ 24
- 17
david/templates/tag_2021.html View File

@@ -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 %}

+ 8
- 1
pyproject.toml View File

@@ -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

Loading…
Cancel
Save