autoliens.php 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. <?php
  2. // Les URLs brutes sont converties en <a href='url'>url</a>
  3. // http://code.spip.net/@traiter_raccourci_liens
  4. function tw_autoliens($t) {
  5. defined('_EXTRAIRE_LIENS') || define('_EXTRAIRE_LIENS', ',' . '\[[^\[\]]*(?:<-|->).*?\]' . '|<a\b.*?</a\b' . '|<\w.*?>' . '|((?:https?:/|www\.)[^"\'\s\[\]\}\)<>]*)' .',imsS');
  6. $t = preg_replace_callback(_EXTRAIRE_LIENS, 'tw_traiter_autoliens', $t);
  7. include_spip('inc/ressource');
  8. if (defined('_EXTRAIRE_RESSOURCES'))
  9. $t = preg_replace_callback(_EXTRAIRE_RESSOURCES, 'traiter_ressources', $t);
  10. // echapper les autoliens eventuellement inseres (en une seule fois)
  11. if (strpos($t,"<html>")!==false)
  12. $t = echappe_html($t);
  13. return $t;
  14. }
  15. // callback pour la fonction autoliens()
  16. // http://code.spip.net/@autoliens_callback
  17. function tw_traiter_autoliens($r) {
  18. if (count($r)<2) return reset($r);
  19. list($tout, $l) = $r;
  20. if (!$l) return $tout;
  21. // reperer le protocole
  22. if (preg_match(',^(https?):/*,S', $l, $m)) {
  23. $l = substr($l, strlen($m[0]));
  24. $protocol = $m[1];
  25. } else $protocol = 'http';
  26. // valider le nom de domaine
  27. if (!preg_match(_EXTRAIRE_DOMAINE, $l)) return $tout;
  28. // les ponctuations a la fin d'une URL n'en font certainement pas partie
  29. // en particulier le "|" quand elles sont dans un tableau a la SPIP
  30. preg_match('/^(.*?)([,.;?|]?)$/', $l, $k);
  31. $url = $protocol.'://'.$k[1];
  32. $lien = charger_fonction('lien', 'inc');
  33. // deux fois <html> car inc_lien echappe un coup et restaure ensuite
  34. // => un perd 1 <html>
  35. $r = $lien($url,"<html><html>$url</html></html>",'','','','nofollow') . $k[2];
  36. // ajouter la class auto
  37. $r = inserer_attribut($r, 'class', trim(extraire_attribut($r,'class').' auto'));
  38. // si l'original ne contenait pas le 'http:' on le supprime du clic
  39. return ($m ? $r : str_replace('>http://', '>', $r));
  40. }
  41. ?>