Example #1
0
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('/<a\s[^<>]*>\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 = '<a href="'
						  .$lien['url']
						  .'" class="spip_modele'
						  . '">'
						  .sinon($lien['titre'], _T('ecrire:info_sans_titre'))
						  ."</a>";
					else {
						$modele = "";
						if (test_espace_prive()) {
							$modele = entites_html(substr($texte,$a,$cherche));
							if (!is_null($liens))
								$modele = "<pre>".str_replace($liens[0], $liens[1], $modele)."</pre>";
						}
					}
				}
				// 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;
}
Example #2
0
function traiter_modeles($texte, $doublons = false, $echap = '', $connect = '', $liens = null, $env = array())
{
    // 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);
            while (count($regs) < 6) {
                $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('/<a\\s[^<>]*>\\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 indexation
            if ($doublons) {
                $texte .= preg_replace(',[|][^|=]*,s', ' ', $params);
            } 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, $env);
                // en cas d'echec,
                // si l'objet demande a une url,
                // creer un petit encadre vers elle
                if ($modele === false) {
                    $modele = substr($texte, $a, $cherche);
                    if (!is_null($liens)) {
                        $modele = str_replace($liens[0], $liens[1], $modele);
                    }
                    $contexte = array_merge($env, array('id' => $id, 'type' => $type, 'modele' => $modele));
                    if ($lien) {
                        # un eventuel guillemet (") sera reechappe par #ENV
                        $contexte['lien'] = str_replace("&quot;", '"', $lien['href']);
                        $contexte['lien_class'] = $lien['class'];
                        $contexte['lien_mime'] = $lien['mime'];
                    }
                    $modele = recuperer_fond("modeles/dist", $contexte, array(), $connect);
                }
                // 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;
}