function sommaire_d_une_page(&$texte, &$nbh3, $page=0, $num_pages=0) { static $index = 0; if($page===false) $index = 0; static $self = NULL; if(!isset($self)) $self = str_replace('&', '&', nettoyer_uri());//self();//$GLOBALS['REQUEST_URI']; if($page===false) return; // trouver quel <hx> est utilise $root = $niveau = $match = preg_match(',<h(\d),',$GLOBALS['debut_intertitre'],$regs)?$regs[1]:'3'; @define('_sommaire_NB_CARACTERES', 30); @define('_sommaire_PROFONDEUR', 1); if(_sommaire_PROFONDEUR>1) $match = $match .'-' . ($match+_sommaire_PROFONDEUR-1); // traitement des intertitres <hx> preg_match_all(",(<h([$match])[^>]*)>(.*)</h\\2>,Umsi", $texte, $regs); $nbh3 += count($regs[0]); $pos = 0; $sommaire = ''; // calcul de la page $suffixe = $page?_T('couteau:sommaire_page', array('page'=>$page)):''; $fct_lien_retour = function_exists('sommaire_lien_retour')?'sommaire_lien_retour':'sommaire_lien_retour_dist'; $fct_id_ancre = defined('_sommaire_JOLIES_ANCRES')?'sommaire_id_ancre_ex' :(function_exists('sommaire_id_ancre')?'sommaire_id_ancre':'sommaire_id_ancre_dist'); $nb = count($regs[0]); for($i=0;$i<$nb;$i++,$index++){ $w = &$regs[0][$i]; $h = &$regs[1][$i]; $n = &$regs[2][$i]; if (($pos2 = strpos($texte, $w, $pos))!==false) { $t = $regs[3][$i]; // calcul de l'ancre, $t peut etre modifie $ancre = $fct_id_ancre($index, $t, $n); $id = " id=\"$ancre\">"; //$titre = preg_replace(',^<p[^>]*>(.*)</p>$,Umsi', '\\1', trim($t)); // ancre 'retour au sommaire', sauf : // si on imprime, ou si les blocs depliables utilisent h{$n}... $titre = (defined('_CS_PRINT') OR (strpos($w, 'blocs_titre')!==false)) ?$t//$titre :$fct_lien_retour($self, $t);//$titre); $texte = substr($texte, 0, $pos2) . $h . $id . $titre . substr($texte, $pos2 + strlen($h)+1 + strlen($regs[3][$i])); $pos = $pos2 + strlen($id) + strlen($w); $brut = sommaire_nettoyer_titre($t); // pas trop long quand meme... $lien = cs_propre(couper($brut, _sommaire_NB_CARACTERES)); // eviter une ponctuation a la fin, surtout si la page est precisee $lien = preg_replace('/( |\s)*'.($page?'[!?,;.:]+$/':'[,;.:]+$/'), '', $lien); $titre = attribut_html(couper($brut, 100)); // si la decoupe en page est active... $artpage = (function_exists('decoupe_url') && (strlen(_request('artpage')) || $page>1) ) ?decoupe_url($self, $page, $num_pages):$self; $artpage = "\n<li><a $st title=\"$titre\" href=\"{$artpage}#$ancre\">$lien</a>$suffixe"; if($niveau==$n) $sommaire .= ($sommaire?'</li>':'').$artpage; elseif($niveau<$n) $sommaire .= "\n<ul>".$artpage; else $sommaire .= '</li></ul></li>'.$artpage; $niveau = $n; } } return $sommaire?$sommaire.'</li>'.($niveau!=$root?'</ul>':''):''; }
function sommaire_d_une_page(&$texte, &$nbh3, $page = 0, $num_pages = 0) { static $index; if (!$index || $page === false) { $index = 0; } if ($page === false) { return; } // trouver quel <hx> est utilise $hierarchie = preg_match(',<h(\\d),', $GLOBALS['debut_intertitre'], $regs) ? $regs[1] : '3'; @define('_sommaire_NB_CARACTERES', 30); $self = nettoyer_uri(); //self();//$GLOBALS['REQUEST_URI']; // si on n'est pas en mode impression, on calcule l'image de retour au sommaire if (!defined('_CS_PRINT')) { $titre = _T('couteau:sommaire_titre'); $haut = "<a title=\"{$titre}\" href=\"" . $self . "#sommaire\" class=\"sommaire_ancre\"> </a>"; // modif cld } else { $haut = ''; } // traitement des intertitres <hx> preg_match_all(",(<h{$hierarchie}[^>]*)>(.*)</h{$hierarchie}>,Umsi", $texte, $regs); $nbh3 += count($regs[0]); $pos = 0; $sommaire = ''; // calcul de la page $p = $page ? _T('couteau:sommaire_page', array('page' => $page)) : ''; for ($i = 0; $i < count($regs[0]); $i++, $index++) { $ancre = " id=\"sommaire_{$index}\">"; // modif cld if (($pos2 = strpos($texte, $regs[0][$i], $pos)) !== false) { $titre = preg_replace(',^<p[^>]*>(.*)</p>$,Umsi', '\\1', trim($regs[2][$i])); // ancre 'haut', sauf si les blocs depliables utilisent h3... $texte = substr($texte, 0, $pos2) . $regs[1][$i] . $ancre . (strpos($regs[0][$i], 'blocs_titre') === false ? $haut : '') . $titre . substr($texte, $pos2 + strlen($regs[1][$i]) + 1 + strlen($regs[2][$i])); $pos = $pos2 + strlen($ancre) + strlen($regs[0][$i]); // tout le texte, sans les notes $brut = preg_replace(',\\[<a href=["\']#nb.*?</a>\\],', '', echappe_retour($regs[2][$i], 'CS')); // pas de glossaire if (function_exists('cs_retire_glossaire')) { $brut = cs_retire_glossaire($brut); } // texte brut $brut = preg_replace(',[\\n\\r]+,', ' ', textebrut($brut)); $lien = cs_propre(couper($brut, _sommaire_NB_CARACTERES)); $lien = preg_replace('/( |\\s)*[!?,;.:]+$/', '', $lien); // eviter une ponctuation a la fin $titre = attribut_html(couper($brut, 100)); // si la decoupe en page est active... $artpage = function_exists('decoupe_url') && (strlen(_request('artpage')) || $page > 1) ? decoupe_url($self, $page, $num_pages) : $self; $sommaire .= "<dd><a {$st} title=\"{$titre}\" href=\"{$artpage}#sommaire_{$index}\">{$lien}</a>{$p}</dd>"; // modif cld } } return $sommaire; }
/** * Detecter les demande d'acces aux pages restreintes * et re-orienter vers une 401 si necessaire * * @param array $contexte * @return array */ function accesrestreint_page_indisponible($contexte) { if ($contexte['status'] == '404') { $objet = ""; if (isset($contexte['type'])) { $objet = $contexte['type']; } elseif (isset($contexte['type-page'])) { $objet = $contexte['type-page']; } elseif (isset($contexte['fond_erreur'])) { include_spip('inc/urls'); define('_DEFINIR_CONTEXTE_TYPE_PAGE', true); $c2 = $contexte; list($fond2, $c2, $url_redirect) = urls_decoder_url(nettoyer_uri(), $contexte['fond_erreur'], $c2, true); $objet = $c2['type-page']; } if ($objet) { $table_sql = table_objet_sql($objet); $id_table_objet = id_table_objet($objet); if ($id = intval($contexte[$id_table_objet])) { $publie = true; if (include_spip("base/objets") and function_exists("objet_test_si_publie")) { $publie = objet_test_si_publie($objet, $id); } else { $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table_sql); if (isset($desc['field']['statut'])) { $statut = sql_getfetsel('statut', $table_sql, "{$id_table_objet}=" . intval($id)); if ($statut != 'publie') { $publie = false; } } } include_spip('inc/autoriser'); if ($publie and !autoriser('voir', $objet, $id)) { // c'est un contenu restreint $contexte['status'] = '401'; $contexte['code'] = '401 Unauthorized'; $contexte['fond'] = '401'; $contexte['erreur'] = _T('accesrestreint:info_acces_restreint'); $contexte['cible'] = self(); if (!isset($contexte['objet'])) { $contexte['objet'] = $objet; $contexte['id_objet'] = $id; } } } } } return $contexte; }
/** * Donner l'URL de base d'un lien vers "soi-meme", modulo les trucs inutiles * * @param string $amp * Style des esperluettes * @param bool $root * @return string * URL vers soi-même **/ function self($amp = '&', $root = false) { $url = nettoyer_uri(); if (!$root and ($GLOBALS['profondeur_url'] < (_DIR_RESTREINT ? 1 : 2) or defined('_SET_HTML_BASE') and !_SET_HTML_BASE)) { $url = preg_replace(',^[^?]*/,', '', $url); } // ajouter le cas echeant les variables _POST['id_...'] foreach ($_POST as $v => $c) { if (substr($v, 0, 3) == 'id_') { $url = parametre_url($url, $v, $c, '&'); } } // supprimer les variables sans interet if (test_espace_prive()) { $url = preg_replace(',([?&])(' . 'lang|show_docs|' . 'changer_lang|var_lang|action)=[^&]*,i', '\\1', $url); $url = preg_replace(',([?&])[&]+,', '\\1', $url); $url = preg_replace(',[&]$,', '\\1', $url); } // eviter les hacks include_spip('inc/filtres_mini'); $url = spip_htmlspecialchars($url); // & ? if ($amp != '&') { $url = str_replace('&', $amp, $url); } // Si ca demarre par ? ou vide, donner './' $url = preg_replace(',^([?].*)?$,', './\\1', $url); return $url; }
/** * Décoder une URL en utilisant les fonctions inverses * * Gère les URLs transformées par le htaccess. * * @note * `$renommer = 'urls_propres_dist';` * renvoie `array($contexte, $type, $url_redirect, $nfond)` * * `$nfond` n'est retourné que si l'URL est définie apres le `?` * et risque d'être effacée par un form en get. * Elle est utilisée par form_hidden exclusivement. * * Compat ascendante si le retour est NULL en gérant une sauvegarde/restauration * des globales modifiées par les anciennes fonctions * * @param string $url * URL à décoder * @param string $fond * Fond initial par défaut * @param array $contexte * Contexte initial à prendre en compte * @param bool $assembler * `true` si l'URL correspond à l'URL principale de la page qu'on est en train d'assembler * dans ce cas la fonction redirigera automatiquement si besoin * et utilisera les eventuelles globales `$_SERVER['REDIRECT_url_propre']` et `$_ENV['url_propre']` * provenant du htaccess * @return array * Liste `$fond, $contexte, $url_redirect`. * * Si l'url n'est pas valide, $fond restera à la valeur initiale passée. * Il suffit d'appeler la fonction sans $fond et de vérifier qu'à son retour celui-ci * est non vide pour vérifier une URL * */ function urls_decoder_url($url, $fond = '', $contexte = array(), $assembler = false) { static $current_base = null; // les anciennes fonctions modifient directement les globales // on les sauve avant l'appel, et on les retablit apres ! $save = array(isset($GLOBALS['fond']) ? $GLOBALS['fond'] : null, isset($GLOBALS['contexte']) ? $GLOBALS['contexte'] : null, isset($_SERVER['REDIRECT_url_propre']) ? $_SERVER['REDIRECT_url_propre'] : null, isset($_ENV['url_propre']) ? $_ENV['url_propre'] : null, $GLOBALS['profondeur_url']); if (is_null($current_base)) { include_spip('inc/filtres_mini'); // le decodage des urls se fait toujours par rapport au site public $current_base = url_absolue(_DIR_RACINE ? _DIR_RACINE : './'); } if (strncmp($url, $current_base, strlen($current_base)) == 0) { $url = substr($url, strlen($current_base)); } // si on est en train d'assembler la page principale, // recuperer l'url depuis les globales url propres si fournies // sinon extraire la bonne portion d'url if ($assembler) { if (isset($_SERVER['REDIRECT_url_propre'])) { $url = $_SERVER['REDIRECT_url_propre']; } elseif (isset($_ENV['url_propre'])) { $url = $_ENV['url_propre']; } else { $qs = explode("?", $url); // ne prendre que le segment d'url qui correspond, en fonction de la profondeur calculee $url = ltrim($qs[0], '/'); $url = explode('/', $url); while (count($url) > $GLOBALS['profondeur_url'] + 1) { array_shift($url); } $qs[0] = implode('/', $url); $url = implode("?", $qs); } } unset($_SERVER['REDIRECT_url_propre']); unset($_ENV['url_propre']); include_spip('inc/filtres_mini'); if (strpos($url, "://") === false) { $GLOBALS['profondeur_url'] = substr_count(ltrim(resolve_path("/{$url}"), '/'), '/'); } else { $GLOBALS['profondeur_url'] = max(0, substr_count($url, "/") - substr_count($current_base, "/")); } $url_redirect = ""; $renommer = generer_url_entite('', '', '', '', true); if (!$renommer and !function_exists('recuperer_parametres_url')) { $renommer = charger_fonction('page', 'urls'); } // fallback pour decoder l'url if ($renommer) { $a = $renommer($url, $fond, $contexte); if (is_array($a)) { list($ncontexte, $type, $url_redirect, $nfond) = array_pad($a, 4, null); if ($url_redirect == $url) { $url_redirect = ""; } // securite pour eviter une redirection infinie if ($assembler and strlen($url_redirect)) { spip_log("Redirige {$url} vers {$url_redirect}"); include_spip('inc/headers'); redirige_par_entete($url_redirect, '', 301); } if (isset($nfond)) { $fond = $nfond; } else { if ($fond == '' or $fond == 'type_urls') { $fond = $type; } } if (isset($ncontexte)) { $contexte = $ncontexte; } if (defined('_DEFINIR_CONTEXTE_TYPE') and _DEFINIR_CONTEXTE_TYPE) { $contexte['type'] = $type; } if (defined('_DEFINIR_CONTEXTE_TYPE_PAGE') and _DEFINIR_CONTEXTE_TYPE_PAGE) { $contexte['type-page'] = $type; } } } elseif (function_exists('recuperer_parametres_url')) { $GLOBALS['fond'] = $fond; $GLOBALS['contexte'] = $contexte; recuperer_parametres_url($fond, nettoyer_uri()); // fond est en principe modifiee directement $contexte = $GLOBALS['contexte']; } // retablir les globales list($GLOBALS['fond'], $GLOBALS['contexte'], $_SERVER['REDIRECT_url_propre'], $_ENV['url_propre'], $GLOBALS['profondeur_url']) = $save; // vider les globales url propres qui ne doivent plus etre utilisees en cas // d'inversion url => objet // maintenir pour compat ? #if ($assembler) { # unset($_SERVER['REDIRECT_url_propre']); # unset($_ENV['url_propre']); #} return array($fond, $contexte, $url_redirect); }
function assembler($fond, $connect = '') { // flag_preserver est modifie ici, et utilise en globale // use_cache sert a informer le bouton d'admin pr savoir s'il met un * // contexte est utilise en globale dans le formulaire d'admin $GLOBALS['contexte'] = calculer_contexte(); $page = array('contexte_implicite' => calculer_contexte_implicite()); $page['contexte_implicite']['cache'] = $fond . preg_replace(',\\.[a-zA-Z0-9]*$,', '', preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI'])); // Cette fonction est utilisee deux fois $cacher = charger_fonction('cacher', 'public', true); // Les quatre derniers parametres sont modifies par la fonction: // emplacement, validite, et, s'il est valide, contenu & age if ($cacher) { $res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, $page, $lastmodified); } else { $GLOBALS['use_cache'] = -1; } // Si un resultat est retourne, c'est un message d'impossibilite if ($res) { return array('texte' => $res); } if (!$chemin_cache || !$lastmodified) { $lastmodified = time(); } $headers_only = $_SERVER['REQUEST_METHOD'] == 'HEAD'; $calculer_page = true; // Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client}) // une perennite valide a meme reponse qu'une requete HEAD (par defaut les // pages sont dynamiques) if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) and (!defined('_VAR_MODE') or !_VAR_MODE) and $chemin_cache and isset($page['entetes']) and isset($page['entetes']['Cache-Control']) and strstr($page['entetes']['Cache-Control'], 'max-age=') and !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/')) { $since = preg_replace('/;.*/', '', $_SERVER['HTTP_IF_MODIFIED_SINCE']); $since = str_replace('GMT', '', $since); if (trim($since) == gmdate("D, d M Y H:i:s", $lastmodified)) { $page['status'] = 304; $headers_only = true; $calculer_page = false; } } // Si requete HEAD ou Last-modified compatible, ignorer le texte // et pas de content-type (pour contrer le bouton admin de inc-public) if (!$calculer_page) { $page['texte'] = ""; } else { // si la page est prise dans le cache if (!$GLOBALS['use_cache']) { // Informer les boutons d'admin du contexte // (fourni par urls_decoder_url ci-dessous lors de la mise en cache) $GLOBALS['contexte'] = $page['contexte']; // vider les globales url propres qui ne doivent plus etre utilisees en cas // d'inversion url => objet // plus necessaire si on utilise bien la fonction urls_decoder_url #unset($_SERVER['REDIRECT_url_propre']); #unset($_ENV['url_propre']); } else { // Compat ascendante : // 1. $contexte est global // (a evacuer car urls_decoder_url gere ce probleme ?) // et calculer la page if (!test_espace_prive()) { include_spip('inc/urls'); list($fond, $GLOBALS['contexte'], $url_redirect) = urls_decoder_url(nettoyer_uri(), $fond, $GLOBALS['contexte'], true); } // squelette par defaut if (!strlen($fond)) { $fond = 'sommaire'; } // produire la page : peut mettre a jour $lastmodified $produire_page = charger_fonction('produire_page', 'public'); $page = $produire_page($fond, $GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, null, $page, $lastmodified, $connect); if ($page === '') { $erreur = _T('info_erreur_squelette2', array('fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES)); erreur_squelette($erreur); // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4 $page = array('texte' => '', 'erreur' => $erreur); } } if ($page and $chemin_cache) { $page['cache'] = $chemin_cache; } auto_content_type($page); $GLOBALS['flag_preserver'] |= headers_sent(); // Definir les entetes si ce n'est fait if (!$GLOBALS['flag_preserver']) { if ($GLOBALS['flag_ob']) { // Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions if (trim($page['texte']) === '' and _VAR_MODE != 'debug' and !isset($page['entetes']['Location'])) { $GLOBALS['contexte']['fond_erreur'] = $fond; $page = message_page_indisponible($page, $GLOBALS['contexte']); } // pas de cache client en mode 'observation' if (defined('_VAR_MODE') and _VAR_MODE) { $page['entetes']["Cache-Control"] = "no-cache,must-revalidate"; $page['entetes']["Pragma"] = "no-cache"; } } } } // Entete Last-Modified: // eviter d'etre incoherent en envoyant un lastmodified identique // a celui qu'on a refuse d'honorer plus haut (cf. #655) if ($lastmodified and !isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) and !isset($page['entetes']["Last-Modified"])) { $page['entetes']["Last-Modified"] = gmdate("D, d M Y H:i:s", $lastmodified) . " GMT"; } // fermer la connexion apres les headers si requete HEAD if ($headers_only) { $page['entetes']["Connection"] = "close"; } return $page; }
/** * Retourne une URL vers un validateur * * @return string **/ function admin_valider() { return (!isset($GLOBALS['xhtml']) or $GLOBALS['xhtml'] !== 'true') ? parametre_url(self(), 'var_mode', 'debug', '&') . '&var_mode_affiche=validation' : 'http://validator.w3.org/check?uri=' . rawurlencode("http://" . $_SERVER['HTTP_HOST'] . nettoyer_uri()); }
function assembler($fond, $connect='') { global $flag_preserver,$lastmodified, $use_cache, $contexte; $contexte = calculer_contexte(); $page = array('contexte_implicite'=>calculer_contexte_implicite()); $page['contexte_implicite']['cache'] = $fond . preg_replace(',\.[a-zA-Z0-9]*$,', '', preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI'])); // Cette fonction est utilisee deux fois $cacher = charger_fonction('cacher', 'public'); // Les quatre derniers parametres sont modifies par la fonction: // emplacement, validite, et, s'il est valide, contenu & age $res = $cacher($GLOBALS['contexte'], $use_cache, $chemin_cache, $page, $lastmodified); // Si un resultat est retourne, c'est un message d'impossibilite if ($res) {return array('texte' => $res);} if (!$chemin_cache || !$lastmodified) $lastmodified = time(); $headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD'); // Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client}) // une perennite valide a meme reponse qu'une requete HEAD (par defaut les // pages sont dynamiques) if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) AND !$GLOBALS['var_mode'] AND $chemin_cache AND isset($page['entetes']) AND isset($page['entetes']['Cache-Control']) AND strstr($page['entetes']['Cache-Control'],'max-age=') AND !strstr($_SERVER['SERVER_SOFTWARE'],'IIS/') ) { $since = preg_replace('/;.*/', '', $_SERVER['HTTP_IF_MODIFIED_SINCE']); $since = str_replace('GMT', '', $since); if (trim($since) == gmdate("D, d M Y H:i:s", $lastmodified)) { $page['status'] = 304; $headers_only = true; } } // Si requete HEAD ou Last-modified compatible, ignorer le texte // et pas de content-type (pour contrer le bouton admin de inc-public) if ($headers_only) { $page['entetes']["Connection"] = "close"; $page['texte'] = ""; } else { // si la page est prise dans le cache if (!$use_cache) { // Informer les boutons d'admin du contexte // (fourni par $renommer ci-dessous lors de la mise en cache) $contexte = $page['contexte']; // vider les globales url propres qui ne doivent plus etre utilisees en cas // d'inversion url => objet unset($_SERVER['REDIRECT_url_propre']); unset($_ENV['url_propre']); } // ATTENTION, gestion des URLs transformee par le htaccess // $renommer = 'urls_propres_dist'; // renvoie array($contexte, $type, $url_redirect, $nfond) // $nfond n'est retourne que si l'url est definie apres le ? // et risque d'etre effacee par un form en get // elle est utilisee par form_hidden exclusivement // Compat ascendante si le retour est null: // 1. $contexte est global car cette fonction le modifie. // 2. $fond est passe par reference, pour la meme raison // et calculer la page else { $renommer = generer_url_entite(); if ($renommer) { $url = nettoyer_uri(); $a = $renommer($url, $fond, $contexte); if (is_array($a)) { list($ncontexte, $type, $url_redirect, $nfond) = $a; if (strlen($url_redirect) AND $url !== $url_redirect) { spip_log("Redirige $url vers $url_redirect"); include_spip('inc/headers'); redirige_par_entete($url_redirect, '', 301); } if (isset($nfond)) $fond = $nfond; else if ($fond == '' OR $fond == 'type_urls' /* compat avec htaccess 2.0.0 */ ) $fond = ($type === 'syndic') ? 'site' : $type; if (isset($ncontexte)) $contexte = $ncontexte; if (defined('_DEFINIR_CONTEXTE_TYPE') AND _DEFINIR_CONTEXTE_TYPE) $contexte['type'] = ($type === 'syndic') ? 'site' : $type; } } // compatibilite <= 1.9.2 elseif (function_exists('recuperer_parametres_url')) recuperer_parametres_url($fond, nettoyer_uri()); // vider les globales url propres qui ne doivent plus etre utilisees en cas // d'inversion url => objet unset($_SERVER['REDIRECT_url_propre']); unset($_ENV['url_propre']); // squelette par defaut if (!strlen($fond)) $fond = 'sommaire'; // produire la page : peut mettre a jour $lastmodified $produire_page = charger_fonction('produire_page','public'); $page = $produire_page($fond, $GLOBALS['contexte'], $use_cache, $chemin_cache, NULL, $page, $lastmodified, $connect); if ($page === '') { $erreur = _T('info_erreur_squelette2', array('fichier'=>htmlspecialchars($fond).'.'._EXTENSION_SQUELETTES)); erreur_squelette($erreur); // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4 $page = array('texte' => '', 'erreur' => $erreur); } } if ($page AND $chemin_cache) $page['cache'] = $chemin_cache; auto_content_type($page); $flag_preserver |= headers_sent(); // Definir les entetes si ce n'est fait if (!$flag_preserver) { if ($GLOBALS['flag_ob']) { // Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions if (trim($page['texte']) === '' AND $GLOBALS['var_mode'] != 'debug' AND !isset($page['entetes']['Location']) // cette page realise une redirection, donc pas d'erreur ) { // passer le type d'objet recherche au contexte de la page d'erreur $contexte['type'] = (isset($type)?$type:$fond); $page = message_page_indisponible($page, $contexte); // cacher la page d'erreur car celle ci est contextuelle if ($chemin_cache AND is_array($page) AND count($page) AND $page['entetes']['X-Spip-Cache'] > 0){ $cacher = charger_fonction('cacher', 'public'); $lastinclude = time(); $cacher($contexte_cache, $use_cache, $chemin_cache, $page, $lastinclude); } } // pas de cache client en mode 'observation' if ($GLOBALS['var_mode']) { $page['entetes']["Cache-Control"]= "no-cache,must-revalidate"; $page['entetes']["Pragma"] = "no-cache"; } } } } // Entete Last-Modified: // eviter d'etre incoherent en envoyant un lastmodified identique // a celui qu'on a refuse d'honorer plus haut (cf. #655) if ($lastmodified AND !isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) AND !isset($page['entetes']["Last-Modified"])) $page['entetes']["Last-Modified"]=gmdate("D, d M Y H:i:s", $lastmodified)." GMT"; return $page; }
function decouper_en_pages_rempl($texte, $pagination_seule=false) { // un seul id par page... static $id_decoupe = ''; // si pas de separateur, on sort if (strpos($texte, _decoupe_SEPARATEUR)===false) return $pagination_seule?'':$texte; // au cas ou on ne veuille pas de decoupe, on remplace les '++++' par un filet. if (defined('_CS_PRINT') && !$pagination_seule) { @define(_decoupe_FILET, '<p style="border-bottom:1px dashed #666; padding:0; margin:1em 20%; font-size:4pt;" > </p>'); return str_replace(_decoupe_SEPARATEUR, _decoupe_FILET, $texte); } // recherche du sommaire s'il existe if (defined('_sommaire_REM') && (substr_count($texte, _sommaire_REM)==2)) { $pages = explode(_sommaire_REM, $texte); $sommaire = $pages[0].$pages[1]; $texte = $pages[2]; } else $sommaire = ''; // traitement des pages $pages = explode(_decoupe_SEPARATEUR, $texte); $num_pages = count($pages); if ($num_pages == 1) return $pagination_seule?'':$texte; $artpage = max(intval(artpage()), 1); $artpage = min($artpage, $num_pages); /* // si numero illegal ou si var_recherche existe, alors renvoyer toutes les pages, separees par une ligne <hr/>. // la surbrillance pourra alors fonctionner correctement. if (strlen($_GET['var_recherche']) || $artpage < 1 || $artpage > $num_pages) return join("<hr/>", $pages); */ // si la balise #CS_DECOUPE est utilisee on renvoie le texte sans pagination if (!$pagination_seule) { // page demandee $page = cs_safebalises($pages[$artpage-1]); if (isset($_GET['decoupe_recherche'])) { include_spip('inc/surligne'); $page = surligner_mots($page, $_GET['decoupe_recherche']); } if (defined('_decoupe_BALISE')) return $sommaire.$page; } $self = nettoyer_uri();//self();//$GLOBALS['REQUEST_URI']; // liens des differentes pages sous forme : 1 2 3 4 $milieu = ''; for ($i = 1; $i <= $num_pages; $i++) { $page_ = supprimer_tags(cs_safebalises(cs_introduire(echappe_retour($pages[$i-1],'CS')))); $title = preg_split("/[\r\n]+/", trim($page_), 2); $title = attribut_html(/*propre*/(couper($title[0], _decoupe_NB_CARACTERES)));//.' (...)'; $milieu .= recuperer_fond('fonds/decoupe_item', array( 'page'=>$i, 'artpage'=>$artpage, 'derniere_page'=>$num_pages, 'title_page'=>_T('couteau:page_lien', array('page' => $i, 'title' => $title)), 'self' =>$self, )); } // pagination finale $pagination = recuperer_fond('fonds/decoupe', array( 'artpage'=>$artpage, 'derniere_page'=>$num_pages, 'items'=>$milieu, 'self' =>$self, )); if ($pagination_seule) { if(trim($pagination)=="") return ""; $pagination = "<div id='decoupe_balise$id_decoupe' class='pagination decoupe_balise'>\n$pagination\n</div>\n"; return $pagination; } // ici $pagination_seule est false, $page est definie $pagination1 = "<div id='decoupe_haut$id_decoupe' class='pagination decoupe_haut'>\n$pagination\n</div>\n"; $pagination2 = "<div id='decoupe_bas$id_decoupe' class='pagination decoupe_bas'>\n$pagination\n</div>\n"; $id_decoupe++; return $sommaire.$pagination1.$page.$pagination2; }
/** * Decoder une url en utilisant les fonctions inverse * gestion des URLs transformee par le htaccess * $renommer = 'urls_propres_dist'; * renvoie array($contexte, $type, $url_redirect, $nfond) * $nfond n'est retourne que si l'url est definie apres le ? * et risque d'etre effacee par un form en get * elle est utilisee par form_hidden exclusivement * Compat ascendante si le retour est null en gerant une sauvegarde/restauration * des globales modifiees par les anciennes fonctions * * @param string $url * url a decoder * @param string $fond * fond initial par defaut * @param array $contexte * contexte initial a prendre en compte * @param bool $assembler * true si l'url correspond a l'url principale de la page qu'on est en train d'assembler * dans ce cas la fonction redirigera automatiquement si besoin * et utilisera les eventuelles globales $_SERVER['REDIRECT_url_propre'] et $_ENV['url_propre'] * provenant du htaccess * @return array * ($fond,$contexte,$url_redirect) * si l'url n'est pas valide, $fond restera a la valeur initiale passee * il suffit d'appeler la fonction sans $fond et de verifier qu'a son retour celui-ci * est non vide pour verifier une url * */ function urls_decoder_url($url, $fond = '', $contexte = array(), $assembler = false) { static $current_base = null; // les anciennes fonctions modifient directement les globales // on les sauve avant l'appel, et on les retablit apres ! $save = array(@$GLOBALS['fond'], @$GLOBALS['contexte'], @$_SERVER['REDIRECT_url_propre'], @$_ENV['url_propre']); if (is_null($current_base)) { include_spip('inc/filtres_mini'); // le decodage des urls se fait toujours par rapport au site public $current_base = url_absolue(_DIR_RACINE ? _DIR_RACINE : './'); } if (strncmp($url, $current_base, strlen($current_base)) == 0) { $url = substr($url, strlen($current_base)); } // si on est pas en train d'assembler la page principale, // vider les globales url propres qui ne doivent pas etre utilisees en cas // d'inversion url => objet if (!$assembler) { unset($_SERVER['REDIRECT_url_propre']); unset($_ENV['url_propre']); } $url_redirect = ""; $renommer = generer_url_entite(); if (!$renommer and !function_exists('recuperer_parametres_url')) { $renommer = charger_fonction('page', 'urls'); } // fallback pour decoder l'url if ($renommer) { $a = $renommer($url, $fond, $contexte); if (is_array($a)) { list($ncontexte, $type, $url_redirect, $nfond) = array_pad($a, 4, null); if ($url_redirect == $url) { $url_redirect = ""; } // securite pour eviter une redirection infinie if ($assembler and strlen($url_redirect)) { spip_log("Redirige {$url} vers {$url_redirect}"); include_spip('inc/headers'); redirige_par_entete($url_redirect, '', 301); } if (isset($nfond)) { $fond = $nfond; } else { if ($fond == '' or $fond == 'type_urls') { $fond = $type; } } if (isset($ncontexte)) { $contexte = $ncontexte; } if (defined('_DEFINIR_CONTEXTE_TYPE') and _DEFINIR_CONTEXTE_TYPE) { $contexte['type'] = $type; } if (defined('_DEFINIR_CONTEXTE_TYPE_PAGE') and _DEFINIR_CONTEXTE_TYPE_PAGE) { $contexte['type-page'] = $type; } } } elseif (function_exists('recuperer_parametres_url')) { $GLOBALS['fond'] = $fond; $GLOBALS['contexte'] = $contexte; recuperer_parametres_url($fond, nettoyer_uri()); // fond est en principe modifiee directement $contexte = $GLOBALS['contexte']; } // retablir les globales list($GLOBALS['fond'], $GLOBALS['contexte'], $_SERVER['REDIRECT_url_propre'], $_ENV['url_propre']) = $save; // vider les globales url propres qui ne doivent plus etre utilisees en cas // d'inversion url => objet // maintenir pour compat ? #if ($assembler) { # unset($_SERVER['REDIRECT_url_propre']); # unset($_ENV['url_propre']); #} return array($fond, $contexte, $url_redirect); }
function admin_valider() { global $xhtml; return @$xhtml !== 'true' ? parametre_url(self(), 'var_mode', 'debug', '&') . '&var_mode_affiche=validation' : 'http://validator.w3.org/check?uri=' . rawurlencode("http://" . $_SERVER['HTTP_HOST'] . nettoyer_uri()); }