pull/53/head
Aleksander Machniak 12 years ago
parent 83370e5ff1
commit 0d214498d0

@ -169,7 +169,7 @@ class html
$attr = array('href' => $attr); $attr = array('href' => $attr);
} }
return self::tag('a', $attr, $cont, array_merge(self::$common_attrib, return self::tag('a', $attr, $cont, array_merge(self::$common_attrib,
array('href','target','name','rel','onclick','onmouseover','onmouseout','onmousedown','onmouseup'))); array('href','target','name','rel','onclick','onmouseover','onmouseout','onmousedown','onmouseup')));
} }
/** /**
@ -675,7 +675,7 @@ class html_table extends html
} }
$cell = new stdClass; $cell = new stdClass;
$cell->attrib = $attr; $cell->attrib = $attr;
$cell->content = $cont; $cell->content = $cont;
$this->rows[$this->rowindex]->cells[$this->colindex] = $cell; $this->rows[$this->rowindex]->cells[$this->colindex] = $cell;
@ -699,16 +699,16 @@ class html_table extends html
} }
$cell = new stdClass; $cell = new stdClass;
$cell->attrib = $attr; $cell->attrib = $attr;
$cell->content = $cont; $cell->content = $cont;
$this->header[] = $cell; $this->header[] = $cell;
} }
/** /**
* Remove a column from a table * Remove a column from a table
* Useful for plugins making alterations * Useful for plugins making alterations
* *
* @param string $class * @param string $class
*/ */
public function remove_column($class) public function remove_column($class)
{ {
@ -788,8 +788,9 @@ class html_table extends html
*/ */
public function show($attrib = null) public function show($attrib = null)
{ {
if (is_array($attrib)) if (is_array($attrib)) {
$this->attrib = array_merge($this->attrib, $attrib); $this->attrib = array_merge($this->attrib, $attrib);
}
$thead = $tbody = ""; $thead = $tbody = "";
@ -831,7 +832,7 @@ class html_table extends html
*/ */
public function size() public function size()
{ {
return count($this->rows); return count($this->rows);
} }
/** /**

@ -138,7 +138,7 @@ abstract class rcube_addressbook
*/ */
function get_error() function get_error()
{ {
return $this->error; return $this->error;
} }
/** /**
@ -149,7 +149,7 @@ abstract class rcube_addressbook
*/ */
protected function set_error($type, $message) protected function set_error($type, $message)
{ {
$this->error = array('type' => $type, 'message' => $message); $this->error = array('type' => $type, 'message' => $message);
} }
/** /**

File diff suppressed because it is too large Load Diff

@ -24,164 +24,164 @@
*/ */
class rcube_string_replacer class rcube_string_replacer
{ {
public static $pattern = '/##str_replacement\[([0-9]+)\]##/'; public static $pattern = '/##str_replacement\[([0-9]+)\]##/';
public $mailto_pattern; public $mailto_pattern;
public $link_pattern; public $link_pattern;
private $values = array(); private $values = array();
function __construct() function __construct()
{ {
// Simplified domain expression for UTF8 characters handling // Simplified domain expression for UTF8 characters handling
// Support unicode/punycode in top-level domain part // 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 = '.:;,'; $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->link_pattern = "/([\w]+:\/\/|\W[Ww][Ww][Ww]\.|^[Ww][Ww][Ww]\.)($utf_domain([$url1]?[$url2]+)*)/";
$this->mailto_pattern = "/(" $this->mailto_pattern = "/("
."[-\w!\#\$%&\'*+~\/^`|{}=]+(?:\.[-\w!\#\$%&\'*+~\/^`|{}=]+)*" // local-part ."[-\w!\#\$%&\'*+~\/^`|{}=]+(?:\.[-\w!\#\$%&\'*+~\/^`|{}=]+)*" // local-part
."@$utf_domain" // domain-part ."@$utf_domain" // domain-part
."(\?[$url1$url2]+)?" // e.g. ?subject=test... ."(\?[$url1$url2]+)?" // e.g. ?subject=test...
.")/"; .")/";
}
/**
* Add a string to the internal list
*
* @param string String value
* @return int Index of value for retrieval
*/
public function add($str)
{
$i = count($this->values);
$this->values[$i] = $str;
return $i;
}
/**
* Build replacement string
*/
public function get_replacement($i)
{
return '##str_replacement['.$i.']##';
}
/**
* Callback function used to build HTML links around URL strings
*
* @param array Matches result from preg_replace_callback
* @return int Index of saved string value
*/
public function link_callback($matches)
{
$i = -1;
$scheme = strtolower($matches[1]);
if (preg_match('!^(http|ftp|file)s?://!i', $scheme)) {
$url = $matches[1] . $matches[2];
} }
else if (preg_match('/^(\W*)(www\.)$/i', $matches[1], $m)) {
$url = $m[2] . $matches[2]; /**
$url_prefix = 'http://'; * Add a string to the internal list
$prefix = $m[1]; *
* @param string String value
* @return int Index of value for retrieval
*/
public function add($str)
{
$i = count($this->values);
$this->values[$i] = $str;
return $i;
} }
if ($url) { /**
$suffix = $this->parse_url_brackets($url); * Build replacement string
$i = $this->add($prefix . html::a(array( */
'href' => $url_prefix . $url, public function get_replacement($i)
'target' => '_blank' {
), rcube::Q($url)) . $suffix); return '##str_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]; * Callback function used to build HTML links around URL strings
} *
* @param array Matches result from preg_replace_callback
/** * @return int Index of saved string value
* Callback function used to build mailto: links around e-mail strings */
* public function link_callback($matches)
* @param array Matches result from preg_replace_callback {
* @return int Index of saved string value $i = -1;
*/ $scheme = strtolower($matches[1]);
public function mailto_callback($matches)
{ if (preg_match('!^(http|ftp|file)s?://!i', $scheme)) {
$href = $matches[1]; $url = $matches[1] . $matches[2];
$suffix = $this->parse_url_brackets($href); }
$i = $this->add(html::a('mailto:' . $href, rcube::Q($href)) . $suffix); else if (preg_match('/^(\W*)(www\.)$/i', $matches[1], $m)) {
$url = $m[2] . $matches[2];
return $i >= 0 ? $this->get_replacement($i) : ''; $url_prefix = 'http://';
} $prefix = $m[1];
/**
* Look up the index from the preg_replace matches array
* and return the substitution value.
*
* @param array Matches result from preg_replace_callback
* @return string Value at index $matches[1]
*/
public function replace_callback($matches)
{
return $this->values[$matches[1]];
}
/**
* Replace all defined (link|mailto) patterns with replacement string
*
* @param string $str Text
*
* @return string Text
*/
public function replace($str)
{
// search for patterns like links and e-mail addresses
$str = preg_replace_callback($this->link_pattern, array($this, 'link_callback'), $str);
$str = preg_replace_callback($this->mailto_pattern, array($this, 'mailto_callback'), $str);
return $str;
}
/**
* Replace substituted strings with original values
*/
public function resolve($str)
{
return preg_replace_callback(self::$pattern, array($this, 'replace_callback'), $str);
}
/**
* Fixes bracket characters in URL handling
*/
public static function parse_url_brackets(&$url)
{
// #1487672: special handling of square brackets,
// URL regexp allows [] characters in URL, for example:
// "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]"
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) if ($url) {
break; $suffix = $this->parse_url_brackets($url);
$in = false; $i = $this->add($prefix . html::a(array(
'href' => $url_prefix . $url,
'target' => '_blank'
), rcube::Q($url)) . $suffix);
} }
}
if ($i<$len) { // Return valid link for recognized schemes, otherwise
$suffix = substr($url, $i); // return the unmodified string for unrecognized schemes.
$url = substr($url, 0, $i); return $i >= 0 ? $this->get_replacement($i) : $matches[0];
}
} }
return $suffix; /**
} * Callback function used to build mailto: links around e-mail strings
*
* @param array Matches result from preg_replace_callback
* @return int Index of saved string value
*/
public function mailto_callback($matches)
{
$href = $matches[1];
$suffix = $this->parse_url_brackets($href);
$i = $this->add(html::a('mailto:' . $href, rcube::Q($href)) . $suffix);
return $i >= 0 ? $this->get_replacement($i) : '';
}
/**
* Look up the index from the preg_replace matches array
* and return the substitution value.
*
* @param array Matches result from preg_replace_callback
* @return string Value at index $matches[1]
*/
public function replace_callback($matches)
{
return $this->values[$matches[1]];
}
/**
* Replace all defined (link|mailto) patterns with replacement string
*
* @param string $str Text
*
* @return string Text
*/
public function replace($str)
{
// search for patterns like links and e-mail addresses
$str = preg_replace_callback($this->link_pattern, array($this, 'link_callback'), $str);
$str = preg_replace_callback($this->mailto_pattern, array($this, 'mailto_callback'), $str);
return $str;
}
/**
* Replace substituted strings with original values
*/
public function resolve($str)
{
return preg_replace_callback(self::$pattern, array($this, 'replace_callback'), $str);
}
/**
* Fixes bracket characters in URL handling
*/
public static function parse_url_brackets(&$url)
{
// #1487672: special handling of square brackets,
// URL regexp allows [] characters in URL, for example:
// "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]"
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;
}
} }

Loading…
Cancel
Save