source: spip-zone/_plugins_/z-core/trunk/zcore_options.php @ 115264

Last change on this file since 115264 was 115264, checked in by cedric@…, 18 months ago

Extension de #ICON pour permettre de l'utiliser simplement avec des sprites svg perso ou inline:

  • utiliser une icone standard du sprite par defaut :

#ICON{search,icon-sm,Rechercher}

  • utiliser une icone #search definie dans un svg inline de la page

#ICON{#search,icon-sm,Rechercher}

  • utiliser une l'icone #search definie dans un svg externe (qui sera resolu via #CHEMIN)

#ICON{img/sprite.svg#search,icon-sm,Rechercher}

File size: 8.4 KB
Line 
1<?php
2/*
3 * Plugin Z-core
4 * (c) 2008-2010 Cedric MORIN Yterium.net
5 * Distribue sous licence GPL
6 *
7 */
8
9// demander a SPIP de definir 'type-page' dans le contexte du premier squelette
10define('_DEFINIR_CONTEXTE_TYPE_PAGE', true);
11define('_ZPIP', true);
12// differencier le cache,
13// la verification de credibilite de var_zajax sera faite dans public_styliser_dist
14// mais ici on s'assure que la variable ne permet pas de faire une inclusion arbitraire
15// avec un . ou un /
16if ($z = _request('var_zajax') AND !preg_match(",[^\w-],", $z)) {
17        if (!isset($GLOBALS['marqueur'])) {
18                $GLOBALS['marqueur'] = "$z:";
19        } else {
20                $GLOBALS['marqueur'] .= "$z:";
21        }
22        $GLOBALS['flag_preserver'] = true;
23} else {
24        // supprimer cette variable dangereuse
25        set_request('var_zajax', '');
26}
27
28if (!isset($GLOBALS['spip_pipeline']['recuperer_fond'])) $GLOBALS['spip_pipeline']['recuperer_fond'] = '';
29$GLOBALS['spip_pipeline']['recuperer_fond'] .= '||zcore_recuperer_fond';
30
31/**
32 * Passe un chemin en URL absolue uniquement si non vide
33 * utilise pour l'insertion d'URL conditionnee a l'existence d'un fichier (favicon.ico par exemple)
34 *
35 * @param string $path
36 * @param string $base
37 *
38 * @return string
39 */
40function url_absolue_si($path, $base = '') {
41        if (!$path) {
42                return "";
43        }
44        if (!function_exists('url_absolue')) {
45                include_spip('inc/filtres_mini');
46        }
47
48        return url_absolue($path, $base);
49}
50
51/**
52 * html Pour pouvoir masquer les logos sans les downloader en petit ecran
53 * il faut le mettre dans un conteneur parent que l'on masque
54 * http://timkadlec.com/2012/04/media-query-asset-downloading-results/
55 *
56 * On utilise un double conteneur :
57 * le premier fixe la largeur, le second la hauteur par le ratio hauteur/largeur
58 * grace a la technique des intrinsic-ratio ou padding-bottom-hack
59 * http://mobile.smashingmagazine.com/2013/09/16/responsive-images-performance-problem-case-study/
60 * http://alistapart.com/article/creating-intrinsic-ratios-for-video
61 *
62 * Le span interieur porte l'image en background CSS
63 * Le span conteneur ne porte pas de style display car trop prioritaire.
64 * Sans CSS il occupe la largeur complete disponible, car en inline par defaut
65 * Il suffit de lui mettre un float:xxx ou un display:block pour qu'il respecte la largeur initiale du logo
66 *
67 * Pour masquer les logos :
68 * .spip_logos {display:none}
69 * Pour forcer une taille maxi :
70 * .spip_logos {max-width:25%;float:right}
71 *
72 * @param $logo
73 *
74 * @return string
75 */
76function responsive_logo($logo) {
77        if (!function_exists('extraire_balise')) {
78                include_spip('inc/filtres');
79        }
80        if (!$logo OR !$img = extraire_balise($logo, "img")) {
81                return $logo;
82        }
83        list($h, $w) = taille_image($img);
84        if (!$h or !$w) {
85                return $logo;
86        }
87        $src = extraire_attribut($img, "src");
88        $class = extraire_attribut($img, "class");
89
90        // timestamper l'url si pas deja fait
91        if (strpos($src, "?") == false) {
92                $src = timestamp($src);
93        }
94
95        if (defined('_STATIC_IMAGES_DOMAIN')) {
96                $src = url_absolue($src, _STATIC_IMAGES_DOMAIN);
97        }
98
99        $hover = "";
100        if ($hover_on = extraire_attribut($img, "onmouseover")) {
101                $hover_off = extraire_attribut($img, "onmouseout");
102                $hover_on = str_replace("this.src=", "jQuery(this).css('background-image','url('+", $hover_on) . "+')')";
103                $hover_off = str_replace("this.src=", "jQuery(this).css('background-image','url('+", $hover_off) . "+')')";
104                $hover = " onmouseover=\"$hover_on\" onmouseout=\"$hover_off\"";
105        }
106
107        $ratio = round($h * 100 / $w, 2);
108
109        return "<span class='$class' style=\"width:{$w}px;\"><span class=\"img\" style=\"display:block;position:relative;height:0;width:100%;padding-bottom:{$ratio}%;overflow:hidden;background:url($src) no-repeat center;background-size:100%;\"$hover> </span></span>";
110}
111
112/**
113 * Compatibilite : permet de remplacer les [(#TEXTE|image_reduire{500})] des squelettes
114 * par un simple [(#TEXTE|adaptive_images)]
115 * Avec le plugin adaptive_images cela produire des images adaptives
116 */
117if (!defined('_DIR_PLUGIN_ADAPTIVE_IMAGES')) {
118        // les images 1x sont au maximum en _ADAPTIVE_IMAGES_MAX_WIDTH_1x px de large dans la page
119        if (!defined('_ADAPTIVE_IMAGES_MAX_WIDTH_1x')) {
120                define('_ADAPTIVE_IMAGES_MAX_WIDTH_1x', 640);
121        }
122
123        function adaptive_images($texte, $max_width_1x = _ADAPTIVE_IMAGES_MAX_WIDTH_1x) {
124                if (!function_exists('filtrer')) {
125                        include_spip('inc/filtres');
126                }
127                $texte = filtrer('image_reduire', $texte, $max_width_1x, 10000);
128
129                return filtrer('image_graver', $texte);
130        }
131}
132
133/**
134 * utiliser une icone standard du sprite par defaut :
135 * #ICON{search,icon-sm,Rechercher}
136 *
137 * utiliser une icone #search definie dans un svg inline de la page
138 * #ICON{#search,icon-sm,Rechercher}
139 *
140 * utiliser une l'icone #search definie dans un svg externe (qui sera resolu via #CHEMIN)
141 * #ICON{img/sprite.svg#search,icon-sm,Rechercher}
142 *
143 * @param $p
144 * @return mixed
145 */
146function balise_ICON_dist($p) {
147        $_name = interprete_argument_balise(1, $p);
148        if (!$_name) {
149                // compat avec les champs #ICON utilises dans composition et noizetier : pas d'argument = champ sql (ou DATA)
150                $_icon = champ_sql('icon', $p);
151                $p->code = $_icon;
152        }
153        else {
154                $_class = interprete_argument_balise(2, $p);
155                if (!$_class) {
156                        $_class = "''";
157                }
158                $_alt = interprete_argument_balise(3, $p);
159                if (!$_alt) {
160                        $_alt = "''";
161                }
162                $p->code = "afficher_icone_svg($_name, $_class, $_alt)";
163        }
164
165        $p->interdire_scripts = false;
166        return $p;
167}
168
169function afficher_icone_svg($name, $class = '', $alt = '') {
170        $icone_href_class_from_name = chercher_filtre("icone_href_class_from_name");
171        list($href, $class_base) = $icone_href_class_from_name($name);
172        if (!$name) {
173                return $href;
174        }
175
176        if ($href) {
177                /*
178                        <svg aria-labelledby="my-icon-title" role="img">
179                    <title id="my-icon-title">Texte alternatif</title>
180                    <use xlink:href="bytesize-symbols.min.svg#search"></use>
181            </svg>
182                        <svg aria-hidden="true" role="img">
183                    <use xlink:href="bytesize-symbols.min.svg#search"></use>
184                        </svg>
185                 */
186                // width="0" height="0" -> rien ne s'affiche si on a pas la CSS icons.css
187                $svg = "<svg role=\"img\" width=\"0\" height=\"0\"";
188                if ($alt) {
189                        $id = "icon-title-" . substr(md5("$name:$alt:$href"),0,4);
190                        $svg .= " aria-labelledby=\"$id\"><title id=\"$id\">" . entites_html($alt)."</title>";
191                }
192                else {
193                        $svg .= ">";
194                }
195                $svg .= "<use xlink:href=\"$href\"></use>";
196                $svg .= "</svg>";
197
198                if ($class_base = trim($class_base)) {
199                        $class_base = ' icon-' . $class_base;
200                }
201                if ($class = trim($class)) {
202                        $class = preg_replace(",[^\w\s\-],", "", $class);
203                }
204                return "<i class=\"icon{$class_base}" . ($class ? " $class" : "") . "\">$svg</i> ";
205        }
206        return "";
207}
208
209function filtre_icone_href_class_from_name_dist($name) {
210        static $sprite_files = array();
211
212        if (strpos($name,'#') !== false or strpos($name,'/') !== false or strpos($name,'.svg') !== false) {
213                // l'ancre est fournie explicitement (sprite inline)
214                // voire le nom du fichier sprite svg
215                list($filename, $anchor) = explode('#', trim($name), 2);
216                // sanitizer l'ancre pour la class
217                $class = preg_replace(",[^\w\-],", "", $anchor);
218
219                if ($filename) {
220                        if (!isset($sprite_files[$filename])) {
221                                $sprite_files[$filename] = timestamp(find_in_path($filename));
222                        }
223                        $filename = $sprite_files[$filename];
224                        return array($filename . ($anchor ? '#' . $anchor : ''), $class);
225                }
226                else {
227                        return array($name, $class);
228                }
229        }
230        else {
231                // c'est le sprite par defaut avec un name qui correspond a l'ancre abregee
232                // et la gestion de quelques historiques de nommage/renommage
233                if (!isset($sprite_files[''])) {
234                        if (!defined('_ICON_SPRITE_SVG_FILE')) {
235                                define('_ICON_SPRITE_SVG_FILE', "css/bytesize/bytesize-symbols.min.svg");
236                        }
237                        $sprite_files[''] = timestamp(find_in_path(_ICON_SPRITE_SVG_FILE));
238                }
239                // sanitizer l'ancre pour la class
240                $class = preg_replace(",[^\w\-],", "", $name);
241                if (!$name) {
242                        return array($sprite_files[''], $class);
243                }
244                $icone_anchor_from_name = chercher_filtre("icone_anchor_from_name");
245                $anchor = $icone_anchor_from_name($name);
246                return array($sprite_files[''] . '#' . $anchor, $class);
247        }
248}
249
250function filtre_icone_anchor_from_name_dist($name) {
251        switch ($name) {
252                case "comment":
253                        $ancre = 'msg';
254                        break;
255                case "ok-circle":
256                        $ancre = 'compose';
257                        break;
258                default:
259                        $ancre = $name;
260                        break;
261        }
262        return "i-$ancre";
263}
264
265function lister_icones_svg() {
266        $sprite_file = afficher_icone_svg('');
267        if ($sprite_file
268                and $sprite_file = supprimer_timestamp($sprite_file)
269          and $sprite = file_get_contents($sprite_file)
270          and preg_match_all(',id="i-([\w\-]+)",', $sprite, $matches, PREG_PATTERN_ORDER)) {
271                $icons = $matches[1];
272                return $icons;
273        }
274        return array();
275}
276
277
Note: See TracBrowser for help on using the repository browser.