[ticket/14323] Added support for truncating long URLs

PHPBB3-14323
This commit is contained in:
JoshyPHP 2015-12-05 07:55:52 +01:00
parent 28969511d2
commit eb6ceb963e
3 changed files with 76 additions and 2 deletions

View file

@ -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 // Load the magic links plugins. We do that after BBCodes so that they use the same tags
$configurator->plugins->load('Autoemail'); $this->configure_autolink($configurator);
$configurator->plugins->load('Autolink', array('matchWww' => true));
// Register some vars with a default value. Those should be set at runtime by whatever calls // Register some vars with a default value. Those should be set at runtime by whatever calls
// the parser // the parser
@ -394,6 +393,31 @@ class factory implements \phpbb\textformatter\cache_interface
return array('parser' => $parser, 'renderer' => $renderer); 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 = '<xsl:value-of select="@text"/>';
// 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 * Return the default BBCodes configuration
* *

View file

@ -393,4 +393,44 @@ class parser implements \phpbb\textformatter\parser_interface
return $url; 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;
}
} }

View file

@ -225,6 +225,16 @@ class phpbb_textformatter_s9e_default_formatting_test extends phpbb_test_case
'... www.example.org ...', '... www.example.org ...',
'... <a href="http://www.example.org" class="postlink">www.example.org</a> ...' '... <a href="http://www.example.org" class="postlink">www.example.org</a> ...'
), ),
array(
// From make_clickable_test.php
'www.phpbb.com/community/?',
'<a href="http://www.phpbb.com/community/" class="postlink">www.phpbb.com/community/</a>?'
),
array(
// From make_clickable_test.php
'http://www.phpbb.com/community/path/to/long/url/file.ext#section',
'<a href="http://www.phpbb.com/community/path/to/long/url/file.ext#section" class="postlink">http://www.phpbb.com/community/path/to/ ... xt#section</a>'
),
array( array(
'[quote="[url=http://example.org]xxx[/url]"]...[/quote]', '[quote="[url=http://example.org]xxx[/url]"]...[/quote]',
'<blockquote><div><cite><a href="http://example.org" class="postlink">xxx</a> wrote:</cite>...</div></blockquote>' '<blockquote><div><cite><a href="http://example.org" class="postlink">xxx</a> wrote:</cite>...</div></blockquote>'