HEAD
tags
$body = addBreaks($body);
// create hyperlinks for http:// addresses
// there's a testcase for this in /build/testcases/urllinking.txt
$replace_from = array(
'/([^:\/\/\w]|^)((https:\/\/)([\w\.-]+)([\/\w+\.~%&?@=_:;#,-]+))/i',
'/([^:\/\/\w]|^)((http:\/\/|www\.)([\w\.-]+)([\/\w+\.~%&?@=_:;#,-]+))/i',
'/([^:\/\/\w]|^)((ftp:\/\/|ftp\.)([\w\.-]+)([\/\w+\.~%&?@=_:;#,-]+))/i',
'/([^:\/\/\w]|^)(mailto:(([a-zA-Z\@\%\.\-\+_])+))/i'
);
return preg_replace_callback($replace_from, array(__CLASS__, 'prepareBody_cb'), $body);
}
/**
* Comment::createLinkCode()
* Creates a link code for unlinked URLs with different protocols
*
* @static
* @param string $pre Prefix of comment
* @param string $url URL
* @param string $protocol http, mailto and so on
* @return string string including anchor element and child text
*/
static private function createLinkCode($pre, $url, $protocol = 'http')
{
$post = '';
// it's possible that $url ends contains entities we don't want,
// since htmlspecialchars is applied _before_ URL linking
// move the part of URL, starting from the disallowed entity to the 'post' link part
$aBadEntities = array('"', '>', '<');
foreach ( $aBadEntities as $entity )
{
$pos = i18n::strpos($url, $entity);
if ( $pos )
{
$post = i18n::substr($url, $pos) . $post;
$url = i18n::substr($url, 0, $pos);
}
}
// remove entities at end (&&&&)
if ( preg_match('/(&\w+;)+$/i', $url, $matches) )
{
$post = $matches[0] . $post; // found entities (1 or more)
$url = i18n::substr($url, 0, i18n::strlen($url) - i18n::strlen($post) );
}
// move ending comma from url to 'post' part
if ( i18n::substr($url, i18n::strlen($url) - 1) == ',' )
{
$url = i18n::substr($url, 0, i18n::strlen($url) - 1);
$post = ',' . $post;
}
if ( !preg_match('#^' . $protocol . '://#', $url) )
{
$linkedUrl = $protocol . ( ($protocol == 'mailto') ? ':' : '://') . $url;
}
else
{
$linkedUrl = $url;
}
if ( $protocol != 'mailto' )
{
$displayedUrl = $linkedUrl;
}
else
{
$displayedUrl = $url;
}
return $pre . '' . Entity::hsc(Entity::shorten($displayedUrl,30,'...')) . '' . $post;
}
/**
* Comment::prepareBody_cb()
* This method is a callback for creating link codes
*
* @param array $match elements for achor
* @return string including anchor element and child text
*
*/
static public function prepareBody_cb($match)
{
if ( !preg_match('/^[a-z]+/i', $match[2], $protocol) )
{
return $match[0];
}
switch( strtolower($protocol[0]) )
{
case 'https':
return self::createLinkCode($match[1], $match[2], 'https');
break;
case 'ftp':
return self::createLinkCode($match[1], $match[2], 'ftp');
break;
case 'mailto':
return self::createLinkCode($match[1], $match[3], 'mailto');
break;
default:
return self::createLinkCode($match[1], $match[2], 'http');
break;
}
return;
}
}
=======
tags
$body = addBreaks($body);
// create hyperlinks for http:// addresses
// there's a testcase for this in /build/testcases/urllinking.txt
$replace_from = array(
'/([^:\/\/\w]|^)((https:\/\/)([\w\.-]+)([\/\w+\.~%&?@=_:;#,-]+))/i',
'/([^:\/\/\w]|^)((http:\/\/|www\.)([\w\.-]+)([\/\w+\.~%&?@=_:;#,-]+))/i',
'/([^:\/\/\w]|^)((ftp:\/\/|ftp\.)([\w\.-]+)([\/\w+\.~%&?@=_:;#,-]+))/i',
'/([^:\/\/\w]|^)(mailto:(([a-zA-Z\@\%\.\-\+_])+))/i'
);
return preg_replace_callback($replace_from, array(__CLASS__, 'prepareBody_cb'), $body);
}
/**
* Comment::createLinkCode()
* Creates a link code for unlinked URLs with different protocols
*
* @static
* @param string $pre Prefix of comment
* @param string $url URL
* @param string $protocol http, mailto and so on
* @return string string including anchor element and child text
*/
static private function createLinkCode($pre, $url, $protocol = 'http')
{
$post = '';
// it's possible that $url ends contains entities we don't want,
// since htmlspecialchars is applied _before_ URL linking
// move the part of URL, starting from the disallowed entity to the 'post' link part
$aBadEntities = array('"', '>', '<');
foreach ( $aBadEntities as $entity )
{
$pos = i18n::strpos($url, $entity);
if ( $pos )
{
$post = i18n::substr($url, $pos) . $post;
$url = i18n::substr($url, 0, $pos);
}
}
// remove entities at end (&&&&)
if ( preg_match('/(&\w+;)+$/i', $url, $matches) )
{
$post = $matches[0] . $post; // found entities (1 or more)
$url = i18n::substr($url, 0, i18n::strlen($url) - i18n::strlen($post) );
}
// move ending comma from url to 'post' part
if ( i18n::substr($url, i18n::strlen($url) - 1) == ',' )
{
$url = i18n::substr($url, 0, i18n::strlen($url) - 1);
$post = ',' . $post;
}
if ( !preg_match('#^' . $protocol . '://#', $url) )
{
$linkedUrl = $protocol . ( ($protocol == 'mailto') ? ':' : '://') . $url;
}
else
{
$linkedUrl = $url;
}
if ( $protocol != 'mailto' )
{
$displayedUrl = $linkedUrl;
}
else
{
$displayedUrl = $url;
}
return $pre . '' . Entity::hsc(Entity::shorten($displayedUrl,30,'...')) . '' . $post;
}
/**
* Comment::prepareBody_cb()
* This method is a callback for creating link codes
*
* @param array $match elements for achor
* @return string including anchor element and child text
*
*/
static public function prepareBody_cb($match)
{
if ( !preg_match('/^[a-z]+/i', $match[2], $protocol) )
{
return $match[0];
}
switch( strtolower($protocol[0]) )
{
case 'https':
return self::createLinkCode($match[1], $match[2], 'https');
break;
case 'ftp':
return self::createLinkCode($match[1], $match[2], 'ftp');
break;
case 'mailto':
return self::createLinkCode($match[1], $match[3], 'mailto');
break;
default:
return self::createLinkCode($match[1], $match[2], 'http');
break;
}
return;
}
}
>>>>>>> skinnable-master