diff --git a/phpBB/phpbb/textformatter/s9e/factory.php b/phpBB/phpbb/textformatter/s9e/factory.php index 63b23d2fd0..dd3102d4de 100644 --- a/phpBB/phpbb/textformatter/s9e/factory.php +++ b/phpBB/phpbb/textformatter/s9e/factory.php @@ -332,8 +332,7 @@ class factory implements \phpbb\textformatter\cache_interface } // Load the magic links plugins. We do that after BBCodes so that they use the same tags - $configurator->plugins->load('Autoemail'); - $configurator->plugins->load('Autolink', array('matchWww' => true)); + $this->configure_autolink($configurator); // Register some vars with a default value. Those should be set at runtime by whatever calls // the parser @@ -394,6 +393,31 @@ class factory implements \phpbb\textformatter\cache_interface return array('parser' => $parser, 'renderer' => $renderer); } + /** + * Configure the Autolink / Autoemail plugins used to linkify text + * + * @param \s9e\TextFormatter\Configurator $configurator + * @return void + */ + protected function configure_autolink(Configurator $configurator) + { + $configurator->plugins->load('Autoemail'); + $configurator->plugins->load('Autolink', array('matchWww' => true)); + + // Create a tag that will be used to display the truncated text by replacing the original + // content with the content of the @text attribute + $tag = $configurator->tags->add('AUTOLINK_TEXT'); + $tag->attributes->add('text'); + $tag->template = ''; + + // Add a tag filter that replaces the text of links that were created by the Autolink plugin + $configurator->Autolink->getTag()->filterChain + ->add(__NAMESPACE__ . '\\parser::generate_autolink_text') + ->resetParameters() + ->addParameterByName('tag') + ->addParameterByName('parser'); + } + /** * Return the default BBCodes configuration * diff --git a/phpBB/phpbb/textformatter/s9e/parser.php b/phpBB/phpbb/textformatter/s9e/parser.php index ffaffbc63c..faddc806cd 100644 --- a/phpBB/phpbb/textformatter/s9e/parser.php +++ b/phpBB/phpbb/textformatter/s9e/parser.php @@ -393,4 +393,44 @@ class parser implements \phpbb\textformatter\parser_interface return $url; } + + /** + * Replace the content displayed inside of a URL tag + * + * Will only apply to URL tags that do not use any markup (e.g. not "[url]") on the assumption + * that those tags were created by the Autolink plugin to linkify URLs found in plain text + * + * @param \s9e\TextFormatter\Parser\Tag $url_tag URL tag (start tag) + * @param \s9e\TextFormatter\Parser $parser Parser + * @return bool Always TRUE to indicate that the tag is valid + */ + public static function generate_autolink_text(\s9e\TextFormatter\Parser\Tag $url_tag, \s9e\TextFormatter\Parser $parser) + { + // If the tag consumes any text then we ignore it because it's not a linkified URL. Same if + // it's not paired with an end tag that doesn't consume any text either + if ($url_tag->getLen() > 0 || !$url_tag->getEndTag()) + { + return true; + } + + // Capture the text between the start tag and its end tag + $start = $url_tag->getPos(); + $end = $url_tag->getEndTag()->getPos(); + $length = $end - $start; + $text = substr($parser->getText(), $start, $length); + + if ($length <= 55 || utf8_strlen($text) <= 55) + { + // Do not do anything if the text is not longer than 55 characters + return true; + } + + $tag = $parser->addSelfClosingTag('AUTOLINK_TEXT', $start, $length); + $url_tag->cascadeInvalidationTo($tag); + + $text = utf8_substr($text, 0, 39) . ' ... ' . utf8_substr($text, -10); + $tag->setAttribute('text', $text); + + return true; + } } diff --git a/tests/text_formatter/s9e/default_formatting_test.php b/tests/text_formatter/s9e/default_formatting_test.php index 3047653d51..facffd5df1 100644 --- a/tests/text_formatter/s9e/default_formatting_test.php +++ b/tests/text_formatter/s9e/default_formatting_test.php @@ -225,6 +225,16 @@ class phpbb_textformatter_s9e_default_formatting_test extends phpbb_test_case '... www.example.org ...', '... www.example.org ...' ), + array( + // From make_clickable_test.php + 'www.phpbb.com/community/?', + 'www.phpbb.com/community/?' + ), + array( + // From make_clickable_test.php + 'http://www.phpbb.com/community/path/to/long/url/file.ext#section', + 'http://www.phpbb.com/community/path/to/ ... xt#section' + ), array( '[quote="[url=http://example.org]xxx[/url]"]...[/quote]', '
xxx wrote:...
'