From c2fef93b65309946bbf2dc2758f1a3941f9bda3e Mon Sep 17 00:00:00 2001 From: Cerdic <cedric@yterium.com> Date: Wed, 23 Apr 2008 11:13:36 +0000 Subject: [PATCH] le point d'insertion des plugins dans les pipelines est la fin du pipeline ou || permet d'ajouter une fonction en fin de pipeline dans tous les cas ajout de la fonction f_compacte_head sur la fin des pipeline insert_head et header_prive pour agglomerer/compacter les js et css par media en un seul fichier statique compacte var_mode=recalcul permet de forcer la mise a jour de ces fichiers compactes pour inclure ses css perso dans le compactage dans ses squelettes, il faut remplacer #INSERT_HEAD par #PIPELINE{insert_head,'<link rel="stylesheet" type="text/css" href="macss.css" />'} --- ecrire/inc/filtres.php | 107 +++++++++++++++++++++++++++++++++++++++-- ecrire/inc/plugin.php | 2 +- ecrire/inc_version.php | 4 +- 3 files changed, 107 insertions(+), 6 deletions(-) diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php index f2928790b9..3f92ca0603 100644 --- a/ecrire/inc/filtres.php +++ b/ecrire/inc/filtres.php @@ -1949,7 +1949,8 @@ function direction_css ($css, $voulue='') { function url_absolue_css ($css) { if (!preg_match(',\.css$,i', $css, $r)) return $css; - $path = dirname(url_absolue($css))."/"; // pour mettre sur les images + $url_absolue_css = url_absolue($css); + $path = dirname($url_absolue_css)."/"; // pour mettre sur les images $f = basename($css,'.css'); $f = sous_repertoire (_DIR_VAR, 'cache-css') @@ -1960,7 +1961,15 @@ function url_absolue_css ($css) { AND ($GLOBALS['var_mode'] != 'recalcul')) return $f; - if (!lire_fichier($css, $contenu)) + if ($url_absolue_css==$css){ + if (strncmp($GLOBALS['meta']['adresse_site'],$css,$l=strlen($GLOBALS['meta']['adresse_site']))!=0 + OR !lire_fichier(_DIR_RACINE . substr($css,$l), $contenu)){ + include_spip('inc/distant'); + if (!$contenu = recuperer_page($css)) + return $css; + } + } + elseif (!lire_fichier($css, $contenu)) return $css; // passer les url relatives a la css d'origine en url absolues @@ -2258,4 +2267,96 @@ function filtre_info_plugin_dist($plugin, $type_info) { return $plugins_actifs[$plugin][$type_info]; } -?> + +function filtre_cache_static($scripts,$type='js'){ + $nom = ""; + if (!is_array($scripts) && $scripts) $scripts = array($scripts); + if (count($scripts)){ + $dir = sous_repertoire(_DIR_VAR,'cache-'.$type); + $nom = $dir . md5(serialize($scripts)) . ".$type"; + if ( + (_request('var_mode')=='recalcul') + OR (!file_exists($nom))){ + $fichier = ""; + foreach($scripts as $script){ + if (!is_array($script)){ + if ($type=='css') + $script = url_absolue_css($script); + lire_fichier($script,$contenu); + $fichier .= $contenu . "\n"; + } + else { + parse_str($script[1],$contexte); + $contenu = evaluer_fond($script[0],$contexte); + if ($type=='css'){ + $self = url_absolue(self(true)); + $path = $path = pathinfo($self); + $path = $path['dirname'].'/'; + // passer les url relatives a la css d'origine en url absolues + $contenu = preg_replace(",url\s*\(\s*['\"]?([^'\"/][^:]*)['\"]?\s*\),Uims","url($path\\1)",$contenu); + + } + $fichier .= $contenu['texte']; + } + } + // compacter + $fichier = compacte($fichier,$type); + // ecrire + ecrire_fichier($nom,$fichier); + } + } + return $nom; +} + +function f_compacte_head($flux){ + $self = url_absolue(self(true)); + $path = $path = pathinfo($self); + $dir = preg_quote($path['dirname'].'/',','); + + // rechercher les js, les agglomerer et les compacter, et mettre le tout dans un cache statique + $scripts = array(); + preg_match_all(",<script\s[^>]*src=['\"]([^'\"]*)['\"][^>]*>\s*</script>,",$flux,$regs,PREG_SET_ORDER); + foreach($regs as $script){ + $src = $script[1]; + if (preg_match(",(".$dir."|)spip.php[?](page=([^&]*).*)$,",$src,$r)){ + $src = array($r[3],str_replace('&','&',$r[2])); + } + $scripts[$script[0]] = $src; + } + if ($src = filtre_cache_static($scripts,'js')){ + $scripts = array_keys($scripts); + $flux = str_replace(reset($scripts),"<script type='text/javascript' src='$src'></script>",$flux); + $flux = str_replace($scripts,"",$flux); + } + + // rechercher les css, les agglomerer et les compacter, par type de media + $css = array(); + preg_match_all(",<link\s[^>]*href=['\"]([^'\"]*)['\"][^>]*>,",$flux,$regs,PREG_SET_ORDER); + foreach($regs as $style){ + if (preg_match(',rel=["\']stylesheet["\'],i',$style[0])) { + $m = 0; + // regarder si un media est dispo + preg_match(',media=["\']([^\'"]*)["\'],i',$style[0],$m); + $src = $style[1]; + if (preg_match(",(".$dir."|)spip.php[?](page=([^&]*).*)$,",$src,$r)){ + $src = array($r[3],str_replace('&','&',$r[2])); + } + $css[$m[1]][$style[0]] = $src; + } + } + + // et mettre le tout dans un cache statique + foreach($css as $m=>$s){ + // si plus d'une css pour ce media ou si c'est une css dynamique + if (count($s)>1 OR is_array(reset($s))){ + if ($src = filtre_cache_static($s,'css')){ + $s = array_keys($s); + $flux = str_replace(reset($s),"<link rel='stylesheet'".($m?" media='$m'":"")." href='$src' />",$flux); + $flux = str_replace($s,"",$flux); + } + } + } + return $flux; +} + +?> \ No newline at end of file diff --git a/ecrire/inc/plugin.php b/ecrire/inc/plugin.php index 1caa6a525b..560c104d74 100644 --- a/ecrire/inc/plugin.php +++ b/ecrire/inc/plugin.php @@ -329,7 +329,7 @@ function ecrire_plugin_actifs($plugin,$pipe_recherche=false,$operation='raz') { if (!isset($GLOBALS['spip_pipeline'][$nom])) // creer le pipeline eventuel $GLOBALS['spip_pipeline'][$nom]=""; if (strpos($GLOBALS['spip_pipeline'][$nom],"|$prefix$action")===FALSE) - $GLOBALS['spip_pipeline'][$nom] .= "|$prefix$action"; + $GLOBALS['spip_pipeline'][$nom] = preg_replace(",(\|\||$),","|$prefix$action\\1",$GLOBALS['spip_pipeline'][$nom],1); if (isset($pipe['inclure'])){ $GLOBALS['spip_matrice']["$prefix$action"] = "_DIR_PLUGINS$plug/".$pipe['inclure']; diff --git a/ecrire/inc_version.php b/ecrire/inc_version.php index 7ca736af61..263f5e40ad 100644 --- a/ecrire/inc_version.php +++ b/ecrire/inc_version.php @@ -225,8 +225,8 @@ $spip_pipeline = array( 'delete_all' => '', 'delete_statistiques' => '', 'exec_init' => '', - 'header_prive' => '|f_jQuery', - 'insert_head' => '|f_jQuery', + 'header_prive' => '|f_jQuery||f_compacte_head', + 'insert_head' => '|f_jQuery||f_compacte_head', 'insert_js' => '', 'lister_tables_noexport' => '', 'verifie_js_necessaire' => '', -- GitLab