FIX HTMLEditorField is not able to show html or xml code examples (#11243)

This commit is contained in:
Sabina Talipova 2024-05-22 09:39:36 +12:00 committed by GitHub
parent 470293a6d2
commit f0aaba5504
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 43 additions and 16 deletions

View File

@ -191,7 +191,19 @@ class HTMLEditorField extends TextareaField
*/ */
public function ValueEntities() public function ValueEntities()
{ {
return htmlentities($this->Value() ?? '', ENT_COMPAT, 'UTF-8', false); $entities = get_html_translation_table(HTML_ENTITIES);
foreach ($entities as $key => $value) {
$entities[$key] = "/" . $value . "/";
}
$value = preg_replace_callback($entities, function ($matches) {
// Don't apply double encoding to ampersand
$doubleEncoding = $matches[0] != '&';
return htmlentities($matches[0], ENT_COMPAT, 'UTF-8', $doubleEncoding);
}, $this->Value() ?? '');
return $value;
} }
/** /**

View File

@ -171,6 +171,10 @@ class EmbedShortcodeProvider implements ShortcodeHandler
$arguments['style'] = 'width: ' . intval($arguments['width']) . 'px;'; $arguments['style'] = 'width: ' . intval($arguments['width']) . 'px;';
} }
if (!empty($arguments['caption'])) {
$arguments['caption'] = htmlentities($arguments['caption'], ENT_QUOTES, 'UTF-8', false);
}
// override iframe dimension attributes provided by webservice with ones specified in shortcode arguments // override iframe dimension attributes provided by webservice with ones specified in shortcode arguments
foreach (['width', 'height'] as $attr) { foreach (['width', 'height'] as $attr) {
if (!($value = $arguments[$attr] ?? false)) { if (!($value = $arguments[$attr] ?? false)) {

View File

@ -3,6 +3,6 @@
> >
{$Content} {$Content}
<% if $Arguments.caption %> <% if $Arguments.caption %>
<p class="caption">{$Arguments.caption}</p> <p class="caption">{$Arguments.caption.RAW}</p>
<% end_if %> <% end_if %>
</div> </div>

View File

@ -74,7 +74,7 @@ class HTMLEditorFieldTest extends FunctionalTest
$inputText = "These are some unicodes: ä, ö, & ü"; $inputText = "These are some unicodes: ä, ö, & ü";
$field = new HTMLEditorField("Test", "Test"); $field = new HTMLEditorField("Test", "Test");
$field->setValue($inputText); $field->setValue($inputText);
$this->assertStringContainsString('These are some unicodes: &auml;, &ouml;, &amp; &uuml;', $field->Field()); $this->assertStringContainsString('These are some unicodes: ä, ö, & ü', $field->Field());
// Test shortcodes // Test shortcodes
$inputText = "Shortcode: [file_link id=4]"; $inputText = "Shortcode: [file_link id=4]";
$field = new HTMLEditorField("Test", "Test"); $field = new HTMLEditorField("Test", "Test");
@ -210,23 +210,34 @@ EOS
); );
} }
public function testValueEntities() public function provideTestValueEntities()
{ {
$inputText = "The company &amp; partners"; return [
$field = new HTMLEditorField("Content"); "ampersand" => [
$field->setValue($inputText);
$this->assertEquals(
"The company &amp; partners", "The company &amp; partners",
$field->obj('ValueEntities')->forTemplate() "The company &amp; partners"
); ],
"double ampersand" => [
"The company &amp;amp; partners",
"The company &amp;amp; partners"
],
"left arrow and right arrow" => [
"<p>&lt;strong&gt;The company &amp;amp; partners&lt;/strong&gt;</p>",
"<p>&amp;lt;strong&amp;gt;The company &amp;amp; partners&amp;lt;/strong&amp;gt;</p>"
],
];
}
$inputText = "The company &amp;&amp; partners"; /**
* @dataProvider provideTestValueEntities
*/
public function testValueEntities(string $input, string $result)
{
$field = new HTMLEditorField("Content"); $field = new HTMLEditorField("Content");
$field->setValue($inputText); $field->setValue($input);
$this->assertEquals( $this->assertEquals(
"The company &amp;&amp; partners", $result,
$field->obj('ValueEntities')->forTemplate() $field->obj('ValueEntities')->forTemplate()
); );
} }