diff --git a/sake b/sake index 3e1274d8cfb..65d9af3394a 100755 --- a/sake +++ b/sake @@ -9,7 +9,8 @@ Executes a SilverStripe command" exit 1 fi -if ! [ -x "$(command -v which)" ]; then +command -v which >/dev/null 2>&1 +if [ $? -ne 0 ]; then echo "Error: sake requires the 'which' command to operate." >&2 exit 1 fi diff --git a/src/Forms/HTMLEditor/HTMLEditorField.php b/src/Forms/HTMLEditor/HTMLEditorField.php index 3edd623f7ec..90c3fad75c1 100644 --- a/src/Forms/HTMLEditor/HTMLEditorField.php +++ b/src/Forms/HTMLEditor/HTMLEditorField.php @@ -192,7 +192,19 @@ public function getSchemaStateDefaults() */ 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; } /** diff --git a/src/View/Shortcodes/EmbedShortcodeProvider.php b/src/View/Shortcodes/EmbedShortcodeProvider.php index 58aefc2c3b9..9a8c524506f 100644 --- a/src/View/Shortcodes/EmbedShortcodeProvider.php +++ b/src/View/Shortcodes/EmbedShortcodeProvider.php @@ -171,6 +171,10 @@ protected static function videoEmbed($arguments, $content) $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 foreach (['width', 'height'] as $attr) { if (!($value = $arguments[$attr] ?? false)) { diff --git a/templates/SilverStripe/View/Shortcodes/EmbedShortcodeProvider_video.ss b/templates/SilverStripe/View/Shortcodes/EmbedShortcodeProvider_video.ss index c526f16404d..be1a2a0a48d 100644 --- a/templates/SilverStripe/View/Shortcodes/EmbedShortcodeProvider_video.ss +++ b/templates/SilverStripe/View/Shortcodes/EmbedShortcodeProvider_video.ss @@ -3,6 +3,6 @@ > {$Content} <% if $Arguments.caption %> -

{$Arguments.caption}

+

{$Arguments.caption.RAW}

<% end_if %> diff --git a/tests/php/Forms/HTMLEditor/HTMLEditorFieldTest.php b/tests/php/Forms/HTMLEditor/HTMLEditorFieldTest.php index b046a1fd243..1a0196e6075 100644 --- a/tests/php/Forms/HTMLEditor/HTMLEditorFieldTest.php +++ b/tests/php/Forms/HTMLEditor/HTMLEditorFieldTest.php @@ -75,7 +75,7 @@ public function testCasting() $inputText = "These are some unicodes: ä, ö, & ü"; $field = new HTMLEditorField("Test", "Test"); $field->setValue($inputText); - $this->assertStringContainsString('These are some unicodes: ä, ö, & ü', $field->Field()); + $this->assertStringContainsString('These are some unicodes: ä, ö, & ü', $field->Field()); // Test shortcodes $inputText = "Shortcode: [file_link id=4]"; $field = new HTMLEditorField("Test", "Test"); @@ -211,23 +211,34 @@ public function testReadonlyField() ); } - public function testValueEntities() + public function provideTestValueEntities() { - $inputText = "The company & partners"; - $field = new HTMLEditorField("Content"); - $field->setValue($inputText); - - $this->assertEquals( - "The company & partners", - $field->obj('ValueEntities')->forTemplate() - ); + return [ + "ampersand" => [ + "The company & partners", + "The company & partners" + ], + "double ampersand" => [ + "The company &amp; partners", + "The company &amp; partners" + ], + "left arrow and right arrow" => [ + "

<strong>The company &amp; partners</strong>

", + "

&lt;strong&gt;The company &amp; partners&lt;/strong&gt;

" + ], + ]; + } - $inputText = "The company && partners"; + /** + * @dataProvider provideTestValueEntities + */ + public function testValueEntities(string $input, string $result) + { $field = new HTMLEditorField("Content"); - $field->setValue($inputText); + $field->setValue($input); $this->assertEquals( - "The company && partners", + $result, $field->obj('ValueEntities')->forTemplate() ); }