From f38f4f609b2de8897e2f57c6a41e8383108a6c78 Mon Sep 17 00:00:00 2001 From: "Committo,Ergo:sum" <esj@rezo.net> Date: Sun, 5 Sep 2004 11:31:42 +0000 Subject: [PATCH] =?UTF-8?q?traitement=20des=20doublons=20sans=20globale=20?= =?UTF-8?q?pour=20assurer=20la=20r=C3=A9entrance=20du=20compilateur=20de?= =?UTF-8?q?=20squelettes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecrire/inc_documents.php3 | 4 +- ecrire/inc_texte.php3 | 181 ++++++++++++++++++++++++-------------- inc-balises.php3 | 22 +++-- inc-calcul-outils.php3 | 3 +- inc-compilo-index.php3 | 41 ++++----- inc-compilo.php3 | 14 +-- inc-html-squel.php3 | 1 - 7 files changed, 154 insertions(+), 112 deletions(-) diff --git a/ecrire/inc_documents.php3 b/ecrire/inc_documents.php3 index 47fd132eba..0ed0a5c5a6 100644 --- a/ecrire/inc_documents.php3 +++ b/ecrire/inc_documents.php3 @@ -62,7 +62,7 @@ function vignette_par_defaut($type_extension) { // function embed_document($id_document, $les_parametres="", $afficher_titre=true) { - global $id_doublons; # ne sert plus aux squelettes + global $id_doublons; $id_doublons['documents'] .= ",$id_document"; @@ -195,7 +195,7 @@ function embed_document($id_document, $les_parametres="", $afficher_titre=true) // function integre_image($id_document, $align, $type_aff) { - global $id_doublons; # ne sert plus aux squelettes + global $id_doublons; global $flag_ecrire; $id_doublons['documents'] .= ",$id_document"; diff --git a/ecrire/inc_texte.php3 b/ecrire/inc_texte.php3 index 579d9d46d3..db9855bdfc 100644 --- a/ecrire/inc_texte.php3 +++ b/ecrire/inc_texte.php3 @@ -121,28 +121,33 @@ function spip_apres_typo ($letexte) { } - // Mise de cote des echappements -function echappe_html($letexte, $source='SOURCEPROPRE', $no_transform=false) { - global $flag_pcre; - if ($flag_pcre) { // beaucoup plus rapide si on a pcre - $regexp_echap_html = "<html>((.*?))<\/html>"; - $regexp_echap_code = "<code>((.*?))<\/code>"; - $regexp_echap_cadre = "[\n\r]*<(cadre|frame)>((.*?))<\/(cadre|frame)>[\n\r]*"; - $regexp_echap_poesie = "[\n\r]*<(poesie|poetry)>((.*?))<\/(poesie|poetry)>[\n\r]*"; - $regexp_echap = "/($regexp_echap_html)|($regexp_echap_code)|($regexp_echap_cadre)|($regexp_echap_poesie)/si"; +// Les regexp de echappe_html, dépendant de la fonction de comparaison + +if ($GLOBALS['flag_pcre']) { + $GLOBALS['fct_match'] = 'preg_match'; + $regexp_echap_html = "<html>((.*?))<\/html>"; + $regexp_echap_code = "<code>((.*?))<\/code>"; + $regexp_echap_cadre = "[\n\r]*<(cadre|frame)>((.*?))<\/(cadre|frame)>[\n\r]*"; + $regexp_echap_poesie = "[\n\r]*<(poesie|poetry)>((.*?))<\/(poesie|poetry)>[\n\r]*"; + $GLOBALS['regexp_echappe'] = "/($regexp_echap_html)|($regexp_echap_code)|($regexp_echap_cadre)|($regexp_echap_poesie)/si"; } else { //echo creer_echappe_sans_pcre("cadre"); - $regexp_echap_html = "<html>(([^<]|<[^/]|</[^h]|</h[^t]|</ht[^m]|</htm[^l]|<\/html[^>])*)<\/html>"; - $regexp_echap_code = "<code>(([^<]|<[^/]|</[^c]|</c[^o]|</co[^d]|</cod[^e]|<\/code[^>])*)<\/code>"; - $regexp_echap_cadre = "(<[cf][ar][da][rm]e>(([^<]|<[^/]|</[^cf]|</[cf][^ar]|</[cf][ar][^da]|</[cf][ar][da][^rm]|</[cf][ar][da][rm][^e]|<\/[cf][ar][da][rm]e[^>])*)<\/[cf][ar][da][rm]e>)()"; // parentheses finales pour obtenir meme nombre de regs que pcre - $regexp_echap_poesie = "(<poe[st][ir][ey]>(([^<]|<[^/]|</[^p]|</p[^o]|</po[^e]|</poe[^st]|</poe[st][^ir]|</poe[st][ir][^[ey]]|<\/poe[st][ir][ey][^>])*)<\/poe[st][ir][ey]>)()"; - $regexp_echap = "($regexp_echap_html)|($regexp_echap_code)|($regexp_echap_cadre)|($regexp_echap_poesie)"; - } + $GLOBALS['fct_match'] = 'eregi'; + $regexp_echap_html = "<html>(([^<]|<[^/]|</[^h]|</h[^t]|</ht[^m]|</htm[^l]|<\/html[^>])*)<\/html>"; + $regexp_echap_code = "<code>(([^<]|<[^/]|</[^c]|</c[^o]|</co[^d]|</cod[^e]|<\/code[^>])*)<\/code>"; + $regexp_echap_cadre = "(<[cf][ar][da][rm]e>(([^<]|<[^/]|</[^cf]|</[cf][^ar]|</[cf][ar][^da]|</[cf][ar][da][^rm]|</[cf][ar][da][rm][^e]|<\/[cf][ar][da][rm]e[^>])*)<\/[cf][ar][da][rm]e>)()"; // parentheses finales pour obtenir meme nombre de regs que pcre + $regexp_echap_poesie = "(<poe[st][ir][ey]>(([^<]|<[^/]|</[^p]|</p[^o]|</po[^e]|</poe[^st]|</poe[st][^ir]|</poe[st][ir][^[ey]]|<\/poe[st][ir][ey][^>])*)<\/poe[st][ir][ey]>)()"; + $GLOBALS['regexp_echappe'] = "($regexp_echap_html)|($regexp_echap_code)|($regexp_echap_cadre)|($regexp_echap_poesie)"; + } - while (($flag_pcre && preg_match($regexp_echap, $letexte, $regs)) - || (!$flag_pcre && eregi($regexp_echap, $letexte, $regs))) { +function echappe_html($letexte, $source='SOURCEPROPRE', $no_transform=false) { + global $flag_pcre, $fct_match, $regexp_echappe; + + $debut = ''; + $suite = $letexte; + while ($fct_match($regexp_echappe, $suite, $regs)) { $num_echap++; if ($no_transform) { // echappements bruts @@ -188,11 +193,12 @@ function echappe_html($letexte, $source='SOURCEPROPRE', $no_transform=false) { $les_echap[$num_echap] = propre($lecode); } - $pos = strpos($letexte, $regs[0]); - $letexte = substr($letexte,0,$pos)."@@SPIP_$source$num_echap@@" - .substr($letexte,$pos+strlen($regs[0])); + $pos = strpos($suite, $regs[0]); + $debut .= substr($suite,0,$pos)."@@SPIP_$source$num_echap@@"; + $suite = substr($suite, $pos+strlen($regs[0])); + spip_log($suite); } - + $letexte = $debut . $suite; // Gestion du TeX if (!(strpos($letexte, "<math>") === false)) { include_ecrire("inc_math.php3"); @@ -200,22 +206,15 @@ function echappe_html($letexte, $source='SOURCEPROPRE', $no_transform=false) { } // - // Insertion d'images et de documents utilisateur - // + // Reperages d'images et de documents utilisateur + // (insertion dans echappe_retour pour faciliter les doublons) while (eregi("<(IMG|DOC|EMB)([0-9]+)(\|([^\>]*))?".">", $letexte, $match)) { - include_ecrire("inc_documents.php3"); $num_echap++; $letout = quotemeta($match[0]); $letout = ereg_replace("\|", "\|", $letout); - $id_document = $match[2]; - $align = $match[4]; - if (eregi("emb", $match[1])) - $rempl = embed_document($id_document, $align); - else - $rempl = integre_image($id_document, $align, $match[1]); $letexte = ereg_replace($letout, "@@SPIP_$source$num_echap@@", $letexte); - $les_echap[$num_echap] = $rempl; + $les_echap[$num_echap] = $match; } // @@ -241,19 +240,46 @@ function echappe_html($letexte, $source='SOURCEPROPRE', $no_transform=false) { .substr($letexte,$pos+strlen($les_echap[$num_echap])); } } - return array($letexte, $les_echap); } // Traitement final des echappements function echappe_retour($letexte, $les_echap, $source='') { - while (ereg("@@SPIP_$source([0-9]+)@@", $letexte, $match)) { - $lenum = $match[1]; - $cherche = $match[0]; - $pos = strpos($letexte, $cherche); - $letexte = substr($letexte, 0, $pos). $les_echap[$lenum] . substr($letexte, $pos + strlen($cherche)); - } - return $letexte; + $cherche = "@@SPIP_$source"; + $n = strlen($cherche); + $debut = ''; + while(($pos = strpos($letexte, $cherche)) !== false) { + ereg("^([0-9]+)@@(.*)$",substr($letexte,$pos+$n),$regs); + $rempl = $les_echap[$regs[1]]; +# si $rempl est un tableau, c'est le résultat (cf echappe_html) de eregi sur : +# <(IMG|DOC|EMB)([0-9]+)(\|([^\>]*))? + if (is_array($rempl)) + { + include_ecrire("inc_documents.php3"); + $type = strtoupper($rempl[1]); + if ($type == 'EMB') + $rempl = embed_document($rempl[2], $rempl[4]); + else + $rempl = integre_image($rempl[2], $rempl[4], $type); + } + $debut .= substr($letexte,0,$pos) . $rempl; + $letexte = $regs[2]; + } + return $debut . $letexte; +} + +# il y a 3 couples de fonctions homonymes au prefixe _doublons pres +# pour éviter à tous les appels de se trimbaler ce qui concerne les squelettes + +function echappe_retour_doublon($letexte, $les_echap, $source, &$doublons) +{ + if (!$les_echap) + return $letexte; + foreach($les_echap as $rempl) { + if (is_array($rempl)) # cf commentaires dans la fonction echappe_retour + $doublons['documents'] .= "," . $rempl[2]; + } + return echappe_retour($letexte, $les_echap, $source); } function couper($texte, $taille=50) { @@ -445,12 +471,9 @@ function typo_en($letexte) { // Typographie generale : francaise si la langue est 'cpf', 'fr' ou 'eo', // sinon anglaise (minimaliste) -function typo($letexte) { +function typo_generale($letexte) { global $spip_lang, $lang_typo; - // echapper les codes <html>...</html> etc. - list($letexte, $les_echap) = echappe_html($letexte, "SOURCETYPO"); - // Appeler la fonction de pre-traitement $letexte = spip_avant_typo ($letexte); @@ -465,21 +488,32 @@ function typo($letexte) { $letexte = typo_en($letexte); // Appeler la fonction de post-traitement - $letexte = spip_apres_typo ($letexte); + return spip_apres_typo ($letexte); +} +function typo($letexte) { + // echapper les codes <html>...</html> etc. + list($letexte, $les_echap) = echappe_html($letexte, "SOURCETYPO"); + + $letexte = typo_generale($letexte); // reintegrer les echappements - $letexte = echappe_retour($letexte, $les_echap, "SOURCETYPO"); - - return $letexte; + return echappe_retour($letexte, $les_echap, "SOURCETYPO"); } +function typo_doublon(&$doublons, $letexte) +{ + // echapper les codes <html>...</html> etc. + list($letexte, $les_echap) = echappe_html($letexte, "SOURCETYPO"); + + $letexte = typo_generale($letexte); + // reintegrer les echappements + return echappe_retour_doublon($letexte, $les_echap, "SOURCETYPO", $doublons); +} // cette fonction est tordue : on lui passe un tableau correspondant au match // de la regexp ci-dessous, et elle retourne le texte a inserer a la place // et le lien "brut" a usage eventuel de redirection... function extraire_lien ($regs) { - global $flag_ecrire; - $lien_texte = $regs[1]; $lien_url = trim($regs[3]); @@ -678,10 +712,9 @@ function traiter_listes ($texte) { } // Nettoie un texte, traite les raccourcis spip, la typo, etc. -function traiter_raccourcis($letexte, $les_echap = false, $traiter_les_notes = 'oui') { +function traiter_raccourcis_generale($letexte) { global $debut_intertitre, $fin_intertitre, $ligne_horizontale, $url_glossaire_externe; global $compt_note; - global $les_notes; global $marqueur_notes; global $ouvre_ref; global $ferme_ref; @@ -690,10 +723,6 @@ function traiter_raccourcis($letexte, $les_echap = false, $traiter_les_notes = ' global $flag_pcre; global $lang_dir; - // echapper les <a href>, <html>...< /html>, <code>...< /code> - if (!$les_echap) - list($letexte, $les_echap) = echappe_html($letexte, "SOURCEPROPRE"); - // Appeler la fonction de pre_traitement $letexte = spip_avant_propre ($letexte); @@ -934,20 +963,38 @@ function traiter_raccourcis($letexte, $les_echap = false, $traiter_les_notes = ' // Appeler la fonction de post-traitement $letexte = spip_apres_propre ($letexte); - // Reinserer les echappements - $letexte = echappe_retour($letexte, $les_echap, "SOURCEPROPRE"); + return array($letexte,$mes_notes); +} - if ($mes_notes) { - $mes_notes = traiter_raccourcis($mes_notes, $les_echap, 'non'); - if (ereg('<p class="spip">',$mes_notes)) - $mes_notes = ereg_replace('<p class="spip">', '<p class="spip_note">', $mes_notes); - else - $mes_notes = '<p class="spip_note">'.$mes_notes."</p>\n"; - $mes_notes = echappe_retour($mes_notes, $les_echap, "SOURCEPROPRE"); - $les_notes .= interdire_scripts($mes_notes); - } +function traiter_les_notes($mes_notes, $les_echap) +{ + $mes_notes = traiter_raccourcis_generale($mes_notes); + if (ereg('<p class="spip">',$mes_notes)) + $mes_notes = ereg_replace('<p class="spip">', '<p class="spip_note">', $mes_notes); + else + $mes_notes = '<p class="spip_note">'.$mes_notes."</p>\n"; + $mes_notes = echappe_retour($mes_notes, $les_echap, "SOURCEPROPRE"); + $GLOBALS['les_notes'] .= interdire_scripts($mes_notes); +} + +function traiter_raccourcis($letexte) +{ + // echapper les <a href>, <html>...< /html>, <code>...< /code> + list($letexte, $les_echap) = echappe_html($letexte, "SOURCEPROPRE"); + list($letexte, $mes_notes) = traiter_raccourcis_generale($letexte); + if ($mes_notes) traiter_les_notes($mes_notes, $les_echap); + // Reinserer les echappements + return trim(echappe_retour($letexte, $les_echap, "SOURCEPROPRE")); +} - return trim($letexte); +function traiter_raccourcis_doublon(&$doublons, $letexte) +{ + // echapper les <a href>, <html>...< /html>, <code>...< /code> + list($letexte, $les_echap) = echappe_html($letexte, "SOURCEPROPRE"); + list($letexte, $mes_notes) = traiter_raccourcis_generale($letexte); + if ($mes_notes) traiter_les_notes($mes_notes, $les_echap); + // Reinserer les echappements + return trim(echappe_retour_doublon($letexte, $les_echap, "SOURCEPROPRE", $doublons)); } diff --git a/inc-balises.php3 b/inc-balises.php3 index 80f05ababf..1efedddfe9 100644 --- a/inc-balises.php3 +++ b/inc-balises.php3 @@ -4,9 +4,9 @@ // Ce fichier regroupe la quasi totalite des definitions de #BALISES de spip // Pour chaque balise, il est possible de surcharger, dans mes_fonctions.php3, // la fonction balise_TOTO_dist par une fonction balise_TOTO() respectant la -// meme API : recoit en entree plein de donnees, les modifie et les retourne. -// Le format du bloc de donnees $p est un objet de la class ParamChamp, -// definie dans inc-compilo-index.php3 +// meme API : +// elle recoit en entree un objet de classe CHAMP, le modifie et le retourne. +// Cette classe est definie dans inc-compilo-index.php3 // ## NB: les fonctions de forum sont definies dans inc-forum.php3 @@ -19,9 +19,9 @@ define("_INC_BALISES", "1"); // -// Pre-traitements standard de divers champs +// Traitements standard de divers champs // -function champs_traitements ($nom_champ) { +function champs_traitements ($p) { static $traitements = array ( 'BIO' => 'traiter_raccourcis(%s)', 'CHAPO' => 'traiter_raccourcis(nettoyer_chapo(%s))', @@ -52,8 +52,16 @@ function champs_traitements ($nom_champ) { 'URL_SITE' => 'htmlspecialchars(vider_url(%s))', 'URL_SYNDIC' => 'htmlspecialchars(vider_url(%s))' ); - - return $traitements[$nom_champ]; + $ps = $traitements[$p->$nom_champ]; + if (!$ps) return $p->code; + if ($p->documents) + {$ps = str_replace('traite_raccourcis(', + 'traite_raccourcis_doublon($doublons,', + str_replace('typo(', + 'ttypo_doublon($doublons,', + $ps)); + } + return str_replace('%s', $p->code, $ps); } // diff --git a/inc-calcul-outils.php3 b/inc-calcul-outils.php3 index 0161b8bda5..c4450778e6 100644 --- a/inc-calcul-outils.php3 +++ b/inc-calcul-outils.php3 @@ -230,8 +230,7 @@ function calcul_branche ($generation) { # fonction appelée par la balise #EMBED function calcule_embed_document($id_document, $filtres, &$doublons, $doubdoc){ - // a finaliser - // if ($doubdoc && $id_document) $doublons["documents"] .= ', ' . $id_document; + if ($doubdoc && $id_document) $doublons["documents"] .= ', ' . $id_document; return embed_document($id_document, $filtres, false); } diff --git a/inc-compilo-index.php3 b/inc-compilo-index.php3 index ff57aaa9d9..191799cf64 100644 --- a/inc-compilo-index.php3 +++ b/inc-compilo-index.php3 @@ -61,14 +61,13 @@ class Champ { var $fonctions; // filtre explicites var $etoile; // champs pour la production de code - var $process; // processeurs standards, exemple 'propre(%s)' var $id_boucle; var $boucles; var $type_requete; var $code; // code du calcul var $statut; // 'numerique, 'h'=texte (html) ou 'p'=script (php) ? // -> definira les pre et post-traitements obligatoires - // champs pour des balises speciales + // champs pour la production de code dependant du contexte var $id_mere; // pour TOTAL_BOUCLE hors du corps var $document; // pour embed et <img dans les textes } @@ -204,7 +203,6 @@ function calculer_champ($p) { // Genere l'application d'une liste de filtres function applique_filtres($p) { - $code = $p->code; $statut = $p->statut; $fonctions = $p->fonctions; $p->fonctions = ''; # pour réutiliser la structure si récursion @@ -223,9 +221,7 @@ function applique_filtres($p) { } // processeurs standards (cf inc-balises.php3) - $ps = champs_traitements($p->nom_champ); - if ($ps && (!$p->etoile)) - $code = str_replace('%s', $code, $ps); + $code = ($p->etoile ? $p->code : champs_traitements($p)); // Appliquer les filtres perso if ($fonctions) { foreach($fonctions as $fonc) { @@ -233,26 +229,13 @@ function applique_filtres($p) { $arglist = ''; if (ereg('([^\{\}]*)\{(.+)\}$', $fonc, $regs)) { $fonc = $regs[1]; - $args = $regs[2]; - while (ereg('([^,]+),?(.*)$', $args, $regs)) { - $args = $regs[2]; - $arg = trim($regs[1]); - if ($arg) { - if ($arg[0] =='#') - { $p->nom_champ = substr($arg,1); - $arg = calculer_champ($p);} - else if ($arg[0] =='$') - $arg = '$Pile[0][\'' . substr($arg,1) . "']"; - $arglist .= ','.$arg; - } - } + $arglist = filtres_arglist($regs[2],$p); } - if (function_exists($fonc)) - $code = "$fonc($code$arglist)"; - else + if (!function_exists($fonc)) $code = "'".texte_script( _T('erreur_filtre', array('filtre' => $fonc)) )."'"; + else $code = "$fonc($code$arglist)"; } } } @@ -264,6 +247,20 @@ function applique_filtres($p) { } +function filtres_arglist($args, $p) { + while (ereg('([^,]+),?(.*)$', $args, $regs)) { + $arg = trim($regs[1]); + if ($arg) { + if ($arg[0] =='#') + { $p->nom_champ = substr($arg,1); + $arg = calculer_champ($p);} + else if ($arg[0] =='$') + $arg = '$Pile[0][\'' . substr($arg,1) . "']"; + $arglist .= ','.$arg; + } + } +} + // // Reserve les champs necessaires a la comparaison avec le contexte donne par // la boucle parente ; attention en recursif il faut les reserver chez soi-meme diff --git a/inc-compilo.php3 b/inc-compilo.php3 index c79883376f..b876b9ceb6 100644 --- a/inc-compilo.php3 +++ b/inc-compilo.php3 @@ -216,7 +216,7 @@ function calculer_boucle($id_boucle, &$boucles) { if ($lang_select AND !$constant) $debut .= ' - if ($x = $Pile[$SP]["lang"]) $spip_lang = $x; // lang_select'; + if ($x = $Pile[$SP]["lang"]) $GLOBALS[\'spip_lang\'] = $x; // lang_select'; $corps = $debut . $invalide; @@ -251,14 +251,6 @@ function calculer_boucle($id_boucle, &$boucles) { if ($boucle->hierarchie) $texte .= "\n ".$boucle->hierarchie; - // hack doublons documents : s'il y a quelque chose dans - // $GLOBALS['doublons_documents'], c'est que des documents ont - // ete vus par integre_image() ou autre fournisseur officiel de - // doublons : on les transfere alors vers la vraie variable - $texte .= ' - global $spip_lang, $doublons_documents; - $doublons[\'documents\'].=$doublons_documents; $doublons_documents="";'; - // Recherche : recuperer les hash a partir de la chaine de recherche if ($boucle->hash) { $texte .= ' @@ -287,8 +279,8 @@ function calculer_boucle($id_boucle, &$boucles) { // Memoriser la langue avant la boucle pour la restituer apres if ($lang_select) { - $texte .= "\n \$old_lang = \$spip_lang;"; - $corps .= "\n \$spip_lang = \$old_lang;"; + $texte .= "\n \$old_lang = \$GLOBLAS['spip_lang'];"; + $corps .= "\n \$GLOBAL['spip_lang'] = \$old_lang;"; } } diff --git a/inc-html-squel.php3 b/inc-html-squel.php3 index e61ae1a20f..394565fa11 100644 --- a/inc-html-squel.php3 +++ b/inc-html-squel.php3 @@ -103,7 +103,6 @@ function parser_champs_etendus($debut) { function parser_champs_exterieurs($debut, $sep, $nested) { - spip_log("$sep: $debut"); $res = array(); foreach (split("%$sep",$debut) as $v) { if (!ereg("^([0-9]+)@(.*)$", $v, $m)) -- GitLab