From a90cc31f99b51cb8dbcb37f8985bb043ca6f6c36 Mon Sep 17 00:00:00 2001 From: "Committo,Ergo:sum" <esj@rezo.net> Date: Wed, 12 Sep 2007 22:32:17 +0000 Subject: [PATCH] =?UTF-8?q?D=C3=A9coupage=20de=20traiter=5Fraccourcis=20en?= =?UTF-8?q?=20plusieurs=20sous-fonctions=20afin=20de=20pr=C3=A9parer=20la?= =?UTF-8?q?=20r=C3=A9solution=20du=20bug=20du=20mod=C3=A8le=20ou=20du=20ra?= =?UTF-8?q?ccourci=20d'URL=20sur=20une=20base=20distante.=20Les=20op=C3=A9?= =?UTF-8?q?rations=20se=20font=20pour=20l'instant=20toujours=20dans=20le?= =?UTF-8?q?=20m=C3=AAme=20ordre,=20rien=20n'est=20chang=C3=A9.=20Mais=20le?= =?UTF-8?q?s=20globales=20sont=20cantonn=C3=A9es=20aux=20portions=20de=20c?= =?UTF-8?q?ode=20qui=20les=20utilisent,=20notamment=20$class=5Fspip=20n'a?= =?UTF-8?q?=20pas=20besoin=20d'=C3=AAtre=20d=C3=A9j=C3=A0=20d=C3=A9finie?= =?UTF-8?q?=20lorsqu'on=20traite=20les=20raccourcis=20d'URL=20et=20les=20m?= =?UTF-8?q?od=C3=A8les=20(i.e.=20lorsqu'on=20appelle=20typo()).=20De=20plu?= =?UTF-8?q?s,=20l'initialisation=20des=202=20memes=20tableaux=20=C3=A0=20c?= =?UTF-8?q?haque=20appel=20de=20propre=20=C3=A9tait=20inutilement=20couteu?= =?UTF-8?q?x.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecrire/inc/texte.php | 476 +++++++++++++++++++++++-------------------- 1 file changed, 250 insertions(+), 226 deletions(-) diff --git a/ecrire/inc/texte.php b/ecrire/inc/texte.php index e148278a92..fd9818053f 100644 --- a/ecrire/inc/texte.php +++ b/ecrire/inc/texte.php @@ -23,17 +23,66 @@ include_spip('inc/lang'); // http://doc.spip.org/@tester_variable function tester_variable($var, $val){ if (!isset($GLOBALS[$var])) - $GLOBALS[$var] = $val; + return $GLOBALS[$var] = $val; if ( isset($_REQUEST[$var]) AND $GLOBALS[$var] == $_REQUEST[$var] ) die ("tester_variable: $var interdite"); + return $GLOBALS[$var]; } -// on initialise la puce ici car il serait couteux de faire le find_in_path() -// a chaque hit, alors qu'on n'a besoin de cette valeur que lors du calcul +// Init des globales reglant la typo de propre +// voir aussi traiter_raccourci_glossaire et traiter_raccourci_notes +// Retourne aussi un double tableau raccourci / texte-clair les utilisant. + +function traiter_variables_sales() +{ + global $class_spip, $class_spip_plus; +// class_spip : savoir si on veut class="spip" sur p i strong & li +// class_spip_plus : class="spip" sur les ul ol h3 hr quote table... +// la difference c'est que des css specifiques existent pour les seconds + tester_variable('class_spip', ''); /*' class="spip"'*/ + tester_variable('class_spip_plus', ' class="spip"'); + tester_variable('toujours_paragrapher', true); + + return array(array( + /* 0 */ "/\n(----+|____+)/S", + /* 3 */ "/\n_ +/S", + /* 4 */ "/(^|[^{])[{][{][{]/S", + /* 5 */ "/[}][}][}]($|[^}])/S", + /* 6 */ "/(( *)\n){2,}(<br\s*\/?".">)?/S", + /* 7 */ "/[{][{]/S", + /* 8 */ "/[}][}]/S", + /* 9 */ "/[{]/S", + /* 10 */ "/[}]/S", + /* 11 */ "/(?:<br\s*\/?".">){2,}/S", + /* 12 */ "/<p>\n*(?:<br\s*\/?".">\n*)*/S", + /* 13 */ "/<quote>/S", + /* 14 */ "/<\/quote>/S", + /* 15 */ "/<\/?intro>/S" + ), + array( + /* 0 */ "\n\n" . tester_variable('ligne_horizontale', "\n<hr$class_spip_plus />\n") . "\n\n", + /* 3 */ "\n<br />", + /* 4 */ "\$1\n\n" . tester_variable('debut_intertitre', "\n<h3$class_spip_plus>"), + /* 5 */ tester_variable('fin_intertitre', "</h3>\n") ."\n\n\$1", + /* 6 */ "<p>", + /* 7 */ tester_variable('debut_gras', "<strong$class_spip>"), + /* 8 */ tester_variable('fin_gras', '</strong>'), + /* 9 */ tester_variable('debut_italique', "<i$class_spip>"), + /* 10 */ tester_variable('fin_italique', '</i>'), + /* 11 */ "<p>", + /* 12 */ "<p>", + /* 13 */ "<blockquote$class_spip_plus><p>", + /* 14 */ "</blockquote><p>", + /* 15 */ "" + ) + ); +} + +// On initialise la puce pour eviter find_in_path() a chaque rencontre de \n- // http://doc.spip.org/@definir_puce function definir_puce() { static $les_puces = array(); @@ -525,11 +574,6 @@ function corriger_typo($letexte) { return $letexte; } -// - -// note: $echapper = false lorsqu'on appelle depuis propre() [pour accelerer] -// -// http://doc.spip.org/@typo // analyse des raccourcis issus de [TITRE->RACCOURCInnn] et connexes @@ -1053,6 +1097,92 @@ function paragrapher($letexte, $forcer=true) { return $letexte; } +// +// Raccourcis ancre [#ancre<-] +// + +define('_RACCOURCI_ANCRE', "|\[#?([^][]*)<-\]|S"); + +function traiter_raccourci_ancre($letexte) +{ + if (preg_match_all(_RACCOURCI_ANCRE, $letexte, $m, PREG_SET_ORDER)) + foreach ($m as $regs) + $letexte = str_replace($regs[0], + '<a name="'.entites_html($regs[1]).'"></a>', $letexte); + return $letexte; +} + +// +// Raccourcis automatiques [?SPIP] vers un glossaire +// Ils sont ramenes a la forme [X->Y] (raccourcis liens std de SPIP) +// traitee ensuite pour ne pas appliquer le correcteur typo sur les URLs +// + +define('_RACCOURCI_GLOSSAIRE', "|\[\?+\s*([^][<>]+)\]|S"); + +function traiter_raccourci_glossaire($letexte) +{ + static $glosateur = NULL, $subst = NULL; + if ($glosateur === NULL) { + $glosateur = tester_variable('url_glossaire_externe', + "http://@lang@.wikipedia.org/wiki/"); + $subst = strpos($glosateur,"%s") !== 0; + } + + if (empty($glosateur) + OR !preg_match_all(_RACCOURCI_GLOSSAIRE, $letexte, $m, PREG_SET_ORDER)) + return $letexte; + + foreach ($m as $regs) { + list($tout, $terme) = $regs; + // Eviter les cas particulier genre "[?!?]" + if (preg_match(',^(.*\w\S*)\s*$,', $terme, $regs)) { + $terme = $regs[1]; + $_terme = preg_replace(',\s+,', '_', $terme); +// faire sauter l'eventuelle partie "|bulle d'aide" du lien +// cf. http://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Conventions_sur_les_titres + $_terme = preg_replace(',[|].*,', '', $_terme); + if ($subst) + $url = str_replace("%s", rawurlencode($_terme), $glosateur); + else $url = $glosateur.$_terme; + $url = str_replace("@lang@", $GLOBALS['spip_lang'], $url); + $url = '['.$terme.'->?'.$url.']'; + $letexte = str_replace($tout, $url, $letexte); + } + } + return $letexte; +} + + +// +// Raccourcis liens [xxx->url] +// Note : complique car c'est ici qu'on applique typo(), +// et en plus on veut pouvoir les passer en pipeline +// + +// Regexp des raccouris, aussi utilisee pour la fusion de sauvegarde Spip +define('_RACCOURCI_LIEN', ",\[([^][]*)->(>?)([^]]*)\],msS"); + +function traiter_raccourcis_propre($letexte) +{ + $inserts = array(); + if (preg_match_all(_RACCOURCI_LIEN, $letexte, $matches, PREG_SET_ORDER)) { + $i = 0; + foreach ($matches as $regs) { + $inserts[++$i] = traiter_raccourci_lien($regs); + $letexte = str_replace($regs[0], "@@SPIP_ECHAPPE_LIEN_$i@@", + $letexte); + } + } + + $letexte = typo($letexte, /* echap deja fait, accelerer */ false); + + foreach ($inserts as $i => $insert) { + $letexte = str_replace("@@SPIP_ECHAPPE_LIEN_$i@@", $insert, $letexte); + } + return $letexte; +} + // // Inserer un lien a partir du preg_match du raccourci [xx->url] // $regs: @@ -1064,8 +1194,9 @@ function paragrapher($letexte, $forcer=true) { // http://doc.spip.org/@traiter_raccourci_lien function traiter_raccourci_lien($regs) { $bulle = $hlang = ''; + list(,$texte, ,$url) = $regs; // title et hreflang donnes par le raccourci ? - if (preg_match(',^(.*?)([|]([^<>]*?))?([{]([a-z_]+)[}])?$,', $regs[1], $m)) { + if (preg_match(',^(.*?)([|]([^<>]*?))?([{]([a-z_]+)[}])?$,', $texte, $m)) { $n =count($m); // |infobulle ? if ($n > 2) { @@ -1091,10 +1222,10 @@ function traiter_raccourci_lien($regs) { } } } - $regs[1] = $m[1]; + $texte = $m[1]; } - list ($lien, $class, $texte, $lang) = calculer_url($regs[3], $regs[1], 'tout'); + list ($lien, $class, $texte, $lang) = calculer_url($url, $texte, 'tout'); // Si l'objet n'est pas de la langue courante, on ajoute hreflang if (!$hlang AND $lang AND ($lang!=$GLOBALS['spip_lang'])) $hlang=$lang; @@ -1124,24 +1255,25 @@ function chapo_redirige($chapo) return $m; } -// Regexp des raccouris, aussi utilisee pour la fusion de sauvegarde Spip -define('_RACCOURCI_LIEN', ",\[([^][]*)->(>?)([^]]*)\],msS"); +function traiter_poesie($letexte) +{ + if (preg_match_all(",<(poesie|poetry)>(.*)<\/(poesie|poetry)>,UimsS", + $letexte, $regs, PREG_SET_ORDER)) { + foreach ($regs as $reg) { + $lecode = preg_replace(",\r\n?,S", "\n", $reg[2]); + $lecode = preg_replace("/\n[\s]*\n/", "\n \n",$lecode); + $lecode = "<blockquote class=\"spip_poesie\">\n<div>".preg_replace("/\n+/", "</div>\n<div>", trim($lecode))."</div>\n</blockquote>\n\n"; + $letexte = str_replace($reg[0], $lecode, $letexte); + } + } + return $letexte; +} // Nettoie un texte, traite les raccourcis spip, la typo, etc. // http://doc.spip.org/@traiter_raccourcis function traiter_raccourcis($letexte) { - global $debut_intertitre, $fin_intertitre, $ligne_horizontale, $url_glossaire_externe; - global $debut_italique, $fin_italique; - global $debut_gras, $fin_gras; - global $class_spip, $class_spip_plus; - global $compt_note; - global $marqueur_notes; - global $ouvre_ref; - global $ferme_ref; - global $ouvre_note; - global $ferme_note; - static $notes_vues; - static $tester_variables=0; + + static $remplace = NULL; // Appeler les fonctions de pre_traitement $letexte = pipeline('pre_propre', $letexte); @@ -1149,52 +1281,105 @@ function traiter_raccourcis($letexte) { if (function_exists('avant_propre')) $letexte = avant_propre($letexte); - // Verifier les variables de personnalisation - if (!$tester_variables++) { - // class_spip : savoir si on veut class="spip" sur p i strong & li - // class_spip_plus : class="spip" sur les ul ol h3 hr quote table... - // la difference c'est que des css specifiques existent pour les seconds - tester_variable('class_spip', ''); /*' class="spip"'*/ - tester_variable('class_spip_plus', ' class="spip"'); - tester_variable('debut_italique', "<i$class_spip>"); - tester_variable('fin_italique', '</i>'); - tester_variable('debut_gras', "<strong$class_spip>"); - tester_variable('fin_gras', '</strong>'); - tester_variable('debut_intertitre', "\n<h3$class_spip_plus>"); - tester_variable('fin_intertitre', "</h3>\n"); - tester_variable('ligne_horizontale', "\n<hr$class_spip_plus />\n"); - tester_variable('ouvre_ref', ' ['); - tester_variable('ferme_ref', ']'); - tester_variable('ouvre_note', '['); - tester_variable('ferme_note', '] '); - tester_variable('url_glossaire_externe', - "http://@lang@.wikipedia.org/wiki/"); - tester_variable('les_notes', ''); - tester_variable('compt_note', 0); - tester_variable('toujours_paragrapher', true); - } - - // Gestion de la <poesie> - if (preg_match_all(",<(poesie|poetry)>(.*)<\/(poesie|poetry)>,UimsS", - $letexte, $regs, PREG_SET_ORDER)) { - foreach ($regs as $reg) { - $lecode = preg_replace(",\r\n?,S", "\n", $reg[2]); - $lecode = preg_replace("/\n[\s]*\n/", "\n \n",$lecode); - $lecode = "<blockquote class=\"spip_poesie\">\n<div>".preg_replace("/\n+/", "</div>\n<div>", trim($lecode))."</div>\n</blockquote>\n\n"; - $letexte = str_replace($reg[0], $lecode, $letexte); - } - } + $letexte = traiter_poesie($letexte); // Harmoniser les retours chariot $letexte = preg_replace(",\r\n?,S", "\n", $letexte); - // Recuperer les para HTML + // Recuperer les paragraphes HTML $letexte = preg_replace(",<p[>[:space:]],iS", "\n\n\\0", $letexte); $letexte = preg_replace(",</p[>[:space:]],iS", "\\0\n\n", $letexte); + list($l, $mes_notes) = traite_raccourci_notes($letexte); + $letexte = traiter_raccourci_glossaire($l); + $letexte = traiter_raccourci_ancre($letexte); + $letexte = traiter_raccourcis_propre($letexte); + + // A present on introduit des attributs class_spip* + // Init de leur valeur et connexes au premier appel + if (!$remplace) $remplace = traiter_variables_sales(); + // - // Notes de bas de page + // Tableaux // + + // ne pas oublier les tableaux au debut ou a la fin du texte + $letexte = preg_replace(",^\n?[|],S", "\n\n|", $letexte); + $letexte = preg_replace(",\n\n+[|],S", "\n\n\n\n|", $letexte); + $letexte = preg_replace(",[|](\n\n+|\n?$),S", "|\n\n\n\n", $letexte); + + if (preg_match_all(',[^|](\n[|].*[|]\n)[^|],UmsS', $letexte, + $regs, PREG_SET_ORDER)) + foreach ($regs as $tab) { + $letexte = str_replace($tab[1], traiter_tableau($tab[1]), $letexte); + } + + $letexte = "\n".trim($letexte); + + // les listes + if (strpos($letexte,"\n-*")!==false OR strpos($letexte,"\n-#")!==false) + $letexte = traiter_listes($letexte); + + // Proteger les caracteres actifs a l'interieur des tags html + $protege = "{}_-"; + $illegal = "\x1\x2\x3\x4"; + if (preg_match_all(",</?[a-z!][^<>]*[".preg_quote($protege)."][^<>]*>,imsS", + $letexte, $regs, PREG_SET_ORDER)) { + foreach ($regs as $reg) { + $insert = $reg[0]; + // hack: on transforme les caracteres a proteger en les remplacant + // par des caracteres "illegaux". (cf corriger_caracteres()) + $insert = strtr($insert, $protege, $illegal); + $letexte = str_replace($reg[0], $insert, $letexte); + } + } + + // autres raccourcis + $puce = (strpos($letexte, "\n- ") == false) ? '' : definir_puce(); + $puce_rac = array("/\n-- */S", "/\n- */S"); + $puce_long = array("\n<br />— ", "\n<br />$puce "); + + $letexte = preg_replace($puce_rac, $puce_long, $letexte); + $letexte = preg_replace($remplace[0], $remplace[1], $letexte); + $letexte = preg_replace("@^ <br />@S", "", $letexte); + + // Retablir les caracteres proteges + $letexte = strtr($letexte, $illegal, $protege); + + // Fermer les paragraphes ; mais ne pas en creer si un seul + $letexte = paragrapher($letexte, $GLOBALS['toujours_paragrapher']); + + // Appeler les fonctions de post-traitement + $letexte = pipeline('post_propre', $letexte); + // old style + if (function_exists('apres_propre')) + $letexte = apres_propre($letexte); + + if ($mes_notes) traiter_les_notes($mes_notes); + + return $letexte; +} + +// +// Notes de bas de page +// + +function traite_raccourci_notes($letexte) +{ + global $compt_note, $marqueur_notes, $les_notes; + global $ouvre_ref, $ferme_ref, $ouvre_note, $ferme_note; #static ok + static $notes_vues = NULL; + + if ($notes_vues === NULL) { + $ouvre_ref = tester_variable('ouvre_ref', ' ['); + $ferme_ref = tester_variable('ferme_ref', ']'); + $ouvre_note = tester_variable('ouvre_note', '['); + $ferme_note = tester_variable('ferme_note', '] '); + $les_notes = tester_variable('les_notes', ''); + $compt_note = tester_variable('compt_note', 0); + $notes_vues === array(); + } + $mes_notes = ''; $regexp = ', *\[\[(.*?)\]\],msS'; if (preg_match_all($regexp, $letexte, $matches, PREG_SET_ORDER)) @@ -1255,173 +1440,12 @@ function traiter_raccourcis($letexte) { // dans le texte, mettre l'appel de note a la place de la note $pos = strpos($letexte, $note_source); $letexte = substr($letexte, 0, $pos) . $insert - . substr($letexte, $pos + strlen($note_source)); - } - - // - // Raccourcis automatiques [?SPIP] vers un glossaire - // (on traite ce raccourci en deux temps afin de ne pas appliquer - // la typo sur les URLs, voir raccourcis liens ci-dessous) - // - if ($url_glossaire_externe) { - $regexp = "|\[\?+([^][<>]+)\]|S"; - if (preg_match_all($regexp, $letexte, $matches, PREG_SET_ORDER)) - foreach ($matches as $regs) { - $terme = trim($regs[1]); - $terme_underscore = preg_replace(',\s+,', '_', $terme); - // faire sauter l'eventuelle partie "|bulle d'aide" du lien - // cf. http://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Conventions_sur_les_titres - $terme_underscore = preg_replace(',[|].*,', '', $terme_underscore); - if (strstr($url_glossaire_externe,"%s")) - $url = str_replace("%s", rawurlencode($terme_underscore), - $url_glossaire_externe); - else - $url = $url_glossaire_externe.$terme_underscore; - $url = str_replace("@lang@", $GLOBALS['spip_lang'], $url); - $code = '['.$terme.'->?'.$url.']'; - - // Eviter les cas particulier genre "[?!?]" - if (preg_match(',[a-z],i', $terme)) - $letexte = str_replace($regs[0], $code, $letexte); - } - } - - - // - // Raccourcis ancre [#ancre<-] - // - $regexp = "|\[#?([^][]*)<-\]|S"; - if (preg_match_all($regexp, $letexte, $matches, PREG_SET_ORDER)) - foreach ($matches as $regs) - $letexte = str_replace($regs[0], - '<a name="'.entites_html($regs[1]).'"></a>', $letexte); - - // - // Raccourcis liens [xxx->url] - // Note : complique car c'est ici qu'on applique typo(), - // et en plus on veut pouvoir les passer en pipeline - // - - $inserts = array(); - if (preg_match_all(_RACCOURCI_LIEN, $letexte, $matches, PREG_SET_ORDER)) { - $i = 0; - foreach ($matches as $regs) { - $inserts[++$i] = traiter_raccourci_lien($regs); - $letexte = str_replace($regs[0], "@@SPIP_ECHAPPE_LIEN_$i@@", - $letexte); - } - } - - $letexte = typo($letexte, /* echap deja fait, accelerer */ false); - - foreach ($inserts as $i => $insert) { - $letexte = str_replace("@@SPIP_ECHAPPE_LIEN_$i@@", $insert, $letexte); - } - - - // - // Tableaux - // - - // ne pas oublier les tableaux au debut ou a la fin du texte - $letexte = preg_replace(",^\n?[|],S", "\n\n|", $letexte); - $letexte = preg_replace(",\n\n+[|],S", "\n\n\n\n|", $letexte); - $letexte = preg_replace(",[|](\n\n+|\n?$),S", "|\n\n\n\n", $letexte); - - // traiter chaque tableau - if (preg_match_all(',[^|](\n[|].*[|]\n)[^|],UmsS', $letexte, - $regs, PREG_SET_ORDER)) - foreach ($regs as $tab) { - $letexte = str_replace($tab[1], traiter_tableau($tab[1]), $letexte); - } - - // - // Ensemble de remplacements implementant le systeme de mise - // en forme (paragraphes, raccourcis...) - // - - $letexte = "\n".trim($letexte); - - // les listes - if (strpos($letexte,"\n-*")!==false OR strpos($letexte,"\n-#")!==false) - $letexte = traiter_listes($letexte); - - // Puce - if (strpos($letexte, "\n- ") !== false) - $puce = definir_puce(); - else $puce = ''; - - // Proteger les caracteres actifs a l'interieur des tags html - $protege = "{}_-"; - $illegal = "\x1\x2\x3\x4"; - if (preg_match_all(",</?[a-z!][^<>]*[".preg_quote($protege)."][^<>]*>,imsS", - $letexte, $regs, PREG_SET_ORDER)) { - foreach ($regs as $reg) { - $insert = $reg[0]; - // hack: on transforme les caracteres a proteger en les remplacant - // par des caracteres "illegaux". (cf corriger_caracteres()) - $insert = strtr($insert, $protege, $illegal); - $letexte = str_replace($reg[0], $insert, $letexte); - } + . substr($letexte, $pos + strlen($note_source)); } - - // autres raccourcis - $cherche1 = array( - /* 0 */ "/\n(----+|____+)/S", - /* 1 */ "/\n-- */S", - /* 2 */ "/\n- */S", - /* 3 */ "/\n_ +/S", - /* 4 */ "/(^|[^{])[{][{][{]/S", - /* 5 */ "/[}][}][}]($|[^}])/S", - /* 6 */ "/(( *)\n){2,}(<br\s*\/?".">)?/S", - /* 7 */ "/[{][{]/S", - /* 8 */ "/[}][}]/S", - /* 9 */ "/[{]/S", - /* 10 */ "/[}]/S", - /* 11 */ "/(?:<br\s*\/?".">){2,}/S", - /* 12 */ "/<p>\n*(?:<br\s*\/?".">\n*)*/S", - /* 13 */ "/<quote>/S", - /* 14 */ "/<\/quote>/S", - /* 15 */ "/<\/?intro>/S" - ); - $remplace1 = array( - /* 0 */ "\n\n$ligne_horizontale\n\n", - /* 1 */ "\n<br />— ", - /* 2 */ "\n<br />$puce ", - /* 3 */ "\n<br />", - /* 4 */ "\$1\n\n$debut_intertitre", - /* 5 */ "$fin_intertitre\n\n\$1", - /* 6 */ "<p>", - /* 7 */ $debut_gras, - /* 8 */ $fin_gras, - /* 9 */ $debut_italique, - /* 10 */ $fin_italique, - /* 11 */ "<p>", - /* 12 */ "<p>", - /* 13 */ "<blockquote$class_spip_plus><p>", - /* 14 */ "</blockquote><p>", - /* 15 */ "" - ); - $letexte = preg_replace($cherche1, $remplace1, $letexte); - $letexte = preg_replace("@^ <br />@S", "", $letexte); - - // Retablir les caracteres proteges - $letexte = strtr($letexte, $illegal, $protege); - - // Fermer les paragraphes ; mais ne pas en creer si un seul - $letexte = paragrapher($letexte, $GLOBALS['toujours_paragrapher']); - - // Appeler les fonctions de post-traitement - $letexte = pipeline('post_propre', $letexte); - // old style - if (function_exists('apres_propre')) - $letexte = apres_propre($letexte); - - if ($mes_notes) traiter_les_notes($mes_notes); - - return $letexte; + return array($letexte, $mes_notes); } + // http://doc.spip.org/@traiter_les_notes function traiter_les_notes($mes_notes) { $mes_notes = propre('<p>'.$mes_notes); -- GitLab