source: spip-zone/_plugins_/less-css/trunk/lesscss_fonctions.php @ 48829

Last change on this file since 48829 was 48829, checked in by cedric@…, 10 years ago

n'inclure qu'une seule fois la lib LESS

  • Property svn:executable set to *
File size: 3.5 KB
Line 
1<?php
2
3/**
4 * Compiler des styles inline LESS en CSS
5 * @param string $style
6 * @return string
7 */
8function less_compile($style){
9        require_once 'lessphp/lessc.inc.php';
10
11        // le compilateur lessc compile le contenu
12        $less = new lessc();
13        try {
14                $out = $less->parse($style);
15                return $out;
16        }
17        // en cas d'erreur, on retourne du vide...
18        catch (exception $ex) {
19                spip_log('lessc fatal error:'.$ex->getMessage(),'less'._LOG_ERREUR);
20                return '';
21        }
22}
23
24/**
25 * Transformer du LESS en CSS
26 * Peut prendre en entree
27 * - un fichier .css ou .less :
28 *   [(#CHEMIN{messtyles.less.css}|less_css)]
29 *   la sortie est un chemin vers un fichier CSS
30 * - des styles inline,
31 *   pour appliquer dans une feulle less calculee :
32 *   #FILTRE{less_css}
33 *   la sortie est du style inline
34 *
35 * @param string $source
36 * @return string
37 */
38function less_css($source){
39        // Si on n'importe pas, est-ce un fichier ?
40        if (!preg_match(',[\s{}],', $source)
41          AND preg_match(',\.(less|css)$,i', $source, $r)
42          AND file_exists($source)) {
43
44                $f = basename($source,$r[0]);
45                $f = sous_repertoire (_DIR_VAR, 'cache-less')
46                . preg_replace(",(.*?)(_rtl|_ltr)?$,","\\1-cssify-"
47                . substr(md5("$source-lesscss"), 0,4) . "\\2", $f, 1)
48                . '.css';
49
50                # si la feuille compilee est plus recente que la feuille source
51                # l'utiliser sans rien faire, sauf si recalcul explicite
52                if ((@filemtime($f) > @filemtime($source))
53                  AND (!defined('_VAR_MODE') OR _VAR_MODE != 'recalcul'))
54                        return $f;
55
56                if (!lire_fichier($source, $contenu))
57                        return $source;
58
59                # compiler le LESS
60                $contenu = less_compile($contenu);
61                // si erreur de compilation on renvoit la source, et il y a deja eu un log
62                if (!$contenu)
63                        return $source;
64                # passer la css en url absolue (on ne peut pas le faire avant, car c'est du LESS, pas des CSS)
65                $contenu = urls_absolues_css($contenu, $source);
66
67                // ecrire le fichier destination, en cas d'echec renvoyer la source
68                if (ecrire_fichier($f, $contenu, true))
69                        return $f;
70                else
71                        return $source;
72        }
73        $source = less_compile($source);
74        if (!$source)
75                return "/* Erreur compilation LESS : cf less.log */";
76        else
77                return $source;
78}
79
80
81/**
82 * injecter l'appel au compresseur sous la forme de filtre
83 * pour intervenir sur l'ensemble du head
84 * du squelette public
85 *
86 * @param string $flux
87 * @return string
88 */
89function lesscss_insert_head($flux){
90        $flux .= '<'
91                .'?php header("X-Spip-Filtre: '
92                .'cssify_head'
93                .'"); ?'.'>';
94        return $flux;
95}
96
97
98/**
99 * Attraper automatiquement toutes les .less ou .less.css du head
100 * les compiler, et les remplacer par leur css compilee
101 *
102 * @param string $head
103 * @return void
104 */
105function cssify_head($head){
106        $url_base = url_de_base();
107        $balises = extraire_balises($head,'link');
108        $files = array();
109        foreach ($balises as $s){
110                if (extraire_attribut($s, 'rel') === 'stylesheet'
111                        AND (!($type = extraire_attribut($s, 'type')) OR $type == 'text/css')
112                        AND $src = extraire_attribut($s, 'href')
113                        // format .less.css ou .less avec un eventuel timestamp ?123456
114                        AND preg_match(",\.(less\.css|less)(\?\d+)?$,",$src)
115                        AND $src = preg_replace(",\?\d+$,","",$src)
116                        AND $src = preg_replace(",^$url_base,",_DIR_RACINE,$src)
117                        AND file_exists($src))
118                        $files[$s] = $src;
119        }
120
121        if (!count($files))
122                return $head;
123
124        foreach($files as $s=>$lessfile){
125                $cssfile = less_css($lessfile);
126                $m = @filemtime($cssfile);
127                $s2 = inserer_attribut($s,"href","$cssfile?$m");
128                $head = str_replace($s, $s2, $head);
129        }
130       
131        return $head;
132}
133?>
Note: See TracBrowser for help on using the repository browser.