Příručka:Konvence pro psaní kódu/SVG
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"?> <svgxmlns="http://www.w3.org/2000/svg"width="20"height="20"viewBox="0 0 20 20"> <title> subtract </title> <pathd="M4 9h12v2H4z"/> </svg>
Pro minimalisty lze kreslit úplně stejně
<?xml version="1.0"?> <svgxmlns="http://www.w3.org/2000/svg"width="20"height="20"> <pathd="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"?> <svgxmlns="http://www.w3.org/2000/svg"width="264"height="162"viewBox="0 0 264 162"> <title> BetaFeaturesscreenshottemplate </title> <defs> <clipPathid="jagged-edge"> <pathd="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> <gfill="#eaecf0"clip-path="url(#jagged-edge)"> <pathid="background"fill="#fff"d="M0 0h264v162H0"/> <pathid="logo"d="M11 22c0-8 6-14 14-14s14 6 14 14-6 14-14 14-14-6-14-14M38 45v-5H13v5h25"/> <pathid="sidebar"d="M38 163V58H13v106h25"/> <pathid="personal-tools"d="M233 5h26v6h-26V5zM209 5h22v6h-22zM185 5h22v6h-22zM162 5h13v6h-13zM177 5h6v6h-6zM154 5h6v6h-6z"/> <pathid="search-input"d="M258 16v4h-92v-4h92m1-1h-94v6h94v-6z"/> <pathid="search-icon"d="M168 17h2v2h-2z"/> <pathid="article"d="M252 162V29H48v133z"/> <pathid="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 natrue
. 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á IDMůž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]
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]
cleanupNumericValues
Rozbije některé soubory [25]
minifyStyles
Rozbije 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]
removeStyleElement
Rozbije některé soubory[31]
removeOffCanvasPaths
Rozbije některé soubory[32]
removeElementsByAttr
Rozbije některé soubory[35]
convertStyleToAttrs
Rozbije některé soubory[36]
cleanupNumericValues
Rozbije některé soubory [41]
inlineStyles
Porušuje některé funkce CSS[42]
reusePaths
Rozbije 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)
července 2025 SVGO v4.0.0+ compatibility, removing removeTitle
and removeViewBox
from preset-default config override as they are false
by default now. (phab:T399676)
č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 with v4.0.0+ * Recommended options from: * 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, // If the SVG doesn't start with an XML declaration, then its MIME type will be detected as "text/plain" rather than "image/svg+xml" by libmagic and, consequently, MediaWiki's CSSMin CSS minifier. // libmagic's default database currently requires that SVGs contain an XML declaration: // 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 removeEmptyContainers:false,// https://github.com/svg/svgo/issues/1194 https://github.com/svg/svgo/issues/1618 convertTransform:false,// https://github.com/svg/svgo/issues/988 https://github.com/svg/svgo/issues/1021 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, // Configure the indent to tabs (default 4 spaces) used by '--pretty' here. 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"
astroke-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ý srx="..."
, bude obtížnější jej číst/upravovat. - Odstraňte nepotřebné
fill-rule="..."
aclip-rule="..."
. Tato pravidla mají vliv pouze na určité cesty, např. když se cesta protne. - Hledejte chyby zaokrouhlení IEEE jako
0.999999998
nebo1.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é:
- SvgWorkAroundBot
- SVGOMG
- scour
- svgcleaner
- 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
- ↑ https://github.com/deepsweet
- ↑ https://github.com/GreLI
- ↑ https://github.com/svg/svgo/commit/b1f3a62809e5b6f73c4ebae4bc792cb18f5ce6c5
- ↑ Still maintained?
- ↑ Call for new maintainer(s)
- ↑ https://github.com/TrySound
- ↑ https://github.com/svg/svgo/issues/1021
- ↑ c:Help:SVG_guidelines#Invalid elements that should be replaced (id=)
- ↑ https://github.com/svg/svgo/issues/1195
- ↑ Optimalizace SVG, které již byly nahrány (Neměli byste měnit vzhled obrázku, viz File:Oxygen15.04.1-computer-laptop.svg)
- ↑ c:Help:SVG_guidelines#Elements that should not be converted (CSS by se obecně neměly převádět)
- ↑ 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/.
- ↑ phab:T217990
- ↑ https://github.com/svg/svgo/issues/880
- ↑ https://github.com/svg/svgo/issues/1487
- ↑ https://github.com/svg/svgo/issues/1493
- ↑ https://github.com/svg/svgo/issues/1402
- ↑ c:Help:SVG_guidelines#Elements that should not be converted (rect by se často neměl převádět na cestu)
- ↑ https://github.com/svg/svgo/issues/1402
- ↑ phab:T327446
- ↑ 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)
- ↑ c:Help:SVG_guidelines#Useless elements that should be kept; názvy se používají k popisu/názvu souboru.
- ↑ 23.0 23.1 c:Help:SVG_guidelines#Invalid elements that should be kept
- ↑ c:Help:SVG_guidelines#Invalid elements that should be replaced; (Odstraňuje Flowtext)
- ↑ https://github.com/svg/svgo/issues/1080
- ↑ https://github.com/svg/svgo/issues/888
- ↑ c:Help:SVG_guidelines#Useless elements that should be kept (komentáře vysvětlují věci ve zdrojovém kódu)
- ↑ https://github.com/svg/svgo/issues/1096; udržujte mřížku a vodítko
- ↑ c:Help:SVG_guidelines#Useless elements that should be kept (Skupiny se používají k seskupování prvků.)
- ↑ https://github.com/svg/svgo/issues/1057
- ↑ https://github.com/svg/svgo/issues/946
- ↑ https://github.com/svg/svgo/issues/1732
- ↑ https://github.com/svg/svgo/issues/1194
- ↑ https://github.com/svg/svgo/issues/1618
- ↑ https://github.com/svg/svgo/issues/945
- ↑ https://github.com/svg/svgo/issues/1735
- ↑ https://github.com/svg/svgo/issues/988
- ↑ https://github.com/svg/svgo/issues/1021
- ↑ https://github.com/svg/svgo/issues/1222
- ↑ https://github.com/svg/svgo/issues/1268
- ↑ https://github.com/svg/svgo/issues/1080
- ↑ https://github.com/svg/svgo/issues/1486
- ↑ https://github.com/svg/svgo/issues/1733
- ↑ https://github.com/Ede123
- ↑ https://github.com/scour-project/scour/commits/master?after=0609c596766ec98e4e2092b49bd03b802702ba1a+279&branch=master&qualified_name=refs%2Fheads%2Fmaster
- ↑ https://github.com/RazrFalcon
- ↑ https://www.w3.org/TR/SVG11/
- ↑ https://github.com/RazrFalcon/svgcleaner#cleaning-ratio
- ↑ https://github.com/RazrFalcon/svgcleaner#cleaning-ratio
- ↑ https://github.com/RazrFalcon/svgcleaner#cleaning-time