7.2 KiB
Changelog — varlog
[Unreleased] — 2026-05-13
Performances
- Cache multi-niveaux pour les vues d'articles : temps de chargement réduit
de +5 s à ~0,4 s sur 1 062 articles.
- Mémoïsation de
getAll()etgetSearchIndex()dans la requête PHP ($allCache,$searchIndexCache) — évite les appels répétés. - Cache disque par article (
_cache/articles/{uuid}.json) avec invalidation par comparaisonmtime— 1 lecture au lieu de 2 par article. - Slug index (
_cache/slug_index.json) :getBySlug()en O(1) sans scanner tous les articles ; construit depuissearch_index.jsonen un seul fichier. getCategories()et$_allPublishedchargés depuissearch_index.jsonau lieu degetAll()— 1 fichier lu quelle que soit la taille du catalogue.search_index.jsonenrichi aveccover,created_at,author; rebuild automatique si le format est obsolète.SearchEngine::scorePool(): tokenise chaque article une seule fois pour N mots de titre (vs N passes séparées qui retokenisaient chaque article N fois et calculaient la similarité trigramme sur le contenu).- Le nombre de lectures de fichiers par vue d'article est désormais constant (~4), indépendamment du nombre total d'articles.
- Documentation :
docs/cache-architecture.md.
- Mémoïsation de
Corrigé
- Upload de fichiers (#48) : les fichiers > 8 Mo étaient rejetés silencieusement.
Le serveur utilise
mod_php(non PHP-FPM) ; les limites ont été corrigées dans/etc/php/8.3/apache2/php.ini:upload_max_filesize = 500M,post_max_size = 2048M. Le handleradd_filesdétecte désormais le dépassement et affiche un message d'erreur explicite au lieu de rediriger sans rien faire.
Fonctionnalités
-
Réactions visiteurs : trois boutons (👍 Utile / 🔥 Important / 🤔 À creuser) affichés sous chaque article. Toggle : recliquer retire la réaction. Accessible sans compte via un cookie UUID (
vl_vid, 1 an,HttpOnly). Comportement async fetch avec fallback formulaire natif (compatible CSPscript-src 'self'). Routes :POST /react. Table BDD :article_reactions. -
Commentaires avec vérification email : formulaire nom + email (non publié) + texte (2 000 caractères max). Protection honeypot + CSRF en session. Un code à 6 chiffres est envoyé par email (expire 24 h) ; le commentaire est auto-publié au clic sur le lien de confirmation. Routes :
POST /comment,GET /verify-comment/<6chiffres>. Table BDD :comments. -
Modération commentaires : onglet Commentaires dans
/admin/commentslistant tous les commentaires avec statut (vérifié / publié) et actions masquer/republier. Route :POST /comment-moderate. -
Page de confirmation à l'enregistrement : cliquer sur "Enregistrer" affiche une page intermédiaire avec le diff du contenu, le slug (déplacé ici depuis le formulaire, avec suggestion auto si le titre a changé), un commentaire de révision pré-rempli d'après les modifications détectées, et un aperçu SEO (snippet Google). La sauvegarde effective n'a lieu qu'après confirmation.
-
URLs propres : toutes les routes internes migrent vers des chemins lisibles. Les anciennes URLs
/?action=…restent fonctionnelles (compatibilité).Ancienne URL Nouvelle URL /?action=edit&uuid=<u>/edit/<u>/?action=sources&uuid=<u>/sources/<u>/?action=diff&uuid=<u>&rev=<n>/diff/<u>/<n>/?action=create/new/?action=admin[&tab=<t>]/admin[/<t>]/?action=categories/categories/?action=profile/profile/?action=about|legal|licenses|contact/about,/legal…/?action=regen_thumbs/admin/regen-thumbs/?action=add_files&uuid=<u>/files/<u>/add/?action=import_image&uuid=<u>/import/<u>/?cat=<cat>/categorie/<cat>/?cursor=<uuid>/page/<uuid> -
Moteur de recherche : index trigram+substring pré-construit (
search_index.json, reconstruit à chaque écriture), accessible depuis la navbar.
Corrections
- Métadonnées fichiers (sources) :
addFileMeta()ne sauvegardait pas l'auteur et l'URL source en raison d'un guardfile_exists()trop strict — supprimé. - Authentification OIDC (
State invalide.) :session_start()était appelé avantbootstrap.phpdans les fichiers OIDC, écrasant les paramètres de cookie (SameSite=Lax,Secure,HttpOnly) — corrigé dansstart.php,callback.phpetme.php. - Sidebar droite de l'article : classe Bootstrap
flex-nowrap-lginexistante, remplacée parflex-lg-nowrap— la sidebar ne tombe plus en bas de page. - Date d'affichage en liste :
created_ataffiché à la place depublished_at— corrigé avec fallback approprié. - Formulaire d'édition : "Fichiers existants" déplacé dans la colonne de droite ; attribution auteur/source étendue à tous les types de fichiers (pas seulement images).
- Historique des révisions : plus de révision créée si le contenu et le titre sont inchangés. Ajout des boutons de suppression par révision et suppression globale.
- Canonical URL catégorie : passe de
/?cat=…à/categorie/…. - Flux RSS :
/rsset/rss.xmlredirigent en 301 vers/feed(URL canonique) ; les articles des catégories privées sont exclus du flux ; la description est convertie depuis Markdown en texte brut.
2026-05-09
Fonctionnalités
- SEO : balises canonical,
sitemap.xml,robots.txt, JSON-LD (BlogPosting/WebSite),noindexsur les pages d'administration. - Recherche : page de résultats avec score de pertinence, mise en évidence des termes, lien vers la catégorie depuis les résultats.
- Support HEIC/HEIF : conversion automatique en JPEG à l'upload.
- Support SVG : upload autorisé, servi avec Content-Type correct.
- Avant-première : article visible en liste mais verrouillé avant sa date de publication.
- Pagination curseur : navigation par UUID de dernier article vu, sans offset SQL.
- Layout article 3 colonnes : sidebar gauche (catégorie), contenu central, sidebar droite (pièces jointes, liens externes, articles liés).
- Import depuis URL : téléchargement de fichiers distants avec extraction automatique des métadonnées (EXIF, OpenGraph, PDF).
- Gestion des pièces jointes dans le formulaire d'édition, avec attribution auteur/source affichée dans la vue article.
Corrections
- Login intégré dans
layout.php, chemins CSS en absolu. - Redéclaration de
url()dansconfig.php— fatal error corrigée. - Correction permissions
www-datasurdata/.
2026-04 et antérieur
- Flux RSS paginé (
/feed,/rss,/rss.xml) avec autodiscovery. - Stockage des articles en fichiers Markdown (migration depuis base de données).
- SSO via Keycloak/OIDC avec PKCE.
- Images de couverture (liste, vue article,
og:image). - Brouillons visibles uniquement par l'auteur.
- Formulaire de contact (CSRF, honeypot, rate-limit).
- Pages : mentions légales (LCEN/RGPD), licences, à propos.
- Auto-hébergement Bootstrap 5, police Inter, favicon SVG.
- Headers HTTP de sécurité, CSP stricte.