]*>|[^>])*?)?' # |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);
if ($bulle===false) $bulle = $m[1];
$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);
}
?>