X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=www%2Fecrire%2Finc%2Ffiltres_mini.php;h=c935e564836345505d21154d4957b8d4d44b262d;hb=4f443dce95ff6f8221c189880a70c74ce1c1f238;hp=c65a2da7ffd0c04b810c03ef33f5fa40f876a2ae;hpb=4a628e9b277d3617535f99d663ca79fa2e891177;p=lhc%2Fweb%2Fwww.git diff --git a/www/ecrire/inc/filtres_mini.php b/www/ecrire/inc/filtres_mini.php index c65a2da7..c935e564 100644 --- a/www/ecrire/inc/filtres_mini.php +++ b/www/ecrire/inc/filtres_mini.php @@ -3,54 +3,82 @@ /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * - * Copyright (c) 2001-2016 * + * Copyright (c) 2001-2017 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ +/** + * Filtres d'URL et de liens + * + * @package SPIP\Core\Filtres\Liens + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} -// -// Filtres d'URLs -// -// Nettoyer une URL contenant des ../ -// -// resolve_url('/.././/truc/chose/machin/./.././.././hopla/..'); -// inspire (de loin) par PEAR:NetURL:resolvePath -// -// http://doc.spip.org/@resolve_path +/** + * Nettoyer une URL contenant des `../` + * + * Inspiré (de loin) par PEAR:NetURL:resolvePath + * + * @example + * ``` + * resolve_path('/.././/truc/chose/machin/./.././.././hopla/..'); + * ``` + * + * @param string $url URL + * @return string URL nettoyée + **/ function resolve_path($url) { list($url, $query) = array_pad(explode('?', $url, 2), 2, null); - while (preg_match(',/\.?/,', $url, $regs) # supprime // et /./ - OR preg_match(',/[^/]*/\.\./,S', $url, $regs) # supprime /toto/../ - OR preg_match(',^/\.\./,S', $url, $regs)) # supprime les /../ du haut + while (preg_match(',/\.?/,', $url, $regs) # supprime // et /./ + or preg_match(',/[^/]*/\.\./,S', $url, $regs) # supprime /toto/../ + or preg_match(',^/\.\./,S', $url, $regs) # supprime les /../ du haut + ) { $url = str_replace($regs[0], '/', $url); + } - if ($query) - $url .= '?'.$query; + if ($query) { + $url .= '?' . $query; + } - return '/'.preg_replace(',^/,S', '', $url); + return '/' . preg_replace(',^/,S', '', $url); } -// -// Suivre un lien depuis une adresse donnee -> nouvelle adresse -// -// suivre_lien('http://rezo.net/sous/dir/../ect/ory/fi.html..s#toto', -// 'a/../../titi.coco.html/tata#titi'); -// http://doc.spip.org/@suivre_lien + +/** + * Suivre un lien depuis une URL donnée vers une nouvelle URL + * + * @uses resolve_path() + * @example + * ``` + * suivre_lien( + * 'http://rezo.net/sous/dir/../ect/ory/fi.html..s#toto', + * 'a/../../titi.coco.html/tata#titi'); + * ``` + * + * @param string $url URL de base + * @param string $lien Lien ajouté à l'URL + * @return string URL complète. + **/ function suivre_lien($url, $lien) { - if (preg_match(',^(mailto|javascript|data):,iS', $lien)) + if (preg_match(',^(mailto|javascript|data|tel|callto|file|ftp):,iS', $lien)) { return $lien; - if (preg_match(';^((?:[a-z]{3,7}:)?//.*?)(/.*)?$;iS', $lien, $r)) - return $r[1].resolve_path($r[2]); + } + if (preg_match(';^((?:[a-z]{3,7}:)?//.*?)(/.*)?$;iS', $lien, $r)) { + $r = array_pad($r, 3, null); + + return $r[1] . resolve_path($r[2]); + } # L'url site spip est un lien absolu aussi - if ($lien == $GLOBALS['meta']['adresse_site']){ + if (isset($GLOBALS['meta']['adresse_site']) and $lien == $GLOBALS['meta']['adresse_site']) { return $lien; } @@ -60,59 +88,90 @@ function suivre_lien($url, $lien) { $debut = $regs[1]; $dir = !strlen($regs[2]) ? '/' : $regs[2]; $mot = $regs[3]; - $get = isset($regs[4])?$regs[4]:""; - $hash = isset($regs[5])?$regs[5]:""; + $get = isset($regs[4]) ? $regs[4] : ''; + $hash = isset($regs[5]) ? $regs[5] : ''; } - switch (substr($lien,0,1)) { + switch (substr($lien, 0, 1)) { case '/': return $debut . resolve_path($lien); case '#': - return $debut . resolve_path($dir.$mot.$get.$lien); + return $debut . resolve_path($dir . $mot . $get . $lien); case '': - return $debut . resolve_path($dir.$mot.$get.$hash); + return $debut . resolve_path($dir . $mot . $get . $hash); default: - return $debut . resolve_path($dir.$lien); + return $debut . resolve_path($dir . $lien); } } -// un filtre pour transformer les URLs relatives en URLs absolues ; -// ne s'applique qu'aux #URL_XXXX -// http://doc.spip.org/@url_absolue -function url_absolue($url, $base='') { - if (strlen($url = trim($url)) == 0) + +/** + * Transforme une URL relative en URL absolue + * + * S'applique sur une balise SPIP d'URL. + * + * @filtre + * @link http://www.spip.net/4127 + * @uses suivre_lien() + * @example + * ``` + * [(#URL_ARTICLE|url_absolue)] + * [(#CHEMIN{css/theme.css}|url_absolue)] + * ``` + * + * @param string $url URL + * @param string $base URL de base de destination (par défaut ce sera l'URL de notre site) + * @return string Texte ou URL (en absolus) + **/ +function url_absolue($url, $base = '') { + if (strlen($url = trim($url)) == 0) { return ''; - if (!$base) + } + if (!$base) { $base = url_de_base() . (_DIR_RACINE ? _DIR_RESTREINT_ABS : ''); + } + return suivre_lien($base, $url); } /** * Supprimer le protocole d'une url absolue * pour le rendre implicite (URL commencant par "//") + * * @param string $url_absolue * @return string */ -function protocole_implicite($url_absolue){ - return preg_replace(";^[a-z]{3,7}://;i","//",$url_absolue); +function protocole_implicite($url_absolue) { + return preg_replace(';^[a-z]{3,7}://;i', '//', $url_absolue); } -// un filtre pour transformer les URLs relatives en URLs absolues ; -// ne s'applique qu'aux textes contenant des liens -// http://doc.spip.org/@liens_absolus -function liens_absolus($texte, $base='') { - if (preg_match_all(',(<(a|link|image|img|script)\s[^<>]*(href|src)=[^<>]*>),imsS', - $texte, $liens, PREG_SET_ORDER)) { +/** + * Transforme les URLs relatives en URLs absolues + * + * Ne s'applique qu'aux textes contenant des liens + * + * @filtre + * @uses url_absolue() + * @link http://www.spip.net/4126 + * + * @param string $texte Texte + * @param string $base URL de base de destination (par défaut ce sera l'URL de notre site) + * @return string Texte avec des URLs absolues + **/ +function liens_absolus($texte, $base = '') { + if (preg_match_all(',(<(a|link|image|img|script)\s[^<>]*(href|src)=[^<>]*>),imsS', $texte, $liens, PREG_SET_ORDER)) { if (!function_exists('extraire_attribut')) { include_spip('inc/filtres'); } foreach ($liens as $lien) { - foreach(array('href', 'src') as $attr) { + foreach (array('href', 'src') as $attr) { $href = extraire_attribut($lien[0], $attr); - if (strlen($href)>0) { - $abs = url_absolue($href, $base); - if ($href != $abs and !preg_match('/^#/',$href)) { - $texte_lien = inserer_attribut($lien[0], $attr, $abs); - $texte = str_replace($lien[0],$texte_lien,$texte); + if (strlen($href) > 0) { + if (!preg_match(';^((?:[a-z]{3,7}:)?//);iS', $href)) { + $abs = url_absolue($href, $base); + if (rtrim($href, '/') !== rtrim($abs, '/') and !preg_match('/^#/', $href)) { + $texte_lien = inserer_attribut($lien[0], $attr, $abs); + $texte = str_replace($lien[0], $texte_lien, $texte); + } } } } @@ -122,60 +181,62 @@ function liens_absolus($texte, $base='') { return $texte; } -// -// Ce filtre public va traiter les URL ou les -// -// http://doc.spip.org/@abs_url -function abs_url($texte, $base='') { - if ($GLOBALS['mode_abs_url'] == 'url') + +/** + * Transforme une URL ou des liens en URL ou liens absolus + * + * @filtre + * @link http://www.spip.net/4128 + * @global mode_abs_url Pour connaître le mode (url ou texte) + * + * @param string $texte Texte ou URL + * @param string $base URL de base de destination (par défaut ce sera l'URL de notre site) + * @return string Texte ou URL (en absolus) + **/ +function abs_url($texte, $base = '') { + if ($GLOBALS['mode_abs_url'] == 'url') { return url_absolue($texte, $base); - else + } else { return liens_absolus($texte, $base); + } } /** -* htmlspecialchars wrapper (PHP >= 5.4 compat issue) -* -* @param string $string -* @param int $flags -* @param string $encoding -* @param bool $double_encode -* @return string -*/ -function spip_htmlspecialchars($string, $flags=null, $encoding='ISO-8859-1', $double_encode = true){ + * htmlspecialchars wrapper (PHP >= 5.4 compat issue) + * + * @param string $string + * @param int $flags + * @param string $encoding + * @param bool $double_encode + * @return string + */ +function spip_htmlspecialchars($string, $flags = null, $encoding = 'ISO-8859-1', $double_encode = true) { if (is_null($flags)) { - if (!defined('PHP_VERSION_ID') OR PHP_VERSION_ID < 50400) - $flags = ENT_COMPAT; - else - $flags = ENT_COMPAT|ENT_HTML401; + $flags = ENT_COMPAT; + if (defined('ENT_HTML401')) { + $flags |= ENT_HTML401; + } } - if (!defined('PHP_VERSION_ID') OR PHP_VERSION_ID < 50203) - return htmlspecialchars($string,$flags,$encoding); - else - return htmlspecialchars($string,$flags,$encoding,$double_encode); + return htmlspecialchars($string, $flags, $encoding, $double_encode); } /** -* htmlentities wrapper (PHP >= 5.4 compat issue) -* -* @param string $string -* @param int $flags -* @param string $encoding -* @param bool $double_encode -* @return string -*/ -function spip_htmlentities($string,$flags=null,$encoding = 'ISO-8859-1',$double_encode = true){ + * htmlentities wrapper (PHP >= 5.4 compat issue) + * + * @param string $string + * @param int $flags + * @param string $encoding + * @param bool $double_encode + * @return string + */ +function spip_htmlentities($string, $flags = null, $encoding = 'ISO-8859-1', $double_encode = true) { if (is_null($flags)) { - if (!defined('PHP_VERSION_ID') OR PHP_VERSION_ID < 50400) - $flags = ENT_COMPAT; - else - $flags = ENT_COMPAT|ENT_HTML401; + $flags = ENT_COMPAT; + if (defined('ENT_HTML401')) { + $flags |= ENT_HTML401; + } } - if (!defined('PHP_VERSION_ID') OR PHP_VERSION_ID < 50203) - return htmlentities($string,$flags,$encoding); - else - return htmlentities($string,$flags,$encoding,$double_encode); + return htmlentities($string, $flags, $encoding, $double_encode); } -?>