Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
85.71% |
6 / 7 |
CRAP | |
90.91% |
40 / 44 |
utils | |
0.00% |
0 / 1 |
|
85.71% |
6 / 7 |
19.27 | |
90.91% |
40 / 44 |
clean_formatting | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
format_attribute_value | |
100.00% |
1 / 1 |
3 | |
100.00% |
6 / 6 |
|||
generate_quote | |
100.00% |
1 / 1 |
7 | |
100.00% |
19 / 19 |
|||
get_outermost_quote_authors | |
100.00% |
1 / 1 |
3 | |
100.00% |
11 / 11 |
|||
remove_bbcode | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
unparse | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
is_empty | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 4 |
<?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; | |
/** | |
* Text manipulation utilities | |
*/ | |
class utils implements \phpbb\textformatter\utils_interface | |
{ | |
/** | |
* Replace BBCodes and other formatting elements with whitespace | |
* | |
* NOTE: preserves smilies as text | |
* | |
* @param string $xml Parsed text | |
* @return string Plain text | |
*/ | |
public function clean_formatting($xml) | |
{ | |
// Insert a space before <s> and <e> then remove formatting | |
$xml = preg_replace('#<[es]>#', ' $0', $xml); | |
return utf8_htmlspecialchars(\s9e\TextFormatter\Utils::removeFormatting($xml)); | |
} | |
/** | |
* Format given string to be used as an attribute value | |
* | |
* Will return the string as-is if it can be used in a BBCode without quotes. Otherwise, | |
* it will use either single- or double- quotes depending on whichever requires less escaping. | |
* Quotes and backslashes are escaped with backslashes where necessary | |
* | |
* @param string $str Original string | |
* @return string Same string if possible, escaped string within quotes otherwise | |
*/ | |
protected function format_attribute_value($str) | |
{ | |
if (!preg_match('/[ "\'\\\\\\]]/', $str)) | |
{ | |
// Return as-is if it contains none of: space, ' " \ or ] | |
return $str; | |
} | |
$singleQuoted = "'" . addcslashes($str, "\\'") . "'"; | |
$doubleQuoted = '"' . addcslashes($str, '\\"') . '"'; | |
return (strlen($singleQuoted) < strlen($doubleQuoted)) ? $singleQuoted : $doubleQuoted; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function generate_quote($text, array $attributes = array()) | |
{ | |
$text = trim($text); | |
$quote = '[quote'; | |
if (isset($attributes['author'])) | |
{ | |
// Add the author as the BBCode's default attribute | |
$quote .= '=' . $this->format_attribute_value($attributes['author']); | |
unset($attributes['author']); | |
} | |
if (isset($attributes['user_id']) && $attributes['user_id'] == ANONYMOUS) | |
{ | |
unset($attributes['user_id']); | |
} | |
ksort($attributes); | |
foreach ($attributes as $name => $value) | |
{ | |
$quote .= ' ' . $name . '=' . $this->format_attribute_value($value); | |
} | |
$quote .= ']'; | |
$newline = (strlen($quote . $text . '[/quote]') > 80 || strpos($text, "\n") !== false) ? "\n" : ''; | |
$quote .= $newline . $text . $newline . '[/quote]'; | |
return $quote; | |
} | |
/** | |
* Get a list of quote authors, limited to the outermost quotes | |
* | |
* @param string $xml Parsed text | |
* @return string[] List of authors | |
*/ | |
public function get_outermost_quote_authors($xml) | |
{ | |
$authors = array(); | |
if (strpos($xml, '<QUOTE ') === false) | |
{ | |
return $authors; | |
} | |
$dom = new \DOMDocument; | |
$dom->loadXML($xml); | |
$xpath = new \DOMXPath($dom); | |
foreach ($xpath->query('//QUOTE[not(ancestor::QUOTE)]/@author') as $author) | |
{ | |
$authors[] = $author->textContent; | |
} | |
return $authors; | |
} | |
/** | |
* Remove given BBCode and its content, at given nesting depth | |
* | |
* @param string $xml Parsed text | |
* @param string $bbcode_name BBCode's name | |
* @param integer $depth Minimum nesting depth (number of parents of the same name) | |
* @return string Parsed text | |
*/ | |
public function remove_bbcode($xml, $bbcode_name, $depth = 0) | |
{ | |
return \s9e\TextFormatter\Utils::removeTag($xml, strtoupper($bbcode_name), $depth); | |
} | |
/** | |
* Return a parsed text to its original form | |
* | |
* @param string $xml Parsed text | |
* @return string Original plain text | |
*/ | |
public function unparse($xml) | |
{ | |
return \s9e\TextFormatter\Unparser::unparse($xml); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function is_empty($text) | |
{ | |
if ($text === null || $text === '') | |
{ | |
return true; | |
} | |
return trim($this->unparse($text)) === ''; | |
} | |
} |