Manual:Coding conventions/SVG/fr

Category:Development guidelines/fr

Cette page décrit les conventions de codage utilisées pour les fichiers de la base de code MediaWiki écrits en SVG. Voir aussi les conventions générales qui s'appliquent à tous les langages de programmation et de balisage, y compris SVG.

Nous utilisons SVGO comme outil d'optimisation, voir l'optimisation automatisée ci-dessous.

Structure du code 

Avoir un code minimal avec une lisibilité maximale est le premier objectif.

Exemple de fichier optimisé simple – subtract.svg de OOUI :

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
	<title>
		subtract
	</title>
	<path d="M4 9h12v2H4z"/>
</svg>

Pour les minimalistes, vous pouvez dessiner exactement la même chose avec

<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20">
    <path d="m4,9h12v2H4"/>
</svg>

Exemple pour un fichier légèrement plus complexe et optimisé – modèle de capture d'écran BetaFeatures :

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="264" height="162" viewBox="0 0 264 162">
    <title>
        BetaFeatures screenshot template
    </title>
    <defs>
        <clipPath id="jagged-edge">
            <path d="M0 0v152l12 10 12-10 12 10 12-10 12 10 12-10 12 10 12-10 12 10 12-10 12 10 12-10 12 10 12-10 12 10 12-10 12 10 12-10 12 10 12-10 12 10 12-10V0z"/>
        </clipPath>
    </defs>
    <g fill="#eaecf0" clip-path="url(#jagged-edge)">
        <path id="background" fill="#fff" d="M0 0h264v162H0"/>
        <path id="logo" d="M11 22c0-8 6-14 14-14s14 6 14 14-6 14-14 14-14-6-14-14M38 45v-5H13v5h25"/>
        <path id="sidebar" d="M38 163V58H13v106h25"/>
        <path id="personal-tools" d="M233 5h26v6h-26V5zM209 5h22v6h-22zM185 5h22v6h-22zM162 5h13v6h-13zM177 5h6v6h-6zM154 5h6v6h-6z"/>
        <path id="search-input" d="M258 16v4h-92v-4h92m1-1h-94v6h94v-6z"/>
        <path id="search-icon" d="M168 17h2v2h-2z"/>
        <path id="article" d="M252 162V29H48v133z"/>
        <path id="border" d="M0 0v162h264V0zm1 1h262v150.533l-11 9.166-12-10-12 10-12-10-12 10-12-10-12 10-12-10-12 10-12-10-12 10-12-10-12 10-12-10-12 10-12-10-12 10-12-10-12 10-12-10-12 10-11-9z"/>
    </g>
</svg>

Nous expliquerons les différentes conventions de codage dans la section suivante.

Optimisation automatisée (SVGO)

SVGO a été maintenu par Kir Belevich (depsweet[1]) et Lev Solntsev (GreLI[2]) de août 2012[3] à 2016[4][5] et depuis 2021 par Bogdan Chadkin (TrySound[6]).

Utilisation

Est-il recommandé d'installer svgo à partir de https://github.com/svg/svgo ou de npm pour la ligne de commande. Il existe aussi sur https://jakearchibald.github.io/svgomg/ une démonstration dans le navigateur qui vous aidera avec un aperçu et la comprehension générale de l'outil. Toutefois, il ne faut pas pour autant utiliser cela pour créer des fichiers de production.

Greffons sûrs

Comme certains greffons SVGO par défaut (options) peuvent entraîner une présentation inattendue avec des SVG plus complexes, nous faisons la différence entre les plugins sûrs, ceux qui le sont beaucoup moins sûrs et les dangereux. Initialisez transformPrecision au moins à 7 pour réduire le risque d'avoir des fichiers corrompus.[7] Si vous utilisez des greffons dangereux, nous vous recommandons de vérifier avant et après les diff de chaque fichier pour vous assurer de la qualité visuelle.

Mentionner uniquement les greffons, dont les valeurs par défaut ont été modifiées, ou qui pourraient être contre-intuitifs :

  • Tri des attributs sortAttrs.
    Activé en initialisant true; désactivé par défaut
  • Supprimer ou nettoyer l'attribut enable-background si cleanupEnableBackground est possible.
    Attribut obsoléte, uniquement pris en charge par IE/Edge; activé par défaut

Voir le SVGO Readme des autres greffons sûrs activés.

Greffons à considérer avec précaution : 

cleanupIDs Supprimer les identifiants non utilisés et minimiser les identifiants utilisés
Peut affecter négativement la lisibilité[8] et corrompre certains fichiers[9]; activé par défaut
removeRasterImages En règle générale dangereux, pourrait causer la perte des données, certaines images matriciellles sont difficiles à repérer[10]; désactivé par défaut
inlineStyles Certains utilisateurs préfèrent utiliser le CSS que inlineStyles, peut réduire la possibilité de modifier[11]
removeDoctype Pour SVG 1.1 il n'y a pas de raison de le supprimer, mais pour SVG2 en cours d'élaboration, il sera obsolète.[12]

Règles non sûres qu'il faut désactiver (ne pas utiliser !) :

convertPathData Peut provoquer (i) un rendu imprécis, (ii) un mauvais rendu à cause de librsvg[13], (iii) des fichiers corrompus[14][15][16]; activé par défaut
cleanupListOfValues Arrondir ou redéfinir les listes de numéros perturbe le rendu Wikimedia[17]
convertShapeToPath peut réduire la lisibilité[18] et corrompt les fichiers[19]
removeXMLProcInst Supprimer les instructions de traitement XML, ou la déclaration XML[20][21] <?xml version="1.0" encoding="UTF-8"?>
Problèmes lorsqu'ils sont considérés comme un fichier indépendant dans certains éditeurs, également des problèmes possibles avec l'interprétation du type MIME
Exemple : si le SVG ne commence pas par une déclaration XML, son type MIME sera alors détecté comme text/plain plutôt que comme image/svg+xml par libmagic et par conséquent, par la réduction CSSMin de MediaWiki. La base de données par défaut de libmagic exige actuellement que les fichiers SVG contiennent une déclaration XML; désactiver en mettant la valeur false; activé par défaut
removeTitle Supprimer <title>
Pose des problèmes pour des raisons d'accessibilité[22]; initialisé à false; activé par défaut
removeDesc Supprimer <desc>
Problématique pour des raisons d'accessibilité; initialisé à false; activé par défaut
removeViewBox Supprimer l'attribut viewBox
Produit un aspect perturbé avec certains navigateurs, c'est pourquoi à la fois width (ou height) et viewbox doivent être fournis; initialisé à false; activé par défaut
removeDimensions Supprimer les dimensions width / height lorsque viewbox est disponible
Comme ci-dessus; initialiser à false; désactivé par défaut
removeMetadata Informations possibles sur les droits d'auteur[23]
removeHiddenElems Eventuellement les lignes de référence, les données de l'éditeur, le texte réel avant la conversion, les informations sur le droit d'auteur[23]
removeUnknownsAndDefaults supprime Flow-Text [24]
cleanupNumericValues corrompt certains fichiers [25]
minifyStyles corrompt certains fichiers[26]
removeComments réduit la lisibilité et éventuellement supprime les lignes de référence, les données de l'éditeur, le texte réel avant la conversion, les informations sur le droit d'auteur[27]
removeEditorsNSData réduit la possibilité de modifier avec les éditeurs graphiques SVG.[28]
collapseGroups réduit la lisibilité et la modification [29] et corrompt certains fichiers[30]
removeStyleElement corrompt certains fichiers[31]
removeOffCanvasPaths corrompt certains fichiers[32]
removeEmptyContainers corrompt certains fichiers[33][34]
removeElementsByAttr corrompt certains fichiers[35]
convertStyleToAttrs corrompt certains fichiers[36]
convertTransform corrompt certains fichiers[37][38][39][40]
cleanupNumericValues corrompt certains fichiers [41]
inlineStyles corrompt certaines fonctionnalités CSS[42]
reusePaths corrompt certains fichiers [43]

Exemple de configuration sûre

Notez que ceci concerne SVGO v1.x; v2.x prend différents arguments CLI :

$ svgo path/to/image.svg --disable={cleanupIDs,convertPathData,removeDesc,removeTitle,removeViewBox,removeXMLProcInst} --enable='sortAttrs' --pretty --final-newline

Utiliser la sortie pretty pour le code lisible par un humain et dans le code d'indentation du processus à l'aide des tabulations.

Exemple de configuration sûre (.svgo.config.js)

juin 2023 - Compatibilité SVGO v3.0.0+, modification du nom du greffon cleanupIds. (phab:T324899)

janvier 2022 - Les scripts d'exécution NPM ont activé la configuration SVGO. (phab:T246321)

/**
 * SVGO Configuration
 * Compatible to v3.0.0+
 * Options recommandées de :
 * https://www.mediawiki.org/wiki/Manual:Coding_conventions/SVG#Exemplified_safe_configuration
 */

'use strict';

module.exports = {
	plugins: [
		{
			// Set of built-in plugins enabled by default.
			name: 'preset-default',
			params: {
				overrides: {
					cleanupIds: false,
					removeDesc: false,
					removeTitle: false,
					removeViewBox: false,
					// Si le fichier SVG ne commence pas par une déclaration XML, son type MIME sera détecté comme étant ''text/plain'' plutôt que ''image/svg+xml'' par libmagic et, par conséquent la réduction CSS CSSMin de MediaWiki.
					// La base de données par défaut de libmagic exige actuellement que les SVG contiennent une déclaration XML :
					// https://github.com/threatstack/libmagic/blob/master/magic/Magdir/sgml#L5
					removeXMLProcInst: false // https://phabricator.wikimedia.org/T327446
					convertPathData: false // https://github.com/svg/svgo/issues/880 https://github.com/svg/svgo/issues/1487
					removeMetadata: false // Copyright-Violation
					removeHiddenElems: false // source for converted text2path
					removeUnknownsAndDefaults: false // removes Flow-Text: https://commons.wikimedia.org/wiki/User:JoKalliauer/RepairFlowRoot
					cleanupNumericValues: false // https://github.com/svg/svgo/issues/1080
					minifyStyles: false //https://github.com/svg/svgo/issues/888
					removeComments: false //reduces readability
					removeEditorsNSData: false // https://github.com/svg/svgo/issues/1096
					collapseGroups: false // https://github.com/svg/svgo/issues/1057
					removeOffCanvasPaths: false //https://github.com/svg/svgo/issues/1732
					removeEmptyContainers: false // https://github.com/svg/svgo/issues/1194 https://github.com/svg/svgo/issues/1618
					convertTransform: fasle // https://github.com/svg/svgo/issues/988 https://github.com/svg/svgo/issues/1021
					cleanupNumericValues: false // https://github.com/svg/svgo/issues/1080
					inlineStyles: false // https://github.com/svg/svgo/issues/1486
				}
			}
		},
		'removeRasterImages',
		'sortAttrs'
	],
	// Set whitespace according to Wikimedia Coding Conventions.
	// @see https://github.com/svg/svgo/blob/main/lib/stringifier.js#L39 for available options.
	js2svg: {
		eol: 'lf',
		finalNewline: true,
		// Configurer les indentations en tabulations (4 espaces par défaut) utilisées par ''--pretty'' ici.
		indent: "\t",
		pretty: true
	},
	multipass: true
}

Exemple de configuration sûre (Gruntfile.js)

svgmin: {
	options: {
		js2svg: {
			indent: '\t',
			pretty: true
		},
		plugins: [ {
			cleanupIDs: false
		}, {
			removeDesc: false
		}, {
			removeRasterImages: true
		}, {
			removeTitle: false
		}, {
			removeViewBox: false
		}, {
			removeXMLProcInst: false
		}, {
			sortAttrs: true
		}, {
			convertPathData: false // https://github.com/svg/svgo/issues/880
		}, {
			removeMetadata: false // Copyright-Violation
		}, {
			removeHiddenElems: false // source for converted text2path
		}, {
			removeUnknownsAndDefaults: false // removes Flow-Text
		}, {
			cleanupNumericValues: false // https://github.com/svg/svgo/issues/1080
		}, {
			minifyStyles: false //https://github.com/svg/svgo/issues/888
		}, {
			removeComments: false //reduces readability
		}, {
			removeEditorsNSData: false // https://github.com/svg/svgo/issues/1096
		}, {
			collapseGroups: false // https://github.com/svg/svgo/issues/1057
		}, {
			removeOffCanvasPaths: false //https://github.com/svg/svgo/issues/1732
		}, {
			removeEmptyContainers:false // https://github.com/svg/svgo/issues/1194 https://github.com/svg/svgo/issues/1618
		}, {
			convertTransform: fasle // https://github.com/svg/svgo/issues/988 https://github.com/svg/svgo/issues/1021
		}, {
			cleanupNumericValues: false // https://github.com/svg/svgo/issues/1080
		}, {
			inlineStyles: false // https://github.com/svg/svgo/issues/1486
		} ]
	}
}

Optimisation manuelle

Au-delà de l'optimisation automatisée des SVG, plusieurs étapes sont à considérer :

  • garder le code xml:space="preserve", <!--, <title, \n, \r, \t, <g, visibility="hidden", opacity="0", display="none", requiredFeatures=", <?xml version="1.0" encoding="UTF-8"?>, <defs>, <rect, <style type="text/css", class=", data-name=, inkscape:label, <rdf:RDF, aria-label=, <inkscape:grid, <sodipodi:guide, sodipodi:cx=, sodipodi:cy=, sodipodi:rx=, sodipodi:ry=, sodipodi:type="arc", vector-effect=, inkscape:groupmode="layer", inkscape:label=, sodipodi:role="line" suivant, voir c:Help:SVG guideline
  • Supprimer standalone="no" de l'instruction de traitement XML car elle est par défaut.
  • Mettre en minuscules (pour une meilleure compression gzip) et raccourcir les valeurs de couleur hexadécimales si possible, par exemple #fff au lieu de #FFFFFF.
  • Les attributs qui sont les mêmes pour un groupe d'éléments peuvent être appliqués à un parent commun <g> à la place, ou parfois même spécifiés par l'instruction <svg (voir par exemple : CHE Bettens COA.svg).
    Ceci pourrait réduire la possibilité de modifier ou de lire
  • S'appuyer sur les valeurs par défaut comme fill="#000" et stroke-width="1".
  • La syntaxe de <path d="…"/> est presque toujours plus courte que la syntaxe des formes de base comme <polygon> ou même <rect>, cependant <circle>, <ellipse>, <rect> sont généralement plus faciles à lire ou à éditer, donc il est généralement préférable d'utiliser des formes plus spécifiques.
  • Fusionner les éléments <path d="…"/> où c'est possible. Ne faites pas cela si les deux chemins doivent être modifiés séparément.
  • Ne supprimez pas l'attribut ry="…" redondant quand il est identique à rx="…" il devient plus difficile à lire ou à modifier.
  • Supprimer les fill-rule="…" et clip-rule="…" inutiles. Ces règles n'ont d'effet que sur certains chemins, par exemple lorsqu'un chemin se recoupe.
  • Voir les erreurs d'arrondi IEEE comme 0.999999998 ou 1.000000003. Ces numéros occupent de la place sans fournir réellement d'informations supplémentaires. Ils peuvent presque toujours être supprimés sans rien changer visuellement.
  • Travaillez avec une grille de pixels non fractionnée pendant le dessin et alignez un maximum de points possibles sur cette grille. Ces points ont une chance beaucoup plus grande d'être représentés par de petits nombres entiers dans le code résultant.
  • Choisissez une grille non fractionnée pour que celle-ci corresponde aux caractéristiques d'une image existante, et redimensionnez ou redessinez les formes afin que le plus de points possible se retrouvent sur la grille. Le résultat peut ne pas être aligné et vous pouvez le couper en utilisant viewBox="<gauche(left)> <haut(top)> <largeur(width)> <hauteur(height)>".

Si vous voulez creuser un peu plus le sujet, il existe d'autres optimisations pour compresser la diffusion telles que :

  • reboucler les chemins (en supprimant z pour certaines formes),
  • utiliser les commandes relatives lorsque vous créez les chemins (au lieu des commandes absolues, par exemple "m" pour "move by", au lieu de "M" pour "move to"),
  • optimiser pour compresser les références arrière

Autres outils

Autres outils qu'il est intéressant de connaître :

  1. SvgWorkAroundBot
  2. SVGOMG
  3. scour
  4. svgcleaner
  5. voir Comment optimiser le SVG pour d'autres options.

scour

Description et historique

Cet optimiseur a été l'un des premiers : Depuis 2009, il est inclus avec l'installation d'Inkscape, il peut être utilisé en sauvegardant les fichiers Inkscape sous SVG Inkscape Optimisé, et en 2013[44] a été séparé en un projet autonome disponible sur https://github.com/scour-project/scour. Il est maintenu par le développeur Inscape Patrick Storz (Ede123).[45]

Utilisation

Vous pouvez l'utiliser dans le navigateur sur https://svgworkaroundbot.toolforge.org/ ou l'installer via pip install scour à partir de la ligne de commande (sur Linux-PC/Mac-PC/Windows).

Greffons sûrs

Scour est un optimiseur très prudent, cependant certains greffons peuvent toujours corrompre le fichier ou supprimer des parties importantes non visibles; pour vous protéger, vous pouvez utiliser scour -i input.svg -o output.svg --disable-simplify-colors --disable-style-to-xml --disable-group-collapsing --keep-editor-data --keep-unreferenced-defs --protect-ids-noninkscape --disable-embed-rasters --set-precision=8 --set-c-precision=8

svgcleaner

Description et historique

Cet optimiseur a été développé de janvier 2012 à 2022 par Yevhenii Reizner.[46] Il se concentre sur le respect des normes actuelles w3c (SVG1.1).[47] Comparé à scour ou svgo, il corrompt moins de fichiers[48], réduit davantage[49] la taille du fichier et la performance est plus rapide.[50]

Utilisation

Vous pouvez l'utiliser dans le navigateur sur https://svgworkaroundbot.toolforge.org/ ou le télécharger à partir de https://github.com/RazrFalcon/svgcleaner-gui/releases.

Greffons sûrs

Les fichiers seront traités selon les normes, mais parfois pour sécuriser les éléments non-svg du fichier qui sont importants pour la lecture et / ou la modification du fichier, vous pouvez utiliser svgcleaner input.svg output.svg --allow-bigger-file --indent yes --resolve-use no --apply-transform-to-gradients yes --apply-transform-to-shapes yes --convert-shapes no --group-by-style no --join-arcto-flags no --join-style-attributes no --merge-gradients yes --regroup-gradient-stops yes --remove-comments no --remove-declarations no --remove-default-attributes yes --remove-desc no --remove-dupl-cmd-in-paths yes --remove-dupl-fegaussianblur yes --remove-dupl-lineargradient yes --remove-dupl-radialgradient yes --remove-gradient-attributes yes --remove-invalid-stops yes --remove-invisible-elements no --remove-metadata no --remove-needless-attributes yes --remove-nonsvg-attributes no --remove-nonsvg-elements no --remove-text-attributes no --remove-title no --remove-unreferenced-ids no --remove-unresolved-classes yes --remove-unused-coordinates yes --remove-unused-defs yes --remove-version yes --remove-xmlns-xlink-attribute yes --simplify-transforms yes --trim-colors yes --trim-ids no --trim-paths yes --ungroup-defs yes --ungroup-groups no --use-implicit-cmds yes --list-separator comma --paths-to-relative yes --remove-unused-segments yes --convert-segments yes --apply-transform-to-paths yes --coordinates-precision 2 --paths-coordinates-precision 5 --properties-precision 3 --transforms-precision 7

Références

  1. https://github.com/deepsweet
  2. https://github.com/GreLI
  3. https://github.com/svg/svgo/commit/b1f3a62809e5b6f73c4ebae4bc792cb18f5ce6c5
  4. Still maintained?
  5. Call for new maintainer(s)
  6. https://github.com/TrySound
  7. https://github.com/svg/svgo/issues/1021
  8. c:Help:SVG_guidelines#Invalid elements that should be replaced (id=)
  9. https://github.com/svg/svgo/issues/1195
  10. Optimisation des SVG déjà téléversés (vous ne devez pas modifier l'aspect de l'image, voir File:Oxygen15.04.1-computer-laptop.svg)
  11. c:Help:SVG_guidelines#Elements that should not be converted (Le CSS ne doit généralement pas être converti)
  12. c:Help:SVG_guidelines#Useless elements that should be kept; Il y a différents points de vue à ce sujet, mais il est nécessaire pour https://validator.w3.org/.
  13. phab:T217990
  14. https://github.com/svg/svgo/issues/880
  15. https://github.com/svg/svgo/issues/1487
  16. https://github.com/svg/svgo/issues/1493
  17. https://github.com/svg/svgo/issues/1402
  18. c:Help:SVG_guidelines#Elements that should not be converted (souvent rect ne doit pas être converti en chemin)
  19. https://github.com/svg/svgo/issues/1402
  20. phab:T327446
  21. https://commons.wikimedia.org/w/index.php?title=Commons:Commons_SVG_Checker&withJS=MediaWiki:CommonsSvgChecker.js (AVERTISSEMENT: déclaration XML non trouvée et fortement recommandée)
  22. c:Help:SVG_guidelines#Useless elements that should be kept; les titres sont utilisés pour décrire ou pour nommer le fichier.
  23. 1 2 c:Help:SVG_guidelines#Invalid elements that should be kept
  24. c:Help:SVG_guidelines#Invalid elements that should be replaced; (supprimer Flowtext)
  25. https://github.com/svg/svgo/issues/1080
  26. https://github.com/svg/svgo/issues/888
  27. c:Help:SVG_guidelines#Useless elements that should be kept (commentaires expliquant les choses dans le code source)
  28. https://github.com/svg/svgo/issues/1096; préserver la grille et le guide
  29. c:Help:SVG_guidelines#Useless elements that should be kept (Les groupes sont utilisés pour grouper les éléments.)
  30. https://github.com/svg/svgo/issues/1057
  31. https://github.com/svg/svgo/issues/946
  32. https://github.com/svg/svgo/issues/1732
  33. https://github.com/svg/svgo/issues/1194
  34. https://github.com/svg/svgo/issues/1618
  35. https://github.com/svg/svgo/issues/945
  36. https://github.com/svg/svgo/issues/1735
  37. https://github.com/svg/svgo/issues/988
  38. https://github.com/svg/svgo/issues/1021
  39. https://github.com/svg/svgo/issues/1222
  40. https://github.com/svg/svgo/issues/1268
  41. https://github.com/svg/svgo/issues/1080
  42. https://github.com/svg/svgo/issues/1486
  43. https://github.com/svg/svgo/issues/1733
  44. https://github.com/scour-project/scour/commits/master?after=0609c596766ec98e4e2092b49bd03b802702ba1a+279&branch=master&qualified_name=refs%2Fheads%2Fmaster
  45. https://github.com/Ede123
  46. https://github.com/RazrFalcon
  47. https://www.w3.org/TR/SVG11/
  48. https://github.com/RazrFalcon/svgcleaner#cleaning-ratio
  49. https://github.com/RazrFalcon/svgcleaner#cleaning-ratio
  50. https://github.com/RazrFalcon/svgcleaner#cleaning-time
Category:Development guidelines/fr#Coding%20conventions/SVG/fr Category:SVG/fr
Category:Development guidelines/fr Category:SVG/fr