From 937e26a541e3144f6df812d7e8eb6de3d35f596d Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Tue, 12 Oct 2010 04:44:25 -0400
Subject: [PATCH] - Fix links handling

---
 program/include/rcube_string_replacer.php |   24 +++++++++++++++---------
 1 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/program/include/rcube_string_replacer.php b/program/include/rcube_string_replacer.php
index 064a723..326bb7f 100644
--- a/program/include/rcube_string_replacer.php
+++ b/program/include/rcube_string_replacer.php
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/rcube_string_replacer.php                             |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2009, RoundCube Dev. - Switzerland                      |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2009, Roundcube Dev. - Switzerland                      |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id:  $
+ $Id$
 
 */
 
@@ -35,11 +35,16 @@
 
   function __construct()
   {
-    $url_chars = 'a-z0-9_\-\+\*\$\/&%=@#:;';
-    $url_chars_within = '\?\.~,!';
+    // Simplified domain expression for UTF8 characters handling
+    $utf_domain = '[^?&@"\'\\/()\s\r\t\n]+\\.[a-z]{2,5}';
+    $url = '[a-z0-9%=#+?.:&\\/_-]+';
 
-    $this->link_pattern = "/([\w]+:\/\/|\Wwww\.)([a-z0-9\-\.]+[a-z]{2,4}([$url_chars$url_chars_within]*[$url_chars])?)/i";
-    $this->mailto_pattern = "/([a-z0-9][a-z0-9\-\.\+\_]*@[a-z0-9]([a-z0-9\-][.]?)*[a-z0-9]\\.[a-z]{2,5})/i";
+    $this->link_pattern = "/([\w]+:\/\/|\Wwww\.)($utf_domain($url)?)/i";
+    $this->mailto_pattern = "/("
+        ."[-\w!\#\$%&\'*+~\/^`|{}=]+(?:\.[-\w!\#\$%&\'*+~\/^`|{}=]+)*"  // local-part
+        ."@$utf_domain"                                                 // domain-part
+        ."(\?$url)?"                                                     // e.g. ?subject=test...
+        .")/i";
   }
 
   /**
@@ -74,7 +79,7 @@
     $i = -1;
     $scheme = strtolower($matches[1]);
 
-    if ($scheme == 'http://' || $scheme == 'https://' || $scheme == 'ftp://') {
+    if (preg_match('!^(http|ftp|file)s?://!', $scheme)) {
       $url = $matches[1] . $matches[2];
       $i = $this->add(html::a(array('href' => $url, 'target' => '_blank'), Q($url)));
     }
@@ -83,7 +88,8 @@
       $i = $this->add($m[1] . html::a(array('href' => 'http://' . $url, 'target' => '_blank'), Q($url)));
     }
 
-    return $i >= 0 ? $this->get_replacement($i) : '';
+    // Return valid link for recognized schemes, otherwise, return the unmodified string for unrecognized schemes.
+    return $i >= 0 ? $this->get_replacement($i) : $matches[0];
   }
 
   /**

--
Gitblit v1.9.1