private function XBBCodeStandardTest::getTags in Extensible BBCode 4.0.x
Same name and namespace in other branches
- 8.3 standard/tests/src/Kernel/XBBCodeStandardTest.php \Drupal\Tests\xbbcode_standard\Kernel\XBBCodeStandardTest::getTags()
Data provider that generates test input/output for standard tags.
Return value
string[][] Array of arrays, each array consisting of two strings:
- The filter input.
- The expected filter output.
1 call to XBBCodeStandardTest::getTags()
- XBBCodeStandardTest::testTags in standard/
tests/ src/ Kernel/ XBBCodeStandardTest.php - Test all of the tags installed by this module.
File
- standard/
tests/ src/ Kernel/ XBBCodeStandardTest.php, line 92
Class
- XBBCodeStandardTest
- Test the standard tags provided by XBBCode.
Namespace
Drupal\Tests\xbbcode_standard\KernelCode
private function getTags() : array {
$input = $this
->randomString(128);
// Add a long run of backslashes to check for backtracking.
$input .= str_repeat('\\', 128);
// Add a pathological mix of raw and encoded characters.
$input .= '<>&&"&amp;amp;quot;>';
// Mask any existing tag names that happen to be generated.
$names = [
'align',
'b',
'color',
'font',
'i',
'url',
'list',
'quote',
'size',
's',
'sub',
'sup',
'u',
'code',
'img',
'table',
];
$replacement = mb_strtolower($this
->randomMachineName());
$input = preg_replace('/(\\[\\/?)(' . implode('|', $names) . ')(?!\\w+)/', '$0' . $replacement, $input);
// Also mask any list item delimiters.
$input = str_replace('[*]', '[**]', $input);
$content = Html::escape($input);
// The option must escape square brackets.
$option = preg_replace('/[\\[\\]\\\\]/', '\\\\$0', $input);
// If the option starts with a quote, add a backslash.
if (preg_match('/^[\'\\"]/', $option)) {
$option = '\\' . $option;
}
// Attribute has escaped quotes.
// Also, all semicolons must be part of character entities.
$style = Html::escape(str_replace(';', '', $input));
$tags[] = [
"[align={$option}]{$input}[/align]",
"<p style=\"text-align:{$style}\">{$content}</p>",
];
$tags[] = [
"[b]{$input}[/b]",
"<strong>{$content}</strong>",
];
$tags[] = [
"[color={$option}]{$input}[/color]",
"<span style=\"color:{$style}\">{$content}</span>",
];
$tags[] = [
"[font={$option}]{$input}[/font]",
"<span style=\"font-family:{$style}\">{$content}</span>",
];
$tags[] = [
"[i]{$input}[/i]",
"<em>{$content}</em>",
];
$tags[] = [
"[url={$option}]{$input}[/url]",
"<a href=\"{$content}\" title=\"{$content}\">{$content}</a>",
];
$tags[] = [
"[quote]{$input}[/quote]",
"<blockquote>{$content}</blockquote>",
];
$tags[] = [
"[size={$option}]{$input}[/size]",
"<span style=\"font-size:{$style}\">{$content}</span>",
];
$tags[] = [
"[s]{$input}[/s]",
"<s>{$content}</s>",
];
$tags[] = [
"[sub]{$input}[/sub]",
"<sub>{$content}</sub>",
];
$tags[] = [
"[sup]{$input}[/sup]",
"<sup>{$content}</sup>",
];
$tags[] = [
"[u]{$input}[/u]",
"<span style=\"text-decoration:underline\">{$content}</span>",
];
$tags[] = [
"[code][b]{$input}[/b][/code]",
"<code>[b]{$content}[/b]</code>",
];
try {
// Exhaustively test cases here.
$width = random_int(0, 1000);
$height = random_int(0, 1000);
} catch (\Exception $e) {
// Chosen by fair dice roll. Guaranteed to be random.
$width = 4;
$height = 4;
}
$tags[] = [
"[img={$width}x{$height}]{$input}[/img]",
"<img src=\"{$content}\" alt=\"{$content}\" style=\"width:{$width}px;height:{$height}px;\" />",
];
$tags[] = [
"[img width={$width} height={$height}]{$input}[/img]",
"<img src=\"{$content}\" alt=\"{$content}\" style=\"width:{$width}px;height:{$height}px;\" />",
];
$tags[] = [
"[img={$width}x]{$input}[/img]",
"<img src=\"{$content}\" alt=\"{$content}\" style=\"width:{$width}px;\" />",
];
$tags[] = [
"[img width={$width}]{$input}[/img]",
"<img src=\"{$content}\" alt=\"{$content}\" style=\"width:{$width}px;\" />",
];
$tags[] = [
"[img=x{$height}]{$input}[/img]",
"<img src=\"{$content}\" alt=\"{$content}\" style=\"height:{$height}px;\" />",
];
$tags[] = [
"[img height={$height}]{$input}[/img]",
"<img src=\"{$content}\" alt=\"{$content}\" style=\"height:{$height}px;\" />",
];
// Tables have an extra backslash level, which is applied first.
$cell = preg_replace('/[\'\\",\\\\]/', '\\\\$0', $input);
$header = preg_replace('/[\\s\\[\\]\\\\]/', '\\\\$0', $cell);
$attribute = preg_replace('/[\'\\"\\s\\[\\]\\\\]/', '\\\\$0', $input);
$headers = "~{$header}0,\\ {$header}1,!{$header}2,#{$header}3";
if (preg_match('/^[\'\\"]/', $headers[0])) {
$headers = '\\' . $headers;
$attribute = '\\' . $attribute;
}
$row = implode(',', array_fill(0, 4, $cell));
$output_row = <<<DOC
<tr>
<td style="text-align:left">{<span class="php-variable">$content</span>}</td>
<td>{<span class="php-variable">$content</span>}</td>
<td style="text-align:center">{<span class="php-variable">$content</span>}</td>
<td style="text-align:right">{<span class="php-variable">$content</span>}</td>
</tr>
DOC;
$table_body = str_repeat("{$row}\n", 5);
$output = str_repeat($output_row, 5);
$table = <<<DOC
<table class="responsive-enabled" data-striping="1">
<caption>{<span class="php-variable">$content</span>}-caption</caption>
<thead>
<tr>
<th>{<span class="php-variable">$content</span>}0</th>
<th>{<span class="php-variable">$content</span>}1</th>
<th>{<span class="php-variable">$content</span>}2</th>
<th>{<span class="php-variable">$content</span>}3</th>
</tr>
</thead>
<tbody>
{<span class="php-variable">$output</span>}
</tbody>
</table>
DOC;
$tags[] = [
"[table header={$headers} caption={$attribute}-caption]\n{$table_body}[/table]",
$table,
];
return $tags;
}