Příručka:Konvence pro psaní kódu/SVG

This page is a translated version of the page Manual:Coding conventions/SVG and the translation is 100% complete.

Tato stránka popisuje kódovací konvence používané v souborech MediaWiki codebase napsané v SVG. Viz také obecné konvence, které platí pro všechny programovací a značkovací jazyky, včetně SVG.

Jako optimalizační nástroj používáme SVGO, viz automatizovaná optimalizace níže.

Struktura kódu

Předpokladem je co nejjednodušší kód s ohledem na čitelnost.

Příklad jednoduchého optimalizovaného souboru – subtract.svg od 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>

Pro minimalisty lze kreslit úplně stejně

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

Příklad trochu složitějšího, optimalizovaného souboru – BetaFeatures šablona snímku obrazovky:

<?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>

V následující části vysvětlíme různé konvence kódování.

Automatická optimalizace (SVGO)

SVGO spravovali Kir Belevich (deepsweet [1]) a Lev Solntsev (GreLI [2]) od srpna 2012 [3] až 2016 [4][5] a od roku 2021 Bogdan Chadkin (TrySound [6]).

Jak používat

Je doporučeno instalovat svgo z https://github.com/svg/svgo nebo z npm pro příkazový řádek. K dispozici je také demo v prohlížeči, které vám pomůže s náhledem a obecným pochopením nástroje na https://jakearchibald.github.io/svgomg/. Toto by se však nemělo používat k vytváření produkčních souborů.

Bezpečné pluginy:

Protože některé výchozí zásuvné moduly (možnosti) SVGO mohou mít za následek neočekávaný vzhled u složitějších zásuvných modulů SVG, rozlišujeme mezi bezpečnými, podstatně méně bezpečnými a nebezpečnými zásuvnými moduly. Nastavte "transformPrecision" alespoň na 7, abyste snížili riziko poškození souborů.[7] Při používání nebezpečných zásuvných modulů se doporučuje ověřit před a po rozdílu na soubor, aby byla zajištěna vizuální kvalita.

Uvádíme pouze pluginy, které jsou změněny z výchozího nastavení nebo které mohou být neintuitivní:

  • Atributy řazení sortAttrs.
    Povolit nastavením na true. Ve výchozím nastavení zakázáno
  • Pokud je to možné, odstraňte nebo vyčistěte atribut enable-background.
    Zastaralý atribut, podporován pouze IE/Edge; ve výchozím nastavení povoleno

Viz SVGO Readme pro další povolené, bezpečné pluginy.

Pluginy, které je třeba pečlivě zvážit: 

cleanupIDs Odstraňte nepoužívaná a minifikujte použitá ID
Může negativně ovlivnit čitelnost[8] a porušit některé soubory[9]. Ve výchozím nastavení povoleno
removeRasterImages Obecné pravidlo je nebezpečné, může způsobit ztrátu dat, některé rastrové obrázky je obtížné rozpoznat[10]; ve výchozím nastavení zakázáno
inlineStyles Někteří uživatelé dávají přednost použití CSS než inlineStyles, což může snížit upravitelnost[11]
removeDoctype Pro SVG 1.1 není důvod jej odstraňovat, nicméně pro nadcházející SVG2-draft bude odepsán[12]

Nebezpečná pravidla k deaktivaci (nepoužívejte!):

convertPathData Může způsobit (i) nepřesné zobrazení, (ii) nesprávné zobrazení pomocí librsvg[13], (iii) porušení souborů[14][15][16]. Ve výchozím nastavení povoleno
cleanupListOfValues Zaokrouhlit/přepsat číselné seznamy přerušení Wikimedia-renderin[17]
convertShapeToPath Může snížit čitelnost[18] a rozbije soubory[19]
removeXMLProcInst Odebrat pokyny pro zpracování XML, neboli deklarace XML[20][21] <?xml version="1.0" encoding="UTF-8"?>
Problémy při zobrazení jako samostatný soubor v některých editorech, také možné problémy s interpretací typu MIME
Příklad: Pokud SVG nezačíná deklarací XML, pak bude jeho MIME typ detekován jako text/plain spíše než image/svg+xml pomocí libmagic a následně CSSMin CSS minifikátoru MediaWiki. Výchozí databáze libmagic aktuálně vyžaduje, aby SVG obsahovaly deklaraci XML. Deaktivovat nastavením na false. Ve výchozím nastavení povoleno
removeTitle Odstranit ‎<title>
Problematické z důvodů přístupnosti[22]. Nastaveno na false. Ve výchozím nastavení povoleno
removeDesc Odstranit ‎<desc>
Problematické z důvodu dostupnosti. Nastaveno na false. Ve výchozím nastavení povoleno
removeViewBox Odebrat atribut viewBox
V některých prohlížečích má za následek obtížný vzhled, a proto by měly být uvedeny oba, width/height a viewbox. Nastaveno na false. Ve výchozím nastavení povoleno
removeDimensions Odebere rozměry width/height, když bude dostupné viewbox
Jak je uvedeno výše. Nastaveno na false. Ve výchozím nastavení zakázáno
removeMetadata Možné informace o autorských právech[23]
removeHiddenElems Možné referenční čáry, data editoru, skutečný text před převodem, informace o autorských právech[23]
removeUnknownsAndDefaults odstraňuje Flow-Text [24]
cleanupNumericValues rozbíje některé soubory [25]
minifyStyles rozbíje některé soubory[26]
removeComments snižuje čitelnost a případně odstraňuje referenční řádky, data editoru, skutečný text před převodem, informace o autorských právech[27]
removeEditorsNSData snižuje upravitelnost pomocí editorů GUI-SVG[28]
collapseGroups reduced readability and editability [29] and breaks some files[30]
removeStyleElement rozbíje některé soubory[31]
removeOffCanvasPaths rozbíje některé soubory[32]
removeEmptyContainers rozbíje některé soubory[33][34]
removeElementsByAttr rozbíje některé soubory[35]
convertStyleToAttrs rozbíje některé soubory[36]
convertTransform rozbíje některé soubory[37][38][39][40]
cleanupNumericValues rozbíje některé soubory [41]
inlineStyles porušuje některé funkce CSS[42]
reusePaths rozbíje některé soubory [43]


Příklad bezpečné konfigurace

Všimněte si, že toto je pro svgo v1.x; v2.x přebírá různé argumenty CLI:

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

Použijte výstup pretty pro kód čitelný pro člověka a v procesu odsazení kódu po tabulátorech.

Příklad bezpečné konfigurace (.svgo.config.js)

června 2023 - Kompatibilita s SVGO v3.0.0+, změna názvu nového pluginu cleanupIds. (phab:T324899)

ledna 2022 - Spouštěcí skripty NPM umožnily konfiguraci SVGO. (phab:T246321)

/**
 * SVGO Configuration
 * Compatible to v3.0.0+
 * Doporučené možnosti od:
 * 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,
					// Pokud SVG nezačíná deklarací XML, pak bude jeho MIME typ detekován jako "text/plain" spíše než "image/svg+xml" pomocí libmagic a následně i CSSMin CSS minifikátor MediaWiki.
					// Výchozí databáze libmagic aktuálně vyžaduje, aby soubory SVG obsahovaly deklaraci 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,
		// Zde nakonfigurujte odsazení tabulátorů (výchozí 4 mezery), které používá '--pretty'.
		indent: "\t",
		pretty: true
	},
	multipass: true
}

Příklad bezpečné konfigurace (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
		} ]
	}
}

Ruční optimalizace

Kromě automatické optimalizace SVG je třeba zvážit další kroky:

  • Ponechte si následující kód 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", viz c:Help:směrnice SVG
  • Odeberte standalone="no" z instrukce zpracování XML, protože je výchozí
  • Malá písmena (pro lepší gzip) a hex hodnoty barev zkraťte, pokud je to možné, např. #fff místo #FFFFFF.
  • Atributy, které jsou stejné pro skupinu prvků, lze místo toho použít na společný rodič ‎<g> nebo někdy dokonce specifikovat příkazem <svg (viz příklad: CHE Bettens COA.svg)
    To může snížit upravitelnost nebo čitelnost
  • Spolehněte se na výchozí hodnoty, jako je fill="#000" a stroke-width="1".
  • Syntaxe <path d="…"/> je téměř vždy kratší než syntaxe základních tvarů, jako je ‎<polygon> nebo dokonce ‎<rect>, nicméně ‎<circle>, ‎<ellipse>, ‎<rect> jsou obecně snadněji čitelné/upravitelné, a proto je obecně preferováno použití specifičtějších.
  • V případě potřeby slučte prvky <path d="…"/>. Nedělejte to, pokud mají být obě cesty upravovány samostatně.
  • Neodstraňujte nadbytečný atribut ry="…", pokud je shodný s rx="…", bude obtížnější jej číst/upravovat.
  • Odstraňte nepotřebné fill-rule="…" a clip-rule="…". Tato pravidla mají vliv pouze na určité cesty, např. když se cesta protne.
  • Hledejte chyby zaokrouhlení IEEE jako 0.999999998 nebo 1.000000003. Taková čísla zabírají místo, aniž by poskytovala další informace. Téměř vždy je lze odříznout, aniž by se cokoli vizuálně změnilo.
  • Při kreslení pracujte s nezlomkovou pixelovou mřížkou a zarovnejte co nejvíce bodů na této mřížce. Tyto body mají mnohem vyšší šanci, že budou ve výsledném kódu reprezentovány jako krátká celá čísla.
  • Vyberte mřížku bez zlomků tak, aby odpovídala rysům existujícího obrázku, a upravte velikost nebo překreslete tvary tak, aby na mřížku dopadalo co nejvíce bodů. Výsledek může být špatně zarovnaný a lze jej oříznout pomocí viewBox="<left> <top> <width> <height>".

Pokud se chcete ponořit ještě hlouběji, existují další optimalizace pro kompresi doručení, například:

  • automatické zavírání cest (neboli odebrání z pro určité tvary),
  • při vytváření cest používejte relativní příkazy (místo absolutních příkazů, např. "m" pro "move by" (přesunout o), místo "M" pro "move to" (přesunout do)),
  • optimalizace pro zpětné reference komprese

Další nástroje

Další nástroje, které mohou být užitečné:

  1. SvgWorkAroundBot
  2. SVGOMG
  3. scour
  4. svgcleaner
  5. další možnosti naleznete na stránce Nápověda:Pokyny pro SVG#Jak optimalizovat.

scour

Popis a historie

Tento optimalizátor byl jedním z prvních optimalizátorů: Od roku 2009 je součástí instalace Inkscape a lze jej používat ukládání souborů Inkscape pomocí "Optimalizovaného Inkscape SVG" a v roce 2013 [45] oddělené do samostatného projektu dostupného na https://github.com/scour-project/scour. Spravuje jej Inscape-Developer Patrick Storz (Ede123).[44]

Jak používat

Můžete jej použít v prohlížeči za https://svgworkaroundbot.toolforge.org/ nebo jej nainstalovat přes pip install scour z příkazového řádku (Linux-PC/Mac-PC/Windows).

bezpečné pluginy

Scour je velmi opatrný optimalizátor, nicméně některé pluginy stále mohou rozbít soubor nebo odstranit důležité neviditelné části, pro jistotu můžete použít 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

Popis a historie

Tento optimalizátor vyvíjel od ledna 2012 do roku 2022 Yevhenii Reizner.[46] Zaměřuje se na dodržování aktuálních standardů w3c (SVG1.1).[47] Ve srovnání s scour nebo svgo rozbije méně souborů [48], sníží velikost souboru o více [49] a výkon je mnohem rychlejší.[50]

Jak používat

Můžete jej použít v prohlížeči na https://svgworkaroundbot.toolforge.org/ nebo si jej stáhnout z https://github.com/RazrFalcon/svgcleaner-gui/releases.

bezpečné pluginy

Se soubory bude zacházeno podle standardů, ale někdy se mohou ukládat jiné než svg prvky, které jsou důležité pro čtení a/nebo úpravu souboru, pro jistotu můžete použít 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

Poznámky pod čarou

  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. c:Help:SVG_guidelines#Optimalizace SVG, které již byly nahrány (Neměli byste měnit vzhled obrázku, viz File:Oxygen15.04.1-computer-laptop.svg)
  11. c:Help:SVG_guidelines#Elements that should not be converted (CSS by se obecně neměly převádět)
  12. c:Help:SVG_guidelines#Useless elements that should be kept; jsou na to různé názory, ale je to nutné pro 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 (rect by se často neměl převádět na cestu)
  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 (VAROVÁNÍ: Deklarace XML nebyla nalezena a důrazně se doporučuje)
  22. c:Help:SVG_guidelines#Useless elements that should be kept; názvy se používají k popisu/názvu souboru.
  23. 23.0 23.1 c:Help:SVG_guidelines#Invalid elements that should be kept
  24. c:Help:SVG_guidelines#Invalid elements that should be replaced; (odstraňuje 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 (komentáře vysvětlují věci ve zdrojovém kódu)
  28. https://github.com/svg/svgo/issues/1096; udržujte mřížku a vodítko
  29. c:Help:SVG_guidelines#Useless elements that should be kept (Skupiny se používají k seskupování prvků.)
  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/Ede123
  45. https://github.com/scour-project/scour/commits/master?after=0609c596766ec98e4e2092b49bd03b802702ba1a+279&branch=master&qualified_name=refs%2Fheads%2Fmaster
  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