<<<<<<< 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