source: spip-zone/_plugins_/css_imbriques/css_imbriques_fonctions.php @ 70864

Last change on this file since 70864 was 70864, checked in by marcimat@…, 7 years ago

2 notices PHP en moins.

File size: 13.5 KB
Line 
1<?php
2if (!defined('_ECRIRE_INC_VERSION')) return;
3
4
5if (!defined("_UTILISER_PIE_HTC")) define("_UTILISER_PIE_HTC", true);
6if (!defined("_UTILISER_BOXSIZING_HTC")) define("_UTILISER_BOXSIZING_HTC", true);
7
8
9$GLOBALS["css_imbriques_medias_queries"] = array();
10
11// filtre couleur_rgba converti une mention de couleur hexadecimale
12// en couleur semi_transparente rgba
13// [(#COULEUR_HEX|couleur_rgba{0.5})]
14function DEFINIR_couleur_rgba () {
15        function couleur_rgba($couleur, $alpha) {
16                include_spip("inc/filtres_images_lib_mini");
17                $couleurs = _couleur_hex_to_dec($couleur);
18
19                $red = $couleurs["red"];
20                $green = $couleurs["green"];
21                $blue = $couleurs["blue"];
22               
23                return "rgba($red, $green, $blue, $alpha)";
24        }
25}
26
27if (!function_exists('couleur_rgba')) {
28        DEFINIR_couleur_rgba ();
29}
30
31
32
33function css_inserer_tab($def) {
34        $def = preg_replace(",\n,", "\n\t", $def);
35       
36        return "\t".$def;
37}
38
39
40function css_contruire($css, $niveau, $chemin, $classe, $enfants, $definition) {
41
42        $intitule = trim($classe[$niveau]);
43        $ret = '';
44
45        if (substr($intitule, 0, 2) == ". ") {
46                $intitule = substr($intitule, 2, strlen($intitule));
47                $chemin = $chemin.$intitule;
48        }
49        else {
50                $chemin = trim($chemin ." ".$intitule);
51        }
52       
53        $def = $definition[$niveau];
54       
55        if (strlen($def) > 0) {
56//              echo "<li><b>$chemin</b>";
57//              echo "<br>$def";
58               
59                $def = css_inserer_tab($def);
60       
61                if ( strlen(trim($chemin)) > 0 ) $ret = "\n".$chemin." {\n".$def."\n}";
62//              echo "<pre>$css</pre>";
63        }
64       
65        if (preg_match(",^\@(-spip-)?keyframes,", $intitule)) {
66                // autoriser @keyframes et @-spip-keyframes
67                $intitule = str_replace("@-spip-keyframes", "@keyframes", $intitule);
68       
69                if (isset($enfants[$niveau]) and $enfants[$niveau]) {
70                        $def_keyframes = "";
71                        foreach($enfants[$niveau] as $num) {
72                                 $def_keyframes .= css_contruire($css, $num, "", $classe, $enfants, $definition);
73                        }
74                       
75                        $ret .= preg_replace(",^@keyframes,","@-moz-keyframes",$intitule)." { $def_keyframes }";
76                        $ret .= preg_replace(",^@keyframes,","@-webkit-keyframes",$intitule)." { $def_keyframes }";
77                        $ret .= preg_replace(",^@keyframes,","@-o-keyframes",$intitule)." { $def_keyframes }";
78                        $ret .= preg_replace(",^@keyframes,","@-ms-keyframes",$intitule)." { $def_keyframes }";
79                        $ret .= $intitule." { $def_keyframes }";
80                }
81        }
82        else if (isset($enfants[$niveau]) and $enfants[$niveau]) {
83                foreach($enfants[$niveau] as $num) {
84                        $ret .= css_contruire($css, $num, $chemin, $classe, $enfants, $definition);
85       
86                }
87        }
88       
89        return $ret;
90}
91
92function css_imbriques_couleurs_ie ($coul) {
93        if (preg_match(",^\#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])$,", $coul, $conv)) {
94                $coul = "#".$conv[1].$conv[1].$conv[2].$conv[2].$conv[3].$conv[3];
95        }
96       
97        return $coul;
98}
99
100function css_imbriques_conv_dec255 ($coul) {
101        $coul = trim ($coul);
102       
103        if (preg_match(",(.*)\%$,", $coul, $pourcent)) {
104                $coul = round($pourcent[1] * 255 / 100);
105        }
106        return $coul;
107}
108
109function css_imbriques_traiter_spip($regs) {
110        // -spip-font-smoothing
111       
112        if (_UTILISER_PIE_HTC) {
113                if (function_exists("chemin")) $pie = chemin("PIE.htc");
114                else $pie = find_in_path("PIE.htc");
115        }
116
117        if (_UTILISER_BOXSIZING_HTC) {
118                if (function_exists("chemin")) $boxsizing = url_absolue(chemin("boxsizing.htc"));
119                else $boxsizing = url_absolue(find_in_path("boxsizing.htc"));
120        }
121       
122        $style = $regs[1];
123        $val = trim($regs[2]);
124        switch($style) {
125                case "border-radius" :
126                        $ret = "-webkit-border-radius:$val;";
127                        $ret .= "-moz-border-radius:$val;";
128                        $ret .= "border-radius:$val;";
129                        if (_UTILISER_PIE_HTC) $ret .= "behavior: url($pie);";
130                        break;
131                case "border-top-right-radius" :
132                        $ret = "-webkit-border-top-right-radius:$val;";
133                        $ret .= "-moz-border-radius-topright:$val;";
134                        $ret .= "border-top-right-radius:$val;";
135                        if (_UTILISER_PIE_HTC) $ret .= "behavior: url($pie);";
136                        break;
137                case "border-top-left-radius" :
138                        $ret = "-webkit-border-top-left-radius:$val;";
139                        $ret .= "-moz-border-radius-topleft:$val;";
140                        $ret .= "border-top-left-radius:$val;";
141                        if (_UTILISER_PIE_HTC) $ret .= "behavior: url($pie);";
142                        break;
143                case "border-bottom-right-radius" :
144                        $ret = "-webkit-border-bottom-right-radius:$val;";
145                        $ret .= "-moz-border-radius-bottomright:$val;";
146                        $ret .= "border-bottom-right-radius:$val;";
147                        if (_UTILISER_PIE_HTC) $ret .= "behavior: url($pie);";
148                        break;
149                case "border-bottom-left-radius" :
150                        $ret = "-webkit-border-bottom-left-radius:$val;";
151                        $ret .= "-moz-border-radius-bottomleft:$val;";
152                        $ret .= "border-bottom-left-radius:$val;";
153                        if (_UTILISER_PIE_HTC) $ret .= "behavior: url($pie);";
154                        break;
155                case "box-sizing" :
156                        $ret = "-webkit-box-sizing:$val;";
157                        $ret .= "-moz-box-sizing:$val;";
158                        $ret .= "box-sizing:$val;";
159                        if (_UTILISER_BOXSIZING_HTC) $ret .= "*behavior: url($boxsizing);";
160                        break;
161                case "opacity" :
162                        $val_ie = round($val * 100);
163                        $ret = "-webkit-opacity:$val;";
164                        $ret .= "-moz-opacity:$val;";
165                        $ret .= "opacity:$val;";
166                        $ret .= "filter:alpha(opacity=$val_ie);";
167                        //$ret .= "-ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(opacity=$val_ie)\";zoom:1;";
168                        break; 
169                case "text-shadow":
170                        $ret .= "text-shadow:$val;";
171                        if (preg_match(",(\-?[0-9]+)px\ *(\-?[0-9]+)px\ *([0-9]+)px\ *(#?[0-9a-zA-Z]*),", $val, $val_ie)) {
172                                $x = $val_ie[1];
173                                $y = $val_ie[2];
174                                $s = $val_ie[3];
175                                $coul = $val_ie[4];
176                        }
177                       
178                        if ($x == 0 && $y == 0) {
179                                $ret .= "zoom:1; filter:progid:DXImageTransform.Microsoft.Glow(Color=$coul,Strength=$s);";
180                        }
181                       
182                        break;
183                case "box-shadow": 
184                        $ret = "-webkit-box-shadow:$val;";
185                        $ret .= "-moz-box-shadow:$val;";
186                        $ret .= "box-shadow:$val;";
187                        if (_UTILISER_PIE_HTC) $ret .= "behavior: url($pie);";
188                        break;
189                case "background-color":
190                        if (preg_match(",(rgba?)[\ \t]*\(([^\,]*)\,([^\,]*)\,([^\,]*)\,?([^\,]*)?\),", $val, $couls)) {
191                                $rgba = trim($couls[1]);
192                                $r = css_imbriques_conv_dec255($couls[2]);
193                                $g = css_imbriques_conv_dec255($couls[3]);
194                                $b = css_imbriques_conv_dec255($couls[4]);
195                                $a = trim($couls[5]);
196
197                                $red = dechex($r);
198                                $green = dechex($g);
199                                $blue = dechex($b);
200                                $alpha = dechex(round($a * 255));
201                               
202                                if (strlen($red) == 1) $red = "0".$red;
203                                if (strlen($green) == 1) $green = "0".$green;
204                                if (strlen($blue) == 1) $blue = "0".$blue;
205                                if (strlen($alpha) == 1) $alpha = "0".$alpha;
206
207                                //$ret = "background-color: #$red$green$blue;";
208                                if ($rgba == "rgba") {
209                                        $ret .= "background-color: rgba($r,$g,$b,$a);";
210                                        $ret .= "filter:  progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#$alpha$red$green$blue', endColorstr='#$alpha$red$green$blue');";
211                                } else {
212                                        $ret = "background-color: #$red$green$blue;";
213                                }
214                        }
215                        break;
216                case "gradient": 
217                        // -spip-gradient: top, #000000, #ffffff;
218                        // directions: "top" (vertical) ou "left" (horizontal)
219                        if (preg_match("#\ ?(.*)\ ?\,\ ?(.*)\ ?\,\ ?(.*)\ ?#", $val, $conv)) {
220                                $dir = strtolower($conv[1]);
221                                $debut = $conv[2];
222                                $fin = $conv[3];
223                               
224                                $debut_ie = css_imbriques_couleurs_ie($debut);
225                                $fin_ie = css_imbriques_couleurs_ie($fin);
226
227                                // $ret = "background: $debut;";
228                               
229                                if ($dir == "top") {
230                                        $ret = "background: -webkit-gradient(linear, left top, left bottom, from($debut), to($fin));";
231                                        $ret .= "background-image: -webkit-linear-gradient(top, $debut, $fin);";
232                                        $ret .= "background-image: -moz-linear-gradient(top, $debut, $fin);";
233                                        $ret .= "background-image: -ms-linear-gradient(top, $debut, $fin);";
234                                        $ret .= "background-image: -o-linear-gradient(top, $debut, $fin);";
235                                        $ret .= "background-image: linear-gradient(top, $debut, $fin);";
236                                        $ret .= "filter:  progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='$debut_ie', endColorstr='$fin_ie');";
237                                        // La version IE8 n'a pas l'air necessaire
238                                        //$ret .= "-ms-filter: \"progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='$debut_ie', endColorstr='$fin_ie')\";";
239                                }
240                                else {
241                                        $ret = "background: -webkit-gradient(linear, left top, right top, from($debut), to($fin));";
242                                        $ret .= "background-image: -moz-linear-gradient(left, $debut, $fin);";
243                                        $ret .= "filter:  progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr='$debut_ie', endColorstr='$fin_ie');";
244                                        //$ret .= "-ms-filter: \"progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr='$debut_ie', endColorstr='$fin_ie')\";";
245                                }
246                        }
247                        break;
248                case "clear";
249                        $ret = "zoom:1;\n";
250                        $ret .= ". :before,. :after  {content:\"\";\ndisplay:block;overflow:hidden;}\n";
251                        $ret .= ". :after{clear:both;}\n";
252                        break;
253                default:
254                        $ret = "-moz-$style:$val;";
255                        $ret .= "-webkit-$style:$val;";
256                        $ret .= "-khtml-$style:$val;";
257                        $ret .= "-ms-$style:$val;";
258                        $ret .= "-o-$style:$val;";
259                        $ret .= "$style:$val;";
260                       
261        }
262        return $ret;
263
264       
265}
266
267function css_imbriques_pseudo($css) {
268       
269        $css = preg_replace_callback(",\-spip\-([a-z\-]*)\ *\:\ *([^\;]*)\ *\;,", "css_imbriques_traiter_spip", $css);
270       
271        return $css;
272}
273
274function css_imbriques_forcer_position($css) {
275        if (_UTILISER_PIE_HTC)  {
276                if (preg_match("/border[a-z\-]*\-radius|box\-shadow/", $css) && !preg_match("/position\ ?\:/", $css)) {
277                        $css .= "position:relative;";
278                }
279        }
280        return $css;
281}
282
283
284function extraire_filters_ie($css) {
285        if (preg_match_all(",filter\:(.*)\;,", $css, $regs)) {
286                $filtres = "filter:".join($regs[1], ", ").";";
287               
288                $css = preg_replace(",filter\:(.*)\;,", "", $css);
289                $css .= $filtres;
290        }
291        return $css;
292}
293
294function css_imbriques_decouper ($css) {
295        $compteur = 0; 
296       
297        $css = preg_replace(",\n[\t\ ]*,", "\n", trim($css));
298        $css = preg_replace(",\n+,", "\n", $css);
299       
300        // Remettre les criteres multilignes sur une ligne
301        $css = preg_replace("#\,\ *\n#", ", ", $css);
302       
303
304        // Virer les commentaires (source d'erreurs, et on ne sait plus ou les placer puisqu'on reorganise la bazar)
305        $css = preg_replace('#(/\*[^*]*\*+([^/*][^*]*\*+)*/)#', '', $css);
306        $css = preg_replace('#\n(\ \t)*\{#', ' {', $css);
307
308
309        // placer l'ensemble dans une fausse classe globale pour pouvoir la traiter d'un coup a la fin
310        $css = "   {\n$css\n}";
311       
312        $css = css_imbriques_pseudo($css);
313       
314        while (preg_match ("/([^\{\n]*)\{([^\{]*)\}/U", $css, $regs)) {
315               
316                        $intitule = trim($regs[1]);
317
318                        if (preg_match(",^@media,", $intitule)) $intitule .= " media@";
319
320                        // le minifieur de CSS vire les intitulés "0%"
321                        if ($intitule == "0%") $intitule = "from";
322
323
324                                               
325                        $def = trim($regs[2]);
326                        $def = css_imbriques_forcer_position($def);
327
328                        $chaine = $regs[0];
329                        $pos = strpos($css, $chaine);
330                        $debut = substr($css, 0, $pos);
331                        $fin = substr($css, $pos + strlen($chaine), strlen($css));
332
333
334                        if (preg_match("#\,#", $intitule)) {
335                                $entrees = explode(",", $intitule);
336                               
337                                $ret = "";
338                               
339                                foreach ($entrees as $intitule) {
340                                        $intitule = trim($intitule);
341                                       
342//                                      echo "<li>$intitule</li>";
343                                       
344                                        $ret .= "$intitule { $def }\n";
345                                       
346                                       
347                                }
348                                                               
349                                $css = $debut.$ret.$fin;
350                               
351//                              echo "<pre>$css </pre><hr>";
352                               
353                        } else {
354                       
355                                $compteur ++;
356                       
357                                $classe[$compteur] = $intitule;
358                                $definition[$compteur] = trim($regs[2]);
359                               
360//                              echo "<li>".$classe[$compteur];
361                               
362                               
363                                preg_match_all("/\[\[([0-9]*)\]\]/", $definition[$compteur], $sous);
364                                foreach($sous[1] as $enfant) {
365                                        $enfants[$compteur][] = $enfant;
366                                }
367       
368                                $definition[$compteur] = extraire_filters_ie(css_imbriques_forcer_position(preg_replace("#[\ \n]*\[\[[0-9]*\]\][\ \n]*#", "", $definition[$compteur])));
369//                              echo "<li>".$definition[$compteur];
370//                              $def = extraire_filters_ie($def);
371       
372                               
373                               
374                               
375                               
376                                $css = $debut."[[$compteur]]".$fin;
377                        }
378                       
379//                      $css = str_replace($regs[0][$num], "[[$compteur]]", $css);
380                       
381               
382        }
383       
384        $css = "";
385       
386        $css = css_contruire($css, $compteur, "", $classe, $enfants, $definition);
387
388       
389       
390        // Derniere passe: "minifier" les CSS
391        $css = preg_replace(",\n,", "", $css);
392        $css = preg_replace(",\t,", "", $css);
393        $css = preg_replace(",\},", "}\n", $css);
394
395
396
397        // Rechercher les media_queries
398        $css = preg_replace_callback(",(.*(@media .* media@).*)\{(.*)\}\n?,", "css_imbriques_traiter_media", $css);
399        if (count($GLOBALS["css_imbriques_medias_queries"]) > 0) {
400                foreach($GLOBALS["css_imbriques_medias_queries"] as $k=>$val) {
401                        $css .= $k ."{\n". $val . "}\n";
402                }
403                $GLOBALS["css_imbriques_medias_queries"] = array();
404        }
405
406        return $css;
407}
408
409
410function css_imbriques_traiter_media($reg) {
411        $query = $reg[2];
412        $query = trim(substr(trim($query), 0, strlen($query) - 6));
413       
414        $intitule = str_replace($reg[2], "", $reg[1]);
415        $intitule = trim(preg_replace(",\ +,", " ", $intitule));
416       
417       
418        $definition = $reg[3];
419
420        $GLOBALS["css_imbriques_medias_queries"]["$query"] .= $intitule."{".$definition."}\n";
421        return;
422}
423function css_imbriques_traiter_keyframe ($flux) {
424        print_r($flux);
425        die();
426}
427
428function css_imbriques ($css) {
429
430        $path = dirname(url_absolue($css))."/"; // pour mettre sur les images   
431       
432               
433
434        // 2.
435        $dir_var = sous_repertoire (_DIR_VAR, 'cache-css');
436        $f = $dir_var
437                . substr(md5($css), 0,20) . '_imbriques.css';
438
439
440        // la css peut etre distante (url absolue !)
441        if (preg_match(",^http:,i",$css)){
442                include_spip('inc/distant');
443                $contenu = recuperer_page($css);
444                if (!$contenu) return $css;
445        }
446        else {
447                if ((@filemtime($f) > @filemtime($css))
448                        AND ($GLOBALS['var_mode'] != 'recalcul'))
449                        return $f;
450                if (!lire_fichier($css, $contenu))
451                        return $css;
452        }
453
454        $contenu = css_imbriques_decouper ($contenu);
455       
456
457        // passer les url relatives a la css d'origine en url absolues
458        $contenu = preg_replace(",url\s*\(\s*['\"]?([^'\"/][^:]*)['\"]?\s*\),UimsS",
459                "url($path\\1)",$contenu);
460
461
462
463        // virer les fausses url absolues que l'on a mis dans les import
464        if (count($src_faux_abs))
465                $contenu = str_replace(array_keys($src_faux_abs),$src_faux_abs,$contenu);
466
467        ecrire_fichier ("$f.gz", $contenu, true);
468        if (!ecrire_fichier($f, $contenu))
469                return $css;
470
471        return $f;
472}
473
474?>
Note: See TracBrowser for help on using the repository browser.