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; }
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(""", '"', $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; }