Utilisation du format SVG avec Spip
Spip Core : Les tickets en cours sur la prise en charge du format svg par spip
Le format SVG permettant d’inclure « potentiellement » des scripts js,
Cedric recommande de sanitizer les fichiers de ce type
Les SVG est géré en tant que document a l’upload, cependant les fichiers svg intégrés aux articles ne sont pas prévisualisés dans la preview du porteplume si ils sont inclus avec une balise object et ne peuvent pas être ajoutés au portfolio étant considérés comme inclus=embed dans la table de description des documents.
L’affichage en partie publique du site est correctement géré, Mais sans gestion avec la balise #LOGO_DOCUMENT : elle retournera toujours la vignette du MimeType, principalement due a l’utilisation de GD qui ne retournera rien sur le format svg n’étant pas pris en charge.
Les boites d’affichage de previsualisation des images de la médiathèque utilisant la balise #LOGO_DOCUMENT produiront le même résultat, pour que le svg soit correctement prévisualisé, il faut donc surcharger au minima quelque squelettes du plugin Medias.
Ajouter la gestion des svg dans le portfolio :
Faire un UPDATE sur la table spip_type_documents et passer le svg en inclus=images
UPDATE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bWFfYmFzZTwvY29kZT4="></span>.<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c3BpcF90eXBlc19kb2N1bWVudHM8L2NvZGU+"></span> SET <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+aW5jbHVzPC9jb2RlPg=="></span> = 'image' WHERE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c3BpcF90eXBlc19kb2N1bWVudHM8L2NvZGU+"></span>.<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZXh0ZW5zaW9uPC9jb2RlPg=="></span> = 'svg';
on peut ensuite ajouter au portfolio, et avoir un affichage prévisualisé avec le porteplume si on utilise le tag image, les balises object étant filtrés de la prévisualisation.
Surchargé quelques modèles de la médiathèque :
- modeles/document_casehtml|php
- document_desc.html
En remplaçant la balise #LOGO_DOCUMENT par exemple par
[(#EXTENSION|match{svg}|oui)
<a href="#URL_DOCUMENT" class="cboxElement hasbox" title="#EXTENSION - #TAILLE">
<img src="#FICHIER" width="150" height="150" class="spip_logo spip_logos">
</a>
]
[(#EXTENSION|match{svg}|non)
[(#LOGO_DOCUMENT{#URL_DOCUMENT}|image_reduire{150,150})]
]
Dans les articles / champ éditoriaux des objets :
Les documents
le modèle doc, n’affichera que la vignette du MIMETYPE svg
on utilisera donc le modèle <emb>
.
On peut lui spécifier une taille en passant au modèle les paramètres hauteur/largeur
<emb1|center|largeur=200px|hauteur=200px>
On peut aussi personnaliser son modèle en créant un modele dédié au svg.
Créer le fichier emb_svg.html
[(#REM)<!-- Modele d'inclusion du format svg
-->]
[(#REM)<!-- Modele d'inclusion du format svg
Différentes façons d'intégrer des graphiques SVG dans une page html :
* https://css-tricks.com/using-svg/
* http://tavmjong.free.fr/INKSCAPE/MANUAL/html/Web-Use.html#Web-Use-Inline
* https://developer.mozilla.org/fr/docs/Web/HTML/Element/object
* https://www.w3.org/TR/html5/embedded-content-0.html#the-object-element
* Article source du markup : https://www.smashingmagazine.com/2013/06/clown-car-technique-solving-for-adaptive-images-in-responsive-web-design/
@param largeur {valeur en px} - largeur desiree
@param hauteur {valeur en px} - hauteur
@param align {center|left|right} - alignement
@param role {application, document or img or presentation} - role aria
-->]
<BOUCLE_tous (DOCUMENTS types_documents){id_document=#ID}{tout}>
<div class='spip_document_#ID_DOCUMENT spip_documents[ spip_documents_(#ENV{align})]'[
style='[(#ENV{align}|match{^(left|right)$}|?{' '})float:#ENV{align};] (#ENV{align,center}|=={center}|?{'',' '})']>
<object tabindex="0" data='#URL_DOCUMENT'
type='#MIME_TYPE'[
width='(#ENV{largeur}|sinon{#LARGEUR})'][
height='(#ENV{hauteur}|sinon{#HAUTEUR})']
data="#URL_DOCUMENT"
role="[(#ENV{role,img})]"[
aria-label="(#TITRE)[: (#DESCRIPTION)]"]
>
[(#REM)<!-- Fallback : dans le cas des svg pourquoi ne pas utiliser la vignette en fallback -->]
<!--[if lte IE 8]>
[(#LOGO_DOCUMENT|inserer_attribut{width,#LARGEUR}
|inserer_attribut{height,#HAUTEUR}
|inserer_attribut{alt,#TITRE})]
<![endif]-->
</object>[
<div class='spip_doc_titre'><strong>(#TITRE)</strong></div>
][
<div class='spip_doc_descriptif'>(#DESCRIPTIF|PtoBR)[(#NOTES|PtoBR)]</div>
][
<div class="spip_doc_credits">(#CREDITS)</div>
]
</div>
</BOUCLE_tous>
Les Logos
Pour pouvoir utiliser des logos au format SVG, on doit actuellement installer le plugin logo-svg.
Disponible sur GitHub : https://github.com/cahri/spip-logo-svg.
Le fichier est inclus via la balise <img>
A noter que :
Le plugin surcharge le formulaire editer_logo, et ne sera pas compatible avec le plugin upload_html5.
r104881 permet d’utiliser upload_html5 avec du svg
Dans les squelettes
Utiliser les svg en Data UR
https://css-tricks.com/using-svg/#article-header-id-17
Comme expliqué précédemment, pas de gestion du cache au niveau serveur
<!-- Le filtre embarque_fichier :encodage en base64
http://www.spip.net/fr_article5538.html
http://caniuse.com/#feat=datauri
-->
[(#FICHIER|embarque_fichier)]
<!-- Mais le base64 n'est pas forcément la meilleur solution pour le format svg comme l'explique cet article
https://css-tricks.com/probably-dont-base64-svg/
Les datauri non-encodees en base64 doivent êtres urlencode pour etres interpretes par … Internet Explorer
http://caniuse.com/#feat=datauri
-->
[data:image/svg+xml;utf8,(#FICHIER|file_get_contents|urlencode)]
Intégrer le svg en inline
- avec file_get_contents :
[(#FICHIER|file_get_contents)]
- avec la balise spip #INCLURE
,
#INCLURE{#CHEMIN{mes_dessins/uneimagesvg}}
Dans ces 2 derniers cas, avec file_get_content
et #INCLURE
une balise <svg>
est insérée dans le code HTML, et il est possible d’agir sur son rendu au moyen des CSS.
En particulier, le style suivant associe automatiquement la couleur de texte courante aux tracés du svg lorsque leur attribut fill est vierge :
svg, rect {fill: currentcolor}
Si nécessaire, il faut ensuite affiner pour couvrir toutes les balises décrivant vos svg.
Polyfills :
Support des svg use pour IE9,IE10,11
https://github.com/Keyamoon/svgxuse
Sources & docs
Différentes façons d’intégrer des graphiques SVG dans une page html :
- https://css-tricks.com/using-svg/
- http://tavmjong.free.fr/INKSCAPE/MANUAL/html/Web-Use.html#Web-Use-Inline
- Video sur les différences d’intégration du format svg , avec avantages et désavantages
Liste de liens et ressources sur le svg : https://css-tricks.com/mega-list-svg-information/
Libs de conversion
Optimiser ou pouvoir générer les images de fallback au format png.
Php-Svg :
Lib autonome, permettant de créer, editer, transformer du svg avec php :
https://github.com/JangoBrick/php-svg
Optimisation SVG
Article sur l’optimisation et surtout les potentiels problèmes que peuvent engendrer des fichiers SVG mal exportés ou mal conçus :
https://css-tricks.com/high-performance-svgs/
- comme pour tout graphic illustrator/vectoriel : prêter une attention particulière aux nombre de points des courbes tracées.
http://astutegraphics.com/software/vectorscribe/ plugin illustrator avec un outil d’optimisation des points.
- export en svgz, permet une compression gzip directement d’illustrator
Attention a nettoyer les svg générés par illustrator, il comprennent un doctype et des commentaires, pour les utiliser en inline ou en DATAuri le doctype peut poser problème.
Editeurs
Editeur de svg Application multiplateforme + En ligne
https://vectr.com/
Outil en ligne
https://petercollingridge.appspot.com/svg-editor
https://jakearchibald.github.io/svgomg/
Optimisation CLI
SVGo : https://github.com/svg/svgo
Applescripts :
https://github.com/svg/svgo-osx-folder-action
Le format SVG
https://www.w3.org/Graphics/SVG/WG/wiki/SVG2_Spec_structure
Pourquoi utiliser le format SVG
Extrait/Traduction de cssTricks
- Poids de ficher réduit et compression
- Utilisable a n’importe quelle taille sans perte de qualité, permettant donc une meilleur accessibilité a des personnes n’ayant pas une vue parfaite.
- Excellent rendu sur les écrans haute densité
- Accessoirement si on l’utilise en inline possibilité d’utiliser des filtres et interactions, animations
Accessibilité
https://www.sitepoint.com/tips-accessible-svg/
Le format svg peut être beaucoup plus accessible quand il est utilisé via la méthode d’inclusion directe, c’est a dire excluant le tag <img>
qui ne propose que l’attribut alt et la balise <object>
Pour décrire et rendre accessible le svg peut être décrit par un titre et une description qui seront donc parcourus par les lecteurs d’écran :
<svg version="1.1" width="300" height="200"
aria-labelledby="title"
aria-describedby="desc">
<title id="title">Green rectangle</title>
<desc id="desc">A light green rectangle with rounded corners and a dark green border</desc>
<rect width="75" height="50" rx="20" ry="20" fill="#90ee90" stroke="#228b22" stroke-fill="1" />
</svg>
Intégration html5 : En résumé
A) Inclusion avec la balise img
<img src="file.svg" alt="Texte alternatif">
Sans précision de taille le fichier est affiché à sa taille d’exportation, on peut ajuster simplement en ajoutant les paramètre width/height
Support navigateur :
http://caniuse.com/#feat=svg-img
Fonctionne partout sauf dans <=IE 8 et <=Android 2.3
Inconvénients
Pas d’interaction possible avec le contenu du fichier
- Pas de possibilité d’utilisation de filtres
- Pas de stylisation via css
B) Utilisation css et Background-image
.logo_site {
display: block;
text-indent: -9999px;
width: 100px;
height: 82px;
background: url(logo.png); // Fallback
background-image: url(logo.svg), none;
}
Support navigateur :
http://caniuse.com/#feat=svg-css
Fonctionne partout sauf dans <=IE 8 et <=Android 2.3
Inconvénients
Pas d’interaction possible avec le contenu du fichier
- Pas de possibilité d’utilisation de filtres
- Pas de stylisation via css
C) Inclusion du SVG inline
Le svg étant un format xml, on peut tout à fait copier le contenu du fichier et coller dans le source html, il sera affiché comme avec la balise image. Ceci étant le fichier html devient vite très long et donc perd en clarté si on utilise un éditeur de texte.
Comme pour les DATAUri (méthode d’encodage des fichiers encodé en base64, permettant d’évité une requête http) on ne profitera pas de la mise en cache.
A noter qu’en utilisation avec spip/php on peut envisager d’utiliser file_get_content
pour inclure dans le html le source/contenu du fichier svg.
Utilisation de svg:use :
Utiliser une def,symbol svg déclarée dans un sprite inclu dans le html.
<svg viewBox="0 0 100 100">
<use xlink:href="#icon-1"></use>
</svg>
Doc svg:use : https://developer.mozilla.org/fr/docs/Web/SVG/Element/use
Compatibilité : IE9+
Si vous préférez utiliser un svg externe, au lieu de l’embarquer dans votre html, un polyfill est nécessaire pour que IE9,10,11.
IE9,IE10,IE11 avec polyfill svgxuse.js
Support navigateur :
http://caniuse.com/#feat=svg-html5
Fonctionne partout sauf dans <=IE 8 et <=Android 2.3
D) Inclusion avec <object>
<object type="image/svg+xml" data="web_square.svg"> <!-- Chargement du svg -->
<img src="web_square.png" alt="Blue Square"/> <!-- Image de fallback pour les vielles bouses aka IE -->
</object>
Problème fréquent liés au format svg
Redimensionnement d’un graphique svg :
https://css-tricks.com/scale-svg/