alpinux-www/site/modifications.html
Cédrix d740c2c900 Publier toutes les pages du wiki, et une vraie page d'erreur
L'accueil n'annonçait que six pages du wiki, et rien ne menait au reste :
qui voulait savoir ce qui avait bougé depuis sa dernière visite n'avait
nulle part où aller. modifications.html liste tout ce que le wiki publie,
du plus récemment retouché au plus ancien, avec un filtre par titre ou
par rubrique. Elle lit toutes-les-pages.json, que le build du wiki écrit
à côté de derniers-articles.json ; tant que ce fichier n'existe pas, elle
se rabat sur celui de l'accueil et le dit plutôt que de rester vide.

404.html reprend la charte et propose l'accueil, le wiki, les mises à
jour et les listes. Elle attend encore sa directive Apache : le site
répond aujourd'hui 200 et l'accueil à toute adresse inconnue, ce qui
trompe le visiteur comme le moteur de recherche. Le README dit quoi
poser dans le .htaccess du serveur.

Les deux pages partagent commun.css plutôt que de recopier le style de
l'accueil, qui garde le sien en ligne — une page, une requête. Et le
garde-fou du déploiement, qui ne regardait que l'accueil, refuse
désormais de mettre en ligne n'importe quelle page tronquée : une 404
servie à moitié serait aussi laide qu'une erreur.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JYfYUZRcJmmEWJwAxZb4o2
2026-09-23 12:42:03 +02:00

352 lines
11 KiB
HTML

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Toutes les pages du wiki d'Alpinux, de la plus récemment mise à jour à la plus ancienne.">
<meta name="robots" content="index, follow">
<title>Les mises à jour du wiki — Alpinux</title>
<link rel="canonical" href="https://alpinux.org/modifications.html">
<link rel="icon" type="image/x-icon" href="https://static.alpinux.org/logo/favicon.ico">
<link rel="icon" type="image/png" sizes="32x32" href="https://static.alpinux.org/logo/favicon-32.png">
<link rel="apple-touch-icon" sizes="192x192" href="https://static.alpinux.org/logo/favicon-192.png">
<meta property="og:type" content="website">
<meta property="og:site_name" content="Alpinux">
<meta property="og:title" content="Les mises à jour du wiki — Alpinux">
<meta property="og:description" content="Toutes les pages du wiki d'Alpinux, de la plus récemment mise à jour à la plus ancienne.">
<meta property="og:url" content="https://alpinux.org/modifications.html">
<meta property="og:image" content="https://static.alpinux.org/logo/alpinux-logo-512.png">
<meta property="og:locale" content="fr_FR">
<link rel="stylesheet" href="/commun.css">
<style>
.barre {
display: flex;
align-items: center;
gap: 1rem;
flex-wrap: wrap;
margin: 1.8rem 0 1.2rem;
}
.barre input {
flex: 1 1 260px;
font: inherit;
font-size: .95rem;
padding: .6rem .9rem;
border: 2px solid #dce8f5;
border-radius: 8px;
background: #fff;
color: inherit;
min-width: 0;
}
.barre input:focus {
outline: none;
border-color: #1a6bbf;
}
.compte {
font-size: .85rem;
color: #7a8ba0;
white-space: nowrap;
}
.mois {
font-size: .78rem;
font-weight: 700;
letter-spacing: .08em;
text-transform: uppercase;
color: #0f4e8f;
background: #e8f1fb;
border-radius: 4px;
padding: .3rem .6rem;
display: inline-block;
margin: 1.8rem 0 .8rem;
}
.pages { list-style: none; }
.page-ligne {
display: grid;
grid-template-columns: 5.5rem 1fr;
gap: 1rem;
align-items: baseline;
background: #fff;
border-radius: 10px;
border-left: 4px solid #9fc5e8;
box-shadow: 0 2px 10px rgba(26,107,191,.08);
padding: .85rem 1.1rem;
margin-bottom: .6rem;
text-decoration: none;
color: inherit;
transition: transform .15s, box-shadow .15s;
}
.page-ligne:hover {
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(26,107,191,.18);
}
.page-ligne:hover .page-titre { color: #1a6bbf; }
.page-date {
font-size: .8rem;
font-weight: 700;
color: #7a8ba0;
letter-spacing: .04em;
text-transform: uppercase;
white-space: nowrap;
}
.page-titre {
display: block;
font-size: 1rem;
font-weight: 600;
line-height: 1.35;
}
.page-rubrique {
display: block;
font-size: .8rem;
color: #7a8ba0;
margin-top: .15rem;
}
.badge {
background: #f5a623;
color: #fff;
font-size: .66rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: .06em;
padding: .1rem .45rem;
border-radius: 3px;
margin-left: .5rem;
vertical-align: .1em;
}
.etat {
background: #fff;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(26,107,191,.08);
padding:1.4rem;
font-size: .95rem;
color: #4a5a6a;
line-height: 1.6;
}
.etat a { color: #1a6bbf; }
.genere {
margin-top: 2rem;
font-size: .8rem;
color: #93a2b3;
}
@media (max-width: 560px) {
.page-ligne { grid-template-columns: 1fr; gap: .25rem; }
}
</style>
</head>
<body>
<header>
<a href="/" class="logo-wrap">
<img src="https://static.alpinux.org/logo/alpinux-logo.png"
alt="Logo Alpinux — LUG de Savoie"
class="logo-img" width="66" height="66">
<span class="logo-text">
<span class="brand">
<span class="light">A</span><span class="bold">l</span><span class="light">p</span><span class="bold">inux</span>
</span>
<span class="tagline">le LUG de Savoie</span>
</span>
</a>
</header>
<nav aria-label="Navigation principale">
<a href="/">Accueil</a>
<a href="https://wiki.alpinux.org">Wiki</a>
<a href="/modifications.html" aria-current="page">Mises à jour</a>
<a href="https://portail.alpinux.org">Portail membres</a>
<a href="https://installparty.alpinux.org">Install Party</a>
<a href="https://messagerie.alpinux.org">Listes de diffusion</a>
</nav>
<main>
<h1>Les mises à jour du wiki</h1>
<p class="chapeau">
Toutes les pages de <a href="https://wiki.alpinux.org">wiki.alpinux.org</a>, de la
plus récemment retouchée à la plus ancienne. Les dates viennent de l'historique du
dépôt : c'est le jour où le texte a changé, pas celui où le fichier a été recopié.
Déplacer une page ne la fait donc pas remonter ici.
</p>
<div class="barre">
<label for="filtre" class="sr-only" hidden>Filtrer les pages</label>
<input id="filtre" type="search" placeholder="Filtrer par titre ou rubrique…"
autocomplete="off" hidden>
<span class="compte" id="compte"></span>
</div>
<div id="etat" class="etat">Chargement de la liste…</div>
<ol class="pages" id="pages"></ol>
<p class="genere" id="genere" hidden></p>
</main>
<footer>
<p>© Alpinux — Association loi 1901 &nbsp;·&nbsp; Chambéry, Savoie</p>
<p style="margin-top:.4rem;">
<a href="https://wiki.alpinux.org/alpinux/">À propos</a> &nbsp;·&nbsp;
<a href="https://wiki.alpinux.org/alpinux/faq/">FAQ</a> &nbsp;·&nbsp;
<a href="https://wiki.alpinux.org/alpinux/donnees-personnelles/">Vos données</a> &nbsp;·&nbsp;
<a href="https://messagerie.alpinux.org/archives">Archives des listes</a> &nbsp;·&nbsp;
<a href="https://www.helloasso.com/associations/alpinux-le-lug-de-savoie">Adhérer</a>
</p>
</footer>
<script>
(function () {
'use strict';
/* Le wiki publie l'inventaire complet à chaque build. Le second fichier est celui
que lit l'accueil : il ne porte que vingt entrées, mais il existe depuis plus
longtemps — s'en contenter vaut mieux qu'une page vide. */
var SOURCES = [
{ url: 'https://wiki.alpinux.org/toutes-les-pages.json', clef: 'pages', partiel: false },
{ url: 'https://wiki.alpinux.org/derniers-articles.json', clef: 'articles', partiel: true }
];
var etat = document.getElementById('etat');
var liste = document.getElementById('pages');
var compte = document.getElementById('compte');
var filtre = document.getElementById('filtre');
var genere = document.getElementById('genere');
var MOIS = ['janvier', 'février', 'mars', 'avril', 'mai', 'juin',
'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'];
var toutes = [];
function echappe(texte) {
var d = document.createElement('div');
d.textContent = texte;
return d.innerHTML;
}
function sansAccent(texte) {
return texte.normalize ? texte.normalize('NFD').replace(/[̀-ͯ]/g, '') : texte;
}
function ligne(page) {
var a = document.createElement('a');
a.className = 'page-ligne';
a.href = page.url;
a.innerHTML =
'<time class="page-date" datetime="' + echappe(page.date) + '">' +
page.d.getDate() + ' ' + MOIS[page.d.getMonth()].slice(0, 4) + '.' +
'</time>' +
'<span>' +
'<span class="page-titre">' + echappe(page.titre) +
(page.nouveau ? '<span class="badge">Nouveau</span>' : '') +
'</span>' +
(page.rubrique ? '<span class="page-rubrique">' + echappe(page.rubrique) + '</span>' : '') +
'</span>';
return a;
}
function dessiner(pages) {
liste.textContent = '';
var moisCourant = '';
pages.forEach(function (page) {
var cle = page.d.getFullYear() + '-' + page.d.getMonth();
if (cle !== moisCourant) {
moisCourant = cle;
var titre = document.createElement('li');
titre.className = 'mois';
titre.textContent = MOIS[page.d.getMonth()] + ' ' + page.d.getFullYear();
liste.appendChild(titre);
}
var li = document.createElement('li');
li.appendChild(ligne(page));
liste.appendChild(li);
});
compte.textContent = pages.length + (pages.length > 1 ? ' pages' : ' page') +
(pages.length !== toutes.length ? ' sur ' + toutes.length : '');
}
function appliquerLeFiltre() {
var q = sansAccent(filtre.value.trim().toLowerCase());
if (!q) return dessiner(toutes);
dessiner(toutes.filter(function (page) {
return sansAccent((page.titre + ' ' + (page.rubrique || '')).toLowerCase()).indexOf(q) !== -1;
}));
}
async function lire(source) {
var r = await fetch(source.url, { cache: 'no-cache' });
if (!r.ok) throw new Error(r.status);
var data = await r.json();
var brut = data[source.clef];
if (!Array.isArray(brut) || !brut.length) throw new Error('vide');
return { data: data, brut: brut };
}
async function charger() {
var lu = null, source = null;
for (var i = 0; i < SOURCES.length && !lu; i++) {
try {
lu = await lire(SOURCES[i]);
source = SOURCES[i];
} catch (_) { /* on essaie la source suivante */ }
}
if (!lu) {
etat.innerHTML = 'La liste n\'a pas pu être chargée. ' +
'Le wiki reste consultable sur <a href="https://wiki.alpinux.org">wiki.alpinux.org</a>.';
return;
}
toutes = lu.brut
.map(function (page) {
var d = new Date(page.date);
return (page && page.titre && page.url && !isNaN(d)) ?
{ titre: page.titre, url: page.url, date: page.date,
nouveau: !!page.nouveau, rubrique: page.rubrique || '', d: d } : null;
})
.filter(Boolean)
.sort(function (a, b) { return b.d - a.d; });
if (!toutes.length) {
etat.textContent = 'Le wiki n\'annonce aucune page pour le moment.';
return;
}
etat.hidden = true;
filtre.hidden = false;
filtre.addEventListener('input', appliquerLeFiltre);
dessiner(toutes);
var quand = new Date(lu.data.genere);
genere.textContent =
(source.partiel
? 'Le wiki ne publie pour l\'instant que ses vingt dernières pages. '
: '') +
(isNaN(quand) ? '' : 'Liste publiée par le wiki le ' +
quand.toLocaleDateString('fr-FR', { day: 'numeric', month: 'long', year: 'numeric' }) +
' à ' + quand.toLocaleTimeString('fr-FR', { hour: '2-digit', minute: '2-digit' }) + '.');
genere.hidden = !genere.textContent;
}
document.addEventListener('DOMContentLoaded', charger);
})();
</script>
</body>
</html>