mirror of
				https://github.com/phpbb/phpbb.git
				synced 2025-10-26 21:21:32 +01:00 
			
		
		
		
	Explicitly tests a tag's markup to determine whether a link should be shortened PHPBB3-14323
		
			
				
	
	
		
			119 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
| *
 | |
| * This file is part of the phpBB Forum Software package.
 | |
| *
 | |
| * @copyright (c) phpBB Limited <https://www.phpbb.com>
 | |
| * @license GNU General Public License, version 2 (GPL-2.0)
 | |
| *
 | |
| * For full copyright and license information, please see
 | |
| * the docs/CREDITS.txt file.
 | |
| *
 | |
| */
 | |
| 
 | |
| namespace phpbb\textformatter\s9e;
 | |
| 
 | |
| class link_helper
 | |
| {
 | |
| 	/**
 | |
| 	* Clean up and invalidate a LINK_TEXT tag if applicable
 | |
| 	*
 | |
| 	* Will invalidate the tag if its replacement text is the same as the original
 | |
| 	* text and would have no visible effect
 | |
| 	*
 | |
| 	* @param  \s9e\TextFormatter\Parser\Tag $tag    LINK_TEXT tag
 | |
| 	* @param  \s9e\TextFormatter\Parser     $parser Parser
 | |
| 	* @return bool                                  Whether the tag is valid
 | |
| 	*/
 | |
| 	public function cleanup_tag(\s9e\TextFormatter\Parser\Tag $tag, \s9e\TextFormatter\Parser $parser)
 | |
| 	{
 | |
| 		// Invalidate if the content of the tag matches the text attribute
 | |
| 		$text = substr($parser->getText(), $tag->getPos(), $tag->getLen());
 | |
| 
 | |
| 		return ($text !== $tag->getAttribute('text'));
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	* Create a LINK_TEXT tag inside of a link
 | |
| 	*
 | |
| 	* Meant to only apply to linkified URLs and [url] BBCodes without a parameter
 | |
| 	*
 | |
| 	* @param  \s9e\TextFormatter\Parser\Tag $tag    URL tag (start tag)
 | |
| 	* @param  \s9e\TextFormatter\Parser     $parser Parser
 | |
| 	* @return bool                                  Always true to indicate that the tag is valid
 | |
| 	*/
 | |
| 	public function generate_link_text_tag(\s9e\TextFormatter\Parser\Tag $tag, \s9e\TextFormatter\Parser $parser)
 | |
| 	{
 | |
| 		// Only create a LINK_TEXT tag if the start tag is paired with an end
 | |
| 		// tag, which is the case with tags from the Autolink plugins and with
 | |
| 		// the [url] BBCode when its content is used for the URL
 | |
| 		if (!$tag->getEndTag() || !$this->should_shorten($tag, $parser->getText()))
 | |
| 		{
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		// Capture the text between the start tag and its end tag
 | |
| 		$start  = $tag->getPos() + $tag->getLen();
 | |
| 		$end    = $tag->getEndTag()->getPos();
 | |
| 		$length = $end - $start;
 | |
| 		$text   = substr($parser->getText(), $start, $length);
 | |
| 
 | |
| 		// Create a tag that consumes the link's text
 | |
| 		$parser->addSelfClosingTag('LINK_TEXT', $start, $length)->setAttribute('text', $text);
 | |
| 
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	* Test whether we should shorten this tag's text
 | |
| 	*
 | |
| 	* Will test whether the tag either does not use any markup or uses a single
 | |
| 	* [url] BBCode
 | |
| 	*
 | |
| 	* @param  \s9e\TextFormatter\Parser\Tag $tag  URL tag
 | |
| 	* @param  string                        $text Original text
 | |
| 	* @return bool
 | |
| 	*/
 | |
| 	protected function should_shorten(\s9e\TextFormatter\Parser\Tag $tag, $text)
 | |
| 	{
 | |
| 		return ($tag->getLen() === 0 || strtolower(substr($text, $tag->getPos(), $tag->getLen())) === '[url]');
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	* Remove the board's root URL from a the start of a string
 | |
| 	*
 | |
| 	* @param  \s9e\TextFormatter\Parser\Tag $tag       LINK_TEXT tag
 | |
| 	* @param  string                        $board_url Forum's root URL (with trailing slash)
 | |
| 	* @return bool                                     Always true to indicate that the tag is valid
 | |
| 	*/
 | |
| 	public function truncate_local_url(\s9e\TextFormatter\Parser\Tag $tag, $board_url)
 | |
| 	{
 | |
| 		$text = $tag->getAttribute('text');
 | |
| 		if (stripos($text, $board_url) === 0 && strlen($text) > strlen($board_url))
 | |
| 		{
 | |
| 			$tag->setAttribute('text', substr($text, strlen($board_url)));
 | |
| 		}
 | |
| 
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	* Truncate the replacement text set in a LINK_TEXT tag
 | |
| 	*
 | |
| 	* @param  \s9e\TextFormatter\Parser\Tag $tag LINK_TEXT tag
 | |
| 	* @return bool                               Always true to indicate that the tag is valid
 | |
| 	*/
 | |
| 	public function truncate_text(\s9e\TextFormatter\Parser\Tag $tag)
 | |
| 	{
 | |
| 		$text = $tag->getAttribute('text');
 | |
| 		if (utf8_strlen($text) > 55)
 | |
| 		{
 | |
| 			$text = utf8_substr($text, 0, 39) . ' ... ' . utf8_substr($text, -10);
 | |
| 		}
 | |
| 
 | |
| 		$tag->setAttribute('text', $text);
 | |
| 
 | |
| 		return true;
 | |
| 	}
 | |
| }
 |