function glossaire_verifie(&$c) { include_spip('public/parametrer'); // pour mes_fonctions $res = array(); $c = count($gloss = glossaire_query_tab()); for($i=0; $i<$c; $i++) for($j=$i+1; $j<$c; $j++) { $gi = &$gloss[$i]; $gj = &$gloss[$j]; if(!isset($gi['mots'])) list($gi['mots'],$gi['regs'],$gi['titre2']) = glossaire_parse(extraire_multi($gi['titre'])); if(!isset($gj['mots'])) list($gj['mots'],$gj['regs'],$gj['titre2']) = glossaire_parse(extraire_multi($gj['titre'])); $u = false; $titre = $gi['mots']?glossaire_gogogo($gj['titre2'], $gi['mots'], -1, $u):''; if(count($gi['regs'])) $titre .= preg_replace_callback($gi['regs'], "glossaire_echappe_mot_callback", $gj[titre], -1); if(strpos($titre,'@@GLOSS')!==false) { $a = '['.$gi['titre'].'->mot'.$gi['id_mot'].']'; $b = '['.$gj['titre'].'->mot'.$gj['id_mot'].']'; $res[] = "• "._T('couteauprive:glossaire_erreur', array('mot1'=>$a, 'mot2'=>$b))."\n_ "; } } if(count($res)) return propre(join('', $res)._T('couteauprive:glossaire_inverser')); return ''; }
function cs_rempl_glossaire($texte, $liste=false) { global $gloss_id, $gloss_mots, $gloss_mots_id, $gloss_ech, $gloss_ech_id; // si [!glossaire] est trouve on sort if(strpos($texte, _CS_SANS_GLOSSAIRE)!==false) return $liste?array():str_replace(_CS_SANS_GLOSSAIRE, '', $texte); // mise en static de la table des mots pour eviter d'interrroger la base a chaque fois // attention aux besoins de memoire... static $limit, $glossaire_generer_url, $glossaire_generer_mot, $glossaire_array = NULL; if(!isset($glossaire_array)) { $glossaire_array = glossaire_query_tab(); $glossaire_generer_url = function_exists('glossaire_generer_url')?'glossaire_generer_url':'glossaire_generer_url_dist'; $limit = defined('_GLOSSAIRE_LIMITE')?_GLOSSAIRE_LIMITE:-1; $glossaire_generer_mot = function_exists('glossaire_generer_mot') ?'glossaire_generer_mot(\'\\2\', $GLOBALS[\'gloss_mots\'][\\1])':'$GLOBALS[\'gloss_mots\'][\\1]'; // 'glossaire_generer_mot_dist(\'\\2\', $GLOBALS[\'gloss_mots\'][\\1])'; $glossaire_generer_mot = '"<a $table1[\\2]_".$GLOBALS["gl_i"]++."\' class=\'cs_glossaire\'><span class=\'gl_mot\'>".'.$glossaire_generer_mot.'."</span>$table2[\\2]</a>"'; } $unicode = false; $mem = $GLOBALS['toujours_paragrapher']; $GLOBALS['toujours_paragrapher'] = false; // initialisation des globales d'echappement $gloss_ech = $gloss_mots = array(); $gloss_ech_id = $gloss_mots_id = 0; // prudence 1 : protection des liens SPIP if (strpos($texte, '[')!==false) $texte = preg_replace_callback(',\[[^][]*->>?[^]]*\],msS', 'glossaire_echappe_balises_callback', $texte); // parcours de tous les mots, sauf celui qui peut faire partie du contexte (par ex : /spip.php?mot5) $mot_contexte=$GLOBALS['contexte']['id_mot']?$GLOBALS['contexte']['id_mot']:_request('id_mot'); foreach ($glossaire_array as $mot) if (($gloss_id = $mot['id_mot']) <> $mot_contexte) { // parser le mot-cle du glossaire // contexte de langue a prendre en compte ici list($les_mots, $les_regexp, $les_titres) = glossaire_parse($titre=extraire_multi($mot['titre'])); $mot_present = false; if(count($les_regexp)) { // a chaque expression reconnue, on pose une balise temporaire cryptee // ce remplacement est puissant, attention aux balises HTML ; par exemple, eviter : ,div,i $texte = preg_replace_callback($les_regexp, "glossaire_echappe_mot_callback", $texte, $limit); // TODO 1 : sous PHP 5.0, un parametre &$count permet de savoir si un remplacement a eu lieu // et s'il faut construire la fenetre de glossaire. // TODO 2 : decrementer le parametre $limit pour $les_mots, si &$count est renseigne. // en attendant, constuisons qd meme la fenetre... $mot_present = true; } if($les_mots) { if(preg_match(",\W(?:$les_mots)\W,i", " $texte ")) { $texte = glossaire_gogogo($texte, $les_mots, $limit, $unicode); $mot_present = true; } } // si un mot est trouve, on construit la fenetre de glossaire if($mot_present) { $lien = $glossaire_generer_url($gloss_id, $titre); // $definition =strlen($mot['descriptif'])?$mot['descriptif']:$mot['texte']; if($liste) $table1[$gloss_id] = array($gloss_id, $lien, $les_titres); else { $table1[$gloss_id] = "href='$lien' name='mot$gloss_id"; // name est complete plus tard pour eviter les doublons $table2[$gloss_id] = recuperer_fond( defined('_GLOSSAIRE_JS')?'fonds/glossaire_js':'fonds/glossaire_css', array('id_mot' => $gloss_id, 'titre' => $les_titres, 'texte' => glossaire_safe($mot['texte']), 'descriptif' => glossaire_safe($mot['descriptif']))); } } } $GLOBALS['toujours_paragrapher'] = $mem; $GLOBALS['gl_i'] = 0; if($liste) $texte = (preg_match_all(',@@M(\d+)#(\d+)@@,', $texte, $reg, PREG_SET_ORDER) && array_walk($reg, create_function('&$v,$k,&$t1', '$v=array_merge(array($GLOBALS[\'gloss_mots\'][$v[1]]),$t1[$v[2]]);'), $table1) )?$reg:array(); else { // remplacement des echappements $texte = preg_replace(',@@E(\d+)@@,e', '$GLOBALS[\'gloss_ech\'][\\1]', $texte); // remplacement final des balises posees ci-dessus $texte = preg_replace(',@@M(\d+)#(\d+)@@,e', $glossaire_generer_mot, $texte); } // nettoyage unset($gloss_id, $gloss_mots, $gloss_mots_id, $gloss_ech, $gloss_ech_id); return $texte; }