diff --git a/.gitattributes b/.gitattributes index 645649360acf190a3091a08dd23177e689c203be..c7693b4818b774cb37e34a2d0879e81848b7731f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -275,7 +275,6 @@ dist/javascript/jquery.ifixpng.js -text dist/javascript/jquery.js -text dist/javascript/multilang.js -text dist/javascript/pause.js -text -dist/jquery.js.html -text dist/minipres.css -text dist/modeles/application.html -text dist/modeles/article_mots.html -text diff --git a/dist/inc-head.html b/dist/inc-head.html index fc461b85b993039b40d1e2384758087d387845dc..81dffbb9d1d6c957108aeea20fdc23daf47e7f7d 100644 --- a/dist/inc-head.html +++ b/dist/inc-head.html @@ -32,3 +32,9 @@ C'est ici que SPIP va inserer l'appel de la librairie jQuery ] #INSERT_HEAD + + +[(#REM) Agreger et compacter tout cela dans des fichiers statiques + TODO : creer une configuration dans l'espace prive +] +#FILTRE{compacte_head} diff --git a/dist/javascript/SearchHighlight.js b/dist/javascript/SearchHighlight.js index 9c72c169420e5d1e370049594207e25d956f8451..013e650d31800872fe7bbaeba66fcc504cd887b1 100644 --- a/dist/javascript/SearchHighlight.js +++ b/dist/javascript/SearchHighlight.js @@ -6,7 +6,7 @@ * * @author Renato Formato <renatoformato@virgilio.it> * - * @version 0.34 + * @version 0.35 * * Options * - exact (string, default:"exact") @@ -45,6 +45,7 @@ * */ +if (window.jQuery) (function($){ jQuery.fn.SearchHighlight = function(options) { var ref = options.debug_referrer || document.referrer; diff --git a/dist/jquery.js.html b/dist/jquery.js.html deleted file mode 100644 index 5c06ddc330fbbbdfe78393c0c614fee2e83a7058..0000000000000000000000000000000000000000 --- a/dist/jquery.js.html +++ /dev/null @@ -1,22 +0,0 @@ -[(#REM) - - Charger la librairie jQuery et ses plugins - -]#CACHE{7*24*3600,cache-client} -#HTTP_HEADER{'Content-Type: text/javascript'} -/* - * jQuery 1.2.3 - New Wave Javascript - * - * Copyright (c) 2008 John Resig (jquery.com) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * + form.js (plugins @ jQuery.com) - * + ajaxCallback.js (www.spip.net) - */ -[(#INCLURE{javascript/jquery.js}|compacte_js)] -[(#INCLURE{javascript/jquery.form.js}|compacte_js)] -[(#INCLURE{javascript/ajaxCallback.js}|compacte_js)] - -[(#REM) js ajoutee par les plugin et a la volee] -[(#ENV{script}|charge_scripts|compacte_js)] diff --git a/dist/sommaire.html b/dist/sommaire.html index ffd29985f206719945656cb150006af254e7eb87..4980268c65b21af4fe8275c820f36988d3672758 100644 --- a/dist/sommaire.html +++ b/dist/sommaire.html @@ -105,4 +105,4 @@ </div><!--#page--> </body> -</html> \ No newline at end of file +</html> diff --git a/ecrire/balise/formulaire_admin.php b/ecrire/balise/formulaire_admin.php index 26dde4a3f814366997f620f9308ec42c8c5dd99a..60d0cac87878b0c8bb2bb5bd37ec07454c68681e 100644 --- a/ecrire/balise/formulaire_admin.php +++ b/ecrire/balise/formulaire_admin.php @@ -101,7 +101,7 @@ function admin_objet() as $id => $obj) { if (is_int($id)) $id = $obj; $_id_type = id_table_objet($id); - if ($id_type = $GLOBALS[$_id_type]) { + if ($id_type = $GLOBALS['contexte'][$_id_type]) { $id_type = sql_getfetsel($_id_type, table_objet_sql($id), "$_id_type=".intval($id_type)); if ($id_type) { $env[$_id_type] = $id_type; diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php index 38eb37837727e4408e0d8167822eb0a189f4133d..c6c79eb108faedad21e126b9faf7b636a44041d4 100644 --- a/ecrire/inc/filtres.php +++ b/ecrire/inc/filtres.php @@ -2123,8 +2123,15 @@ function f_jQuery ($texte) { array("#INSERT_HEAD",_T('double_occurrence'))) ) . $texte; } else { - $texte = "\n<script src=\"".generer_url_public('jquery.js') - . "\" type=\"text/javascript\"></script>\n".$texte; + foreach (pipeline('jquery_plugins', + array( + 'javascript/jquery.js', + 'javascript/jquery.form.js', + 'javascript/ajaxCallback.js' + )) as $script) + if ($script = find_in_path($script)) + $x .= "\n<script src=\"$script\" type=\"text/javascript\"></script>\n"; + $texte = $x.$texte; } return $texte; } @@ -2309,15 +2316,18 @@ function filtre_cache_static($scripts,$type='js'){ (_request('var_mode')=='recalcul') OR (!file_exists($nom))){ $fichier = ""; + $comms = array(); + $total = 0; foreach($scripts as $script){ if (!is_array($script)) { - $fichier .= "/* $script */\n"; + $comm = $script; if ($type=='css') $script = url_absolue_css($script); lire_fichier($script, $contenu); } else { - $fichier .= "/* page: $script[0] $script[1] */\n"; + $comm = "page=$script[0]" + . (strlen($script[1])?"($script[1])":''); parse_str($script[1],$contexte); $contenu = evaluer_fond($script[0],$contexte); $contenu = $contenu['texte']; @@ -2330,19 +2340,26 @@ function filtre_cache_static($scripts,$type='js'){ } } $f = 'compacte_'.$type; - $fichier .= $f($contenu) . "\n\n"; + $fichier .= "/* $comm */\n". $f($contenu) . "\n\n"; + $comms[] = $comm; + $total += strlen($contenu); } + // calcul du % de compactage + $pc = intval(1000*strlen($fichier)/$total)/10; + $comms = "compact [\n\t".join("\n\t", $comms)."\n] $pc%"; + $fichier = "/* $comms */\n\n".$fichier; + // ecrire ecrire_fichier($nom,$fichier); // ecrire une version .gz pour content-negociation par apache, cf. [11539] ecrire_fichier("$nom.gz",$fichier); } } - return $nom; + return array($nom, "<!-- $comms -->\n"); } -// http://doc.spip.org/@f_compacte_head -function f_compacte_head($flux){ +// http://doc.spip.org/@compacte_head +function compacte_head($flux){ $url_page = substr(generer_url_public('A'), 0, -1); $dir = preg_quote($url_page,',').'|'.preg_quote(url_absolue($url_page,',')); @@ -2366,10 +2383,11 @@ function f_compacte_head($flux){ $scripts[$s] = $src; } } - if ($src = filtre_cache_static($scripts,'js')){ + if (list($src,$comms) = filtre_cache_static($scripts,'js')){ $scripts = array_keys($scripts); $flux = str_replace(reset($scripts), - "<script type='text/javascript' src='$src'></script>\n",$flux); + $comms + ."<script type='text/javascript' src='$src'></script>\n",$flux); $flux = str_replace($scripts,"",$flux); } @@ -2403,10 +2421,11 @@ function f_compacte_head($flux){ 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')){ + if (list($src,$comms) = filtre_cache_static($s,'css')){ $s = array_keys($s); $flux = str_replace(reset($s), - "<link rel='stylesheet'".($m?" media='$m'":"")." href='$src' type='text/css' />\n",$flux); + $comms + ."<link rel='stylesheet'".($m?" media='$m'":"")." href='$src' type='text/css' />\n",$flux); $flux = str_replace($s,"",$flux); } } diff --git a/ecrire/inc/iconifier.php b/ecrire/inc/iconifier.php index 635ed58abf95e2c01143bb8413929dcca4681b39..1dfd616037ecdb81c057abb7332f3c9129e9229a 100644 --- a/ecrire/inc/iconifier.php +++ b/ecrire/inc/iconifier.php @@ -68,7 +68,6 @@ function inc_iconifier_dist($id_objet, $id, $script, $visible=false, $flag_modi . http_script('$("form.form_upload_icon").async_upload(async_upload_icon)'); } else $js = ""; - spip_log($js); return ajax_action_greffe("iconifier", $id, $res).$js; } else return ''; diff --git a/ecrire/inc/surligne.php b/ecrire/inc/surligne.php index 78ecf99871ab5928a1c4e4d3bc7e23cda67be92d..22189f92020117620f0a5a690a6f88a0fd4326e9 100644 --- a/ecrire/inc/surligne.php +++ b/ecrire/inc/surligne.php @@ -53,9 +53,12 @@ function surligner_mots($page) { if($surcharge_surligne || (preg_match($engine[0],$ref) && preg_match($engine[1],$ref))) { //good referrer found or var_recherche is not null - $script = "<script type='text/javascript'> - jQuery(function(){ - jQuery(document).SearchHighlight({ + $script = " + <script type='text/javascript' src='".url_absolue(find_in_path('javascript/SearchHighlight.js'))."'></script> + <script type='text/javascript'> + if (window.jQuery) + (function(\$){\$(function(){ + \$(document).SearchHighlight({ style_name:'spip_surligne', exact:'whole', style_name_suffix:false, @@ -67,14 +70,13 @@ function surligner_mots($page) { min_length: 3 }) }); + })(jQuery); </script> "; - if(jquery_chargee($page)) { - //add javascript/SearchHighlight.js to the template jquery.js.html - $page = ajouter_js_affichage_final($page,"SearchHighlight"); - //add a script inline into the <head> - $page = ajouter_js_affichage_final($page,$script,true); - } + // on l'insere juste avant </head>, sinon tout en bas + if (is_null($l = strpos($page,'</head>'))) + $l = strlen($page); + $page = substr_replace($page, $script, $l,0); break; } return $page; diff --git a/ecrire/inc_version.php b/ecrire/inc_version.php index dd1db3fae5881b6a5fda65c91232920158b53ab8..89ddee1abda58a43356a6935a2009523bda2217f 100644 --- a/ecrire/inc_version.php +++ b/ecrire/inc_version.php @@ -227,11 +227,12 @@ $spip_pipeline = array( 'delete_all' => '', 'delete_statistiques' => '', 'exec_init' => '', - 'header_prive' => '|f_jQuery||f_compacte_head', - 'insert_head' => '|f_jQuery||f_compacte_head', - 'insert_js' => '', + 'header_prive' => '|f_jQuery', + 'insert_head' => '|f_jQuery', + 'jquery_plugins' => '', +# 'insert_js' => '', 'lister_tables_noexport' => '', - 'verifie_js_necessaire' => '', +# 'verifie_js_necessaire' => '', 'mots_indexation' => '', 'nettoyer_raccourcis_typo' => '', 'pre_boucle' => '', diff --git a/ecrire/public.php b/ecrire/public.php index 4dba9ca06674f9bb7b217ab9ff1c1761e9a7b1a9..e64b26213463410f2e041267657a71b5ba243d45 100644 --- a/ecrire/public.php +++ b/ecrire/public.php @@ -217,8 +217,6 @@ if ($GLOBALS['_INC_PUBLIC']>0) { } - if ($html) $page = analyse_js_ajoutee($page); - // Passer la main au debuggueur le cas echeant if ($var_mode == 'debug') { diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php index 96e978d0bcc244a8f9d40944216578ed42f9605b..1d706e5f2156610165a1f1a0537f2139df5cc26e 100644 --- a/ecrire/public/assembler.php +++ b/ecrire/public/assembler.php @@ -233,18 +233,17 @@ function assembler_page ($fond, $connect='') { // Si requete HEAD ou Last-modified compatible, ignorer le texte // et pas de content-type (pour contrer le bouton admin de inc-public) - if ($headers_only) { $page['entetes']["Connection"] = "close"; $page['texte'] = ""; } else { + // si la page est prise dans le cache if (!$use_cache) { - if (isset($page['contexte'])){ - // Remplir les globals pour les boutons d'admin - foreach ($page['contexte'] as $var=>$val) - $GLOBALS[$var] = $val; - } - } else { + // Informer les boutons d'admin du contexte + $GLOBALS['contexte'] = $page['contexte']; + } + // sinon analyser le contexte & calculer la page + else { $parametrer = charger_fonction('parametrer', 'public'); $page = $parametrer($fond, '', $chemin_cache, $connect); @@ -510,99 +509,6 @@ function f_msie ($texte) { } -// Ajoute a la volee scripts a le squelette jquery.js.html -// http://doc.spip.org/@ajouter_js_affichage_final -function ajouter_js_affichage_final($page,$scripts,$inline = false) { - if(!$scripts || (!$inline && !preg_match(",\w+\|?,",$scripts)) || ($inline && !preg_match(",^\s*<script.*</script>\s*$,Us",$scripts))) { - spip_log("ajouter_js_afficaghe_final interdite $scripts"); - return $page; - } - if($inline) { - $page = substr_replace($page,$scripts."\n",strpos($page,"</head>"),0); - } - //verifie c'est un script HTML et que jquery.js.html est la - else if($res = jquery_chargee($page)) { - list($pos_script,$appelle) = $res; - $params = $appelle.(strpos($appelle,"&")?"|":"&script=").$scripts; - $page = substr_replace($page,$params,$pos_script,strlen($appelle)); - } - return $page; -} - -//verifie si le squelette jquery.js.html est appelle dans un flux de page et donnee -//false ou un tableau avec la position et la chaine de l'appelle -// http://doc.spip.org/@jquery_chargee -function jquery_chargee($page) { - $pos_debut_head=strpos($page,"<head>"); - $pos_fin_head=strpos($page,"</head>",$pos_debut_head); - if($pos_debut_head!==false && $pos_fin_head!==false) { - $head = substr($page,$pos_debut_head,$pos_fin_head-$pos_debut_head); - // verifie on a l'appelle a le squelette jquery.js - if ($pos_script = strpos($head, generer_url_public('jquery.js'))){ - $pos_script += $pos_debut_head; - $appelle = substr($page,$pos_script,strpos($page,'"',$pos_script)-$pos_script); - return array($pos_script,$appelle); - } - } - return false; -} - -// http://doc.spip.org/@analyse_js_ajoutee -function analyse_js_ajoutee($page) { - //verifie si jquery.js.html est chargee - $corps = $page['texte']; - if(!($jquery_chargee = jquery_chargee($corps))) return $page; - //verifie js necessaire - $js_necessaire = pipeline("verifie_js_necessaire",array("page" => $page, "data" => "")); - $scripts_fichier = $page['insert_js_fichier']; - $scripts_inline = $page['insert_js_inline']; - $scripts_a_ajouter = array(); - if (is_array($scripts_fichier)) - foreach($scripts_fichier as $nom => $script) - if (!isset($js_necessaire[$nom]) || $js_necessaire[$nom]) { - //ajoute script fichier - if(is_array($script)) - foreach($script as $code) - push_script($scripts_a_ajouter,$code); - else - push_script($scripts_a_ajouter,$script); - } - // ajoute le scripts trouvee - if(count($scripts_a_ajouter)) { - $scripts_a_ajouter = join("|",$scripts_a_ajouter); - list($pos_script,$appelle) = $jquery_chargee; - $params = $appelle.(strpos($appelle,"&")?"|":"&script=").$scripts_a_ajouter; - $corps = substr_replace($corps,$params,$pos_script,strlen($appelle)); - } - $scripts_a_ajouter = array(); - if (is_array($scripts_inline)) - foreach($scripts_inline as $nom => $script) - if (!isset($js_necessaire[$nom]) || $js_necessaire[$nom]) { - //ajoute script inline - if (is_array($script)) { - foreach($script as $code) - push_script($scripts_a_ajouter,$code,true); - } else - push_script($scripts_a_ajouter,$script,true); - } - // ajoute le scripts trouvee - if (count($scripts_a_ajouter)) { - list($pos_script,$appelle) = $jquery_chargee; - $pos_fin_script = strpos($corps,"</script>",$pos_script)+strlen("</script>"); - $corps = substr_replace($corps,join("\n",$scripts_a_ajouter),$pos_fin_script,0); - } - $page['texte'] = $corps; - return $page; -} - -// http://doc.spip.org/@push_script -function push_script(&$scripts,$script,$inline = false) { - if(($inline && preg_match(",^\s*<script.*</script>\s*$,Us",$script)) || (!$inline && preg_match(",^\w+$,",$script))) - $scripts[]= $script; - else - spip_log("insert_js ".($inline?"inline":"")." interdite $script"); -} - // http://doc.spip.org/@message_erreur_404 function message_erreur_404 ($erreur= "") { if (defined('_PAS_DE_PAGE_404')) diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php index e92464df555a5219788e11d875efeb4c7378839b..be79b2faa0541b1a986ca16a89bb82242993a882 100644 --- a/ecrire/public/balises.php +++ b/ecrire/public/balises.php @@ -975,6 +975,23 @@ function balise_HTTP_HEADER_dist($p) { return $p; } +// Filtre a appliquer a l'ensemble de la page une fois calculee +// (filtrage fait au niveau du squelette, et sans s'appliquer aux <INCLURE>) +function balise_FILTRE_dist($p) { + if ($p->param) { + $args = array(); + foreach ($p->param as $i => $ignore) + $args[] = interprete_argument_balise($i+1,$p); + $p->code = '\'<' + .'?php header("X-Spip-Filtre: \'.' + .join('.', $args) + . " . '\"); ?'.'>'"; + + $p->interdire_scripts = false; + return $p; + } +} + // // #CACHE // definit la duree de vie ($delais) du squelette diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php index 80026a34789d3926c3e59f73c89b874356d9a25e..b4f4dc7b7eaa5218746dec1a7a3b39587800fa84 100644 --- a/ecrire/public/compiler.php +++ b/ecrire/public/compiler.php @@ -892,7 +892,8 @@ function " . $nom . '($Cache, $Pile, $doublons=array(), $Numrows=array(), $SP=0) // avant de referencer $Cache $corps . "; - return analyse_resultat_skel('$nom', \$Cache, \$page); + return analyse_resultat_skel(".var_export($nom,true) + .", \$Cache, \$page, ".var_export($sourcefile,true)."); } ?".">"; diff --git a/ecrire/public/parametrer.php b/ecrire/public/parametrer.php index 6f81f0b659a2599f4b4fabe7a12670f93bfd0091..bdb714981dcabf0e88163fe328f14f111df3927b 100644 --- a/ecrire/public/parametrer.php +++ b/ecrire/public/parametrer.php @@ -58,8 +58,26 @@ function calculer_contexte() { return $contexte; } + +function echapper_php_callback($r) { + static $src = array(); + static $dst = array(); + + // si on recoit un tableau, on est en mode echappement + // on enregistre le code a echapper dans dst, et le code echappe dans src + if (is_array($r)) { + $dst[] = $r[0]; + return $src[] = ' ___'.md5($r[0]).'___ '; + } + + // si on recoit une chaine, on est en mode remplacement + $r = str_replace($src, $dst, $r); + $src = $dst = array(); // raz de la memoire + return $r; +} + // http://doc.spip.org/@analyse_resultat_skel -function analyse_resultat_skel($nom, $cache, $corps) { +function analyse_resultat_skel($nom, $cache, $corps, $source='') { $headers = array(); // Recupere les < ?php header('Xx: y'); ? > pour $page['headers'] @@ -82,8 +100,25 @@ function analyse_resultat_skel($nom, $cache, $corps) { ? 'html' : 'php'; + // traiter #FILTRE{} ? + if (isset($headers['X-Spip-Filtre']) + AND strlen($headers['X-Spip-Filtre'])) { + // proteger les <INCLUDE> et tous les morceaux de php + if ($process_ins == 'php') + $corps = preg_replace_callback(',<[?](\s|php|=).*[?]>,UimsS', + echapper_php_callback, $corps); + foreach (explode(',', $headers['X-Spip-Filtre']) as $filtre) { + $corps = appliquer_filtre($corps, $filtre); + } + // restaurer les echappements + $corps = echapper_php_callback($corps); + unset($headers['X-Spip-Filtre']); + } + + return array('texte' => $corps, 'squelette' => $nom, + 'source' => $source, 'process_ins' => $process_ins, 'invalideurs' => $cache, 'entetes' => $headers, @@ -244,22 +279,17 @@ function public_parametrer_dist($fond, $local='', $cache='', $connect='') { // 2. $fond est passe par reference, pour la meme raison // Bref, les URL dites propres ont une implementation sale. // Interdit de nettoyer, faut assumer l'histoire. - global $contexte; - $contexte = calculer_contexte(); + $GLOBALS['contexte'] = calculer_contexte(); if (!$renommer_urls) { // compatibilite < 1.9.3 charger_generer_url(); if (function_exists('recuperer_parametres_url')) $renommer_urls = 'recuperer_parametres_url'; } - if ($renommer_urls) { + if ($renommer_urls) $renommer_urls($fond, nettoyer_uri()); - // remettre les globales (bouton "Modifier cet article" etc) - foreach ($contexte as $var=>$val) { - if (substr($var,0,3) == 'id_') $GLOBALS[$var] = $val; - } - } - $local = $contexte; + + $local = $GLOBALS['contexte']; // si le champ chapo commence par '=' c'est une redirection. // avec un eventuel raccourci Spip @@ -340,14 +370,19 @@ function public_parametrer_dist($fond, $local='', $cache='', $connect='') { $GLOBALS['les_notes'] = $notes; // spip_log: un joli contexte - $info = array(); - foreach($local as $var => $val) - if($val) - $info[] = "$var='$val'"; + $infos = array(); + foreach (array_filter($local) as $var => $val) { + if (is_array($val)) $val = "[".join($val)."]"; + if (strlen("$val") > 20) + $val = substr("$val", 0,17).'..'; + if (strstr($val,' ')) + $val = "'$val'"; + $infos[] = $var.'='.$val; + } spip_log("calcul (" .($profile = spip_timer($a)) .") [$skel] " - . join(', ',$info) + . join(', ', $infos) .' ('.strlen($page['texte']).' octets)' ); if ($debug)