Compare commits
7 Commits
main
...
267f580648
| Author | SHA1 | Date | |
|---|---|---|---|
| 267f580648 | |||
| 188e996581 | |||
| 6efbecc07a | |||
| 6745469841 | |||
| 208a873d80 | |||
| 5e00c0c7c4 | |||
| 7f614688d0 |
@@ -7,12 +7,6 @@ disableHugoGeneratorInject: true
|
||||
enableEmoji: true
|
||||
timeZone: Europe/Paris
|
||||
theme: ["2026"]
|
||||
security:
|
||||
funcs:
|
||||
getenv:
|
||||
- "^HUGO_"
|
||||
- "^CI$"
|
||||
- "^MEILI_SEARCH_API_KEY$"
|
||||
params:
|
||||
lists:
|
||||
layout: spotlight
|
||||
|
||||
@@ -2,12 +2,12 @@ favicon: /favicon.png
|
||||
# Pas de / pour les ressources qui seront transformées
|
||||
# Et les placer dans /assets et non dans /static
|
||||
logo: logo-large.png
|
||||
description: "Richard Dern et ses opinions impopulaires"
|
||||
themeColor: "#060c14"
|
||||
description: "et ses opinions impopulaires"
|
||||
search:
|
||||
action: /recherche/
|
||||
param: q
|
||||
meilisearch:
|
||||
endpoint: /api/search
|
||||
indexUid: blog_posts
|
||||
apiKey: "cf49bcdb1b08e5c502c41956d38ce0be80d5e79e9f084e6f15f4485f87d63c30"
|
||||
hitsPerPage: 20
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "L'écran d'accueil du jeu est à la hauteur de tout le reste : magnifique"
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Première page de mes réglages graphiques"
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Deuxième page de mes réglages graphiques"
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Les écrans de chargement sont agrémentés du clin d'oeil à ces pauvres chèvres qui servent de repas."
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "La nouvelle carte de la campagne, partiellement révélée."
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Couché de soleil sur une volière à Vegas."
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Restaurants, boutiques de souvenirs et stands de boissons forment toujours le trio de base pour contenter les visiteurs."
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Ils n'ont toujours pas de plumes, mais je les emmènerai bien en balade quand même..."
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "_JWE3_ a fait monter d'un cran l'aspect organique des parcs, mêlant objets naturels et constructions artificielles. On pourrait presque respirer la poussière et sentir le métal et le béton chauffés par le soleil."
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Les _Diplodocus_ dans leur enclôs du Montana."
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
#description: ""
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Sur l'île de Kauai."
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Et certaines parties sont mobiles ! Ici, l'antenne s'anime !"
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
#description: ""
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Là aussi, belle photo qui met en évidence la robe des _Parasaurolophus_, prise alors que je chutais de mon piédestal rocheux."
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Katsuyama, au Japon."
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
#description: ""
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
#description: ""
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Dire que je n'ai encore vu qu'un cinquième de la campagne à ce stade !"
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Katsuyama, au Japon."
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Je suis plutôt content de cette capture, même si j'étais en train de me casser la gueule entre les rochers..."
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Plus près et... on commence à voir les faiblesses de certaines textures."
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Jouant avec son frère."
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Câliné par sa mère."
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
#description: ""
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Il y a quantité d'éléments de décor dans le catalogue, même sans compter sur le _marketplace_ du _workshop_."
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Je n'ai pas résisté à la tentation, si déjà j'ai les éléments à portée de main. J'avoue, la composition aurait pu être bien meilleure."
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
#description: ""
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Le bateau de _Jurassic Park III_."
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "De quoi se faire un manoir musée, façon Lockwood."
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
#description: ""
|
||||
#prompt: ""
|
||||
|
Before Width: | Height: | Size: 11 MiB |
|
Before Width: | Height: | Size: 3.2 MiB |
|
Before Width: | Height: | Size: 3.3 MiB |
|
Before Width: | Height: | Size: 5.0 MiB |
|
Before Width: | Height: | Size: 4.9 MiB |
|
Before Width: | Height: | Size: 11 MiB |
|
Before Width: | Height: | Size: 10 MiB |
|
Before Width: | Height: | Size: 13 MiB |
|
Before Width: | Height: | Size: 14 MiB |
|
Before Width: | Height: | Size: 13 MiB |
|
Before Width: | Height: | Size: 10 MiB |
|
Before Width: | Height: | Size: 13 MiB |
|
Before Width: | Height: | Size: 11 MiB |
|
Before Width: | Height: | Size: 13 MiB |
|
Before Width: | Height: | Size: 12 MiB |
|
Before Width: | Height: | Size: 13 MiB |
|
Before Width: | Height: | Size: 11 MiB |
|
Before Width: | Height: | Size: 11 MiB |
|
Before Width: | Height: | Size: 13 MiB |
|
Before Width: | Height: | Size: 14 MiB |
|
Before Width: | Height: | Size: 15 MiB |
|
Before Width: | Height: | Size: 12 MiB |
|
Before Width: | Height: | Size: 14 MiB |
|
Before Width: | Height: | Size: 14 MiB |
|
Before Width: | Height: | Size: 15 MiB |
|
Before Width: | Height: | Size: 13 MiB |
|
Before Width: | Height: | Size: 12 MiB |
|
Before Width: | Height: | Size: 8.3 MiB |
|
Before Width: | Height: | Size: 5.8 MiB |
|
Before Width: | Height: | Size: 5.6 MiB |
|
Before Width: | Height: | Size: 5.8 MiB |
@@ -1,182 +0,0 @@
|
||||
---
|
||||
title: Jurassic World Evolution 3
|
||||
date: "2026-03-05 01:38:12"
|
||||
cover: images/2958130_20260302225758_1.png
|
||||
genres:
|
||||
- jeu de gestion économique
|
||||
entreprises:
|
||||
- Epic Games Store
|
||||
- Frontier Developments
|
||||
- Microsoft Store
|
||||
- PlayStation Store
|
||||
- Steam
|
||||
links:
|
||||
- name: Page Wikipédia
|
||||
url: https://en.wikipedia.org/wiki/Jurassic_World_Evolution_3
|
||||
lang: en
|
||||
- name: Site officiel
|
||||
url: https://www.frontier.co.uk/games/jurassic-world-evolution-3
|
||||
wikidata_id: Q134723499
|
||||
weather:
|
||||
temperature: 7.77777777777778
|
||||
humidity: 62
|
||||
pressure: 1024.38256370315
|
||||
wind_speed: 3.5405568
|
||||
wind_direction: 108
|
||||
illuminance: 0
|
||||
precipitations: false
|
||||
source:
|
||||
- influxdb
|
||||
comments_url: https://com.richard-dern.fr/post/479
|
||||
---
|
||||
|
||||
## En bref
|
||||
|
||||
- Le meilleur de la saga
|
||||
- Bravo à Frontier qui a écouté les critiques des joueurs
|
||||
|
||||
## Configuration
|
||||
|
||||
Ma [machine de jeu](/interets/informatique/2022/04/15/mon-nouveau-pc-de-jeu-est-arrive/) est un Ryzen 9 5900X, 32G de mémoire vive, et une RTX3080 10G.
|
||||
Elle tourne sous [NixOS](https://nixos.org/) 25.11.
|
||||
Je joue sur un téléviseur [4K@120Hz](/interets/informatique/2024/01/15/2024-l-annee-du-changement/) (LG C3 55 pouces).
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## Rappels
|
||||
|
||||
[Le premier opus](/critiques/jeux-video/jurassic-world-evolution/) était excellent, mais il manquait cruellement de contenu, en particulier concernant les objets et les options pour personnaliser les parcs.
|
||||
J'estimais qu'il était beaucoup plus accessible que _Planet Coaster_ que j'avais acheté en même temps.
|
||||
|
||||
[Le deuxième volet](/critiques/jeux-video/jurassic-world-evolution-2/) a un peu étoffé le contenu, mais se trouvait grevé par d'autres défauts qui l'ont rendu, à mes yeux, moins intéressant au fil du temps, malgré ma conclusion originale.
|
||||
|
||||
## Critique
|
||||
|
||||
La campagne s'est largement étoffée, et nous offre l'accès à des contrées encore jamais explorées, pas même dans la saga cinématographique ou ses _spin-offs_.
|
||||
Mais avant d'y évoluer, il faudra passer par des lieux déjà connus.
|
||||
Un bon moyen de s'ancrer dans le canon avant d'introduire des nouveautés bienvenues, tout en permettant au joueur de se familiariser avec son environnement de gestion de parc.
|
||||
|
||||
Les habitués de la série de jeux-vidéo trouveront sans doute ces présentations un peu laborieuses, considérant que les mécaniques sous-jacentes n'ont pas vraiment changé.
|
||||
Il s'agit toujours de recruter des scientifiques, d'envoyer des expéditions chercher des fossiles, en extraire l'ADN ou les vendre, jusqu'à pouvoir incuber des œufs, relâchés dans un enclos approprié, tout en s'assurant que les visiteurs sont contents du parc.
|
||||
|
||||

|
||||
|
||||
Mais cette redondance apparente avec les deux volets précédents n'est finalement que la mécanique de base d'un jeu de gestion de parc à dinosaures, et _Jurassic World Evolution 3_ a beaucoup plus à offrir.
|
||||
Et c'est tout l'intérêt de commencer par la campagne, même si on maîtrise le jeu de bout en bout.
|
||||
|
||||

|
||||
|
||||
Il n'est plus question ici d'épisodes indépendants à achever séquentiellement.
|
||||
Ici, les allers-retours seront fréquents, et l'histoire conduira le joueur à switcher d'un parc à un autre dès le début de la campagne.
|
||||
Heureusement, ce papillonnage n'a pas de conséquence négative sur les parcs laissés en attente.
|
||||
|
||||
Ces interruptions, ces voyages d'un parc à un autre, permettent une rupture visuelle ponctuelle, ce qui n'est pas pour me déplaire, compte tenu de la diversité des lieux visités.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
{.center }
|
||||
|
||||
La beauté du jeu est phénoménale, et je crois qu'elle est notamment due à l'introduction du [ray-tracing](https://fr.wikipedia.org/wiki/Ray_tracing).
|
||||
La lumière et les ombres sont beaucoup plus naturelles, apportent plus de contraste, et contribuent finalement à une immersion que je n'attendais pas d'un jeu de gestion de parc.
|
||||
|
||||

|
||||
|
||||

|
||||
{.center }
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
La caméra à la première personne offre un point de vue rapproché.
|
||||
Accessible à tout moment depuis le menu principal, elle permet de visiter littéralement son parc.
|
||||
Ce n'est pas une nouveauté de _Jurassic World Evolution 3_, mais c'est dans ce nouvel opus que j'en fais le plus usage.
|
||||
|
||||
La raison ?
|
||||
La richesse et la diversité de la faune, de la flore, des paysages et des structures, qui atteignent des sommets.
|
||||
On est comme Sarah Harding dans [_The Lost World_](/critiques/films/the-lost-world-jurassic-park/) : on ne peut se contenter de regarder, il faut qu'on "touche".
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
Mais cette vue à la première personne est quelque peu frustrante : instinctivement, je reprends mes réflexes dans [_ARK: Survival Evolved_](/critiques/jeux-video/ark-survival-evolved/), je veux bondir, aller partout, gratouiller un dinosaure, interagir avec eux.
|
||||
J'oublie que je suis dans un jeu de gestion de parc, principalement parce qu'à la première personne, je peux aller là où je ne suis pas censé aller en tant que _visiteur_ : à l'intérieur des enclos.
|
||||
|
||||
Pourtant, les déplacements sont à la fois contraints et hasardeux : il n'est pas rare de rester coincé dans les rochers, à la recherche de l'emplacement parfait pour une photo.
|
||||
Et nul saut ne viendra nous aider, sinon les sauts épileptiques de la caméra qui tente de suivre un chemin qui n'a pas été prévu pour elle.
|
||||
|
||||

|
||||
|
||||
Donc, pour parfaitement apprécier la vue à la première personne : restez dans les chemins prévus à cet effet !
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
Malgré la complexité visuelle, apportée par la diversification des lieux visités, je ne me sens pas comme d'habitude, surchargé, incapable de reproduire ou enrichir ce que je vois.
|
||||
Je n'ai pas l'impression que les outils mis à ma disposition sont trop compliqués pour que je puisse assembler correctement deux formes.
|
||||
|
||||
Pourtant, c'est le point qui me faisait le plus peur avec ce nouveau volet : j'ai eu vent de la diversification des outils de constructions, plus proches de _Planet Coaster_ que de _Jurassic World Evolution_.
|
||||
Et si j'ai si peu joué à _Planet Coaster_, c'est parce que cette complexité me faisait peur.
|
||||
|
||||
Dans les deux épisodes précédents, je posais mes routes, mes bâtiments, mes clôtures, je m'occupais de mes animaux, et je ne me préoccupais pas du tout de l'aspect esthétique de mes parcs.
|
||||
Mais ici, ça serait une trahison intellectuelle de ne pas exploiter tout ce que le jeu peut nous offrir.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
Et, maintenant que le jeu offre un _workshop_ (malheureusement pas intégré à celui de Steam), on peut télécharger des _blueprints_ qui sont, pour certains, de toute beauté.
|
||||
Il y a de gros, gros fans _hardcore_ qui ont déjà accompli un travail absolument – positivement – monstrueux.
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
Tout cela ferait presque oublier la vue classique d'un jeu de gestion de parc, alors qu'elle n'est pas moins méritante.
|
||||
|
||||

|
||||
|
||||
L'optimisation du jeu est excellente.
|
||||
Je peux zoomer ou dézoomer comme un porc, me balader aux quatres coins d'une immense carte en mode créatif, je n'ai à déplorer que de rares ralentissements, parfaitement compréhensibles sur des cartes très fournies.
|
||||
Il est très clair que, sur ce point aussi, _JWE3_ a bénéficié d'améliorations considérables.
|
||||
|
||||

|
||||
|
||||
On pourra toutefois reprocher des temps de chargement relativement longs, mais, surtout, l'absence apparente de sauvegarde automatique en quittant le jeu.
|
||||
On doit sauvegarder manuellement, puis quitter.
|
||||
|
||||
Mais la grande nouveauté de cet épisode est l'introduction des bébés dinosaures.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
Réunissez un mâle et une femelle, offrez-leur un petit nid d'amour (littéralement), et quelques instants plus tard, vous pourriez y découvrir un œuf, duquel sortira un juvénile, et tout ce qu'il a à offrir de plus "kawaï".
|
||||
Après, vous le gardez ou vous le vendez...
|
||||
|
||||
## Appréciation
|
||||
|
||||
Le jeu a atteint une maturité insoupçonnée.
|
||||
Je compare ici avec la saga _Civilization_, qui a trébuché avec le sixième épisode et qui s'est franchement viandé avec le septième, au point qu'on se demande si la série peut y survivre.
|
||||
C'est rare qu'un épisode ultérieur soit meilleur que les précédents.
|
||||
Mais c'est indéniablement le cas pour _Jurassic World Evolution 3_ qui comble tous les déficits de ses prédécesseurs.
|
||||
|
||||
À part pouvoir visiter l'intérieur des laboratoires et observer les scientifiques travailler, j'ignore ce qu'il pourrait manquer à ce jeu.
|
||||
|
Before Width: | Height: | Size: 408 KiB After Width: | Height: | Size: 419 KiB |
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "L'alias `comportement_suspect` se remplit tout seul désormais."
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Vue simplifiée de mon architecture réseau."
|
||||
#prompt: ""
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
attribution: "ChatGPT Auto"
|
||||
description: "Collaboration entre Caddy et OPNsense pour filtrer les comportements suspects sur mon site."
|
||||
prompt: "Dynamic digital illustration showing collaboration between a Caddy web server and an OPNsense firewall to block suspicious IP addresses while remaining bot-friendly. Split cyber-security themed scene: on the left a modern server rack with the Caddy logo and a glowing blue protective shield, friendly small robot bots representing legitimate crawlers; on the right an OPNsense firewall server emitting an orange security shield. In the center a digital warning panel reading ‘Access Denied – Suspicious IP’ with network traffic being filtered. Dark cyber-security environment with world map, network lines, glowing circuits, blue vs orange lighting contrast, cinematic lighting, high-detail, wide banner illustration suitable as a blog header."
|
||||
@@ -1,4 +0,0 @@
|
||||
#title: ""
|
||||
#attribution: ""
|
||||
description: "Ce petit malotru vérifie si je fais tourner WordPress. Pour la dernière fois."
|
||||
#prompt: ""
|
||||
@@ -1,15 +0,0 @@
|
||||
flowchart LR
|
||||
internet[Internet]
|
||||
freebox[Freebox<br/>mode bridge]
|
||||
opnsense[Routeur<br/>OPNsense + Caddy]
|
||||
|
||||
internet --> freebox --> opnsense
|
||||
|
||||
subgraph lan[Réseau local]
|
||||
direction TB
|
||||
server[server-main<br/>NixOS + Caddy<br/>Héberge mon blog]
|
||||
others[Autres machines physiques<br/>Autres services web]
|
||||
end
|
||||
|
||||
opnsense -->|Reverse-proxy| server
|
||||
opnsense -->|Reverse-proxy| others
|
||||
|
Before Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 2.4 MiB |
|
Before Width: | Height: | Size: 371 KiB |
@@ -1,18 +0,0 @@
|
||||
{{- $description := .Description | default "" -}}
|
||||
{{- if not $description -}}
|
||||
{{- $description = .Summary | plainify | htmlUnescape -}}
|
||||
{{- end -}}
|
||||
{{- if not $description -}}
|
||||
{{- $description = .Plain | htmlUnescape -}}
|
||||
{{- end -}}
|
||||
{{- if not $description -}}
|
||||
{{- $description = .Content | plainify | htmlUnescape -}}
|
||||
{{- end -}}
|
||||
{{- if not $description -}}
|
||||
{{- $description = site.Params.description | default "" -}}
|
||||
{{- end -}}
|
||||
{{- $description = $description | replaceRE "\\s+" " " | strings.TrimSpace -}}
|
||||
{{- if gt (len $description) 180 -}}
|
||||
{{- $description = truncate 180 $description -}}
|
||||
{{- end -}}
|
||||
{{- return $description -}}
|
||||
@@ -1,68 +0,0 @@
|
||||
{{- $title := site.Title -}}
|
||||
{{- if not .IsHome -}}
|
||||
{{- $title = printf "%s | %s" .Title site.Title -}}
|
||||
{{- end -}}
|
||||
{{- $socialTitle := site.Title -}}
|
||||
{{- if not .IsHome -}}
|
||||
{{- $socialTitle = .Title -}}
|
||||
{{- end -}}
|
||||
{{- $description := partial "head/description.html" . -}}
|
||||
{{- $socialImage := partial "head/social-image.html" . -}}
|
||||
{{- $searchPath := site.Params.search.action | relURL -}}
|
||||
{{- $isSearchPage := eq .RelPermalink $searchPath -}}
|
||||
{{- $robots := "max-image-preview:large" -}}
|
||||
{{- if $isSearchPage -}}
|
||||
{{- $robots = "noindex, follow" -}}
|
||||
{{- end -}}
|
||||
{{- $ogType := "website" -}}
|
||||
{{- if and .IsPage (not $isSearchPage) -}}
|
||||
{{- $ogType = "article" -}}
|
||||
{{- end -}}
|
||||
{{- $localeCode := site.LanguageCode | default site.Language.LanguageCode | default "fr-FR" -}}
|
||||
{{- $locale := replace $localeCode "-" "_" -}}
|
||||
<title>{{ $title }}</title>
|
||||
{{- with $description }}
|
||||
<meta name="description" content="{{ . }}">
|
||||
{{- end }}
|
||||
<meta name="theme-color" content="{{ site.Params.themeColor | default "#060c14" }}">
|
||||
<meta name="robots" content="{{ $robots }}">
|
||||
<link rel="canonical" href="{{ .Permalink }}">
|
||||
<meta property="og:locale" content="{{ $locale }}">
|
||||
<meta property="og:site_name" content="{{ site.Title }}">
|
||||
<meta property="og:type" content="{{ $ogType }}">
|
||||
<meta property="og:title" content="{{ $socialTitle }}">
|
||||
<meta property="og:url" content="{{ .Permalink }}">
|
||||
{{- with $description }}
|
||||
<meta property="og:description" content="{{ . }}">
|
||||
{{- end }}
|
||||
{{- with $socialImage.url }}
|
||||
<meta property="og:image" content="{{ . }}">
|
||||
{{- end }}
|
||||
{{- with $socialImage.width }}
|
||||
<meta property="og:image:width" content="{{ . }}">
|
||||
{{- end }}
|
||||
{{- with $socialImage.height }}
|
||||
<meta property="og:image:height" content="{{ . }}">
|
||||
{{- end }}
|
||||
{{- with $socialImage.alt }}
|
||||
<meta property="og:image:alt" content="{{ . }}">
|
||||
{{- end }}
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:title" content="{{ $socialTitle }}">
|
||||
{{- with $description }}
|
||||
<meta name="twitter:description" content="{{ . }}">
|
||||
{{- end }}
|
||||
{{- with $socialImage.url }}
|
||||
<meta name="twitter:image" content="{{ . }}">
|
||||
{{- end }}
|
||||
{{- with $socialImage.alt }}
|
||||
<meta name="twitter:image:alt" content="{{ . }}">
|
||||
{{- end }}
|
||||
{{- if eq $ogType "article" -}}
|
||||
{{- with .Date }}
|
||||
<meta property="article:published_time" content="{{ .Format "2006-01-02T15:04:05Z07:00" }}">
|
||||
{{- end }}
|
||||
{{- with .Lastmod }}
|
||||
<meta property="article:modified_time" content="{{ .Format "2006-01-02T15:04:05Z07:00" }}">
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
@@ -1,55 +0,0 @@
|
||||
{{- $image := false -}}
|
||||
{{- $isCoverImage := false -}}
|
||||
{{- $alt := "" -}}
|
||||
{{- with .Params.cover -}}
|
||||
{{- $cover := $.Resources.GetMatch . -}}
|
||||
{{- if and $cover (ne $cover.MediaType.SubType "svg") -}}
|
||||
{{- $image = $cover -}}
|
||||
{{- $isCoverImage = true -}}
|
||||
{{- $coverName := path.Base . | replaceRE "\\.[^.]+$" "" -}}
|
||||
{{- $coverDataFile := $.Resources.Get (printf "data/images/%s.yaml" $coverName) -}}
|
||||
{{- if not $coverDataFile -}}
|
||||
{{- $coverDataFile = $.Resources.Get (printf "data/%s.yaml" $coverName) -}}
|
||||
{{- end -}}
|
||||
{{- $coverData := dict -}}
|
||||
{{- if $coverDataFile -}}
|
||||
{{- $coverData = $coverDataFile.Content | transform.Unmarshal -}}
|
||||
{{- end -}}
|
||||
{{- $alt = index $coverData "description" | default "" -}}
|
||||
{{- if not $alt -}}
|
||||
{{- $alt = index $coverData "title" | default "" -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- if not $image -}}
|
||||
{{- $logoPath := site.Params.logo | default "logo-large.png" -}}
|
||||
{{- $logo := resources.GetMatch $logoPath -}}
|
||||
{{- if and $logo (ne $logo.MediaType.SubType "svg") -}}
|
||||
{{- $image = $logo -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- if not $alt -}}
|
||||
{{- if and $image $isCoverImage -}}
|
||||
{{- if and .IsPage (not .IsHome) -}}
|
||||
{{- $alt = printf "Image de partage pour %s" .Title -}}
|
||||
{{- else -}}
|
||||
{{- $alt = printf "Logo du site %s" site.Title -}}
|
||||
{{- end -}}
|
||||
{{- else if $image -}}
|
||||
{{- $alt = printf "Logo du site %s" site.Title -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- $data := dict -}}
|
||||
{{- if $image -}}
|
||||
{{- $data = dict
|
||||
"url" $image.Permalink
|
||||
"alt" ($alt | strings.TrimSpace | truncate 420)
|
||||
-}}
|
||||
{{- with $image.Width -}}
|
||||
{{- $data = merge $data (dict "width" .) -}}
|
||||
{{- end -}}
|
||||
{{- with $image.Height -}}
|
||||
{{- $data = merge $data (dict "height" .) -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- return $data -}}
|
||||
@@ -1,10 +1,6 @@
|
||||
{{ define "main" }}
|
||||
{{- $search := .Site.Params.search -}}
|
||||
{{- $meili := $search.meilisearch -}}
|
||||
{{- $apiKey := getenv "MEILI_SEARCH_API_KEY" -}}
|
||||
{{- if eq $apiKey "" -}}
|
||||
{{- errorf "MEILI_SEARCH_API_KEY is required to render the search page" -}}
|
||||
{{- end -}}
|
||||
<header class="article-header">
|
||||
{{ partialCached "header-brand.html" .Site .Site.Title (.Site.Params.logo | default "logo-large.png") }}
|
||||
<h1>{{ .Title }}</h1>
|
||||
@@ -13,7 +9,7 @@
|
||||
class="search-page"
|
||||
data-search-endpoint="{{ $meili.endpoint }}"
|
||||
data-search-index="{{ $meili.indexUid }}"
|
||||
data-search-api-key="{{ $apiKey }}"
|
||||
data-search-api-key="{{ $meili.apiKey }}"
|
||||
data-search-limit="{{ $meili.hitsPerPage }}"
|
||||
data-search-param="{{ $search.param }}"
|
||||
>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"scripts": {
|
||||
"icons:generate": "node tools/generate_apple_touch_icons.js",
|
||||
"links:refresh": "node tools/check_external_links.js",
|
||||
"stats:generate": "node tools/generate_stats.js"
|
||||
},
|
||||
|
||||
|
Before Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 49 KiB |
6
test.sh
@@ -18,8 +18,4 @@ detect_dev_host() {
|
||||
DEV_HOST="$(detect_dev_host)"
|
||||
DEV_PORT=1313
|
||||
|
||||
if [ -z "${MEILI_SEARCH_API_KEY+x}" ]; then
|
||||
export MEILI_SEARCH_API_KEY="dummy"
|
||||
fi
|
||||
|
||||
hugo server -DEF --bind "$DEV_HOST" --port $DEV_PORT --baseURL "http://$DEV_HOST:$DEV_PORT"
|
||||
hugo server -DEF --bind "$DEV_HOST" --port $DEV_PORT --baseURL "http://$DEV_HOST:$DEV_PORT"
|
||||
@@ -858,49 +858,6 @@ aside section dl > div {
|
||||
padding-top: var(--space-2);
|
||||
}
|
||||
|
||||
body:has(> header.article-header) > main > aside.article-complementary-images {
|
||||
width: min(100%, var(--max-width-reading));
|
||||
margin-inline: auto;
|
||||
margin-top: var(--space-6);
|
||||
}
|
||||
|
||||
body:has(> header.article-header) > main > aside.article-complementary-images > section {
|
||||
margin-top: 0;
|
||||
border-top: 1px solid var(--color-border);
|
||||
padding-top: var(--space-3);
|
||||
}
|
||||
|
||||
body:has(> header.article-header) > main > aside.article-complementary-images > section > h2 {
|
||||
margin-top: 0;
|
||||
font-size: 1.02rem;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.08em;
|
||||
}
|
||||
|
||||
body:has(> header.article-header) > main > aside.article-complementary-images > section > ul {
|
||||
list-style: none;
|
||||
margin-top: var(--space-3);
|
||||
padding-left: 0;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(9rem, 1fr));
|
||||
gap: var(--space-3);
|
||||
}
|
||||
|
||||
body:has(> header.article-header) > main > aside.article-complementary-images > section > ul > li {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
body:has(> header.article-header) > main > aside.article-complementary-images > section > ul > li > a {
|
||||
display: block;
|
||||
border: 1px solid var(--color-border);
|
||||
}
|
||||
|
||||
body:has(> header.article-header) > main > aside.article-complementary-images > section > ul > li > a > img {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
display: block;
|
||||
}
|
||||
|
||||
body:has(> header.article-header) > main > aside.article-toc {
|
||||
position: fixed;
|
||||
inset-inline-end: var(--space-2);
|
||||
|
||||
@@ -71,16 +71,8 @@
|
||||
{{- $coverImage = $page.Resources.GetMatch $coverPath -}}
|
||||
{{- if $coverImage -}}
|
||||
{{- $coverDisplay = $coverImage -}}
|
||||
{{- if ne $coverDisplay.MediaType.SubType "svg" -}}
|
||||
{{- $coverWidth := $coverDisplay.Width -}}
|
||||
{{- if gt $coverDisplay.Width 1480 -}}
|
||||
{{- $coverWidth = 1480 -}}
|
||||
{{- end -}}
|
||||
{{- $coverDisplay = partial "media/process-image.html" (dict
|
||||
"image" $coverImage
|
||||
"action" "Resize"
|
||||
"spec" (printf "%dx" $coverWidth)
|
||||
) -}}
|
||||
{{- if and (ne $coverDisplay.MediaType.SubType "svg") (gt $coverDisplay.Width 1480) -}}
|
||||
{{- $coverDisplay = $coverImage.Resize "1480x" -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
@@ -1,119 +0,0 @@
|
||||
{{- $page := . -}}
|
||||
{{- $bundleImages := slice -}}
|
||||
{{- range $page.Resources.ByType "image" -}}
|
||||
{{- if strings.HasPrefix .Name "images/" -}}
|
||||
{{- $bundleImages = $bundleImages | append . -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- if gt (len $bundleImages) 0 -}}
|
||||
{{- $coverPath := "" -}}
|
||||
{{- with $page.Params.cover -}}
|
||||
{{- $coverPath = strings.TrimSpace (printf "%v" .) -}}
|
||||
{{- end -}}
|
||||
{{- $coverImagePath := "" -}}
|
||||
{{- if ne $coverPath "" -}}
|
||||
{{- $coverPathLower := lower $coverPath -}}
|
||||
{{- if or (strings.HasSuffix $coverPathLower ".yaml") (strings.HasSuffix $coverPathLower ".yml") -}}
|
||||
{{- $coverDataFile := $page.Resources.GetMatch $coverPath -}}
|
||||
{{- if $coverDataFile -}}
|
||||
{{- $coverData := $coverDataFile.Content | transform.Unmarshal -}}
|
||||
{{- with index $coverData "file" -}}
|
||||
{{- $coverImagePath = strings.TrimSpace (printf "%v" .) -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- else -}}
|
||||
{{- $coverImagePath = $coverPath -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- $coverImageName := "" -}}
|
||||
{{- if ne $coverImagePath "" -}}
|
||||
{{- $coverImageName = lower (path.Base $coverImagePath) -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $contentImageNames := slice -}}
|
||||
{{- $contentImageStems := slice -}}
|
||||
{{- $imageTags := findRE `(?is)<img[^>]+src=["'][^"']+["'][^>]*>` .Content -}}
|
||||
{{- range $imageTags -}}
|
||||
{{- $srcMatch := findRESubmatch `(?is)src=["']([^"']+)["']` . -}}
|
||||
{{- if gt (len $srcMatch) 0 -}}
|
||||
{{- $src := lower (index (index $srcMatch 0) 1) -}}
|
||||
{{- if or (in $src "/images/") (strings.HasPrefix $src "images/") (strings.HasPrefix $src "./images/") -}}
|
||||
{{- $srcName := path.Base $src -}}
|
||||
{{- $srcName = replaceRE "\\?.*$" "" $srcName -}}
|
||||
{{- $srcName = replaceRE "#.*$" "" $srcName -}}
|
||||
{{- $srcName = replaceRE "_hu_[^.]*" "" $srcName -}}
|
||||
{{- $srcStem := $srcName | replaceRE "\\.[^.]+$" "" -}}
|
||||
{{- $contentImageNames = $contentImageNames | append $srcName -}}
|
||||
{{- $contentImageStems = $contentImageStems | append $srcStem -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $unusedImages := slice -}}
|
||||
{{- range $bundleImages -}}
|
||||
{{- $imageName := path.Base .Name -}}
|
||||
{{- $imageNameLower := lower $imageName -}}
|
||||
{{- $isCoverImage := false -}}
|
||||
{{- if and (ne $coverImageName "") (eq $imageNameLower $coverImageName) -}}
|
||||
{{- $isCoverImage = true -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- if not $isCoverImage -}}
|
||||
{{- $imageStem := $imageName | replaceRE "\\.[^.]+$" "" -}}
|
||||
{{- $imageStemLower := lower $imageStem -}}
|
||||
{{- $isUsedInContent := false -}}
|
||||
{{- range $contentImageNames -}}
|
||||
{{- if eq . $imageNameLower -}}
|
||||
{{- $isUsedInContent = true -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- if not $isUsedInContent -}}
|
||||
{{- range $contentImageStems -}}
|
||||
{{- if eq . $imageStemLower -}}
|
||||
{{- $isUsedInContent = true -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- if not $isUsedInContent -}}
|
||||
{{- $unusedImages = $unusedImages | append . -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- if gt (len $unusedImages) 0 -}}
|
||||
<aside class="article-complementary-images">
|
||||
<section>
|
||||
<h2>Images complémentaires</h2>
|
||||
<ul>
|
||||
{{- range $unusedImages -}}
|
||||
{{- $imageName := path.Base .Name -}}
|
||||
{{- $imageStem := $imageName | replaceRE "\\.[^.]+$" "" -}}
|
||||
{{- $data := dict -}}
|
||||
{{- $dataFile := $page.Resources.Get (printf "data/images/%s.yaml" $imageStem) -}}
|
||||
{{- if not $dataFile -}}
|
||||
{{- $dataFile = $page.Resources.Get (printf "data/%s.yaml" $imageStem) -}}
|
||||
{{- end -}}
|
||||
{{- if $dataFile -}}
|
||||
{{- $data = $dataFile.Content | transform.Unmarshal -}}
|
||||
{{- end -}}
|
||||
{{- $title := default (printf "Image complémentaire : %s" $imageName) (index $data "title") -}}
|
||||
{{- $thumbnail := . -}}
|
||||
{{- if and (ne .MediaType.SubType "svg") (gt .Width 360) -}}
|
||||
{{- $thumbnail = partial "media/process-image.html" (dict
|
||||
"image" .
|
||||
"action" "Resize"
|
||||
"spec" "360x"
|
||||
) -}}
|
||||
{{- end -}}
|
||||
<li>
|
||||
<a href="{{ .RelPermalink }}" title="{{ $title }}">
|
||||
<img src="{{ $thumbnail.RelPermalink }}" alt="{{ $title }}" loading="lazy" decoding="async">
|
||||
</a>
|
||||
</li>
|
||||
{{- end -}}
|
||||
</ul>
|
||||
</section>
|
||||
</aside>
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
@@ -109,11 +109,7 @@
|
||||
<a href="{{ $page.RelPermalink }}">
|
||||
<figure>
|
||||
{{- with $image -}}
|
||||
{{- $resized := partial "media/process-image.html" (dict
|
||||
"image" .
|
||||
"action" "Fill"
|
||||
"spec" $thumbnailTransform
|
||||
) -}}
|
||||
{{- $resized := .Fill $thumbnailTransform -}}
|
||||
<img src="{{ $resized.RelPermalink }}" alt="Image de couverture pour {{ $page.Title }}" loading="lazy">
|
||||
{{- end -}}
|
||||
</figure>
|
||||
@@ -129,11 +125,7 @@
|
||||
<a href="{{ $page.RelPermalink }}">
|
||||
<figure>
|
||||
{{- with $image -}}
|
||||
{{- $resized := partial "media/process-image.html" (dict
|
||||
"image" .
|
||||
"action" "Fill"
|
||||
"spec" $thumbnailTransform
|
||||
) -}}
|
||||
{{- $resized := .Fill $thumbnailTransform -}}
|
||||
<img src="{{ $resized.RelPermalink }}" alt="Image de couverture pour {{ $page.Title }}" loading="lazy">
|
||||
{{- end -}}
|
||||
</figure>
|
||||
|
||||
@@ -1,8 +1,14 @@
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
{{ partial "head/metadata.html" . }}
|
||||
<title>{{ if .IsHome }}{{ site.Title }}{{ else }}{{ printf "%s | %s" .Title site.Title }}{{ end }}</title>
|
||||
{{ with .Description }}
|
||||
<meta name="description" content="{{ . }}">
|
||||
{{ else }}
|
||||
{{ with site.Params.description }}
|
||||
<meta name="description" content="{{ . }}">
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
<link rel="icon" href="{{ "favicon.ico" | absURL }}" type="image/x-icon">
|
||||
<link rel="shortcut icon" href="{{ "favicon.ico" | absURL }}" type="image/x-icon">
|
||||
<link rel="icon" href="{{ "favicon.png" | absURL }}" type="image/png" sizes="256x256">
|
||||
<link rel="apple-touch-icon" href="{{ "apple-touch-icon.png" | absURL }}" sizes="180x180">
|
||||
{{ partialCached "head/css.html" . }}
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
{{- $image := .image -}}
|
||||
{{- $showMeta := .showMeta -}}
|
||||
{{- $forceCentered := .forceCentered -}}
|
||||
{{- $alt := .alt -}}
|
||||
{{- $title := .title -}}
|
||||
{{- $display := $image -}}
|
||||
|
||||
{{- if ne $image.MediaType.SubType "svg" -}}
|
||||
{{- if gt $image.Width $image.Height -}}
|
||||
{{- $maxWidth := 1400 -}}
|
||||
{{- if and $showMeta (not $forceCentered) -}}
|
||||
{{- $maxWidth = 900 -}}
|
||||
{{- end -}}
|
||||
{{- $targetWidth := $image.Width -}}
|
||||
{{- if gt $image.Width $maxWidth -}}
|
||||
{{- $targetWidth = $maxWidth -}}
|
||||
{{- end -}}
|
||||
{{- $display = partial "media/process-image.html" (dict
|
||||
"image" $image
|
||||
"action" "Resize"
|
||||
"spec" (printf "%dx" $targetWidth)
|
||||
) -}}
|
||||
{{- else -}}
|
||||
{{- $targetHeight := $image.Height -}}
|
||||
{{- if gt $image.Height 900 -}}
|
||||
{{- $targetHeight = 900 -}}
|
||||
{{- end -}}
|
||||
{{- $display = partial "media/process-image.html" (dict
|
||||
"image" $image
|
||||
"action" "Resize"
|
||||
"spec" (printf "x%d" $targetHeight)
|
||||
) -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
<img src="{{ $display.RelPermalink }}" alt="{{ $alt }}" title="{{ $title }}">
|
||||
@@ -1,30 +0,0 @@
|
||||
{{/* Préserve les GIF animés en évitant toute transformation Hugo. */}}
|
||||
{{- $image := .image -}}
|
||||
{{- if not $image -}}
|
||||
{{- errorf "media/process-image.html: missing image resource" -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $action := .action -}}
|
||||
{{- if not $action -}}
|
||||
{{- errorf "media/process-image.html: missing image action for %q" $image.Name -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $spec := .spec -}}
|
||||
{{- if not $spec -}}
|
||||
{{- errorf "media/process-image.html: missing image spec for %q" $image.Name -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $result := $image -}}
|
||||
{{- $subType := lower $image.MediaType.SubType -}}
|
||||
{{- if and (ne $subType "svg") (ne $subType "gif") -}}
|
||||
{{- $options := printf "%s webp q80" $spec -}}
|
||||
{{- if eq $action "Fill" -}}
|
||||
{{- $result = $image.Fill $options -}}
|
||||
{{- else if eq $action "Resize" -}}
|
||||
{{- $result = $image.Resize $options -}}
|
||||
{{- else -}}
|
||||
{{- errorf "media/process-image.html: unsupported image action %q for %q" $action $image.Name -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- return $result -}}
|
||||
@@ -13,6 +13,10 @@
|
||||
{{- if not $image -}}
|
||||
{{- return -}}
|
||||
{{- end -}}
|
||||
{{- $display := $image -}}
|
||||
{{- if and (ne $display.MediaType.SubType "svg") (gt $display.Height 810) -}}
|
||||
{{- $display = $image.Resize "x810" -}}
|
||||
{{- end -}}
|
||||
{{- $metaTitle := index $data "title" -}}
|
||||
{{- $hasMeta := or $metaTitle (or $description (or $data.attribution $data.prompt)) -}}
|
||||
{{- $attributes := .Attributes | default dict -}}
|
||||
@@ -52,13 +56,7 @@
|
||||
{{- end -}}
|
||||
<figure class="{{ delimit $figureClasses " " }}">
|
||||
<a href="{{ $image.RelPermalink }}" title="Cliquez pour agrandir l'image">
|
||||
{{- partial "media/display-img.html" (dict
|
||||
"image" $image
|
||||
"showMeta" $showMeta
|
||||
"forceCentered" $forceCentered
|
||||
"alt" $alt
|
||||
"title" $title
|
||||
) -}}
|
||||
<img src="{{ $display.RelPermalink }}" alt="{{ $alt }}" title="{{ $title }}">
|
||||
</a>
|
||||
{{- if $showMeta -}}
|
||||
<figcaption class="figure-media-meta cover-meta">
|
||||
|
||||
@@ -4,16 +4,12 @@
|
||||
{{- $assetPath := "images/oeuvres/l-anankeisme.png" -}}
|
||||
{{- $source := resources.Get $assetPath -}}
|
||||
{{- if $source -}}
|
||||
{{- $img := partial "media/process-image.html" (dict
|
||||
"image" $source
|
||||
"action" "Resize"
|
||||
"spec" "320x"
|
||||
) -}}
|
||||
{{- $img := $source.Resize "320x" -}}
|
||||
<img src="{{ $img.RelPermalink }}" width="{{ $img.Width }}" height="{{ $img.Height }}" alt="Couverture de L'Anankéisme" loading="lazy">
|
||||
{{- end -}}
|
||||
</figure>
|
||||
<h2>L'Anankéisme</h2>
|
||||
<p><em>L'Anankéisme</em> propose, en dix axiomes, une pensée du réel fondée sur le déterminisme intégral. Vérité, vivant, morale, mort : cet essai explore avec méthode les conséquences d'un monde où rien n'advient sans cause et invite à mesurer jusqu'où peut aller une pensée qui n'accorde rien au hasard ni à la transcendance.</p>
|
||||
<p><em>L'Anankéisme</em> propose un cadre axiomatique en dix propositions pour penser un déterminisme absolu, une vérité indépendante de toute cognition et une définition rigoureuse du vivant.</p>
|
||||
<p>
|
||||
<a class="ui-button" href="https://librairie.bod.fr/lanankeisme-richard-dern-9782322634903">Acheter le livre</a>
|
||||
<a class="ui-button" href="https://anankeisme.fr/">Découvrir le site dédié à l'Anankéisme</a>
|
||||
|
||||
@@ -4,16 +4,12 @@
|
||||
{{- $assetPath := "images/oeuvres/l-humain-cette-espece-primitive.jpeg" -}}
|
||||
{{- $source := resources.Get $assetPath -}}
|
||||
{{- if $source -}}
|
||||
{{- $img := partial "media/process-image.html" (dict
|
||||
"image" $source
|
||||
"action" "Resize"
|
||||
"spec" "320x"
|
||||
) -}}
|
||||
{{- $img := $source.Resize "320x" -}}
|
||||
<img src="{{ $img.RelPermalink }}" width="{{ $img.Width }}" height="{{ $img.Height }}" alt="Couverture de L'Humain, cette espèce primitive" loading="lazy">
|
||||
{{- end -}}
|
||||
</figure>
|
||||
<h2>L'Humain, cette espèce primitive</h2>
|
||||
<p><em>L'Humain, cette espèce primitive</em> pose une question inconfortable : et si notre sophistication technique masquait surtout un profond retard social, cognitif et moral ? En prenant l'exploration spatiale comme révélateur, cet essai secoue notre récit du progrès et montre pourquoi, avant de prétendre conquérir l'univers, nous avons encore à apprendre à habiter lucidement le monde.</p>
|
||||
<p><em>L'Humain, cette espèce primitive</em> est un essai dans lequel vous explorez plusieurs facettes de ce que nous appelons notre évolution, en adoptant la perspective de l'exploration spatiale.</p>
|
||||
<p>
|
||||
<a class="ui-button" href="https://www.amazon.fr/dp/B08VF4D2NT">Acheter la version numérique</a>
|
||||
<a class="ui-button" href="/interets/philosophie/2023/05/18/lhumain-cette-espece-primitive-lhumain-cette-espece-primitive/">Lire le livre en ligne</a>
|
||||
|
||||
@@ -6,11 +6,7 @@
|
||||
{{- $logo := resources.GetMatch $logoPath -}}
|
||||
<a href="{{ "/" | relURL }}" aria-label="Revenir à l'accueil">
|
||||
{{- with $logo -}}
|
||||
{{- $resized := partial "media/process-image.html" (dict
|
||||
"image" .
|
||||
"action" "Resize"
|
||||
"spec" "64x"
|
||||
) -}}
|
||||
{{- $resized := .Resize "64x" -}}
|
||||
<img src="{{ $resized.RelPermalink }}" alt="">
|
||||
{{- end -}}
|
||||
<strong>{{ $site.Title }}</strong>
|
||||
|
||||
@@ -36,11 +36,7 @@
|
||||
{{- with $image -}}
|
||||
<a href="{{ $page.RelPermalink }}">
|
||||
<figure>
|
||||
{{- $resized := partial "media/process-image.html" (dict
|
||||
"image" .
|
||||
"action" "Fill"
|
||||
"spec" "600x340"
|
||||
) -}}
|
||||
{{- $resized := .Fill "600x340" -}}
|
||||
<img src="{{ $resized.RelPermalink }}" alt="Image de couverture pour {{ $page.Title }}" loading="lazy">
|
||||
</figure>
|
||||
</a>
|
||||
|
||||
@@ -8,16 +8,11 @@
|
||||
{{- $extension := path.Ext $remoteURL -}}
|
||||
{{- $cleanFilename := printf "%s%s" $hash $extension | replace "?raw=true" "" -}}
|
||||
{{- $localImage := $remoteImage | resources.Copy (printf "remote-images/%s" $cleanFilename) -}}
|
||||
{{- $resizedImage := $localImage.Resize "1024x" -}}
|
||||
{{- $hasMeta := or $title (or $description $attribution) -}}
|
||||
<figure class="figure-media{{ if $hasMeta }} figure-media-with-meta{{ else }} figure-media-without-meta{{ end }}">
|
||||
<a href="{{ $localImage.RelPermalink }}" title="Cliquez pour agrandir l'image">
|
||||
{{- partial "media/display-img.html" (dict
|
||||
"image" $localImage
|
||||
"showMeta" $hasMeta
|
||||
"forceCentered" false
|
||||
"alt" $title
|
||||
"title" $title
|
||||
) -}}
|
||||
<img src="{{ $resizedImage.RelPermalink }}" alt="{{ $title }}" title="{{ $title }}">
|
||||
</a>
|
||||
{{- if $hasMeta -}}
|
||||
<figcaption class="figure-media-meta cover-meta">
|
||||
|
||||
@@ -104,36 +104,13 @@
|
||||
{{- end -}}
|
||||
{{- $collectionsEntries = sort $collectionsEntries "LatestDateKey" "desc" -}}
|
||||
|
||||
{{- $critiquesDisplayed := slice -}}
|
||||
|
||||
{{- $critiquesCategoryDefs := slice -}}
|
||||
{{- $critiquesCategoryDefs = $critiquesCategoryDefs | append (dict "Path" "/critiques/films") -}}
|
||||
{{- $critiquesCategoryDefs = $critiquesCategoryDefs | append (dict "Path" "/critiques/series") -}}
|
||||
{{- $critiquesCategoryDefs = $critiquesCategoryDefs | append (dict "Path" "/critiques/jeux-video") -}}
|
||||
{{- $critiquesCategoryDefs = $critiquesCategoryDefs | append (dict "Path" "/critiques/livres") -}}
|
||||
{{- $critiquesCategoryEntries := slice -}}
|
||||
{{- range $critiqueDef := $critiquesCategoryDefs -}}
|
||||
{{- $critiquePath := index $critiqueDef "Path" -}}
|
||||
{{- $critiqueSection := $site.GetPage $critiquePath -}}
|
||||
{{- $critiquePages := slice -}}
|
||||
{{- with $critiqueSection -}}
|
||||
{{- range .RegularPagesRecursive.ByDate.Reverse -}}
|
||||
{{- if eq (partial "is-dossier-lead.html" .) "true" -}}
|
||||
{{- $critiquePages = $critiquePages | append . -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- if gt (len $critiquePages) 0 -}}
|
||||
{{- $latestDateKey := "00000000000000" -}}
|
||||
{{- with index $critiquePages 0 -}}
|
||||
{{- $latestDateKey = .Date.Format "20060102150405" -}}
|
||||
{{- end -}}
|
||||
{{- $critiquesCategoryEntries = $critiquesCategoryEntries | append (dict
|
||||
"Section" $critiqueSection
|
||||
"Pages" (first 8 $critiquePages)
|
||||
"LatestDateKey" $latestDateKey
|
||||
) -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- $critiquesCategoryEntries = sort $critiquesCategoryEntries "LatestDateKey" "desc" -}}
|
||||
|
||||
<main class="home-main">
|
||||
{{- if gt (len $interestsSpotlight) 0 -}}
|
||||
@@ -232,9 +209,22 @@
|
||||
</section>
|
||||
{{- end -}}
|
||||
|
||||
{{- range $critiqueIndex, $critiqueEntry := $critiquesCategoryEntries -}}
|
||||
{{- $critiqueSection := index $critiqueEntry "Section" -}}
|
||||
{{- $critiqueSpotlight := index $critiqueEntry "Pages" -}}
|
||||
{{- range $critiqueIndex, $critiqueDef := $critiquesCategoryDefs -}}
|
||||
{{- $critiquePath := index $critiqueDef "Path" -}}
|
||||
{{- $critiquePrefix := printf "%s/" (strings.TrimSuffix "/" $critiquePath) -}}
|
||||
{{- $critiqueSection := $site.GetPage $critiquePath -}}
|
||||
{{- $critiquePool := slice -}}
|
||||
{{- range $critiquesArticles -}}
|
||||
{{- if and (strings.Contains .RelPermalink $critiquePrefix) (not (in $critiquesDisplayed .File.Path)) -}}
|
||||
{{- $critiquePool = $critiquePool | append . -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $critiqueSpotlight := first 8 $critiquePool -}}
|
||||
{{- range $critiqueSpotlight -}}
|
||||
{{- $critiquesDisplayed = $critiquesDisplayed | append .File.Path -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- if gt (len $critiqueSpotlight) 0 -}}
|
||||
<section class="home-critiques-category">
|
||||
<header>
|
||||
@@ -315,11 +305,7 @@
|
||||
<a href="{{ $page.RelPermalink }}">
|
||||
<figure>
|
||||
{{- with $image -}}
|
||||
{{- $resized := partial "media/process-image.html" (dict
|
||||
"image" .
|
||||
"action" "Fill"
|
||||
"spec" "166x91"
|
||||
) -}}
|
||||
{{- $resized := .Fill "166x91" -}}
|
||||
<img src="{{ $resized.RelPermalink }}" alt="Capture du lien {{ $page.Title }}" loading="lazy">
|
||||
{{- end -}}
|
||||
</figure>
|
||||
@@ -405,11 +391,7 @@
|
||||
<a href="{{ $item.RelPermalink }}" title="{{ $item.Title }}">
|
||||
<figure>
|
||||
{{- with $itemImage -}}
|
||||
{{- $resized := partial "media/process-image.html" (dict
|
||||
"image" .
|
||||
"action" "Resize"
|
||||
"spec" "x128"
|
||||
) -}}
|
||||
{{- $resized := .Resize "x128" -}}
|
||||
<img src="{{ $resized.RelPermalink }}" alt="{{ $item.Title }}" title="{{ $item.Title }}" loading="lazy">
|
||||
{{- end -}}
|
||||
</figure>
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
{{ partial "liens-morts/report.html" (dict "Page" .) }}
|
||||
{{ partial "article-footer.html" . }}
|
||||
</article>
|
||||
{{ partial "asides/complementary-images.html" . }}
|
||||
{{ partial "asides/toc.html" . }}
|
||||
</main>
|
||||
{{ end }}
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
{{ .Content }}
|
||||
{{ partial "article-footer.html" . }}
|
||||
</article>
|
||||
{{ partial "asides/complementary-images.html" . }}
|
||||
{{ partial "asides/toc.html" . }}
|
||||
</main>
|
||||
{{ end }}
|
||||
|
||||