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

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

La version 0.3.0 du plugin revoit complètement le mode de fonctionnement :
par défaut, toutes les feuilles less référencées dans le squelette qui contient #INSERT_HEAD sont compilées à la volée. Elles sont reconnues par leur extension .less ou .less.css

Pour une feuille en particulier (extension non conforme) ou un squelette calculé, il est possible d'utiliser à la main le filtre |less_css (ou #FILTRE{less_css} dans une feuille calculée).

On standardise le logo de LESS comme le nom et le prefixe (inutile de rapperler que c'est pour SPIP puisqu'on est dans un plugin SPIP)
Bon pour le stress test avant de passer en état stable.

  • 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 '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.