]*>|[^>])*?)?' # |arguments (y compris des tags <...>)
+ .'\s*/?'.'>)' # fin du modele >
+ .'\s*(<\/a>)?' # eventuel
+ );
+
+define('_RACCOURCI_MODELE_DEBUT', '@^' . _RACCOURCI_MODELE .'@isS');
+
+// http://doc.spip.org/@traiter_modeles
+function traiter_modeles($texte, $doublons=false, $echap='', $connect='', $liens = null) {
+ // preserver la compatibilite : true = recherche des documents
+ if ($doublons===true)
+ $doublons = array('documents'=>array('doc','emb','img'));
+ // detecter les modeles (rapide)
+ if (strpos($texte,"<")!==false AND
+ preg_match_all('/<[a-z_-]{3,}\s*[0-9|]+/iS', $texte, $matches, PREG_SET_ORDER)) {
+ include_spip('public/assembler');
+ foreach ($matches as $match) {
+ // Recuperer l'appel complet (y compris un eventuel lien)
+
+ $a = strpos($texte,$match[0]);
+ preg_match(_RACCOURCI_MODELE_DEBUT,
+ substr($texte, $a), $regs);
+ $regs[]=""; // s'assurer qu'il y a toujours un 5e arg, eventuellement vide
+ list(,$mod, $type, $id, $params, $fin) = $regs;
+ if ($fin AND
+ preg_match('/]*>\s*$/i',
+ substr($texte, 0, $a), $r)) {
+ $lien = array(
+ 'href' => extraire_attribut($r[0],'href'),
+ 'class' => extraire_attribut($r[0],'class'),
+ 'mime' => extraire_attribut($r[0],'type')
+ );
+ $n = strlen($r[0]);
+ $a -= $n;
+ $cherche = $n + strlen($regs[0]);
+ } else {
+ $lien = false;
+ $cherche = strlen($mod);
+ }
+
+ // calculer le modele
+ # hack articles_edit, breves_edit, indexation
+ if ($doublons)
+ $texte .= preg_replace(',[|][^|=]*,s',' ',$params);
+ # version normale
+ else {
+ // si un tableau de liens a ete passe, reinjecter le contenu d'origine
+ // dans les parametres, plutot que les liens echappes
+ if (!is_null($liens))
+ $params = str_replace($liens[0], $liens[1], $params);
+ $modele = inclure_modele($type, $id, $params, $lien, $connect);
+ // en cas d'echec,
+ // si l'objet demande a une url,
+ // creer un petit encadre vers elle
+ if ($modele === false) {
+ if (!$lien)
+ $lien = traiter_lien_implicite("$type$id", '', 'tout', $connect);
+ if ($lien)
+ $modele = ''
+ .sinon($lien['titre'], _T('ecrire:info_sans_titre'))
+ ."";
+ else {
+ $modele = "";
+ if (test_espace_prive()) {
+ $modele = entites_html(substr($texte,$a,$cherche));
+ if (!is_null($liens))
+ $modele = "".str_replace($liens[0], $liens[1], $modele)."
";
+ }
+ }
+ }
+ // le remplacer dans le texte
+ if ($modele !== false) {
+ $modele = protege_js_modeles($modele);
+ $rempl = code_echappement($modele, $echap);
+ $texte = substr($texte, 0, $a)
+ . $rempl
+ . substr($texte, $a+$cherche);
+ }
+ }
+
+ // hack pour tout l'espace prive
+ if (((!_DIR_RESTREINT) OR ($doublons)) AND ($id)){
+ foreach($doublons?$doublons:array('documents'=>array('doc','emb','img')) as $quoi=>$modeles)
+ if (in_array($type,$modeles))
+ $GLOBALS["doublons_{$quoi}_inclus"][] = $id;
+ }
+ }
+ }
+
+ return $texte;
+}
+
+//
+// Raccourcis ancre [#ancre<-]
+//
+
+define('_RACCOURCI_ANCRE', "/\[#?([^][]*)<-\]/S");
+
+// http://doc.spip.org/@traiter_raccourci_ancre
+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],
+ '', $letexte);
+ return $letexte;
+}
+
+//
+// Raccourcis automatiques [?SPIP] vers un glossaire
+// Wikipedia par defaut, avec ses contraintes techniques
+// cf. http://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Conventions_sur_les_titres
+
+define('_RACCOURCI_GLOSSAIRE', "/\[\?+\s*([^][<>]+)\]/S");
+define('_RACCOURCI_GLOSES', '/^([^|#{]*\w[^|#{]*)([^#]*)(#([^|{}]*))?(.*)$/S');
+
+// http://doc.spip.org/@traiter_raccourci_glossaire
+function traiter_raccourci_glossaire($texte)
+{
+ if (!preg_match_all(_RACCOURCI_GLOSSAIRE,
+ $texte, $matches, PREG_SET_ORDER))
+ return $texte;
+
+ include_spip('inc/charsets');
+ $lien = charger_fonction('lien', 'inc');
+
+ foreach ($matches as $regs) {
+ // Eviter les cas particulier genre "[?!?]"
+ // et isoler le lexeme a gloser de ses accessoires
+ // (#:url du glossaire, | bulle d'aide, {} hreflang)
+ // Transformation en pseudo-raccourci pour passer dans inc_lien
+ if (preg_match(_RACCOURCI_GLOSES, $regs[1], $r)) {
+ preg_match('/^(.*?)(\d*)$/', $r[4], $m);
+ $_n = intval($m[2]);
+ $gloss = $m[1] ? ('#' . $m[1]) : '';
+ $t = $r[1] . $r[2] . $r[5];
+ list($t, $bulle, $hlang) = traiter_raccourci_lien_atts($t);
+ $t = unicode2charset(charset2unicode($t), 'utf-8');
+ $ref = $lien("glose$_n$gloss", $t, 'spip_glossaire', $bulle, $hlang);
+ $texte = str_replace($regs[0], $ref, $texte);
+ }
+ }
+ return $texte;
+}
+
+// http://doc.spip.org/@glossaire_std
+function glossaire_std($terme)
+{
+ global $url_glossaire_externe;
+ static $pcre = NULL;
+
+ if ($pcre === NULL) {
+ $pcre = isset($GLOBALS['meta']['pcre_u'])
+ ? $GLOBALS['meta']['pcre_u']
+ : '';
+ if (strpos($url_glossaire_externe, "%s") === false)
+ $url_glossaire_externe .= '%s';
+ }
+
+ $glosateur = str_replace("@lang@",
+ $GLOBALS['spip_lang'],
+ $GLOBALS['url_glossaire_externe']);
+
+ $terme = rawurlencode(preg_replace(',\s+,'.$pcre, '_', $terme));
+
+ return str_replace("%s", $terme, $glosateur);
+}
+
+?>