1

Sécuriser et documenter les liens morts

Rend les liens supprimés non cliquables, améliore le rapport des liens morts et accélère la génération du site.

Closes #2
Closes #3
Closes #4
This commit is contained in:
2026-04-02 22:23:16 +02:00
parent 0e4e8cd076
commit fe8037bb73
40 changed files with 423 additions and 112 deletions

View File

@@ -36,7 +36,7 @@ Rapidement, je n'eus plus le courage de continuer mon référencement, parce que
Et puis j'ai eu, moi aussi, mon propre ordinateur et ma propre connexion Internet.
Les premiers sites que je visitais alors étaient relativement simples.
De simples pages statiques, ~~[bariolées](http://wonder-tonic.com/geocitiesizer/content.php?theme=3&music=10&url=ingnu.fr)~~, couvertes de gifs animés, s'étendant sur des kilomètres de hauteur.
De simples pages statiques, [bariolées](http://wonder-tonic.com/geocitiesizer/content.php?theme=3&music=10&url=ingnu.fr), couvertes de gifs animés, s'étendant sur des kilomètres de hauteur.
Les gens y mettaient ce qu'ils voulaient.
Ils créaient ça facilement, avec _Frontpage_ par exemple.
Tout le monde pouvait faire son site (ou du moins, sa page perso), y mettre et dire ce qu'il voulait.
@@ -91,7 +91,7 @@ Il y a quelques jours, j'ai lu (malheureusement, je ne sais plus où) qu'un, am
Peut être que finalement, c'est tout de même la seule chose à faire pour restaurer la neutralité d'Internet.
Ou peut-être n'est-ce qu'une utopie, parce qu'après tout, les gens sont procéduriers: rien ne les empêche d'attaquer quelqu'un d'autre en justice simplement à cause d'un délit de sale gueule.
Je ne parle même pas du piratage, parce que si vous avez lu le [~~Manifeste du geek~~](http://dl.ingnu.fr/?f=3), vous savez que je considère que toute œuvre devrait être Libre.
Je ne parle même pas du piratage, parce que si vous avez lu le [Manifeste du geek](http://dl.ingnu.fr/?f=3), vous savez que je considère que toute œuvre devrait être Libre.
Mais pourquoi empêcher les gens de dire ce qu'ils veulent?
Pourquoi nous empêcher de diffuser notre connaissance?
Pourquoi nous mettre des bâtons dans les roues quand on veut avancer et faire avancer?

View File

@@ -24,7 +24,7 @@ weather:
Google est omniprésent et, malheureusement, omniscient. Son succès repose bien sûr sur la pertinence des résultats des recherches qu'on lui soumet; je ne dénie pas son efficacité mais son manque de respect pour la confidentialité. Le problème, c'est que d'une certaine manière, entre le moteur de recherche, YouTube et d'autres sites dont je ne ferai pas la liste ici (Google possède plus de 500 noms de domaine), ils ont réussi à créer une certaine dépendance chez les utilisateurs. J'ai donc voulu tester et vérifier s'il était possible de se passer de Google et de toutes ses autres créations.
Pour ce faire, j'ai utilisé [~~une technique~~](http://ingnu.fr/2011/12/25/comment-bloquer-un-site-internet/) relativement simple à mettre en œuvre pour bloquer l'intégralité des domaines gérés par Google: lorsqu'un des clients de mon réseau essaye d'aller sur une page qui leur appartient, la résolution de nom pointe vers mon propre serveur.
Pour ce faire, j'ai utilisé [une technique](http://ingnu.fr/2011/12/25/comment-bloquer-un-site-internet/) relativement simple à mettre en œuvre pour bloquer l'intégralité des domaines gérés par Google: lorsqu'un des clients de mon réseau essaye d'aller sur une page qui leur appartient, la résolution de nom pointe vers mon propre serveur.
Premier constat: même si Google dispose de fermes de serveurs et d'une bande passante proprement gigantesques, tous les sites Internet, soulagés des publicités AdSense, sont incroyablement plus rapides. Je n'ai pas de méthode pour le mesurer, mais c'est tellement énorme qu'il est inutile de vouloir chronométrer le chargement des pages.

View File

@@ -32,7 +32,7 @@ Google ne s'est pas contenté de phagocyter le marché des moteurs de recherche.
> **[Mise à jour du 27 janvier]**
> Il semblerait que les domaines cités ci-dessous n'appartiennent pas ou plus à Google, comme en témoigne une simple requête ~~[whois](http://www.whois.net/whois/marsgoogle.com)~~:
> Il semblerait que les domaines cités ci-dessous n'appartiennent pas ou plus à Google, comme en témoigne une simple requête [whois](http://www.whois.net/whois/marsgoogle.com):
> " _Savez-vous par exemple que parmi la longue liste de domaines possédés par l'entreprise, on trouve notamment marsgoogle.com, jupitergoogle.com ou neptunegoogle.com, ce qui suggère qu'ils envisagent de coloniser et étendre leur emprise sur tout le système solaire?_ "

View File

@@ -43,7 +43,7 @@ weather:
---
Mes premiers billets ont été consacrés à Google.
Après avoir [~~présenté deux techniques que j'ai mis en oeuvre pour bloquer les sites de Google~~](http://ingnu.fr/2011/12/25/comment-bloquer-un-site-internet/) (entre autres) sur mon réseau, j'ai affirmé qu'[il était tout à fait possible de se passer de leurs services grâce à d'autres services restés dans l'ombre](http://ingnu.fr/2011/12/25/peut-on-se-passer-de-google/), avant d'aborder la question que se posent mes détracteurs : [pourquoi Google c'est le mal](http://ingnu.fr/2011/12/25/pourquoi-google-cest-le-mal/) ?
Après avoir [présenté deux techniques que j'ai mis en oeuvre pour bloquer les sites de Google](http://ingnu.fr/2011/12/25/comment-bloquer-un-site-internet/) (entre autres) sur mon réseau, j'ai affirmé qu'[il était tout à fait possible de se passer de leurs services grâce à d'autres services restés dans l'ombre](http://ingnu.fr/2011/12/25/peut-on-se-passer-de-google/), avant d'aborder la question que se posent mes détracteurs : [pourquoi Google c'est le mal](http://ingnu.fr/2011/12/25/pourquoi-google-cest-le-mal/) ?
La suite logique est donc de vous présenter ces fameuses solutions alternatives.
J'ai cherché et testé différentes solutions de remplacement aux outils Google les plus utilisés, qu'il s'agisse d'un service en ligne ou d'une application à installer sur son propre serveur.

View File

@@ -40,7 +40,7 @@ C'est ainsi que [j'ai bloqué l'accès aux sites appartenant à Google](http://i
Puis abandonné progressivement les derniers logiciels privateurs qui persistaient sur ma machine, que j'ai remplacé par des alternatives libres, à l'exception de mon navigateur web, qui demeure Opera, navigateur auquel je consacrerai mon prochain billet, afin d'expliquer pourquoi, malgré le fait que son code source ne soit pas disponible, je continue de l'utiliser.
En tous les cas, les premiers chapitres de la "_biographie autorisée_" de Richard Stallman ont constitué un déclencheur.
Et par une belle ironie, ce qu'ils ont déclenché en moi l'ont fait à la toute fin de l'année 2011, après avoir [~~réouvert les portes de ingnu~~](http://ingnu.fr/2011/12/24/reouverture-de-ingnu/).
Et par une belle ironie, ce qu'ils ont déclenché en moi l'ont fait à la toute fin de l'année 2011, après avoir [réouvert les portes de ingnu](http://ingnu.fr/2011/12/24/reouverture-de-ingnu/).
Ces chapitres ont décuplé ma volonté de contribuer au Logiciel Libre, que ce soit par la publication d'une application actuellement en développement, mon intégration dans une association pour la promotion du Libre qui devrait arriver au mois de février (lorsque mes finances me le permettront de nouveau), ou la communication que j'entreprends sur le Logiciel Libre auprès de mes proches et de mes amis, et sur Internet via ingnu et les réseaux sociaux, qu'ils soient libres ou non.
L'année 2012 sera pour moi une année de progression, boostée par ce livre; ma motivation est regonflée, mes intentions plus assurées, mes convictions plus fortes.

View File

@@ -23,7 +23,7 @@ weather:
wind_speed: 7.8
---
L'un des principes qui garantissent la liberté sur Internet, la confidentialité des données, et la pérennité des services, est la décentralisation. C'est la raison pour laquelle il est indispensable de préférer un équivalent libre (comme [status.net](http://status.net/) qui fait tourner [~~social.ingnu.fr~~](https://social.ingnu.fr/)) à une solution gérée par une seule entreprise (comme facebook ou twitter).
L'un des principes qui garantissent la liberté sur Internet, la confidentialité des données, et la pérennité des services, est la décentralisation. C'est la raison pour laquelle il est indispensable de préférer un équivalent libre (comme [status.net](http://status.net/) qui fait tourner [social.ingnu.fr](https://social.ingnu.fr/)) à une solution gérée par une seule entreprise (comme facebook ou twitter).
Le gros problème avec Internet, c'est que l'un de ses fondements n'est justement pas décentralisé et bien géré par une seule entreprise: [l'ICANN](http://www.icann.org/).

View File

@@ -21,15 +21,15 @@ weather:
wind_speed: 15.2
---
Si vous suivez régulièrement mes notices sur [~~social.ingnu~~](https://social.ingnu.fr/), sur [facebook](http://www.facebook.com/ingnu) ou sur [twitter](https://twitter.com/#!/Ingnufr), vous avez du voir [celle-là](~~https://social.ingnu.fr/~~notice/110) passer. Cependant, je souhaitais vous faire part de mes résolutions à travers un article complet sur ingnu. Cela me permettra d'en dresser une liste exhaustive avec des détails. Cela me servira non seulement comme liste de tâches/memo/todo, mais cela me permettra également de vous donner l'envie de piocher dans ces résolutions pour que vous les fassiez votre pour cette nouvelle année.
Si vous suivez régulièrement mes notices sur [social.ingnu](https://social.ingnu.fr/), sur [facebook](http://www.facebook.com/ingnu) ou sur [twitter](https://twitter.com/#!/Ingnufr), vous avez du voir [celle-là](https://social.ingnu.fr/notice/110) passer. Cependant, je souhaitais vous faire part de mes résolutions à travers un article complet sur ingnu. Cela me permettra d'en dresser une liste exhaustive avec des détails. Cela me servira non seulement comme liste de tâches/memo/todo, mais cela me permettra également de vous donner l'envie de piocher dans ces résolutions pour que vous les fassiez votre pour cette nouvelle année.
**Développer et publier un Logiciel Libre**
C'est déjà fait, et il s'appelle ShareMyPics. Il s'agit d'un clone libre de twitpic. L'application est diffusée sous licence [GNU Affero GPL](http://www.gnu.org/licenses/agpl.html). Vous pouvez consulter le ~~[wiki](http://sharemypics.net/)~~ de l'application, ainsi que ses sources sur ~~[github](https://github.com/Ingnu/Share-My-Pics)~~.
C'est déjà fait, et il s'appelle ShareMyPics. Il s'agit d'un clone libre de twitpic. L'application est diffusée sous licence [GNU Affero GPL](http://www.gnu.org/licenses/agpl.html). Vous pouvez consulter le [wiki](http://sharemypics.net/) de l'application, ainsi que ses sources sur [github](https://github.com/Ingnu/Share-My-Pics).
**Contribuer à un Logiciel Libre**
Pendant quelques temps après avoir formulé mes résolutions pour 2012, je me suis posé la question: "_A quel Logiciel Libre je vais apporter ma contribution?_". Ce n'est que récemment que j'ai trouvé la réponse via une notice de ~~[nizarus](http://identi.ca/notice/88647631)~~.
Pendant quelques temps après avoir formulé mes résolutions pour 2012, je me suis posé la question: "_A quel Logiciel Libre je vais apporter ma contribution?_". Ce n'est que récemment que j'ai trouvé la réponse via une notice de [nizarus](http://identi.ca/notice/88647631).
Lassé du monopole Google, mais récemment propriétaire d'un [GeeksPhone](http://www.geeksphone.com/fr/), je suis pour le moment dans l'obligation d'utiliser Android. Je n'attendais qu'une chose: voir un OS libre pour smartphone qui ne soit pas issu de Google. Il y en a un, [Tizen](https://www.tizen.org/), par The Linux Foundation. Je n'ai vu aucune mention explicite de la licence exacte sous laquelle il va sortir (je n'ai peut-être que survolé le site), mais vu le contenu du répertoire des sources, il y a plein de paquets GNU, donc c'est plutôt bon signe.
@@ -73,4 +73,4 @@ J'ignore encore vers laquelle je vais me tourner. À vrai dire, j'ignore encore
> Peut-être d'ailleurs que le livre sera restructuré. Il devrait s'agir d'un "Manifeste", autrement dit, il devrait non pas suivre des chapitres mais des articles.
> Enfin, le moyen de diffusion va changer, ainsi que la licence. Actuellement, le Manifeste du Geek est publié sous licence GNU GPL. La licence va passer sur une [FDL](http://www.gnu.org/licenses/fdl.html). Quant au moyen de diffusion, j'ouvrirai mon propre dépôt git (qui me servira également pour ~~[SMP](http://sharemypics.net/)~~).
> Enfin, le moyen de diffusion va changer, ainsi que la licence. Actuellement, le Manifeste du Geek est publié sous licence GNU GPL. La licence va passer sur une [FDL](http://www.gnu.org/licenses/fdl.html). Quant au moyen de diffusion, j'ouvrirai mon propre dépôt git (qui me servira également pour [SMP](http://sharemypics.net/)).

View File

@@ -21,7 +21,7 @@ weather:
wind_speed: 9.9
---
Cela fait maintenant quelques temps que j'enquiquine mes followers sur [~~social.ingnu.fr~~](https://social.ingnu.fr/ingnu/all) à propos de XMPP qui déconne sévèrement avec la release 1.0.1 de [status.net](http://status.net/) : déconnections intempestives, mauvaise gestion de la file d'attente, etc.
Cela fait maintenant quelques temps que j'enquiquine mes followers sur [social.ingnu.fr](https://social.ingnu.fr/ingnu/all) à propos de XMPP qui déconne sévèrement avec la release 1.0.1 de [status.net](http://status.net/) : déconnections intempestives, mauvaise gestion de la file d'attente, etc.
La [page](http://publications.jbfavre.org/statusnet/optimize-statusnet-nginx-php-fpm-apc-memcache.fr) de [Jean-Baptiste Favre](http://www.jbfavre.org/) m'a permis de creuser un peu plus, bien que ne parlant pas de XMPP.
Il aborde tout de même quelques directives de configuration à propos des files d'attente qui m'ont échappé, directives que j'ai adapté pour mieux coller (selon moi) à une debian et à placer dans le fichier _config.php_ :
@@ -48,7 +48,7 @@ addPlugin('xmpp', array(
Maintenant, l'étape la plus "difficile".
En l'état, vous pouvez être à peu près certain que ça ne marchera pas.
Un contributeur au projet propose un patch, ~~[que vous pouvez télécharger ici](http://status.net/sites/default/files/issues/statusnet-1.0.1-inox.txt)~~.
Un contributeur au projet propose un patch, [que vous pouvez télécharger ici](http://status.net/sites/default/files/issues/statusnet-1.0.1-inox.txt).
Enregistrez-le à la racine de votre instance de status.net et nommez-le par exemple statusnet.patch, puis saisissez les commandes suivantes :
```bash

View File

@@ -685,7 +685,7 @@ En l'occurrence :
Voilà donc cet article consacré à la mise en place d'une alternative à Dropbox terminé.
Il s'agissait là probablement du plus complexe que nous ayons eu à aborder depuis le début de l'installation de notre cloud personnalisé.
Il est aussi peu probable que les articles suivants soient aussi long et difficiles à intégrer que celui-ci.
Nous avons vu un certain nombre de notions relativement complexes, sans compter les petites modifications à apporter ça et là à des applications existantes ([~~nous l'avons fait pour status.net~~](http://ingnu.fr/2012/02/08/son-propre-reseau-social-avec-status-net/), nous le faisons ici avec Horde).
Nous avons vu un certain nombre de notions relativement complexes, sans compter les petites modifications à apporter ça et là à des applications existantes ([nous l'avons fait pour status.net](http://ingnu.fr/2012/02/08/son-propre-reseau-social-avec-status-net/), nous le faisons ici avec Horde).
Donc, même si vous n'avez pas eu le courage de tout mettre en œuvre, j'espère néanmoins que cet article (et les autres !) vous a intéressé.

View File

@@ -22,7 +22,7 @@ weather:
wind_speed: 19.9
---
[Je l'ai dis il y a quelques dizaines de minutes](~~https://social.ingnu.fr/~~notice/3292) sur [~~social.ingnu~~](https://social.ingnu.fr/), j'abandonne facebook et twitter. Bien que ma principale raison soit évidemment liée à la protection de ma vie privée, il en existe d'autres.
[Je l'ai dis il y a quelques dizaines de minutes](https://social.ingnu.fr/notice/3292) sur [social.ingnu](https://social.ingnu.fr/), j'abandonne facebook et twitter. Bien que ma principale raison soit évidemment liée à la protection de ma vie privée, il en existe d'autres.
Tout d'abord, facebook et twitter ont beau cumuler à eux deux une population plus nombreuse que la Chine, je m'y sens seul. J'ai l'impression qu'il n'y a aucune activité qui m'intéresse. C'est d'autant plus vrai en ce qui concerne facebook, dont l'idée est davantage de se constituer un cercle d'amis plutôt qu'échanger des idées réellement intéressantes. Je commence à me lasser des photos personnelles, des histoires d'horoscope, ou de ce que les gens ont bouffé la veille (je ne parle pas de mes propres contacts qui ont des timelines un peu plus développées). Ce que je veux dire, c'est que trouver des gens qui m'intéressent sur facebook tient plus du hasard qu'autre chose. D'ailleurs, en fait, ce n'est jamais arrivé.
@@ -30,7 +30,7 @@ En ce qui concerne twitter, la situation est différente. La limite à 160 carac
Il y a quelques semaines, j'ai franchi le pas et j'ai installé une instance de [status.net](http://status.net/). Je l'ai installé parce que c'est un Logiciel Libre, et qu'il est présenté comme un réseau social libre et décentralisé. J'en avais déjà entendu parlé, mais j'étais un peu frileux, n'étant pas de nature particulièrement sociable.
En fin de compte, je me suis rendu compte que l'ouverture de cette application n'est pas seulement une philosophie de développement: cette ouverture se fait aussi sur le monde, à un niveau que je ne soupçonnais pas. On ne suit pas seulement des gens, individuellement, on suit des groupes, des fédérations d'instances de status.net. Et là, ça s'emballe: je reçois les posts de plusieurs dizaines de personnes simplement parce que je suis le groupe ~~[Debian](http://identi.ca/group/14/id)~~, ou le groupe ~~[GNU](http://identi.ca/group/33/id)~~. Et le ratio informations intéressantes/inutiles s'inverse par rapport aux autres réseaux sociaux (je ne parle pas de Google+ que j'ai quitté il y a quelques temps).
En fin de compte, je me suis rendu compte que l'ouverture de cette application n'est pas seulement une philosophie de développement: cette ouverture se fait aussi sur le monde, à un niveau que je ne soupçonnais pas. On ne suit pas seulement des gens, individuellement, on suit des groupes, des fédérations d'instances de status.net. Et là, ça s'emballe: je reçois les posts de plusieurs dizaines de personnes simplement parce que je suis le groupe [Debian](http://identi.ca/group/14/id), ou le groupe [GNU](http://identi.ca/group/33/id). Et le ratio informations intéressantes/inutiles s'inverse par rapport aux autres réseaux sociaux (je ne parle pas de Google+ que j'ai quitté il y a quelques temps).
Du coup, on peut communiquer avec beaucoup plus de gens que sur facebook ou twitter, et surtout, beaucoup plus de gens qui partagent les mêmes centres d'intérêt.
@@ -42,6 +42,6 @@ Par un mystère que je ne m'explique pas, j'ai l'impression que des étrangers c
Sur status.net, c'est l'esprit Libre: on échange, on partage, on communique de manière omnidirectionnelle. Il suffit de faire partie d'un groupe pour que tous puissent lire ce que vous écrivez, tandis que vos posts (vos notices) ne quittent pas votre serveur.
Si vous faites partie de mes contacts facebook ou twitter, et que vous ne faites pas encore partie de mes contacts sur social.ingnu, je vous recommande donc chaudement de venir me rejoindre. [Créez-vous un compte sur mon instance](~~https://social.ingnu.fr/~~main/register) (ou sur [identi.ca](http://identi.ca/) par exemple), et ajoutez *ingnu@social.ingnu.fr* à ceux que vous suivez.
Si vous faites partie de mes contacts facebook ou twitter, et que vous ne faites pas encore partie de mes contacts sur social.ingnu, je vous recommande donc chaudement de venir me rejoindre. [Créez-vous un compte sur mon instance](https://social.ingnu.fr/main/register) (ou sur [identi.ca](http://identi.ca/) par exemple), et ajoutez *ingnu@social.ingnu.fr* à ceux que vous suivez.
Peut-être alors qu'un jour, vous aussi vous quitterez les réseaux sociaux riches à milliards qui se servent de vos informations personnelles pour y parvenir, pour revenir du côté lumineux de la Force...

View File

@@ -36,7 +36,7 @@ Pour y voir un peu plus clair, je vous propose, à travers ce dernier article, d
- [Installation d'un serveur HTTP/HTTPS](http://ingnu.fr/2012/02/07/installation-dun-serveur-http-https/)
- [Kronolith : une alternative à Google Calendar](http://ingnu.fr/2012/02/07/kronolith-une-alternative-a-google-calendar/)
- [Communiquer via XMPP](http://ingnu.fr/2012/02/08/communiquer-via-xmpp/)
- [~~Son propre réseau social avec status.net~~](http://ingnu.fr/2012/02/08/son-propre-reseau-social-avec-status-net/)
- [Son propre réseau social avec status.net](http://ingnu.fr/2012/02/08/son-propre-reseau-social-avec-status-net/)
- [Partager ses fichiers sur les réseaux sociaux avec SMP](http://ingnu.fr/2012/02/09/partager-ses-fichiers-sur-les-reseaux-sociaux-avec-smp/)
- [Une alternative à Dropbox](http://ingnu.fr/2012/02/12/une-alternative-a-dropbox/)
- [Gérer ses photos avec PhotoShow](http://ingnu.fr/2012/02/13/gerer-ses-photos-avec-photoshow/)
@@ -79,7 +79,7 @@ En toute logique, depuis l'extérieur, tous les ports de votre serveur sont ferm
- [Horde](http://www.horde.org/) + [Kronolith](http://www.horde.org/apps#kronolith-) (agenda partagé)
- [Jappix](https://project.jappix.com/) (client XMPP)
- [Status.net](http://status.net/) (réseau social)
- ~~[SMP](http://sharemypics.net/)~~ (partage de fichiers sur les réseaux sociaux)
- [SMP](http://sharemypics.net/) (partage de fichiers sur les réseaux sociaux)
- Horde + [Gollem](http://www.horde.org/apps#gollem-) (accès aux fichiers)
- [PhotoShow](http://www.photoshow-gallery.com/) (galerie de photos)
- [phpSysInfo](http://phpsysinfo.sourceforge.net/) (monitoring)
@@ -102,7 +102,7 @@ Je remercie :
- tous mes lecteurs qui ont contribué de près ou de loin à la rédaction de ces articles
- les bloggeurs qui m'ont linké
- mes followers, qu'ils soient sur twitter, facebook ou [~~status.net~~](https://social.ingnu.fr/ingnu)
- mes followers, qu'ils soient sur twitter, facebook ou [status.net](https://social.ingnu.fr/ingnu)
- Coca Cola et Red Bull (qui auraient pu me fournir quelques canettes gracieusement, franchement...)
- ma femme qui m'a supporté
- mes chats qui ne sont pas montés sur le bureau trop souvent pendant que j'écrivais

View File

@@ -50,4 +50,4 @@ Au final, une somme d'argent colossale est attribuée à des fumisteries. NOTRE
Au moins, aux États-Unis, la chasse aux pirates coûte moins cher vu que ce ne sont que quelques grosses entreprises qui s'en chargent: ce n'est même plus l'État qui paye. Loin de moi l'idée d'approuver ce que fait Google ou eBay, vous savez quelle est ma position sur le premier. Mais ce n'est pas le contribuable qui paye.
Parmi les solutions qui s'offrent à nous pour éviter notre escalade (ou notre chute...) vers un Internet contrôlé par quelques grosses mafias: [~~s'abstenir de voter~~](http://ingnu.fr/2012/02/29/pourquoi-il-est-vital-de-ne-plus-voter/), et basculer massivement et rapidement vers un Internet décentralisé.
Parmi les solutions qui s'offrent à nous pour éviter notre escalade (ou notre chute...) vers un Internet contrôlé par quelques grosses mafias: [s'abstenir de voter](http://ingnu.fr/2012/02/29/pourquoi-il-est-vital-de-ne-plus-voter/), et basculer massivement et rapidement vers un Internet décentralisé.

View File

@@ -29,7 +29,7 @@ C'est un projet dont j'ai [vaguement lancé l'idée](http://ingnu.fr/2012/01/11/
Une alternative Libre, totalement décentralisée et neutre au système DNS actuel, dans ces temps de censure et de blocage par DNS, représente à mon sens une réponse vitale et urgente.
C'est pourquoi je vous ai lâchement abandonné ces derniers jours.
Je reviens aujourd'hui avec la création d'une nouvelle catégorie du blog, [~~ODDNS~~](http://ingnu.fr/category/oddns-2/), dans laquelle je vais régulièrement publier des informations relatives au projet, cet article en étant le premier représentant.
Je reviens aujourd'hui avec la création d'une nouvelle catégorie du blog, [ODDNS](http://ingnu.fr/category/oddns-2/), dans laquelle je vais régulièrement publier des informations relatives au projet, cet article en étant le premier représentant.
## Présentation
@@ -145,7 +145,7 @@ Il est bombardé de SPAM et je commence à saturer.
Je voudrai opter pour quelque chose de plus approprié, c'est pourquoi je ne me suis pas "amusé" à installer des extensions pour aider à combattre les messages non sollicités.
Une fois que ce sera fait, je créerai un dépôt git pour ouvrir le code aux contributions.
Les deux pourraient être faits en même temps si je créais un dépôt sur mon [~~redmine~~](http://redmine.ingnu.fr/), mais j'aimerais avoir l'avis de mes visiteurs avant de faire quoique ce soit.
Les deux pourraient être faits en même temps si je créais un dépôt sur mon [redmine](http://redmine.ingnu.fr/), mais j'aimerais avoir l'avis de mes visiteurs avant de faire quoique ce soit.
Il restera alors à écrire les wrappers pour les différents serveurs DNS existants, notamment ceux qui ne sont pas bind (dont je m'occuperai dans les prochains jours).

View File

@@ -36,7 +36,7 @@ Alors faut il y voir une relation avec le changement récent de leur politique d
Google pourrait avoir atteint une sorte de masse critique. On pourrait presque parler de loi: lorsqu'une entreprise atteint une certaine envergure, elle finit par s'effondrer sur elle-même. Bien sûr, Google est encore loin, très loin du dépôt de bilan, mais les fuites d'utilisateurs, de clients, ne sont jamais bonnes, et sont toujours révélatrices d'un dysfonctionnement de l'entreprise.
Entre les pertes colossales engendrées par l'utilisation d'outils de blocage de publicité (ou [~~le blocage DNS à la sauce ingnu!~~](http://ingnu.fr/2011/12/25/comment-bloquer-un-site-internet/)), la recherche massive d'alternatives au moteur de recherche, le blocage des publicités sur certains sites et les cuisants revers, Google ne se porte bien que parce que c'est un géant. Et je suis persuadé que l'arrivée prochaine de LibreOffice OnLine ne va pas jouer en sa faveur, ni les ayants-droits qui, après avoir coulé MegaUpload, UpToBox, HotFile et compagnie, vont sans aucun doute possible s'attaquer à YouTube.
Entre les pertes colossales engendrées par l'utilisation d'outils de blocage de publicité (ou [le blocage DNS à la sauce ingnu!](http://ingnu.fr/2011/12/25/comment-bloquer-un-site-internet/)), la recherche massive d'alternatives au moteur de recherche, le blocage des publicités sur certains sites et les cuisants revers, Google ne se porte bien que parce que c'est un géant. Et je suis persuadé que l'arrivée prochaine de LibreOffice OnLine ne va pas jouer en sa faveur, ni les ayants-droits qui, après avoir coulé MegaUpload, UpToBox, HotFile et compagnie, vont sans aucun doute possible s'attaquer à YouTube.
Autre échec de Google: Chrome. Enfin, pas vraiment un échec en soi puisqu'il s'est hissé à la seconde place sur le marché des navigateurs. Mais compte tenu de la situation actuelle, même si on dispose de sommes pharaoniques en réserve, on évite de se croire le plus fort, et on évite de mettre un million de dollars sur la table pour pirater une de ses applications. Cinq minutes, c'est le temps qu'il aura fallut pour qu'une partie de ce million de dollars vole en fumée. On notera d'ailleurs que, comme d'habitude, Opera n'est même pas cité dans ce genre de compétitions, alors qu'il s'agit d'un navigateur incontournable.

View File

@@ -27,10 +27,10 @@ Grovi/Chabada\_ a parlé de ingnu et du projet ODDNS [il y a quinze jours](http:
Je me suis donc rendu sur le [tchat](http://chat.rim952.fr/) de l'émission Hotline, où on m'a invité à présenter ODDNS plus en détails.
À ce titre, j'ai eu la permission de vous proposer de télécharger mon intervention.
Voici le fichier audio : [~~oddns-sur-riem~~](http://ingnu.fr/2012/03/10/breve-oddns-et-ingnu-a-la-radio/oddns-sur-riem/).
Voici le fichier audio : [oddns-sur-riem](http://ingnu.fr/2012/03/10/breve-oddns-et-ingnu-a-la-radio/oddns-sur-riem/).
Il est en ogg et pèse 18Mo.
Je remercie donc chaleureusement Ici et Maintenant pour m'avoir permis de toucher un public plus large qu'à travers ingnu ou [~~social.ingnu~~](https://social.ingnu.fr/).
Je remercie donc chaleureusement Ici et Maintenant pour m'avoir permis de toucher un public plus large qu'à travers ingnu ou [social.ingnu](https://social.ingnu.fr/).
Je n'ai pu parler qu'à OliCat/Olivier, mais l'expérience était très sympa (c'est ma première radio !), donc merci aussi à lui.
Il est question de faire un point dans quinze jours, donc on se retrouvera pour, peut-être, annoncer la sortie du projet.

View File

@@ -26,7 +26,7 @@ Sait-il lire ou ne lit-il que les lignes qui l'intéresse ?
N'a-t-il pas lu que la première bêta publique aurait lieu lundi ?
On part donc déjà sur de mauvaises bases pour s'entendre.
Je le dis officiellement : **ODDNS n'est pas un vaporware**, l'application est en alpha test (privé donc) jusqu'à lundi.
[~~Un dépôt git existe~~](http://code.ingnu.fr/?p=oddns.git;a=summary), un site est en préparation pour remplacer l'unique page peu avenante (j'en conviens) qui existe à l'heure actuelle.
[Un dépôt git existe](http://code.ingnu.fr/?p=oddns.git;a=summary), un site est en préparation pour remplacer l'unique page peu avenante (j'en conviens) qui existe à l'heure actuelle.
Des gens travaillent dessus (moi et Rikle_S), passent du temps dessus.
Je trouve intolérable un tel comportement, un tel manque de respect pour des gens qui travaillent à trouver une solution satisfaisante.
Ce manque de respect n'est pas censé être l'esprit de la communauté et du Libre.

View File

@@ -45,8 +45,8 @@ Du coup, j'ai opté pour une licence libre (GNU GPL).
Réécrite from scratch, plus souple, plus esthétique, le moment est venu de se montrer sous un nouveau jour, une nouvelle naissance en quelque sorte.
En conséquence, j'avais envie de partager ce moment avec vous, et que vous partagiez avec moi vos retours.
Si l'application vous intéresse et que vous tentez l'installation, pensez à jeter un oeil aux [~~tickets ouverts~~](https://git.athaliasoft.com/athaliasoft/Cyca/issues).
Si l'application vous intéresse et que vous tentez l'installation, pensez à jeter un oeil aux [tickets ouverts](https://git.athaliasoft.com/athaliasoft/Cyca/issues).
- [Site officiel](https://getcyca.com/)
- [~~Captures d'écran~~](https://getcyca.com/screenshots/)
- [~~Dépôt git~~](https://git.athaliasoft.com/athaliasoft/Cyca)
- [Captures d'écran](https://getcyca.com/screenshots/)
- [Dépôt git](https://git.athaliasoft.com/athaliasoft/Cyca)

View File

@@ -41,6 +41,6 @@ C'est donc un outil écrit en PHP.
J'ai donc intégré la possibilité d'écrire des parseurs pour différents formats de listes et le support pour différents serveurs DNS.
Ainsi, bien que je n'ai écris qu'un parseur pour les listes contenant un hôte par ligne et une classe de support pour bind, il sera très facile de supporter d'autres sources et d'autres serveurs rapidement.
D'ailleurs, [~~c'est déjà prévu~~](https://git.athaliasoft.com/Richard/Blacklist/issues).
D'ailleurs, [c'est déjà prévu](https://git.athaliasoft.com/Richard/Blacklist/issues).
- [~~Le dépôt gitlab~~](https://git.athaliasoft.com/Richard/Blacklist)
- [Le dépôt gitlab](https://git.athaliasoft.com/Richard/Blacklist)

View File

@@ -191,7 +191,7 @@ _OAuth_. Mettez ce que vous voulez comme nom ("drone", par exemple), et l'URL
de redirection, qui correspond à l'URL complète à laquelle vous accèderez à
Drone-CI, suffixée par _/login_. Dans mon cas, l'URL de redirection est :
> ~~https://ci.athaliasoft.com/login~~
> <https://ci.athaliasoft.com/login>
Validez, et Gitea vous communiquera un certain nombre d'informations à
renseigner dans le fichier _docker-compose.yml_ pour Drone-CI, notamment un

View File

@@ -84,7 +84,7 @@ Il n'est pas encore disponible à la vente à l'heure où j'écris ces lignes.
## Kemove Snowfox/Shadow
- ~~[Site officiel](https://www.kmovetech.com/kemove-61-key-white-p0023-p0075.html)~~ [^deadlink-1]
- [Site officiel](https://www.kmovetech.com/kemove-61-key-white-p0023-p0075.html) [^deadlink-1]
- [x] 60%
- [x] switches remplaçables
- [x] câble USB-c remplaçable

View File

@@ -106,7 +106,7 @@ On utilisera un pinceau adapté (donc de petite taille, 0 et/ou 1), tel que celu
proposé par Glorious.
Si vous envisagez de devoir lubrifier _tous_ les switches de votre futur
clavier, une ~~[station de lubrification](https://keygem.store/collections/tools/products/kbdfans-switch-lube-station)~~ [^deadlink-1]
clavier, une [station de lubrification](https://keygem.store/collections/tools/products/kbdfans-switch-lube-station) [^deadlink-1]
peut être pratique.
Selon les switches et le degré de personnalisation visés, on pourra également
@@ -171,13 +171,13 @@ En plastique ou nylon, destinées à isoler les têtes de vis du PCB. On peut au
trouver des [manchons en silicone](https://kbdfans.com/products/kbdfans-standoff-silicone-cover)
à placer sur les pas de vis.
- [Patins en silicone](https://keygem.store/products/replacement-feet-bumpers-4pcs?_pos=1&_sid=2b0f82876&_ss=r) à placer sous le clavier dans le cas où le boitier n'en serait pas déjà équippé - on en trouve aussi des ~~[longs](https://mykeyboard.eu/catalogue/crin-extra-custom-feet_5417/)~~ [^deadlink-2] qui sont plus esthétiques et qualitatifs et qu'on pourra également utiliser sur un repose-poignets.
- [Patins en silicone](https://keygem.store/products/replacement-feet-bumpers-4pcs?_pos=1&_sid=2b0f82876&_ss=r) à placer sous le clavier dans le cas où le boitier n'en serait pas déjà équippé - on en trouve aussi des [longs](https://mykeyboard.eu/catalogue/crin-extra-custom-feet_5417/) [^deadlink-2] qui sont plus esthétiques et qualitatifs et qu'on pourra également utiliser sur un repose-poignets.
- Mousse "modulaire"
À placer entre le PCB et la plaque supérieure. On peut aussi utiliser une mousse
pré-conçue pour le PCB et le layout choisi (par exemple
~~[celle-ci](https://kbdfans.com/products/dz60rgb-ansi-pcb-foam)~~ [^deadlink-3]
[celle-ci](https://kbdfans.com/products/dz60rgb-ansi-pcb-foam) [^deadlink-3]
pour le DZ60 RGB ANSI)).
## Le thème du clavier
@@ -290,7 +290,7 @@ diffusant mieux la lumière, ou que sais-je encore (mais je note que certains on
une préférence pour les switches qui cliquent "à l'aller et au retour", tandis
que je préfère les switches à clic simple - dits "jacket").
- ~~[Stabilisateurs](https://kbdfans.com/collections/keyboard-stabilizer/products/gmk-screw-in-stabilizers?variant=22154915348528)~~ [^deadlink-4]
- [Stabilisateurs](https://kbdfans.com/collections/keyboard-stabilizer/products/gmk-screw-in-stabilizers?variant=22154915348528) [^deadlink-4]
Plus qu'un simple mod, c'est un composant essentiel qui assure la verticalité
d'une pression sur une touche longue, peu importe d'où la touche est appuyée. En
@@ -319,7 +319,7 @@ Bon sang, que j'ai hâte 😍
- Mousse pour le boitier - elle sert à réduire l'écho à l'intérieur du clavier
- ~~[Repose-poignets en résine](https://kbdfans.com/collections/wrist-rest/products/handmade-resin-wrist-rest-1?variant=39444177223819)~~ [^deadlink-5] - modèle "Tropical Sea", magnifique et approprié
- [Repose-poignets en résine](https://kbdfans.com/collections/wrist-rest/products/handmade-resin-wrist-rest-1?variant=39444177223819) [^deadlink-5] - modèle "Tropical Sea", magnifique et approprié
![NJpKr4](images/NJpKr4.webp)

View File

@@ -1,8 +1,8 @@
---
aliases:
- /blog/2023/09/03/nouveau-site-en-ligne/
- /blog/2023/09/03/nouveau-site-en-ligne/
comments_url: https://com.richard-dern.fr/post/365
date: '2023-09-03 12:00:00'
date: "2023-09-03 12:00:00"
title: Nouveau site en ligne
weather:
humidity: 65
@@ -10,7 +10,7 @@ weather:
precipitations: false
pressure: 1026.2
source:
- open-meteo
- open-meteo
temperature: 23.6
wind_direction: 83
wind_speed: 14.2
@@ -59,7 +59,7 @@ Il nest pas fait pour être redistribué : nespérez pas télécharger les
Déjà parce que les sources de mes propres articles sont incluses[^sources_incluses], et puis parce que je lai développé pour répondre à mes besoins et envies spécifiques.
Par contre, jencourage la lecture du code : vous y trouverez peut-être une bonne idée ou deux.
[^sources_incluses]: Ce nest plus le cas depuis le 6 septembre : [~~sources des articles~~](https://git.dern.ovh/Blog/contenu) [^deadlink-1]
[^sources_incluses]: Ce nest plus le cas depuis le 6 septembre : [sources des articles](https://git.dern.ovh/blog/2025) [^deadlink-1]
Le moteur repose sur [Laravel](https://laravel.com/) dans sa dernière version.
La partie UI/UX, cest moi, vraiment à 100%.

View File

@@ -1,2 +1,2 @@
title: Crichtonsaurus bohlini
attribution: ~~[PaleoHistoric](https://www.deviantart.com/paleohistoric/art/Perfil-Crichtonsaurus-bohlini-901292529)~~
attribution: "[PaleoHistoric](https://www.deviantart.com/paleohistoric/art/Perfil-Crichtonsaurus-bohlini-901292529)"

35
data/deletions.yaml Normal file
View File

@@ -0,0 +1,35 @@
- "http://code.ingnu.fr/?p=oddns.git;a=summary"
- "http://dl.ingnu.fr/?f=3"
- "http://identi.ca/group/14/id"
- "http://identi.ca/group/33/id"
- "http://identi.ca/notice/88647631"
- "http://ingnu.fr/2011/12/24/reouverture-de-ingnu/"
- "http://ingnu.fr/2011/12/25/comment-bloquer-un-site-internet/"
- "http://ingnu.fr/2012/02/08/son-propre-reseau-social-avec-status-net/"
- "http://ingnu.fr/2012/02/29/pourquoi-il-est-vital-de-ne-plus-voter/"
- "http://ingnu.fr/2012/03/10/breve-oddns-et-ingnu-a-la-radio/oddns-sur-riem/"
- "http://ingnu.fr/category/oddns-2/"
- "http://sharemypics.net/"
- "http://status.net/sites/default/files/issues/statusnet-1.0.1-inox.txt"
- "http://wonder-tonic.com/geocitiesizer/content.php?theme=3&music=10&url=ingnu.fr"
- "http://www.whois.net/whois/marsgoogle.com"
- "https://ci.athaliasoft.com/login"
- "https://getcyca.com/screenshots/"
- "https://git.athaliasoft.com/Richard/Blacklist"
- "https://git.athaliasoft.com/Richard/Blacklist/issues"
- "https://git.athaliasoft.com/athaliasoft/Cyca"
- "https://git.athaliasoft.com/athaliasoft/Cyca/issues"
- "https://github.com/Ingnu/Share-My-Pics"
- "https://kbdfans.com/collections/keyboard-stabilizer/products/gmk-screw-in-stabilizers?variant=22154915348528"
- "https://kbdfans.com/collections/wrist-rest/products/handmade-resin-wrist-rest-1?variant=39444177223819"
- "https://kbdfans.com/products/dz60rgb-ansi-pcb-foam"
- "https://keygem.store/collections/tools/products/kbdfans-switch-lube-station"
- "https://mykeyboard.eu/catalogue/crin-extra-custom-feet_5417/"
- "https://social.ingnu.fr/"
- "https://social.ingnu.fr/ingnu"
- "https://social.ingnu.fr/ingnu/all"
- "https://social.ingnu.fr/main/register"
- "https://social.ingnu.fr/notice/110"
- "https://social.ingnu.fr/notice/3292"
- "https://www.deviantart.com/paleohistoric/art/Perfil-Crichtonsaurus-bohlini-901292529"
- "https://www.kmovetech.com/kemove-61-key-white-p0023-p0075.html"

View File

@@ -155,3 +155,4 @@
"http://hasbro.com/": "https://web.archive.org/web/20260329055759/https://products.hasbro.com/fr-fr"
"https://www.amd.com/fr/products/processors/desktops/ryzen/5000-series/amd-ryzen-9-5950x.html": "https://web.archive.org/web/20260216084023/https://www.amd.com/fr/products/processors/desktops/ryzen/5000-series/amd-ryzen-9-5950x.html"
"https://www.sciencedirect.com/science/article/pii/S1342937X20301234": "https://web.archive.org/web/20220216000142/https://www.sciencedirect.com/science/article/abs/pii/S1342937X20301234"
"http://redmine.ingnu.fr/": "https://web.archive.org/web/20120221011524/http://redmine.ingnu.fr:80/"

View File

@@ -0,0 +1,9 @@
{{- $deletionsList := default (slice) site.Data.deletions -}}
{{- $deletions := dict -}}
{{- range $deletionsList -}}
{{- $deletedURL := strings.TrimSpace (printf "%v" .) -}}
{{- if ne $deletedURL "" -}}
{{- $deletions = merge $deletions (dict $deletedURL true) -}}
{{- end -}}
{{- end -}}
{{- return $deletions -}}

View File

@@ -1,5 +1,6 @@
{{- $reportPath := "data/external_links.yaml" -}}
{{- $report := dict -}}
{{- $withLocations := false -}}
{{- if reflect.IsMap . -}}
{{- with index . "ReportPath" -}}
@@ -8,6 +9,9 @@
{{- with index . "Report" -}}
{{- $report = . -}}
{{- end -}}
{{- with index . "WithLocations" -}}
{{- $withLocations = . -}}
{{- end -}}
{{- else if . -}}
{{- $report = . -}}
{{- end -}}
@@ -30,7 +34,10 @@
{{- $sourceLinks = default (slice) (index $report "links") -}}
{{- end -}}
{{- $links := slice -}}
{{- $entries := default (dict) (index $report "entries") -}}
{{- $deletions := partialCached "deletions-lookup.html" (dict) "default" -}}
{{- $linksByURL := dict -}}
{{- range $sourceLinks -}}
{{- $code := "" -}}
{{- if isset . "code" -}}
@@ -55,20 +62,100 @@
{{- if and (eq $status "") (ne $statusText "") -}}
{{- $status = $statusText -}}
{{- end -}}
{{- $links = $links | append (dict
"url" (default "" (index . "url"))
{{- $url := strings.TrimSpace (printf "%v" (default "" (index . "url"))) -}}
{{- $linksByURL = merge $linksByURL (dict $url (dict
"url" $url
"code" $code
"statusText" $statusText
"status" $status
"locations" (default (slice) (index . "locations"))
"errorType" (default "" (index . "errorType"))
"checkedAt" (default "" (index . "checkedAt"))
) -}}
"manualMarked" false
)) -}}
{{- end -}}
{{- range $url, $_ := $deletions -}}
{{- $existingLink := default (dict) (index $linksByURL $url) -}}
{{- $locations := default (slice) (index $existingLink "locations") -}}
{{- if $withLocations -}}
{{- $locations = slice -}}
{{- end -}}
{{- $linksByURL = merge $linksByURL (dict $url (merge $existingLink (dict
"url" $url
"status" "deleted"
"statusText" "Supprimé"
"locations" $locations
"manualMarked" true
))) -}}
{{- $existingEntry := default (dict) (index $entries $url) -}}
{{- $entries = merge $entries (dict $url (merge $existingEntry (dict
"status" "deleted"
"statusText" "Supprimé"
"manualMarked" true
))) -}}
{{- end -}}
{{- if $withLocations -}}
{{- range where site.RegularPages ".File" "!=" nil -}}
{{- $page := . -}}
{{- $pageLocation := dict
"file" (printf "content/%s" $page.File.Path)
"page" $page.Path
-}}
{{- $rawContent := "" -}}
{{- with $page.RawContent -}}
{{- $rawContent = . -}}
{{- end -}}
{{- if ne $rawContent "" -}}
{{- range $url, $_ := $deletions -}}
{{- if strings.Contains $rawContent $url -}}
{{- $existingLink := default (dict) (index $linksByURL $url) -}}
{{- $locations := default (slice) (index $existingLink "locations") -}}
{{- if eq (len (where $locations "file" $pageLocation.file)) 0 -}}
{{- $locations = $locations | append $pageLocation -}}
{{- $linksByURL = merge $linksByURL (dict $url (merge $existingLink (dict "locations" $locations))) -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- $dataResources := $page.Resources.Match "data/**/*.yaml" | default (slice) -}}
{{- range ($page.Resources.Match "data/**/*.yml" | default (slice)) -}}
{{- $dataResources = $dataResources | append . -}}
{{- end -}}
{{- range $dataResources -}}
{{- $resourceContent := strings.TrimSpace .Content -}}
{{- if ne $resourceContent "" -}}
{{- $resourceLocation := dict
"file" (printf "content/%s/%s" (path.Dir $page.File.Path) .Name)
"page" $page.Path
-}}
{{- range $url, $_ := $deletions -}}
{{- if strings.Contains $resourceContent $url -}}
{{- $existingLink := default (dict) (index $linksByURL $url) -}}
{{- $locations := default (slice) (index $existingLink "locations") -}}
{{- if eq (len (where $locations "file" $resourceLocation.file)) 0 -}}
{{- $locations = $locations | append $resourceLocation -}}
{{- $linksByURL = merge $linksByURL (dict $url (merge $existingLink (dict "locations" $locations))) -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- $links := slice -}}
{{- range $url, $link := $linksByURL -}}
{{- $links = $links | append $link -}}
{{- end -}}
{{- $links = sort $links "url" -}}
{{- return (dict
"generatedAt" (default "" (index $report "generatedAt"))
"entries" (default (dict) (index $report "entries"))
"entries" $entries
"links" $links
"linksMap" $linksByURL
) -}}

View File

@@ -169,7 +169,11 @@
margin-top: var(--space-3);
}
.article-header .article-origin-link-button > a {
.article-header .article-origin-link-button > del {
display: block;
}
.article-header .article-origin-link-button .article-origin-link-button-link {
width: 100%;
min-height: 2.8rem;
padding: 0.5rem 1rem;
@@ -184,21 +188,21 @@
letter-spacing: normal;
}
.article-header .article-origin-link-button > a.ui-button {
.article-header .article-origin-link-button .article-origin-link-button-link.ui-button {
border-color: color-mix(in srgb, var(--color-section-divider-1) 62%, var(--color-border-strong));
background: linear-gradient(180deg, rgba(217, 122, 63, 0.36) 0%, rgba(17, 27, 42, 0.94) 100%);
}
.article-header .article-origin-link-button > a.ui-button:is(:hover, :focus-visible) {
.article-header .article-origin-link-button .article-origin-link-button-link.ui-button:is(:hover, :focus-visible) {
background: linear-gradient(180deg, rgba(217, 122, 63, 0.52) 0%, rgba(17, 27, 42, 0.98) 100%);
}
.article-header .article-origin-link-button > a.ui-button:visited {
.article-header .article-origin-link-button a.article-origin-link-button-link.ui-button:visited {
color: var(--color-heading);
}
.article-header .article-origin-link-button > a.ui-button:hover .article-origin-link-button-url,
.article-header .article-origin-link-button > a.ui-button:focus-visible .article-origin-link-button-url {
.article-header .article-origin-link-button .article-origin-link-button-link.ui-button:hover .article-origin-link-button-url,
.article-header .article-origin-link-button .article-origin-link-button-link.ui-button:focus-visible .article-origin-link-button-url {
color: #ffffff;
}

View File

@@ -122,6 +122,28 @@ a.link-external:not(.link-affiliated):is(:hover, :focus-visible) {
color: var(--color-link-external-hover);
}
body:has(> header.article-header) > main > article > :not(footer):not(section.article-asides) a.link-archive:not(.ui-button) {
color: var(--color-link-archive);
}
body:has(> header.article-header) > main > article > :not(footer):not(section.article-asides) a.link-archive:not(.ui-button):is(:hover, :focus-visible) {
color: var(--color-link-archive-hover);
}
body:has(> header.article-header) > main > article > :not(footer):not(section.article-asides) a.link-archive:not(.ui-button)::after {
content: "";
display: inline-block;
width: 0.9em;
height: 0.9em;
margin-left: 0.22em;
vertical-align: -0.08em;
background-color: currentColor;
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M3 9h18v2h-1v8h2v2H2v-2h2v-8H3V9zm3 2v8h2v-8H6zm5 0v8h2v-8h-2zm5 0v8h2v-8h-2zM12 2l10 5v1H2V7l10-5zm0 2.2L7.2 6h9.6L12 4.2z' fill='%23000'/%3E%3C/svg%3E");
mask-repeat: no-repeat;
mask-position: center;
mask-size: contain;
}
a.link-affiliated {
color: var(--color-link-affiliated);
}
@@ -130,7 +152,8 @@ a.link-affiliated:is(:hover, :focus-visible) {
color: var(--color-link-affiliated-hover);
}
a.link-dead {
body:has(> header.article-header) > main > article > :not(footer):not(section.article-asides) :is(a, span).link-dead:not(.ui-button),
body:has(> main.listing-page) > main.listing-page table span.link-dead {
text-decoration-line: underline;
text-decoration-style: wavy;
text-decoration-thickness: 1px;
@@ -138,23 +161,49 @@ a.link-dead {
text-underline-offset: 0.2em;
}
a.link-dead:is(:hover, :focus-visible) {
body:has(> header.article-header) > main > article > :not(footer):not(section.article-asides) :is(a, span).link-dead:not(.ui-button):is(:hover, :focus-visible),
body:has(> main.listing-page) > main.listing-page table span.link-dead:is(:hover, :focus-visible) {
text-decoration-line: underline;
text-decoration-style: wavy;
text-decoration-thickness: 2px;
text-decoration-color: currentColor;
}
a.link-dead.link-dead-404 {
body:has(> header.article-header) > main > article > :not(footer):not(section.article-asides) :is(a, span).link-dead.link-dead-404:not(.ui-button),
body:has(> main.listing-page) > main.listing-page table span.link-dead.link-dead-404 {
color: var(--color-link-dead-404);
text-decoration-color: color-mix(in srgb, var(--color-link-dead-404) 78%, transparent);
}
a.link-dead.link-dead-404:is(:hover, :focus-visible) {
body:has(> header.article-header) > main > article > :not(footer):not(section.article-asides) :is(a, span).link-dead.link-dead-404:not(.ui-button):is(:hover, :focus-visible),
body:has(> main.listing-page) > main.listing-page table span.link-dead.link-dead-404:is(:hover, :focus-visible) {
color: var(--color-link-dead-404-hover);
text-decoration-color: currentColor;
}
body:has(> header.article-header) > main > article > :not(footer):not(section.article-asides) del.link-dead.link-dead-marked,
body:has(> main.listing-page) > main.listing-page table del.link-dead.link-dead-marked {
color: var(--color-link-dead-marked);
text-decoration-color: color-mix(in srgb, var(--color-link-dead-marked) 82%, transparent);
}
body:has(> header.article-header) > main > article > :not(footer):not(section.article-asides) del.link-dead.link-dead-marked > span.link-dead.link-dead-marked:not(.ui-button),
body:has(> main.listing-page) > main.listing-page table del.link-dead.link-dead-marked > span.link-dead.link-dead-marked {
color: inherit;
text-decoration-line: underline;
text-decoration-style: solid;
text-decoration-thickness: 1px;
text-decoration-color: inherit;
text-underline-offset: 0.2em;
cursor: help;
}
body:has(> header.article-header) > main > article > :not(footer):not(section.article-asides) del.link-dead.link-dead-marked > span.link-dead.link-dead-marked:not(.ui-button):is(:hover, :focus-visible),
body:has(> main.listing-page) > main.listing-page table del.link-dead.link-dead-marked > span.link-dead.link-dead-marked:is(:hover, :focus-visible) {
color: var(--color-link-dead-marked-hover);
text-decoration-color: currentColor;
}
img,
video,
audio,

View File

@@ -13,10 +13,14 @@
--color-link-hover: #fff1b8;
--color-link-external: #6de0b8;
--color-link-external-hover: #9ef7d6;
--color-link-archive: #d4c4a0;
--color-link-archive-hover: #eadab5;
--color-link-affiliated: #e792ff;
--color-link-affiliated-hover: #f3b8ff;
--color-link-dead-404: #ff9fb3;
--color-link-dead-404-hover: #ffd4df;
--color-link-dead-marked: #ff5b6e;
--color-link-dead-marked-hover: #ff96a3;
--color-accent-1: #76a7d7;
--color-accent-2: #5d86ad;
--color-accent-3: #c3d0df;

View File

@@ -238,10 +238,14 @@
<p class="article-origin-link-kicker">À lire avant mon commentaire</p>
<p class="article-origin-link-hint">Ce billet n'est qu'une note de lecture. Lisez d'abord la source pour avoir le contexte complet.</p>
<p class="article-origin-link-button">
<a href="{{ $originURL }}" class="ui-button{{ if $originIsExternal }} link-external{{ end }}"{{ if $originIsExternal }} rel="noreferrer noopener"{{ end }} title="Lire la page d'origine">
<span class="article-origin-link-button-label">{{ $originLabel }}</span>
<span class="article-origin-link-button-url">{{ $originURL }}</span>
</a>
{{- $originLinkText := printf "<span class=\"article-origin-link-button-label\">%s</span><span class=\"article-origin-link-button-url\">%s</span>" $originLabel $originURL -}}
{{- partial "render/link.html" (dict
"Destination" $originURL
"Title" "Lire la page d'origine"
"Text" $originLinkText
"Class" "ui-button article-origin-link-button-link"
"Page" .
) -}}
</p>
</section>
{{- end -}}
@@ -262,7 +266,7 @@
{{- end -}}
{{- with $coverAttribution -}}
{{- $attribution := partial "media/parse-attribution.html" . -}}
<p class="cover-attribution"><strong>Attribution:</strong> <span>{{- if index $attribution "isURL" -}}<a href="{{ index $attribution "url" }}" class="link-external" title="Lien externe" rel="noreferrer noopener">{{ index $attribution "label" }}</a>{{- else -}}{{ . | markdownify }}{{- end -}}</span></p>
<p class="cover-attribution"><strong>Attribution:</strong> <span>{{- if index $attribution "isURL" -}}{{ partial "render/link.html" (dict "Destination" (index $attribution "url") "Page" $ "Text" (index $attribution "label")) }}{{- else -}}{{ . | markdownify }}{{- end -}}</span></p>
{{- end -}}
{{- with $coverPrompt -}}
<details>

View File

@@ -1,16 +1,16 @@
{{- $url := "" -}}
{{- $report := partial "external-links-report.html" (dict) -}}
{{- $report := partialCached "external-links-report.html" (dict) "default" -}}
{{- if reflect.IsMap . -}}
{{- with index . "URL" -}}
{{- $url = . -}}
{{- end -}}
{{- with index . "Report" -}}
{{- $report = partial "external-links-report.html" (dict "Report" .) -}}
{{- $report = . -}}
{{- end -}}
{{- end -}}
{{- $entries := default (dict) (index $report "entries") -}}
{{- $deadLinks := default (slice) (index $report "links") -}}
{{- $deadLinksMap := default (dict) (index $report "linksMap") -}}
{{- $host := "" -}}
{{- with $url -}}
@@ -39,11 +39,8 @@
{{- $deadInfo := dict -}}
{{- range $lookupURLs -}}
{{- if eq (len $deadInfo) 0 -}}
{{- $matches := where $deadLinks "url" . -}}
{{- if gt (len $matches) 0 -}}
{{- $deadInfo = index $matches 0 -}}
{{- end -}}
{{- if and (eq (len $deadInfo) 0) (isset $deadLinksMap .) -}}
{{- $deadInfo = index $deadLinksMap . -}}
{{- end -}}
{{- end -}}
@@ -54,6 +51,16 @@
{{- $statusTone := "unknown" -}}
{{- $statusLabel := "État inconnu" -}}
{{- $statusTitle := "" -}}
{{- $statusManual := false -}}
{{- with index $entry "manualMarked" -}}
{{- $statusManual = . -}}
{{- end -}}
{{- if and (not $statusManual) (gt (len $deadInfo) 0) -}}
{{- with index $deadInfo "manualMarked" -}}
{{- $statusManual = . -}}
{{- end -}}
{{- end -}}
{{- if gt (len $entry) 0 -}}
{{- with index $entry "status" -}}
@@ -95,7 +102,11 @@
{{- end -}}
{{- end -}}
{{- if gt $statusCode 0 -}}
{{- if $statusManual -}}
{{- $statusTone = "dead" -}}
{{- $statusLabel = "Supprimé" -}}
{{- $statusTitle = "Lien marqué comme supprimé dans data/deletions.yaml" -}}
{{- else if gt $statusCode 0 -}}
{{- if lt $statusCode 400 -}}
{{- $statusTone = "ok" -}}
{{- $statusLabel = printf "OK %d" $statusCode -}}

View File

@@ -1,13 +1,18 @@
{{- $report := partial "external-links-report.html" . -}}
{{- $report := partialCached "external-links-report.html" (dict "WithLocations" true) "with-locations" -}}
{{- $allPages := where site.Pages ".File" "!=" nil -}}
{{- $replacements := default (dict) site.Data.replacements -}}
{{- $sourceLinks := default (slice) $report.links -}}
{{- $links := slice -}}
{{- range $sourceLinks -}}
{{- if eq (index $replacements .url) nil -}}
{{- $manualMarked := false -}}
{{- with index . "manualMarked" -}}
{{- $manualMarked = . -}}
{{- end -}}
{{- if or $manualMarked (eq (index $replacements .url) nil) -}}
{{- $links = $links | append . -}}
{{- end -}}
{{- end -}}
{{- $links = sort $links "url" -}}
{{- $generatedLabel := "" -}}
{{- with $report.generatedAt -}}
{{- $generatedLabel = (time .).Format "02/01/2006" -}}
@@ -33,7 +38,13 @@
{{- range $links -}}
<tr>
<td>
{{- $manualMarked := false -}}
{{- with index . "manualMarked" -}}
{{- $manualMarked = . -}}
{{- end -}}
{{- $locations := default (slice) .locations -}}
{{- $seenLocations := dict -}}
{{- $hasRenderedLocation := false -}}
{{- if gt (len $locations) 0 -}}
{{- range $locations -}}
{{- $file := "" -}}
@@ -66,22 +77,41 @@
{{- $matchedPage = index $candidates 0 -}}
{{- end -}}
{{- end -}}
{{- $locationKey := "unknown" -}}
{{- if $matchedPage -}}
<a href="{{ $matchedPage.RelPermalink }}">{{ $matchedPage.Title }}</a>
{{- $locationKey = printf "page:%s" $matchedPage.Path -}}
{{- else if $file -}}
<code>{{ $file }}{{ if $line }}:{{ $line }}{{ end }}</code>
{{- $locationKey = printf "file:%s" $file -}}
{{- else if $pagePath -}}
<code>{{ $pagePath }}</code>
{{- else -}}
<em>Emplacement inconnu</em>
{{- $locationKey = printf "path:%s" $pagePath -}}
{{- end -}}
{{- if not (isset $seenLocations $locationKey) -}}
{{- $seenLocations = merge $seenLocations (dict $locationKey true) -}}
{{- $hasRenderedLocation = true -}}
{{- if $matchedPage -}}
<a href="{{ $matchedPage.RelPermalink }}">{{ $matchedPage.Title }}</a>
{{- else if $file -}}
<code>{{ $file }}{{ if $line }}:{{ $line }}{{ end }}</code>
{{- else if $pagePath -}}
<code>{{ $pagePath }}</code>
{{- else -}}
<em>Emplacement inconnu</em>
{{- end -}}
<br>
{{- end -}}
<br>
{{- end -}}
{{- else -}}
{{- end -}}
{{- if not $hasRenderedLocation -}}
<em>Emplacements inconnus</em>
{{- end -}}
</td>
<td><a href="{{ .url }}" rel="noreferrer noopener" target="_blank">{{ .url }}</a></td>
<td>
{{- if $manualMarked -}}
<del class="link-dead link-dead-marked"><span class="link-dead link-dead-marked" title="URL d'origine : {{ .url }}" aria-label="Lien supprimé. URL d'origine : {{ .url }}">{{ .url }}</span></del>
{{- else -}}
<span class="link-dead{{ if eq (printf "%v" .status) "404" }} link-dead-404{{ end }}" title="URL d'origine : {{ .url }}" aria-label="Lien mort. URL d'origine : {{ .url }}">{{ .url }}</span>
{{- end -}}
</td>
<td>{{ with .code }}<code>{{ . }}</code>{{ end }}</td>
<td>{{ with .statusText }}<code>{{ . }}</code>{{ end }}</td>
</tr>

View File

@@ -5,7 +5,7 @@
{{- $excludeInterestingLinks := false -}}
{{- $groupBySubSections := false -}}
{{- $subSections := slice -}}
{{- $externalLinksReport := partial "external-links-report.html" (dict) -}}
{{- $externalLinksReport := partialCached "external-links-report.html" (dict) "default" -}}
{{- with $context -}}
{{- if eq (strings.TrimSuffix "/" .RelPermalink) "/interets" -}}
{{- $excludeInterestingLinks = true -}}

View File

@@ -91,7 +91,7 @@
<div class="figure-media-meta-extra">
{{- with $data.attribution -}}
{{- $attribution := partial "media/parse-attribution.html" . -}}
<p class="figure-attribution cover-attribution"><strong>Attribution :</strong> <span>{{- if index $attribution "isURL" -}}<a href="{{ index $attribution "url" }}" class="link-external" title="Lien externe" rel="noreferrer noopener">{{ index $attribution "label" }}</a>{{- else -}}{{ . | markdownify }}{{- end -}}</span></p>
<p class="figure-attribution cover-attribution"><strong>Attribution :</strong> <span>{{- if index $attribution "isURL" -}}{{ partial "render/link.html" (dict "Destination" (index $attribution "url") "Page" $.Page "Text" (index $attribution "label")) }}{{- else -}}{{ . | markdownify }}{{- end -}}</span></p>
{{- end -}}
{{- with $data.prompt -}}
<details>

View File

@@ -1,7 +1,6 @@
{{- $destination := .Destination -}}
{{- if hasPrefix $destination "~~" -}}
{{- $destination = replaceRE "^~~" "" $destination -}}
{{- $destination = replaceRE "~~([/?#]|$)" "$1" $destination -}}
{{- if strings.Contains $destination "~~" -}}
{{- $destination = replace $destination "~~" "" -}}
{{- end -}}
{{- $isExternal := or (strings.HasPrefix $destination "http://") (strings.HasPrefix $destination "https://") -}}
{{- $host := "" -}}
@@ -17,12 +16,41 @@
{{- end -}}
{{- $page := .Page -}}
{{- $site := $page.Site -}}
{{- $deletions := partialCached "deletions-lookup.html" (dict) "default" -}}
{{- $replacements := default (dict) $site.Data.replacements -}}
{{- $aff := index $site.Data.affiliates.sites $host -}}
{{- $isAffiliated := false -}}
{{- $newURL := $destination -}}
{{- $replacementURL := index $replacements $destination -}}
{{- $hasReplacement := ne $replacementURL nil -}}
{{- $lookupURLs := slice $destination -}}
{{- with $destination -}}
{{- if strings.HasSuffix . "/" -}}
{{- $withoutSlash := strings.TrimSuffix "/" . -}}
{{- if ne $withoutSlash . -}}
{{- $lookupURLs = $lookupURLs | append $withoutSlash -}}
{{- end -}}
{{- else -}}
{{- $lookupURLs = $lookupURLs | append (printf "%s/" .) -}}
{{- end -}}
{{- end -}}
{{- $isDeleted := false -}}
{{- range $lookupURLs -}}
{{- if and (not $isDeleted) (isset $deletions .) -}}
{{- $isDeleted = true -}}
{{- end -}}
{{- end -}}
{{- $replacementURL := "" -}}
{{- $hasReplacement := false -}}
{{- if not $isDeleted -}}
{{- range $lookupURLs -}}
{{- if not $hasReplacement -}}
{{- $candidateReplacementURL := index $replacements . -}}
{{- if ne $candidateReplacementURL nil -}}
{{- $replacementURL = $candidateReplacementURL -}}
{{- $hasReplacement = true -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- $customClass := "" -}}
{{- if reflect.IsMap . -}}
@@ -44,6 +72,18 @@
{{- end -}}
{{- end -}}
{{- $newHost := "" -}}
{{- if and $isExternal (gt (len (findRE "^https?://[^[:space:]]+$" $newURL 1)) 0) -}}
{{- $newParsed := urls.Parse $newURL -}}
{{- $newHost = lower $newParsed.Host -}}
{{- end -}}
{{- $isArchiveLink := false -}}
{{- if and $isExternal (ne $newHost "") -}}
{{- if or (eq $newHost "archive.org") (strings.HasSuffix $newHost ".archive.org") -}}
{{- $isArchiveLink = true -}}
{{- end -}}
{{- end -}}
{{- $internalPage := "" -}}
{{- $internalPageFound := false -}}
{{- if not $isExternal -}}
@@ -66,15 +106,22 @@
{{- end -}}
{{- end -}}
{{- $report := partial "external-links-report.html" (dict) -}}
{{- $deadList := default (slice) (index $report "links") -}}
{{- $report := partialCached "external-links-report.html" (dict) "default" -}}
{{- $entriesMap := default (dict) (index $report "entries") -}}
{{- $cacheEntry := index $entriesMap $destination -}}
{{- $deadLinksMap := default (dict) (index $report "linksMap") -}}
{{- $cacheEntry := dict -}}
{{- range $lookupURLs -}}
{{- if and (eq (len $cacheEntry) 0) (isset $entriesMap .) -}}
{{- $cacheEntry = index $entriesMap . -}}
{{- end -}}
{{- end -}}
{{- $deadInfo := dict -}}
{{- $isDeadLink := false -}}
{{- with (first 1 (where $deadList "url" $destination)) -}}
{{- $deadInfo = index . 0 -}}
{{- $isDeadLink = true -}}
{{- range $lookupURLs -}}
{{- if and (not $isDeadLink) (isset $deadLinksMap .) -}}
{{- $deadInfo = index $deadLinksMap . -}}
{{- $isDeadLink = true -}}
{{- end -}}
{{- end -}}
{{- $deadStatus := "" -}}
{{- with (index $deadInfo "status") -}}
@@ -89,6 +136,15 @@
{{- if and $isDeadLink (eq $deadStatus "404") -}}
{{- $isConfirmedDeadLink = true -}}
{{- end -}}
{{- $isMarkedDeadLink := false -}}
{{- with (index $deadInfo "manualMarked") -}}
{{- $isMarkedDeadLink = . -}}
{{- end -}}
{{- if not $isMarkedDeadLink -}}
{{- with (index $cacheEntry "manualMarked") -}}
{{- $isMarkedDeadLink = . -}}
{{- end -}}
{{- end -}}
{{- $titleParts := slice -}}
{{- if $isAffiliated -}}
@@ -96,6 +152,9 @@
{{- else if $isExternal -}}
{{- $titleParts = $titleParts | append "Lien externe" -}}
{{- end -}}
{{- if $isArchiveLink -}}
{{- $titleParts = $titleParts | append "Internet Archive" -}}
{{- end -}}
{{- if and (not $isExternal) $internalPageFound -}}
{{- $internalTitle := $internalPage.LinkTitle | default $internalPage.Title -}}
{{- with $internalPage.Date -}}
@@ -109,6 +168,9 @@
{{- end -}}
{{- if $isDeadLink -}}
{{- $deadDetails := slice -}}
{{- if $isMarkedDeadLink -}}
{{- $deadDetails = $deadDetails | append "supprimé" -}}
{{- end -}}
{{- with (index $cacheEntry "checkedAt") -}}
{{- $deadDetails = $deadDetails | append (printf "inaccessible depuis le %s" (time.Format "02/01/2006" (time .))) -}}
{{- end -}}
@@ -116,7 +178,10 @@
{{- $deadDetails = $deadDetails | append (printf "raison %s" .) -}}
{{- end -}}
{{- with (index $deadInfo "status") -}}
{{- $deadDetails = $deadDetails | append (printf "statut %v" .) -}}
{{- $statusLabel := printf "%v" . -}}
{{- if not (and $isMarkedDeadLink (or (eq $statusLabel "manual") (eq $statusLabel "deleted"))) -}}
{{- $deadDetails = $deadDetails | append (printf "statut %s" $statusLabel) -}}
{{- end -}}
{{- end -}}
{{- if gt (len $deadDetails) 0 -}}
{{- $titleParts = $titleParts | append (printf "(%s)" (delimit $deadDetails " ; ")) -}}
@@ -134,11 +199,17 @@
{{- if $isAffiliated -}}
{{- $linkClasses = $linkClasses | append "link-affiliated" -}}
{{- end -}}
{{- if $isArchiveLink -}}
{{- $linkClasses = $linkClasses | append "link-archive" -}}
{{- end -}}
{{- if $isDeadLink -}}
{{- $linkClasses = $linkClasses | append "link-dead" -}}
{{- if $isConfirmedDeadLink -}}
{{- $linkClasses = $linkClasses | append "link-dead-404" -}}
{{- end -}}
{{- if $isMarkedDeadLink -}}
{{- $linkClasses = $linkClasses | append "link-dead-marked" -}}
{{- end -}}
{{- end -}}
{{- with $customClass -}}
{{- range (split . " ") -}}
@@ -148,4 +219,10 @@
{{- end -}}
{{- end -}}
{{- $classValue := delimit $linkClasses " " -}}
<a href="{{- $newURL -}}"{{ with $classValue }} class="{{- . -}}"{{ end }}{{ with $titleValue }} title="{{- . -}}"{{ end }}{{ if $isExternal }} rel="noreferrer noopener"{{ end }}>{{- strings.TrimSpace .Text | safeHTML -}}</a>{{- "" -}}
{{- if $isMarkedDeadLink -}}
{{- $deadTitleValue := printf "URL d'origine : %s" $destination -}}
{{- $deadAriaLabel := printf "Lien supprimé. URL d'origine : %s" $destination -}}
<del class="link-dead link-dead-marked"><span{{ with $classValue }} class="{{- . -}}"{{ end }} title="{{- $deadTitleValue -}}" aria-label="{{- $deadAriaLabel -}}">{{- strings.TrimSpace .Text | safeHTML -}}</span></del>
{{- else -}}
<a href="{{- $newURL -}}"{{ with $classValue }} class="{{- . -}}"{{ end }}{{ with $titleValue }} title="{{- . -}}"{{ end }}{{ if $isExternal }} rel="noreferrer noopener"{{ end }}>{{- strings.TrimSpace .Text | safeHTML -}}</a>
{{- end -}}{{- "" -}}

View File

@@ -32,7 +32,7 @@
{{- with $attribution -}}
{{- $figureAttribution := partial "media/parse-attribution.html" . -}}
<div class="figure-media-meta-extra">
<p class="figure-attribution cover-attribution"><strong>Attribution :</strong> <span>{{- if index $figureAttribution "isURL" -}}<a href="{{ index $figureAttribution "url" }}" class="link-external" title="Lien externe" rel="noreferrer noopener">{{ index $figureAttribution "label" }}</a>{{- else -}}{{ . | markdownify }}{{- end -}}</span></p>
<p class="figure-attribution cover-attribution"><strong>Attribution :</strong> <span>{{- if index $figureAttribution "isURL" -}}{{ partial "render/link.html" (dict "Destination" (index $figureAttribution "url") "Page" $.Page "Text" (index $figureAttribution "label")) }}{{- else -}}{{ . | markdownify }}{{- end -}}</span></p>
</div>
{{- end -}}
</figcaption>

View File

@@ -15,7 +15,7 @@
{{- with $data.description -}}<p>{{ . | markdownify }}</p>{{- end -}}
{{- with $data.attribution -}}
{{- $attribution := partial "media/parse-attribution.html" . -}}
<p><strong>Attribution :</strong> <em>{{- if index $attribution "isURL" -}}<a href="{{ index $attribution "url" }}" class="link-external" title="Lien externe" rel="noreferrer noopener">{{ index $attribution "label" }}</a>{{- else -}}{{ . | markdownify }}{{- end -}}</em></p>
<p><strong>Attribution :</strong> <em>{{- if index $attribution "isURL" -}}{{ partial "render/link.html" (dict "Destination" (index $attribution "url") "Page" $.Page "Text" (index $attribution "label")) }}{{- else -}}{{ . | markdownify }}{{- end -}}</em></p>
{{- end -}}
</figcaption>
{{- end -}}

View File

@@ -24,7 +24,7 @@
<div class="figure-media-meta-extra">
{{- with $data.attribution -}}
{{- $attribution := partial "media/parse-attribution.html" . -}}
<p class="figure-attribution cover-attribution"><strong>Attribution :</strong> <span>{{- if index $attribution "isURL" -}}<a href="{{ index $attribution "url" }}" class="link-external" title="Lien externe" rel="noreferrer noopener">{{ index $attribution "label" }}</a>{{- else -}}{{ . | markdownify }}{{- end -}}</span></p>
<p class="figure-attribution cover-attribution"><strong>Attribution :</strong> <span>{{- if index $attribution "isURL" -}}{{ partial "render/link.html" (dict "Destination" (index $attribution "url") "Page" $.Page "Text" (index $attribution "label")) }}{{- else -}}{{ . | markdownify }}{{- end -}}</span></p>
{{- end -}}
{{- with $data.prompt -}}
<details>

View File

@@ -33,7 +33,7 @@
{{- $recettesRoot := $site.GetPage "/interets/recettes" -}}
{{- $collectionsRoot := $site.GetPage "/collections" -}}
{{- $critiquesRoot := $site.GetPage "/critiques" -}}
{{- $externalLinksReport := partial "external-links-report.html" (dict) -}}
{{- $externalLinksReport := partialCached "external-links-report.html" (dict) "default" -}}
{{- partial "hero.html" . -}}