Aide:TemplateStyles
| Note : si vous modifiez cette page, vous acceptez de placer votre contribution sous licence CC0. Plus d’informations sont disponibles sur le projet Aide dans le domaine public. |
L'exension TemplateStyles permet de définir des styles et un comportement complexe des modèles (templates) à travers l'utilisation de fichiers CSS externes en référençant des pages wikis qui contiennent le CSS. Il est à noter que la possibilité de créer ou modifier des CSS est incluse dans les droits par défaut des utilisateurs autoconfirmés et donc elle est accessible aux personnes qui ne disposent pas des privilèges administrateurs d'interface.
Fonctionnement
Les contributeurs peuvent ajouter <templatestyles src="[des pages]" /> à une page donnée et le contenu de la page référencée sera analysé comme du code CSS, normalisé et chargé sur les pages où la balise <templatestyles> est utilisée (soit directement, soit par transclusion dans un modèle utilisé dans la page).
Le modèle de contenu de [une page] doit être sanitized-css (CSS nettoyé), c'est le modèle de contenu par défaut pour les sous-pages de l'espace de noms Template: se terminant par .css.
Il est recommandé d'enregistrer la feuille de style d’un modèle dans une sous-page de ce modèle, par exemple enregistrer la feuille de style de Modèle:Test dans Modèle:Test/style.css.
Si [une page] n'a pas de préfixe d'espace de noms, l'espace de noms Modèle est supposé par défaut. À titre d’exemple si <templatestyles src="Foo/styles.css" /> est indiqué, la page chargée sera Modèle:Foo/styles.css.
La balise <templatestyles> doit être placée avant le contenu dont on veut préciser le style, idéalement au début du modèle ou au plus près, pour éviter un clignotement du contenu pas encore mis en forme si la page est déjà visible alors qu'elle n'est encore que partiellement rendue.
Quels sont les problèmes qu'il résout ?
TemplateStyles permet aux contributeurs d'associer des règles CSS à des pages spécifiques, fournissant toute la puissance des feuilles de style CSS tout en filtrant les éléments dangereux. Il fonctionne avec les outils de prévisualisation / débogage (comme TemplateSandbox) comme prévu.
Baisser les barrières d'accès et de maintenance va, on l'espère, permettre plus d'innovation dans la manière dont le visuel des modèles est conçu, moins de charge de maintenance, et une meilleure adaptation aux possibilités d'utiliser plusieurs types d'écrans (en particulier sur les appareils mobiles, qui comptent plus de la moitié des vues de page Wikipédia au moins depuis le )
Traditionnellement, il y a deux manières de mettre en forme les modèles (ou tout autre contenu) sur les pages Mediawiki, mais aucune d'entre-elles ne fonctionne de manière totalement satisfaisante :
- en utilisant des styles en ligne (c'est à dire du code HTML brut en ajoutant des attributs comme
style="margin: 10px;") - en utilisant certains messages système spéciaux tels que MediaWiki:Common.css
Pour les éléments de style en-ligne
- Il n'y a pas de séparation entre le contenu et la mise en forme. Dans les cas où le contenu ne provient pas d'un modèle (comme les tableaux dans les articles), le wikicode devient trop confus pour la plupart des contributeurs.
- Puisque les styles sont mélangés avec le wikicode, la mise en évidence de la syntaxe et les autres formes de support d'édition par CSS sont difficiles ou impossibles.
- Les éléments de style doivent être répétés pour chaque élément HTML auquel ils s'appliquent, ce qui entraîne beaucoup de copier-coller et de code difficile à lire et à maintenir.
- Les attributs de style sont limités à un sous-ensemble de CSS. Plus important encore, les règles
@mediarequises pour la conception d'une page réactive ne fonctionnent pas, il est donc impossible de créer des modèles qui fonctionnent correctement sur une large gamme de tailles d'écran. De plus, les éléments de style en-ligne redéfinissent les feuilles de style CSS et les adaptations de l'utilisateur, de l'habillage ou celles liées à l'appareil qui deviennent plus difficiles.
Pour les pages système (MediaWiki:*.css)
- L'édition est réservée uniquement aux administrateurs d'interface, ce qui constitue un obstacle majeur à la participation.
- Les restrictions d'édition ne peuvent pas être supprimées car il n'y a aucun moyen de limiter les règles CSS qui peuvent être utilisées, et certaines d'entre elles pourraient être abusées pour suivre les adresses IP des lecteurs ou même exécuter des scripts dans certains navigateurs plus anciens.
- Les modifications sont impossibles à tester sans avoir été enregistrées préalablement. T112474
- Toutes les feuilles de style doivent être chargées sur toutes les pages (qu'elles utilisent les règles CSS ou non), ce qui gaspille la bande passante et rend le débogage plus difficile.
Est-ce sans danger ?
Oui ! TemplateStyles inclut un analyseur CSS complet qui lit, re-sérialise, utilise les caractères d'échappement sur tout le code et supprime les règles CSS qu'il ne reconnait pas. L'analyseur est suffisamment avancé pour rejeter les ressources externes (telles que les images d'arrière-plan) tout en permettant d'utiliser les ressources locales. Les sélecteurs CSS sont réécrits de sorte qu'ils ne peuvent pas se référer à des éléments extérieurs au contenu de l'article. (Pour l'instant, il est toujours possible de modifier visuellement des zones en dehors du contenu de l'article, en déplaçant des parties de l'article, par exemple par un positionnement absolu. Ce n'est pas un changement par rapport au status quo, car une telle chose était déjà possible avec le wikicode et les styles en ligne).
Règles et propriétés CSS autorisées
Le 5 mars 2025, TemplateStyles accepte pas moins de 331 propriétés CSS et alias, incluant la vaste majorité de celles utilisées le plus souvent sur l'internet moderne, officiellement supportées par un ou plusieurs des navigateurs majeurs.
En plus des règles simple, les règles "at" (@) de @media, @page, @supports, @keyframe, @font-face/@font-feature-values sont également supportées (avec des restrictions sur le nom des polices de caractères qui doit commencer par TemplateStyles pour des raisons de sécurité).
La fonction CSS var() est autorisée uniquement dans les propriétés prenant une valeur de couleur unique et à l'intérieur des fonctions calc() .
La mise en place de propriétés personnalisées n'est pas permise.
| Déclarations de propriétés CSS autorisées par css-sanitizer [a][b][c] |
Chaque propriété est liée à une source de documentation sur son utilisation, cependant les icônes habituelles des liens externes ont été supprimées pour éviter qu'un lien vers des notes ou des références ne soit masqué par un autre lien apparaîssant en exposant.
Notes :
|
Cibler les définitions pour la navigation sur mobile ou sur station de travail
Les requête de média vous permettent d’appliquer des styles différents en fonction de la définition des dispositifs clients. Certains conseils impliquent de créer par défaut des styles adaptés au mobile, et d’encapsuler les styles « bureau » dans les requêtes de média.
Cibler un habillage spécifique
MediaWiki fournit plusieurs classes pour les balises html et body, dont une qui dépend du thème de l’utilisateur.
Celles ci peuvent être ciblées par un simple sélecteur pour les éléments html ou body, en incluant les classes imbriquées, suivi par une espace (dans la terminologie CSS, le combinateur descendant).
En règle générale, nous conseillons d’utiliser cette technique par soucis de cohérence de design, plutôt que de cibler les cibles mobiles et bureau car tous les thèmes peuvent être utilisés pour les définitions mobiles et bureau. Voir aussi la section sur la navigation mobile et station de travail.
/* Les éléments avec la classe foo auront un texte en rouge dans tous les habillages. */
.foo { color: red; }
/* Redéfinir la couleur de cet élément en vert pour l'habillage Vector seulement. */
body.skin-vector .foo { color: green; }
/* Ajoutez un bord rouge si le navigateur n'a pas activé JavaScript. */
html.client-nojs .foo { border: 1px solid red; }
/* Déclarer la même bordure en vert pour l'habillage Vector. */
html.client-nojs body.skin-vector .foo { border-color: green; }
/* Ceci ne fonctionne pas; il faut sélectionner l'élément 'body'. */
.skin-vector .foo { background: orange; }
/* Cela ne fonctionne pas non plus; il faut utiliser le combinateur descendant. */
body.skin-vector > .foo { background: orange; }
body.skin-vector ~ .foo { background: orange; }
html.client-nojs > body.skin-vector .foo { background: orange; }
Utiliser les styles dans les messages MediaWiki
Pour empêcher un utilisateur malveillant de mélanger des parties du document qui seraient à l'extérieur de la zone de contenu principal, toutes les règles CSS sont automatiquement préfixées par la classe CSS mw-parser-output .
Si vous utilisez un modèle basé sur TemplateStyles en dehors de la zone de contenu (par exemple dans la notice de site), vous devez personnellement fournir cette classe, en encapsulant le modèle dans quelquechose comme <div class="mw-parser-output">…</div>.
Ordre de surcharge des styles CSS
La règle CSS appliquée est choisie d'après la spécificité (en gros, la complexité du sélecteur - par exemple div.foo { margin: 10px } est plus spécifique que .foo { margin: 5px }).
Dans les cas de spécificité égale, le style CSS qui vient en dernier dans le document remplace les styles précédents.
MediaWiki:Common.css, les autres scripts de site, les scripts utilisateur et les gadgets sont chargés dans la section <head> de la page.
Les feuilles de style TemplateStyles sont chargées dans la section <body>, elles surchargent donc les scripts utilisateurs et les règles de gadgets de spécificité égale, et dans le cas de deux règles TemplateStyles, la seconde remplace la première.
(Notez cependant que les règles TemplateStyles sont dédoublonnées: si la même feuille de style est référencées plusieurs fois sur une page, elle est insérée seulement la première fois.
Notez également que « plus tard » est relatif à la position dans le document, pas à l’ordre de chargement. Les gadgets ajoutent leur CSS après le chargement complet de la page, en manipulant la page à l'aide de JavaScript ; quelques-un ajoutent leur CSS à la demande quand l'utilisateur fait certaines actions comme cliquer sur un bouton. Ils l’ajoutent néanmoins à la section « head », donc les règles de spécificité égale du CSS dans le « body » ont la précédence sur les règles des gadgets.)
Interaction des modules Lua avec les styles
TemplateStyles peut être appelé à partir d'un module Lua à l’aide de frame:extensionTag.
Voici un code d’exemple :
local p = {};
function p.templateStyle( frame, src )
return frame:extensionTag( 'templatestyles', '', { src = src } );
end
return p;
Fonctions anti-abus fournies
Le choix de stocker le CSS dans des pages séparées a été fait dés la conception, en partie pour faciliter l’intégration des outils standards anti-abus. Les pages CSS TemplateStyles ont leur propre modèle de contenu (sanitized-css) afin que leurs modifications puissent être suivies ou contrôlées par Extension:AbuseFilter, en utilisant la variable new_content_model.
L’inclusion de CSS est surveillée de la même manière que la transclusion de modèle, afin que vous puissiez voir les endroits ou une feuille de style est utilisée grâce au lien « Pages liées », voir quelles feuilles de styles sont utilisées sur une page donnée grâce au lien « Informations sur la page » (potentiellement également dans l’éditeur de page, en fonction de celui que vous utilisez), et voir quelles modifications récentes pourraient affecter une page en utilisant « Suivi des pages liées ».
TemplateStyles insère également des informations d’identification dans le code HTML ; pour trouver l’endroit d’où provient une règle spécifique, visionnez la source de la page, et les balises <style> auront un attribut comme data-mw-deduplicate="TemplateStyles:r123456", ou 123456 est le numéro de révision de la page de feuille de style (utilisable avec Special:Diff, par exemple).
Comment les décisions concernant TemplateStyles ont-elles été prises ?
L’idée d’inclure du CSS avec des modèles a été proposée et acceptée sous forme d'appel à commentaire (RFC — Request For Comments). Les détails techniques ont été déterminés dans un RFC et le mode d’utilisation a été détaillé dans une consultation des utilisateurs.
Qui est en charge de TemplateStyles ?
TemplateStyles fut initialement un projet de Wikimedia Reading Infrastructure team (précédé du travail exploratoire de Coren comme bénévole) formé en son temps de Brad Jorsch (développeur), Bryan Davis (gestionnaire) and Gergő Tisza (developpeur). Les personnes et les responsabilités ont évolué depuis; voir la page des personnes de maintenance pour les responsabilités actuelles.
Signaler les erreurs ou demander des fonctionnalités
Veuillez créer une nouvelle tâche pour le composant TemplateStyles dans Phabricator.
Voir l'outil en action
Voici quelques exemples vérifiés.
Cette fonctionnalité est active sur tous les sites Wikimedia.
Aide sur les erreurs
background-image
Si vous recevez l'erreur suivante lors de la publication des modifications de votre fichier CSS :
Il se peut que l'attribut url('...'); donné à background-image ne pointe pas vers une ressource locale.
L'analyseur syntaxique ne permet que des ressources locales (et rejette les ressources distantes).
Seules les URL qui pointent vers des ressources situées dans //upload.wikimedia.org/ sont autorisées, par exemple //upload.wikimedia.org/wikipedia/commons/8/83/MediaWiki-2023-button-proposal.svg pour le fichier File:MediaWiki-2023-button-proposal.svg.
Ces URL peuvent être obtenues en utilisant l'adresse URL vers laquelle pointent les liens vers les pages des fichiers Wikimédia Commons.
Ces liens comprennent ceux vers le Fichier d'origine ou l'un des liens vers les fichiers des Autres résolutions : tels que 1,024 × 1,024 pixels.
Voir aussi
- Extension:TemplateStyles – en particulier la section Mise en garde.
- Wikipedia:TemplateStyles – page de lignes de recommendations sur la Wikipedia anglophone.