diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php index f2928790b986df38b5d33866b95976a18e69ad6b..3f92ca0603d563fabb849f0e6bad367a60238bda 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 1caa6a525bf8a662eddc388dfd4f5fa376c18842..560c104d7467e9b476edf809c03734fce16ab5d4 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 7ca736af610b433dea01ed918091e397db403ea4..263f5e40adf3fa16132c4621c3bbf621335ff256 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' => '',