View source
<?php
namespace Drupal\Tests\xbbcode_standard\Kernel;
use Drupal\Component\Utility\Html;
use Drupal\filter\Entity\FilterFormat;
use Drupal\KernelTests\KernelTestBase;
class XBBCodeStandardTest extends KernelTestBase {
public static $modules = [
'filter',
'xbbcode',
'xbbcode_standard',
'system',
'user',
];
protected function setUp() : void {
parent::setUp();
$this
->installConfig([
'xbbcode',
'xbbcode_standard',
]);
$format = [
'format' => 'xbbcode_test',
'name' => 'XBBCode Test',
'filters' => [
'filter_html_escape' => [
'status' => 1,
'weight' => 0,
],
'xbbcode' => [
'status' => 1,
'weight' => 1,
'settings' => [
'linebreaks' => FALSE,
],
],
],
];
FilterFormat::create($format)
->save();
}
public function testTags() : void {
for ($i = 0; $i < 10; $i++) {
foreach ($this
->getTags() as $case) {
$expected = self::stripSpaces($case[1]);
$actual = self::stripSpaces(check_markup($case[0], 'xbbcode_test'));
static::assertEquals($expected, $actual);
}
$input = $this
->randomString(2048) . '>\'"; email@example.com http://example.com/';
$input = str_replace('<', '', $input);
$escaped = Html::escape($input);
$bbcode = "[spoiler]{$input}[/spoiler]";
$element = $this
->checkMarkup($bbcode, 'xbbcode_test');
preg_match('/id="xbbcode-spoiler-(\\d+)"/', $element['#markup'], $match);
$key = $match[1];
static::assertNotNull($key);
$expected = "<input id=\"xbbcode-spoiler-{$key}\" type=\"checkbox\" class=\"xbbcode-spoiler\" />" . "<label class=\"xbbcode-spoiler\" for=\"xbbcode-spoiler-{$key}\">{$escaped}</label>";
static::assertEquals($expected, $element['#markup']);
}
}
private function getTags() : array {
$input = $this
->randomString(128);
$input .= str_repeat('\\', 128);
$input .= '<>&&"&amp;amp;quot;>';
$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);
$input = str_replace('[*]', '[**]', $input);
$content = Html::escape($input);
$option = preg_replace('/[\\[\\]\\\\]/', '\\\\$0', $input);
if (preg_match('/^[\'\\"]/', $option)) {
$option = '\\' . $option;
}
$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 {
$width = random_int(0, 1000);
$height = random_int(0, 1000);
} catch (\Exception $e) {
$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;\" />",
];
$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;
}
private function checkMarkup(string $text, string $format_id) : array {
$build = [
'#type' => 'processed_text',
'#text' => $text,
'#format' => $format_id,
'#filter_types_to_skip' => [],
'#langcode' => '',
];
\Drupal::service('renderer')
->renderPlain($build);
return $build;
}
private static function stripSpaces(string $html) : string {
return preg_replace('/(?<=^|>)\\s+(?=<|$)/', '', $html);
}
}