Andy Wermke
2013-04-04 92cd7f34b07e86062f2c024039e3309768b48ce6
program/lib/Roundcube/rcube_string_replacer.php
@@ -2,8 +2,6 @@
/*
 +-----------------------------------------------------------------------+
 | program/include/rcube_string_replacer.php                             |
 |                                                                       |
 | This file is part of the Roundcube Webmail client                     |
 | Copyright (C) 2009-2012, The Roundcube Dev Team                       |
 |                                                                       |
@@ -13,12 +11,10 @@
 |                                                                       |
 | PURPOSE:                                                              |
 |   Handle string replacements based on preg_replace_callback           |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Thomas Bruederli <roundcube@gmail.com>                        |
 +-----------------------------------------------------------------------+
*/
/**
 * Helper class for string replacements based on preg_replace_callback
@@ -32,15 +28,16 @@
  public $mailto_pattern;
  public $link_pattern;
  private $values = array();
    private $options = array();
  function __construct()
    function __construct($options = array())
  {
    // Simplified domain expression for UTF8 characters handling
    // Support unicode/punycode in top-level domain part
    $utf_domain = '[^?&@"\'\\/()\s\r\t\n]+\\.?([^\\x00-\\x2f\\x3b-\\x40\\x5b-\\x60\\x7b-\\x7f]{2,}|xn--[a-zA-Z0-9]{2,})';
        $utf_domain = '[^?&@"\'\\/()<>\s\r\t\n]+\\.?([^\\x00-\\x2f\\x3b-\\x40\\x5b-\\x60\\x7b-\\x7f]{2,}|xn--[a-zA-Z0-9]{2,})';
    $url1 = '.:;,';
    $url2 = 'a-zA-Z0-9%=#$@+?!&\\/_~\\[\\]{}\*-';
        $url2       = 'a-zA-Z0-9%=#$@+?!&\\/_~\\[\\]\\(\\){}\*-';
    $this->link_pattern = "/([\w]+:\/\/|\W[Ww][Ww][Ww]\.|^[Ww][Ww][Ww]\.)($utf_domain([$url1]?[$url2]+)*)/";
    $this->mailto_pattern = "/("
@@ -48,6 +45,8 @@
        ."@$utf_domain"                                                 // domain-part
        ."(\?[$url1$url2]+)?"                                           // e.g. ?subject=test...
        .")/";
        $this->options = $options;
  }
  /**
@@ -93,13 +92,14 @@
    if ($url) {
      $suffix = $this->parse_url_brackets($url);
      $i = $this->add($prefix . html::a(array(
          'href' => $url_prefix . $url,
          'target' => '_blank'
        ), rcube::Q($url)) . $suffix);
            $attrib = (array)$this->options['link_attribs'];
            $attrib['href'] = $url_prefix . $url;
            $i = $this->add($prefix . html::a($attrib, rcube::Q($url)) . $suffix);
    }
    // Return valid link for recognized schemes, otherwise, return the unmodified string for unrecognized schemes.
        // Return valid link for recognized schemes, otherwise
        // return the unmodified string for unrecognized schemes.
    return $i >= 0 ? $this->get_replacement($i) : $matches[0];
  }
@@ -164,6 +164,9 @@
    // "http://example.com/?a[b]=c". However we need to handle
    // properly situation when a bracket is placed at the end
    // of the link e.g. "[http://example.com]"
        // Yes, this is not perfect handles correctly only paired characters
        // but it should work for common cases
    if (preg_match('/(\\[|\\])/', $url)) {
      $in = false;
      for ($i=0, $len=strlen($url); $i<$len; $i++) {
@@ -185,7 +188,28 @@
      }
    }
    return $suffix;
        // Do the same for parentheses
        if (preg_match('/(\\(|\\))/', $url)) {
            $in = false;
            for ($i=0, $len=strlen($url); $i<$len; $i++) {
                if ($url[$i] == '(') {
                    if ($in)
                        break;
                    $in = true;
                }
                else if ($url[$i] == ')') {
                    if (!$in)
                        break;
                    $in = false;
                }
  }
            if ($i < $len) {
                $suffix = substr($url, $i);
                $url    = substr($url, 0, $i);
            }
        }
        return $suffix;
    }
}