function liens_orphelins($texte){ // deja, on s'en va si pas de point... if ($GLOBALS["liens_orphelins"]<0 || strpos($texte, '.')===false) return $texte; // prudence 1 : on protege TOUTES les balises <a></a> pour eviter les doublons if (strpos($texte, '<a')!==false) $texte = preg_replace_callback(',<a\s*[^<]+</a>,Ums', 'cs_liens_echappe_callback', $texte); // prudence 2 : on protege TOUS les raccourcis de liens Spip, au cas ou... if (strpos($texte, '[')!==false) $texte = preg_replace_callback(',\[([^][]*)->(>?)([^]]*)\],msS', 'cs_liens_echappe_callback', $texte); // prudence 3 : on protege TOUTES les balises contenant des points, histoire de voir plus clair if (strpos($texte, '<')!==false) $texte = preg_replace_callback(',<[^>]+\.[^>]*>,Ums', 'cs_liens_echappe_callback', $texte); // encore ici, on s'en va si pas de point... if (strpos($texte, '.')===false) return echappe_retour($texte, 'LIENS'); // trouve et protege : protocole://qqchose $texte = preg_replace_callback(_cs_liens_HTTP, 'cs_liens_raccourcis_callback', $texte); // trouve et protege : www.lieu.qqchose ou ftp.lieu.qqchose $texte = preg_replace_callback(_cs_liens_WWW, 'cs_liens_raccourcis_callback', $texte); // trouve : mailto:qqchose ou news:qqchose if($GLOBALS['liens_orphelins']>0) { $texte = preg_replace_callback(_cs_liens_NEWS, 'cs_liens_raccourcis_callback', $texte); $texte = preg_replace_callback(_cs_liens_MAILS, 'cs_liens_email_callback', $texte); } return echappe_retour($texte, 'LIENS'); }
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; }
function interro_rempl($texte) { // prudence 1 : on protege TOUTES les balises contenant des "?", "!" ou "-", histoire de voir plus clair if (strpos($texte, '<')!==false) $texte = preg_replace_callback(',(<[^>]+[?!-][^>]*>),Ums', 'cs_liens_echappe_callback', $texte); // prudence 2 : on protege TOUS les liens de raccourcis de liens Spip, au cas ou... if (strpos($texte, '[')!==false) $texte = preg_replace_callback(',\[[^][]*->>?([^]]*)\],msS', 'cs_liens_echappe_callback', $texte); // ici, on traite si on trouve des "?", "!" ou "--" if (strpos($texte, '?')!==false || strpos($texte, '!')!==false || strpos($texte, '--')!==false) { // trouve et protege : protocole://qqchose $texte = preg_replace_callback(_cs_liens_HTTP, 'interro_liens_callback', $texte); // trouve et protege : www.lieu.qqchose ou ftp.lieu.qqchose $texte = preg_replace_callback(_cs_liens_WWW, 'interro_liens_callback', $texte); } return echappe_retour($texte, 'LIENS'); }
function mailcrypt($texte) { static $ok = NULL; if (strpos($texte, '@')===false) return $texte; if(is_null($ok)) { $ok = true; // pour _cs_liens_AUTORISE include_spip('outils/inc_cs_liens'); // tip visible onMouseOver (title) // jQuery replacera ensuite le '@' comme ceci : title.replace(/\.\..t\.\./,'[\x40]') @define('_mailcrypt_AROBASE_JS', '..åt..'); @define('_mailcrypt_AROBASE_JSQ', preg_quote(_mailcrypt_AROBASE_JS,',')); // span ayant l'arobase en background @define('_mailcrypt_AROBASE', '<span class=\'spancrypt\'> </span>'); // @define('_mailcrypt_REGEXPR1', ',\b['._cs_liens_AUTORISE.']*@[a-zA-Z][a-zA-Z0-9-.]*\.[a-zA-Z]+(\?['._cs_liens_AUTORISE.']*)?,'); @define('_mailcrypt_REGEXPR2', ',\b(['._cs_liens_AUTORISE.']+)@([a-zA-Z][a-zA-Z0-9-.]*\.[a-zA-Z]+(\?['._cs_liens_AUTORISE.']*)?),'); } // echappement des 'input' au cas ou le serveur y injecte des mails persos if (strpos($texte, '<in')!==false) $texte = preg_replace_callback(',<input [^<]+/>,Umsi', 'cs_liens_echappe_callback', $texte); // echappement des 'protoc://*****:*****@site.ici' afin ne pas les confondre avec un mail if (strpos($texte, '://')!==false) $texte = preg_replace_callback(',[a-z0-9]+://['._cs_liens_AUTORISE.']+:['._cs_liens_AUTORISE.']+@,Umsi', 'cs_liens_echappe_callback', $texte); // echappement des domaines .htm/.html : ce ne sont pas des mails if (strpos($texte, '.htm')!==false) $texte = preg_replace_callback(',href=(["\'])[^>]*@[^>]*\.html?\\1,', 'cs_liens_echappe_callback', $texte); // protection des liens HTML $texte = preg_replace(",[\"\']mailto:([^@\"']+)@([^\"']+)[\"\'],", '"#" title="$1' . _mailcrypt_AROBASE_JS . '$2" onclick="location.href=lancerlien(\'$1\',\'$2\'); return false;"', $texte); // retrait des titles en doublon... un peu sale, mais en attendant mieux ? $texte = preg_replace(',title="[^"]+'._mailcrypt_AROBASE_JSQ.'[^"]+"([^>]+title=[\"\']),', '$1', $texte); if (strpos($texte, '@')===false) return echappe_retour($texte, 'LIENS'); // protection de tout le reste... $texte = preg_replace(_mailcrypt_REGEXPR2, '$1'._mailcrypt_AROBASE.'$2', $texte); return echappe_retour($texte, 'LIENS'); }
function extraire_multi($letexte, $lang = null, $echappe_span = false) { if (preg_match_all(_EXTRAIRE_MULTI, $letexte, $regs, PREG_SET_ORDER)) { if (!$lang) { $lang = $GLOBALS['spip_lang']; } foreach ($regs as $reg) { // chercher la version de la langue courante $trads = extraire_trads($reg[1]); if ($l = approcher_langue($trads, $lang)) { $trad = $trads[$l]; } else { include_spip('inc/texte'); // langue absente, prendre la premiere dispo // mais typographier le texte selon les regles de celle-ci // Attention aux blocs multi sur plusieurs lignes $l = key($trads); $trad = $trads[$l]; $typographie = charger_fonction(lang_typo($l), 'typographie'); $trad = $typographie($trad); include_spip('inc/texte'); // Tester si on echappe en span ou en div // il ne faut pas echapper en div si propre produit un seul paragraphe $trad_propre = preg_replace(",(^<p[^>]*>|</p>\$),Uims", "", propre($trad)); $mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $trad_propre) ? 'div' : 'span'; $trad = code_echappement($trad, 'multi', false, $mode); $trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l)); if (lang_dir($l) !== lang_dir($lang)) { $trad = str_replace("'", '"', inserer_attribut($trad, 'dir', lang_dir($l))); } if (!$echappe_span) { $trad = echappe_retour($trad, 'multi'); } } $letexte = str_replace($reg[0], $trad, $letexte); } } return $letexte; }
/** * http://code.spip.net/@corriger_typo * * @param string $t * @param string $lang * @return string */ function corriger_typo($t, $lang = '') { static $typographie = array(); // Plus vite ! if (!$t) { return $t; } $t = pipeline('pre_typo', $t); // Caracteres de controle "illegaux" $t = corriger_caracteres($t); // Proteger les caracteres typographiques a l'interieur des tags html if (preg_match_all(_TYPO_BALISE, $t, $regs, PREG_SET_ORDER)) { foreach ($regs as $reg) { $insert = $reg[0]; // hack: on transforme les caracteres a proteger en les remplacant // par des caracteres "illegaux". (cf corriger_caracteres()) $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR); $t = str_replace($reg[0], $insert, $t); } } // trouver les blocs multi et les traiter a part $t = extraire_multi($e = $t, $lang, true); $e = $e === $t; // Charger & appliquer les fonctions de typographie $idxl = "{$lang}:" . (isset($GLOBALS['lang_objet']) ? $GLOBALS['lang_objet'] : $GLOBALS['spip_lang']); if (!isset($typographie[$idxl])) { $typographie[$idxl] = charger_fonction(lang_typo($lang), 'typographie'); } $t = $typographie[$idxl]($t); // Les citations en une autre langue, s'il y a lieu if (!$e) { $t = echappe_retour($t, 'multi'); } // Retablir les caracteres proteges $t = strtr($t, _TYPO_PROTECTEUR, _TYPO_PROTEGER); // pipeline $t = pipeline('post_typo', $t); # un message pour abs_url - on est passe en mode texte $GLOBALS['mode_abs_url'] = 'texte'; return $t; }
function typo_guillemets_rempl($texte){ // on s'en va si pas de guillemets... if (strpos($texte, '"')===false) return $texte; // prudence : on protege TOUTES les balises contenant des doubles guillemets droits if (strpos($texte, '<')!==false) $texte = preg_replace_callback('/(<[^>]+"[^>]*>)/Ums', 'typo_guillemets_echappe_balises_callback', $texte); // $texte = preg_replace('/(<[^>]+"[^>]*>)/Umse', 'cs_code_echappement("\\1", "GUILL")', $texte); ; // choix de la langue, de la constante et de la chaine de remplacement if (!$lang = $GLOBALS['lang_objet']) $lang = $GLOBALS['spip_lang']; $constante = '_GUILLEMETS_'.$lang; $guilles = defined($constante)?constant($constante):_GUILLEMETS_defaut; // Remplacement des autres paires de guillemets (et suppression des espaces apres/avant) // Et retour des balises contenant des doubles guillemets droits return echappe_retour(preg_replace('/"\s*(.*?)\s*"/', $guilles, $texte), 'GUILL'); }
function cs_smileys_BarreTypo($tr) { $smileys = smileys_uniques(cs_lire_data_outil('smileys')); $max = count($smileys[0]); $res = ''; for ($i=0; $i<$max; $i++) $res .= "<a href=\"javascript:barre_inserer('{$smileys[0][$i]}',@@champ@@)\">{$smileys[1][$i]}</a>"; return $tr.'<tr><td><@@span@@>'._T('couteauprive:smileys:nom').'</span> '.echappe_retour($res, 'SMILE').'</td></tr>'; }
function sommaire_d_article_rempl($texte0, $sommaire_seul=false) { // pour sommaire_nettoyer_raccourcis() include_spip('outils/sommaire'); // si le sommaire est malvenu ou s'il n'y a pas de balise <hx>, alors on laisse tomber $inserer_sommaire = defined('_sommaire_AUTOMATIQUE') ?strpos($texte0, _CS_SANS_SOMMAIRE)===false :strpos($texte0, _CS_AVEC_SOMMAIRE)!==false; if (!$inserer_sommaire || strpos($texte0, '<h')===false) return $sommaire_seul?'':sommaire_nettoyer_raccourcis($texte0); // on retire les raccourcis du texte $texte = sommaire_nettoyer_raccourcis($texte0); // on masque les onglets s'il y en a if(defined('_onglets_FIN')) $texte = preg_replace_callback(',<div class="onglets_bloc_initial.*'._onglets_FIN.',Ums', create_function('$matches','return cs_code_echappement($matches[0], \'SOMM\');'), $texte); // et la, on y va... $sommaire = ''; $i = 1; $nbh3 = 0; // reinitialisation de l'index interne de la fonction sommaire_d_une_page($texte, $nbh3, false); // couplage avec l'outil 'decoupe_article' if(defined('_decoupe_SEPARATEUR') && !defined('_CS_PRINT')) { $pages = explode(_decoupe_SEPARATEUR, $texte); if (($num_page=count($pages)) == 1) $sommaire = sommaire_d_une_page($texte, $nbh3); else { foreach($pages as $p=>$page) { $sommaire .= sommaire_d_une_page($page, $nbh3, $i++, $num_page); $pages[$p] = $page; } $texte = join(_decoupe_SEPARATEUR, $pages); } } else $sommaire = sommaire_d_une_page($texte, $nbh3); if(!strlen($sommaire) || $nbh3<_sommaire_NB_TITRES_MINI) return $sommaire_seul?'':sommaire_nettoyer_raccourcis($texte0); // calcul du sommaire include_spip('public/assembler'); $sommaire = recuperer_fond('fonds/sommaire', array( 'sommaire'=>$sommaire, 'fond_css'=>strpos($texte0, _sommaire_SANS_FOND)===false ?'avec':'sans', )); // si on ne veut que le sommaire, on renvoie le sommaire // sinon, on n'insere ce sommaire en tete de texte que si la balise #CS_SOMMAIRE n'est pas activee if($sommaire_seul) return $sommaire; if(defined('_onglets_FIN')) $texte = echappe_retour($texte, 'SOMM'); if(defined('_sommaire_BALISE')) return $texte; return _sommaire_REM.$sommaire._sommaire_REM.$texte; }
function typo($letexte) { global $lcm_lang, $lang_typo; // escape <html>...</html> code, etc. list($letexte, $les_echap) = echappe_html($letexte, "SOURCETYPO"); // Call the function for pre-processing $letexte = spip_avant_typo($letexte); if (!($lang = $lang_typo)) { include_lcm('inc_lang'); $lang = lang_typo($lcm_lang); } if ($lang == 'fr') { $letexte = typo_fr($letexte); } else { $letexte = typo_en($letexte); } // Call the post-processing function $letexte = spip_apres_typo($letexte); // reintegrate the escaped text $letexte = echappe_retour($letexte, $les_echap, "SOURCETYPO"); return $letexte; }
function typo_exposants($texte){ if (!$lang = $GLOBALS['lang_objet']) $lang = $GLOBALS['spip_lang']; if(!function_exists($fonction = 'typo_exposants_'.lang_typo($lang))) return $texte; // prudence : on protege les balises <a> et <img> if (strpos($texte, '<')!==false) $texte = preg_replace_callback('/(<(a|img) [^>]+>)/Ums', 'typo_exposants_echappe_balises_callback', $texte); $texte = cs_echappe_balises('html|code|cadre|frame|script|acronym|cite', $fonction, $texte); return echappe_retour($texte, 'EXPO'); }
function cs_echappe_balises($balises, $fonction, $texte, $arg=NULL){ if(!strlen($texte)) return ''; if (($fonction!==false) && !function_exists($fonction)) { // chargement des fonctions include_spip('cout_fonctions'); if (!function_exists($fonction)) { spip_log("Erreur - cs_echappe_balises() : $fonction() non definie dans : ".$_SERVER['REQUEST_URI']); return $texte; } } // trace d'anciennes balises <html></html> ou autre echappement SPIP ? if(strpos($texte, _CS_HTMLA)!==false) { $texte = preg_replace(',<p[^>]*>(\s*'._CS_HTMLX.')</p>,', '$1', $texte); $texte = preg_replace_callback(','._CS_HTMLA.'(.*?)(?='._CS_HTMLB.'),s', 'cs_echappe_html_callback', $texte); } // protection du texte if($balises!==false) { if(!strlen($balises)) $balises = 'html|code|cadre|frame|script'; $balises = ',<('.$balises.')(\s[^>]*)?>(.*)</\1>,UimsS'; include_spip('inc/texte'); $texte = echappe_html($texte, 'CS', true, $balises); } // retour du texte simplement protege if ($fonction===false) return $texte; // transformation par $fonction $texte = $arg==NULL?$fonction($texte):$fonction($texte, $arg); // deprotection en abime, notamment des modeles... if(strpos($texte, 'base64CS')!==false) $texte = echappe_retour($texte, 'CS'); if(strpos($texte, 'base64CS')!==false) return echappe_retour($texte, 'CS'); return $texte; }
function echappe_retour_modeles($letexte, $interdire_scripts = false) { $letexte = echappe_retour($letexte); // Dans les appels directs hors squelette, securiser aussi ici if ($interdire_scripts) { $letexte = interdire_scripts($letexte); } return trim($letexte); }
function balise_SMILEYS_dist($p) { // Fonctions abandonnees par le plugin Porte Plume $js_compat = !defined('_DIR_PLUGIN_PORTE_PLUME')?"":"<script type=\"text/javascript\">/*<![CDATA[*/ // From SPIP 2.0 (spip_barre.js) if(typeof barre_inserer!='function') { function barre_inserer(text,champ) { var txtarea = champ; if(document.selection){ txtarea.focus(); var r = document.selection.createRange(); if (r == null) { txtarea.selectionStart = txtarea.value.length; txtarea.selectionEnd = txtarea.selectionStart; } else { var re = txtarea.createTextRange(); var rc = re.duplicate(); re.moveToBookmark(r.getBookmark()); rc.setEndPoint('EndToStart', re); txtarea.selectionStart = rc.text.length; txtarea.selectionEnd = rc.text.length + r.text.length; } } mozWrap(txtarea, '', text); }} // From http://www.massless.org/mozedit/ if(typeof mozWrap!='function') { function mozWrap(txtarea, open, close) { var selLength = txtarea.textLength; var selStart = txtarea.selectionStart; var selEnd = txtarea.selectionEnd; if (selEnd == 1 || selEnd == 2) selEnd = selLength; var selTop = txtarea.scrollTop; // Raccourcir la selection par double-clic si dernier caractere est espace if (selEnd - selStart > 0 && (txtarea.value).substring(selEnd-1,selEnd) == ' ') selEnd = selEnd-1; var s1 = (txtarea.value).substring(0,selStart); var s2 = (txtarea.value).substring(selStart, selEnd) var s3 = (txtarea.value).substring(selEnd, selLength); txtarea.value = s1 + open + s2 + close + s3; selDeb = selStart + open.length; selFin = selEnd + close.length; window.setSelectionRange(txtarea, selDeb, selFin); txtarea.scrollTop = selTop; txtarea.focus(); return; }} /*]]>*/</script>\n"; // le tableau des smileys est present dans les metas $smileys = cs_lire_data_outil('smileys');; // valeurs par defaut $nb_col = 8; $titre = _T('couteau:smileys_dispos'); $head = ''; $liens = false; // traitement des arguments : [(#SMILEYS{arg1, arg2, ...})] $n=1; $arg = interprete_argument_balise($n++,$p); while ($arg){ // un nombre est le nombre de colonne if (preg_match(",'([0-9]+)',", $arg, $reg)) $nb_col = intval($reg[1]); // on veut un titre elseif ($arg=="'titre'") $head = "<thead><tr class=\"row_first\"><td colspan=\"$nb_col\">$titre</td></tr></thead>"; // on veut un lien d'insertion sur chaque smiley elseif ($arg=="'liens'") { $liens = true; include_spip('outils/smileys'); $smileys = smileys_uniques($smileys); } $arg = interprete_argument_balise($n++,$p); } $max = count($smileys[0]); if (!$nb_col) $nb_col = $max; $html = "<table summary=\"$titre\" class=\"spip cs_smileys smileys\">$head"; $l = 1; for ($i=0; $i<$max; $i++) { if ($i % $nb_col == 0) { $class = 'row_'.alterner($l++, 'even', 'odd'); $html .= "<tr class=\"$class\">"; } $html .= $liens ?"<td><a href=\"javascript:barre_inserer('{$smileys[0][$i]}',document.getElementById('".(defined('_SPIP19300')?'texte':'textarea_1')."'))\">{$smileys[1][$i]}</a></td>" :"<td>{$smileys[1][$i]}<br />{$smileys[0][$i]}</td>"; if ($i % $nb_col == $nb_col - 1) $html .= "</tr>\n"; } // on finit la ligne qd meme... if ($i = $max % $nb_col) $html .= str_repeat('<td> </td>', $nb_col - $i) . '</tr>'; // accessibilite : alt et title avec le smiley en texte $html = $js_compat . echappe_retour($html, 'SMILE'); $html = str_replace("'", "\'", $html); $p->code = "'$html\n</table>\n'"; $p->interdire_scripts = false; $p->type = 'html'; return $p; }
function extraire_multi($letexte, $lang=null, $echappe_span=false) { if (strpos($letexte, '<multi>') === false) return $letexte; // perf if (preg_match_all(_EXTRAIRE_MULTI, $letexte, $regs, PREG_SET_ORDER)) { if (!$lang) $lang = $GLOBALS['spip_lang']; foreach ($regs as $reg) { // chercher la version de la langue courante $trads = extraire_trads($reg[1]); if ($l = approcher_langue($trads, $lang)) { $trad = $trads[$l]; } else { include_spip('inc/texte'); // langue absente, prendre la premiere dispo // mais typographier le texte selon les regles de celle-ci // Attention aux blocs multi sur plusieurs lignes $l = key($trads); $trad = $trads[$l]; $typographie = charger_fonction(lang_typo($l), 'typographie'); $trad = traiter_retours_chariots($typographie($trad)); $trad = explode("\n", $trad); foreach($trad as $i => $ligne) { if (strlen($ligne)) { $ligne = code_echappement($ligne, 'multi'); $ligne = str_replace("'", '"', inserer_attribut($ligne, 'lang', $l)); if (lang_dir($l) !== lang_dir($lang)) $ligne = str_replace("'", '"', inserer_attribut($ligne, 'dir', lang_dir($l))); $trad[$i] = $ligne; } } $trad = join("\n", $trad); if (!$echappe_span) $trad = echappe_retour($trad, 'multi'); } $letexte = str_replace($reg[0], $trad, $letexte); } } return $letexte; }
function post_autobr($texte, $delim = "\n_ ") { $texte = str_replace("\r\n", "\r", $texte); $texte = str_replace("\r", "\n", $texte); list($texte, $les_echap) = echappe_html($texte, "POSTAUTOBR", true); $debut = ''; $suite = $texte; while ($t = strpos('-' . $suite, "\n", 1)) { $debut .= substr($suite, 0, $t - 1); $suite = substr($suite, $t); $car = substr($suite, 0, 1); if ($car != '-' and $car != '_' and $car != "\n" and $car != "|") { $debut .= $delim; } else { $debut .= "\n"; } if (preg_match("/^\n+/", $suite, $regs)) { $debut .= $regs[0]; $suite = substr($suite, strlen($regs[0])); } } $texte = $debut . $suite; $texte = echappe_retour($texte, $les_echap, "POSTAUTOBR"); return $texte; }
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; }
function extraire_multi($letexte, $lang = null, $options = array()) { if ($letexte and preg_match_all(_EXTRAIRE_MULTI, $letexte, $regs, PREG_SET_ORDER)) { if (!$lang) { $lang = $GLOBALS['spip_lang']; } // Compatibilité avec le prototype de fonction précédente qui utilisait un boolean if (is_bool($options)) { $options = array('echappe_span' => $options, 'lang_defaut' => _LANGUE_PAR_DEFAUT); } if (!isset($options['echappe_span'])) { $options = array_merge($options, array('echappe_span' => false)); } if (!isset($options['lang_defaut'])) { $options = array_merge($options, array('lang_defaut' => _LANGUE_PAR_DEFAUT)); } include_spip('inc/lang'); foreach ($regs as $reg) { // chercher la version de la langue courante $trads = extraire_trads($reg[1]); if ($l = approcher_langue($trads, $lang)) { $trad = $trads[$l]; } else { if ($options['lang_defaut'] == 'aucune') { $trad = ''; } else { // langue absente, prendre le fr ou une langue précisée (meme comportement que inc/traduire.php) // ou la premiere dispo // mais typographier le texte selon les regles de celle-ci // Attention aux blocs multi sur plusieurs lignes if (!($l = approcher_langue($trads, $options['lang_defaut']))) { $l = key($trads); } $trad = $trads[$l]; $typographie = charger_fonction(lang_typo($l), 'typographie'); $trad = $typographie($trad); // Tester si on echappe en span ou en div // il ne faut pas echapper en div si propre produit un seul paragraphe include_spip('inc/texte'); $trad_propre = preg_replace(",(^<p[^>]*>|</p>\$),Uims", "", propre($trad)); $mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $trad_propre) ? 'div' : 'span'; $trad = code_echappement($trad, 'multi', false, $mode); $trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l)); if (lang_dir($l) !== lang_dir($lang)) { $trad = str_replace("'", '"', inserer_attribut($trad, 'dir', lang_dir($l))); } if (!$options['echappe_span']) { $trad = echappe_retour($trad, 'multi'); } } } $letexte = str_replace($reg[0], $trad, $letexte); } } return $letexte; }