Changeset 48764 in spip-zone


Ignore:
Timestamp:
Jun 13, 2011, 1:25:33 PM (10 years ago)
Author:
cedric@…
Message:

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.

Location:
_plugins_/less-css/trunk
Files:
2 added
3 deleted
1 edited
1 moved

Legend:

Unmodified
Added
Removed
  • _plugins_/less-css/trunk/lesscss_fonctions.php

    r48760 r48764  
    11<?php
    22
    3 require 'lessc.inc.php';
     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';
    410
    5 // créé un tableau $styles à partir de la recherche
    6 // de tous les fichiers *.less dans le "path" spip
    7 foreach (find_all_in_path("", ".[.]less$") as $styles)
    8   {
    9     // chaque fichier less produit un fichier css de la forme :
    10     // "cheminVersFichierLess/less_nomFichierLess.css"
    11     $styles_css = dirname($styles).'/'.basename($styles).'.css';
     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}
    1223
    13     // le compilateur lessc compile chaque fichiers less et produit
    14     // la feuille de style correspondante dans le même répertoire.
    15     try {
    16       lessc::ccompile($styles, $styles_css);
    17     } catch (exception $ex) {
    18       exit('lessc fatal error:<br />'.$ex->getMessage());
    19     }
    20   }
     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)) {
    2143
     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}
    22133?>
  • _plugins_/less-css/trunk/plugin.xml

    r45518 r48764  
    11<plugin>
    2         <nom>LESSpip</nom>
     2        <nom>LESS CSS</nom>
    33        <auteur>Jean-Baptiste Bourgoin</auteur>
    44        <licence>MIT</licence>
    5         <version>0.2</version>
     5        <version>0.3.0</version>
     6        <etat>test</etat>
     7        <icon>img/lesscss-32.png</icon>
    68        <description>
    79Int&eacute;gration de l'impl&eacute;mentation php de LESS dans SPIP.
     
    1113l'&eacute;criture de feuilles de style complexes.
    1214
    13 Ce plugin cr&eacute;&eacute; les fichiers css correspondant &agrave; vos fichiers less dans le r&eacute;pertoire o&ugrave; ces derniers ont &eacute;t&eacute; cr&eacute;&eacute;s.
    14  
     15Ce plugin compile &agrave; la vol&eacute;e tous les fichiers .less.css ou .less du squelette qui contient #INSERT_HEAD.
     16Vous pouvez aussi forcer la compilation d'un fichier ou d'une feuille de style calcul&eacute;e &agrave; l'aide
     17du filtre less_css
    1518        </description>
    16         <etat>dev</etat>
    17         <prefix>lesspip</prefix>
    18         <icon>img/lesspip.png</icon>
     19        <prefix>lesscss</prefix>
    1920        <lien>http://leafo.net/lessphp/</lien>
    2021        <categorie>outil</categorie>
    21         <fonctions>lessphp/gen_styles.php</fonctions>
     22        <fonctions>lesscss_fonctions.php</fonctions>
     23        <pipeline>
     24                <nom>insert_head</nom>
     25        </pipeline>
    2226</plugin>
Note: See TracChangeset for help on using the changeset viewer.