([^/]+?)(?:/(.+?))?,ism'); // Les appels a soi-meme (notamment les images) // doivent etre en relatif pour pouvoir creer un cache local function generer_url_aide($args) { return generer_url_ecrire('aide_index', $args, false, true); } function help_fichier_contenu ($lang_aide, $path, $help_server) { $contenu = array(); include_spip('inc/distant'); foreach ($help_server as $k => $server) { // Remplacer les liens aux images par leur gestionnaire de cache $url = "$server/$path"; $page = help_replace_img(recuperer_page($url),$k); // les liens internes ne doivent pas etre deguises en externes $url = parse_url($url); $re = '@(]*\s+href=["\'])' . '(?:' . $url['scheme'] . '://' . $url['host'] . ')?' . $url['path'] . '([^"\']*)@ims'; $page = preg_replace($re,'\\1\\2', $page); preg_match_all(_SECTIONS_AIDE, $page, $sections, PREG_SET_ORDER); // Fusionner les aides ayant meme nom de section $vus = array(); foreach ($sections as $section) { list($tout,$prof, $sujet,) = $section; if (in_array($sujet, $vus)) continue; $corps = help_section($sujet, $page, $prof); foreach ($contenu as $k => $s) { if ($sujet == $k) { // Section deja vue qu'il faut completer // Si le complement a des sous-sections, // ne pas en tenir compte quand on les rencontrera // lors des prochains passages dans la boucle if (preg_match_all(_SECTIONS_AIDE, $corps, $m, PREG_PATTERN_ORDER)) { if ($m) {$vus = array_merge($vus, $m[2]);} $contenu[$k] .= $corps; $corps = ''; break; } else spip_log("aide $server $section incorrecte"); } } // Si totalement nouveau, inserer le titre // mais pas le corps s'il contient des sous-sections: // elles vont venir dans les passages suivants if ($corps) { $corps = help_section($sujet, $page); $contenu[$sujet] = $tout . "\n" . $corps; } } } // Renvoyer les liens vraiment externes dans une autre fenetre $contenu = preg_replace('@]*)>@', '', join('',$contenu)); if (strlen($contenu) <= 75) return array(false, false); // Correction typo dans la langue demandee changer_typo($lang_aide); return '' . justifier("
$contenu
") . ''; } // http://doc.spip.org/@help_lastmodified function help_lastmodified($lastmodified) { $gmoddate = gmdate("D, d M Y H:i:s", $lastmodified); header("Last-Modified: ".$gmoddate." GMT"); if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) # MSoft IIS is dumb AND !preg_match(',IIS/,', $_SERVER['SERVER_SOFTWARE'])) { $ims = preg_replace('/;.*/', '', $_SERVER['HTTP_IF_MODIFIED_SINCE']); $ims = trim(str_replace('GMT', '', $ims)); if ($ims == $gmoddate) { http_status(304); return true; } } return false; } // Les aides non mises a jour ont un vieux Path a remplacer // (mais ce serait bien de le faire en SQL une bonne fois) define('_REPLACE_IMG_PACK', "@(]* +)?\s*src=['\"])img_pack\/@ims"); // Remplacer les URL des images par l'URL du gestionnaire de cache local function help_replace_img($contenu, $server=0) { $html = ""; $re = "@(]* +)?\s*src=['\"])((AIDE|IMG|local)/([-_a-zA-Z0-9]*/?)([^'\"<>]*))@imsS"; while (preg_match($re, $contenu, $r)) { $p = strpos($contenu, $r[0]); $i = $server . ':' . str_replace('/', '-', $r[3]); $h = generer_url_aide("img=" . $i); $html .= substr($contenu, 0, $p) . $r[1] . $h; $contenu = substr($contenu, $p + strlen($r[0])); } $html .= $contenu; // traiter les vieilles doc return preg_replace(_REPLACE_IMG_PACK,"\\1"._DIR_IMG_PACK, $html); } // un bout de squelette qu'il serait bon d'evacuer un jour. define('_HELP_PANNEAU', "SPIP
Système de publication pour l'Internet
"); // Autre squelette qui ne s'avoue pas comme tel // http://doc.spip.org/@help_body function help_body($aide) { if (!$aide) { $c = _T('info_copyright_doc', array('spipnet' => $GLOBALS['home_server'] . '/' . $GLOBALS['spip_lang'] . '_')); return "
" . _HELP_PANNEAU . preg_replace(",'; } elseif ($aide == 'spip') { return "
SPIP
"; } return ''; } // Extraire la seule section demandee, // qui commence par son nom entouree d'une balise h2 // et se termine par la prochaine balise h2 ou h1 ou le /body final. function help_section($aide, $contenu, $prof=2) { $maxprof = ($prof >=2) ? "12" : "1"; $r = "@\s*' . preg_quote($aide) ."\s*(?:/.+?)?(.*?)<(?:(?:h[$maxprof])|/body)@ism"; if (preg_match($r, $contenu, $m)) return $m[1]; return ''; } // Affichage du menu de gauche avec analyse de la section demandee // afin d'ouvrir le sous-menu correspondant a l'affichage a droite // http://doc.spip.org/@help_menu_rubrique function help_menu_rubrique($aide, $contenu) { global $spip_lang; $afficher = false; $ligne = $numrub = 0; $texte = $res = ''; preg_match_all(_SECTIONS_AIDE, $contenu, $sections, PREG_SET_ORDER); foreach ($sections as $section) { list(,$prof, $sujet, $bloc) = $section; if ($prof == '1') { if ($afficher && $texte) $res .= block_parfois_visible("block$numrub", "
$titre
", "\n$texte",'', $ouvrir); $afficher = $bloc ? ($bloc == 'redac') : true; $texte = ''; if ($afficher) { $numrub++; $ouvrir = 0; $titre = $sujet; } } else { ++$ligne; $id = "ligne$ligne"; if ($aide == $sujet) { $ouvrir = 1; $class = "article-actif"; $texte .= http_script("curr_article = '$id';"); } else $class = "article-inactif"; $h = generer_url_aide("aide=$sujet&frame=body&var_lang=$spip_lang"); $texte .= "
" . $bloc . "
\n"; } } if ($afficher && $texte) $res .= block_parfois_visible("block$numrub", "
$titre
", "\n$texte",'', $ouvrir); return $res; } function help_frame_menu($titre, $contenu, $lang) { global $spip_lang_rtl; return "\n" .$titre ."\n" . '\n" . http_script('', 'jquery.js') . "\n" . $GLOBALS['browser_layer'] . http_script('var curr_article; function activer_article(id) { if (curr_article) jQuery("#"+curr_article).removeClass("article-actif").addClass("article-inactif"); if (id) { jQuery("#"+id).removeClass("article-inactif").addClass("article-actif"); curr_article = id; } } ') . ' ' . $contenu . ''; } function help_frame_body($titre, $aide, $html, $lang_aide='') { global $spip_lang_rtl; $dir = $spip_lang_rtl ? " dir='rtl'" : ''; return "\n$titre\n". '\n". "\n". '". help_body($aide) . ($aide ? $html : ''). ''; } function help_frame_frame($titre, $aide, $lang) { global $spip_lang_rtl; $menu = "\n"; $body = "\n"; $seq = $spip_lang_rtl ? "$body$menu" : "$menu$body"; $dim = $spip_lang_rtl ? '*,160' : '160,*'; return "\n$titre\n\n$seq"; } // http://doc.spip.org/@help_img_cache function help_img_cache($img, $ext) { header("Content-Type: image/$ext"); header("Expires: ".gmdate("D, d M Y H:i:s", time()+24*3600) .' GMT'); readfile($img); } // Regexp reperant le travail fait par help_replace_img define('_HELP_PLACE_IMG',',^(\d+:)?(([^-.]*)-([^-.]*)-([^\.]*\.(gif|jpg|png)))$,'); // Distinguer la demande d'une image et la demande d'un texte. // Si c'est une URL d'image deguisee, on la cherche dans le cache ou on l'y met. // Voir les differentes localisations possibles dans help_replace_img // // http://doc.spip.org/@exec_aide_index_dist function exec_aide_index_dist() { global $help_server; if (!is_array($help_server)) $help_server = array($help_server); if (!preg_match(_HELP_PLACE_IMG, _request('img'), $r)) { aide_index_frame( preg_replace(',[^\w-]+,', '', _request('var_lang_r')), preg_replace(',[^\w-]+,', '', _request('lang_r')), _request('frame'), strtr(_request('aide'),'<>"\'', '____'), $help_server); } else { list (,$server, $cache, $rep, $lang, $file, $ext) = $r; if ($rep=="IMG" AND $lang=="cache" AND @file_exists($img = _DIR_VAR.'cache-TeX/'.preg_replace(',^TeX-,', '', $file))) { help_img_cache($img, $ext); } else if (@file_exists($img = _DIR_AIDE . $cache)) { help_img_cache($img, $ext); } else if (@file_exists($img = _DIR_RACINE . 'AIDE/aide-'.$cache)) { help_img_cache($img, $ext); } else { $server = intval(substr($server, 0, -1)); if ($server = $help_server[$server]) { include_spip('inc/distant'); sous_repertoire(_DIR_AIDE,'','',true); $img = "$server/$rep/$lang/$file"; $contenu = recuperer_page($img); if ($contenu) { ecrire_fichier (_DIR_AIDE . $cache, $contenu); // Bug de certains OS: // le contenu est incompris au premier envoi // Donc ne pas mettre d'Expire header("Content-Type: image/$ext"); echo $contenu; } else redirige_par_entete($img); } else redirige_par_entete(generer_url_public('404')); } } } // Determiner la langue L, et en deduire le Path du fichier d'aide. // Sur le site www.spip.net/, ca donne l'URL www.spip.net/L-aide.html // reecrit par le htacces suivant: // http://zone.spip.org/trac/spip-zone/browser/_galaxie_/www.spip.net/squelettes/htaccess.txt function aide_index_frame($var_lang_r, $lang_r, $frame, $aide, $help_server) { global $spip_lang; if ($var_lang_r) changer_langue($lang = $var_lang_r); if ($lang_r) # pour le cas ou on a fait appel au menu de changement de langue # (aide absente dans la langue x) changer_langue($lang = $lang_r); else $lang = $spip_lang; // L'aide correspondant a la langue demandee est dans un cache // reposant sur la date du fichier indiquant la version de SPIP // (approximatif, mais c'est deja qqch) $path = $spip_lang . "-aide.html"; $md5 = md5(serialize($help_server)); $fichier = _DIR_AIDE . substr($md5,0,16) . "-" . $path; $lastm = is_readable($fichier) ? filemtime($fichier) : 0; $lastversion = @filemtime(_DIR_RESTREINT . 'inc_version.php'); if (!($lastm AND ($lastm >= $lastversion))) { $contenu = help_fichier_contenu($spip_lang, $path, $help_server); // mettre en cache (tant pis si echec) sous_repertoire(_DIR_AIDE,'','',true); if ($contenu) ecrire_fichier ($fichier, $contenu); $lastm = time(); } $titre = _T('info_aide_en_ligne'); if (!$frame) { echo _DOCTYPE_AIDE, html_lang_attributes(); echo help_frame_frame($titre, $aide, $lang); echo "\n"; } else { header("Content-Type: text/html; charset=utf-8"); if (!isset($contenu)) { lire_fichier($fichier, $contenu); } if (!$contenu) { include_spip('inc/minipres'); echo minipres(_T('forum_titre_erreur'), "
" . $help_server[0] . " $aide : ". _T('aide_non_disponible'). "

". menu_langues('var_lang_ecrire'). "
"); // Envoie le not-modified-since si possible, sinon envoie tout } elseif (!help_lastmodified($lastm)) { echo _DOCTYPE_AIDE, html_lang_attributes(); if ($frame === 'menu') { $contenu = help_menu_rubrique($aide, $contenu); echo help_frame_menu($titre, $contenu, $lang); } else { if ($aide) { $contenu = help_section($aide, $contenu); if (!$contenu) spip_log("aide inconnue $aide dans " . substr($contenu, 0, 150)); } echo help_frame_body($titre, $aide, $contenu, $lang); } echo "\n"; } } } ?>