[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / ecrire / inc / filtres_mini.php
index c65a2da..c935e56 100644 (file)
@@ -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 <a href>
-//
-// 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);
 }
-?>