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; }
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; }
/** * 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 changer_typo($lang = '', $source = '') { global $lang_typo, $lang_dir, $dir_lang; if (preg_match("/^(article|rubrique|breve|auteur)([0-9]+)/", $source, $regs)) { $r = lcm_fetch_array(lcm_query("SELECT lang FROM spip_" . $regs[1] . "s WHERE id_" . $regs[1] . "=" . $regs[2])); $lang = $r['lang']; } if (!$lang) { $lang = read_meta('default_language'); } $lang_typo = lang_typo($lang); $lang_dir = lang_dir($lang); $dir_lang = " dir='{$lang_dir}'"; }
/** * Retourne le contenu d'une puce avec changement de statut possible * si on en a l'autorisation, sinon simplement l'image de la puce * * @param int $id * Identifiant de l'objet * @param string $statut * Statut actuel de l'objet * @param int $id_rubrique * Identifiant du parent, une rubrique * @param string $type * Type d'objet * @param bool $ajax * Indique s'il ne faut renvoyer que le coeur du menu car on est * dans une requete ajax suite à un post de changement rapide * @param bool $menu_rapide * Indique si l'on peut changer le statut, ou si on l'affiche simplement * @return string * Code HTML de l'image de puce de statut à insérer (et du menu de changement si présent) **/ function puce_statut_changement_rapide($id, $statut, $id_rubrique, $type = 'article', $ajax = false, $menu_rapide = _ACTIVER_PUCE_RAPIDE) { $src = statut_image($type, $statut); if (!$src) { return $src; } if (!$id or !_SPIP_AJAX or !$menu_rapide) { $ajax_node = ''; } else { $ajax_node = " class='imgstatut{$type}{$id}'"; } $t = statut_titre($type, $statut); $inser_puce = http_img_pack($src, $t, $ajax_node, $t); if (!$ajax_node) { return $inser_puce; } $table = table_objet_sql($type); $desc = lister_tables_objets_sql($table); if (!isset($desc['statut_textes_instituer'])) { return $inser_puce; } if (!function_exists('autoriser')) { include_spip('inc/autoriser'); } // cas ou l'on a un parent connu (devrait disparaitre au profit du second cas plus generique) if ($id_rubrique) { if (!autoriser('publierdans', 'rubrique', $id_rubrique)) { return $inser_puce; } } else { if (!autoriser('instituer', $type, $id, null, array('statut' => 'publie'))) { return $inser_puce; } } $coord = array_flip(array_keys($desc['statut_textes_instituer'])); if (!isset($coord[$statut])) { return $inser_puce; } $unit = 8 + 4; $margin = 4; /* marge a gauche + droite */ $zero = 1 + $margin / 2 + 2; $clip = $zero + $unit * $coord[$statut]; if ($ajax) { $width = $unit * count($desc['statut_textes_instituer']) + $margin; $out = "<span class='puce_objet_fixe {$type}'>" . $inser_puce . "</span>" . "<span class='puce_objet_popup {$type} statutdecal{$type}{$id}' style='width:{$width}px;margin-left:-{$clip}px;'>"; $i = 0; foreach ($desc['statut_textes_instituer'] as $s => $t) { $out .= afficher_script_statut($id, $type, -$zero - $i++ * $unit, statut_image($type, $s), $s, _T($t)); } $out .= "</span>"; return $out; } else { $nom = "puce_statut_"; $action = generer_url_ecrire('puce_statut', "", true); $action = "if (!this.puce_loaded) { this.puce_loaded = true; prepare_selec_statut(this, '{$nom}', '{$type}', '{$id}', '{$action}'); }"; $over = " onmouseover=\"{$action}\""; $lang_dir = lang_dir(lang_typo()); return "<span class='puce_objet {$type}' id='{$nom}{$type}{$id}' dir='{$lang_dir}'{$over}>" . $inser_puce . '</span>'; } }
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 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; }
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'); }