From a2ac8b02fac48e7b53b6843e149d46dce3fb5fa1 Mon Sep 17 00:00:00 2001 From: Damien ALEXANDRE Date: Mon, 17 Sep 2018 12:28:42 +0200 Subject: [PATCH 1/3] [EditInPlace] Do not replace HTML translation with tag --- .../Translator/EditInPlaceTranslatorTest.php | 100 ++++++++++++++++++ Translator/EditInPlaceTranslator.php | 5 + 2 files changed, 105 insertions(+) create mode 100644 Tests/Unit/Translator/EditInPlaceTranslatorTest.php diff --git a/Tests/Unit/Translator/EditInPlaceTranslatorTest.php b/Tests/Unit/Translator/EditInPlaceTranslatorTest.php new file mode 100644 index 00000000..34be73e9 --- /dev/null +++ b/Tests/Unit/Translator/EditInPlaceTranslatorTest.php @@ -0,0 +1,100 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Translation\Bundle\Tests\Unit\Translator; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\Translation\Loader\ArrayLoader; +use Symfony\Component\Translation\TranslatorInterface; +use Translation\Bundle\EditInPlace\ActivatorInterface; +use Translation\Bundle\Translator\EditInPlaceTranslator; + +/** + * @author Damien Alexandre + */ +final class EditInPlaceTranslatorTest extends TestCase +{ + public function testEnabled() + { + $symfonyTranslator = $this->getMockBuilder(TranslatorInterface::class)->getMock(); + + $request = new Request(); + $requestStack = new RequestStack(); + $requestStack->push($request); + + $activator = new FakeActivator(true); + $service = new EditInPlaceTranslator($symfonyTranslator, $activator, $requestStack); + + $this->assertSame( + '', + $service->trans('key', []) + ); + } + + public function testDisabled() + { + $symfonyTranslator = $this->getMockBuilder(TranslatorInterface::class)->getMock(); + + $request = new Request(); + $requestStack = new RequestStack(); + $requestStack->push($request); + + $activator = new FakeActivator(false); + $service = new EditInPlaceTranslator($symfonyTranslator, $activator, $requestStack); + + $this->assertSame( + null, + $service->trans('key', []) + ); + } + + public function testHtmlTranslation() + { + $symfonyTranslator = new \Symfony\Component\Translation\Translator('en', null, null, true); + $symfonyTranslator->addLoader('array', new ArrayLoader()); + $symfonyTranslator->addResource('array', array('foo' => 'Normal content.'), 'en'); + $symfonyTranslator->addResource('array', array('bar' => 'Content with HTML in it.'), 'en'); + + $request = new Request(); + $requestStack = new RequestStack(); + $requestStack->push($request); + + $activator = new FakeActivator(true); + $service = new EditInPlaceTranslator($symfonyTranslator, $activator, $requestStack); + + $this->assertSame( + 'Normal content.', + $service->trans('foo', []) + ); + + $this->assertSame( + 'Content with HTML in it.', + $service->trans('bar', []) + ); + } +} + +class FakeActivator implements ActivatorInterface +{ + private $enabled; + + public function __construct($enabled = true) + { + $this->enabled = $enabled; + } + + public function checkRequest(Request $request = null) + { + return $this->enabled; + } +} diff --git a/Translator/EditInPlaceTranslator.php b/Translator/EditInPlaceTranslator.php index 0547d77e..d186bd07 100644 --- a/Translator/EditInPlaceTranslator.php +++ b/Translator/EditInPlaceTranslator.php @@ -63,6 +63,11 @@ public function trans($id, array $parameters = [], $domain = null, $locale = nul return $original; } + // If there is HTML in the translation, do not allow EditInPlace (it broke Content Tools) + if (strpos($original, '<') !== false) { + return $original; + } + $plain = $this->translator->trans($id, [], $domain, $locale); if (null === $domain) { From bda7ca15237b971314d4c9830f71248c6ec38b7c Mon Sep 17 00:00:00 2001 From: Damien ALEXANDRE Date: Mon, 17 Sep 2018 12:37:03 +0200 Subject: [PATCH 2/3] Fix the Coding Style as suggested by StyleCi (too bad phpcsfixer is not part of the project) --- Tests/Unit/Translator/EditInPlaceTranslatorTest.php | 4 ++-- Translator/EditInPlaceTranslator.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/Unit/Translator/EditInPlaceTranslatorTest.php b/Tests/Unit/Translator/EditInPlaceTranslatorTest.php index 34be73e9..fc120126 100644 --- a/Tests/Unit/Translator/EditInPlaceTranslatorTest.php +++ b/Tests/Unit/Translator/EditInPlaceTranslatorTest.php @@ -62,8 +62,8 @@ public function testHtmlTranslation() { $symfonyTranslator = new \Symfony\Component\Translation\Translator('en', null, null, true); $symfonyTranslator->addLoader('array', new ArrayLoader()); - $symfonyTranslator->addResource('array', array('foo' => 'Normal content.'), 'en'); - $symfonyTranslator->addResource('array', array('bar' => 'Content with HTML in it.'), 'en'); + $symfonyTranslator->addResource('array', ['foo' => 'Normal content.'], 'en'); + $symfonyTranslator->addResource('array', ['bar' => 'Content with HTML in it.'], 'en'); $request = new Request(); $requestStack = new RequestStack(); diff --git a/Translator/EditInPlaceTranslator.php b/Translator/EditInPlaceTranslator.php index d186bd07..c26cdb87 100644 --- a/Translator/EditInPlaceTranslator.php +++ b/Translator/EditInPlaceTranslator.php @@ -64,7 +64,7 @@ public function trans($id, array $parameters = [], $domain = null, $locale = nul } // If there is HTML in the translation, do not allow EditInPlace (it broke Content Tools) - if (strpos($original, '<') !== false) { + if (false !== strpos($original, '<')) { return $original; } From 546fbac53f11e859d4a084bcce3b286faf6a4d81 Mon Sep 17 00:00:00 2001 From: Damien ALEXANDRE Date: Mon, 17 Sep 2018 13:57:26 +0200 Subject: [PATCH 3/3] Instead of disabling HTML translations, just generate valid HTML --- Tests/Unit/Translator/EditInPlaceTranslatorTest.php | 8 +++++++- Translator/EditInPlaceTranslator.php | 9 ++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Tests/Unit/Translator/EditInPlaceTranslatorTest.php b/Tests/Unit/Translator/EditInPlaceTranslatorTest.php index fc120126..00b9b45d 100644 --- a/Tests/Unit/Translator/EditInPlaceTranslatorTest.php +++ b/Tests/Unit/Translator/EditInPlaceTranslatorTest.php @@ -64,6 +64,7 @@ public function testHtmlTranslation() $symfonyTranslator->addLoader('array', new ArrayLoader()); $symfonyTranslator->addResource('array', ['foo' => 'Normal content.'], 'en'); $symfonyTranslator->addResource('array', ['bar' => 'Content with HTML in it.'], 'en'); + $symfonyTranslator->addResource('array', ['bar.attr' => 'Content with HTML in it.'], 'en'); $request = new Request(); $requestStack = new RequestStack(); @@ -78,9 +79,14 @@ public function testHtmlTranslation() ); $this->assertSame( - 'Content with HTML in it.', + 'Content with HTML in it.', $service->trans('bar', []) ); + + $this->assertSame( + 'Content with HTML in it.', + $service->trans('bar.attr', []) + ); } } diff --git a/Translator/EditInPlaceTranslator.php b/Translator/EditInPlaceTranslator.php index c26cdb87..35f35b4c 100644 --- a/Translator/EditInPlaceTranslator.php +++ b/Translator/EditInPlaceTranslator.php @@ -63,11 +63,6 @@ public function trans($id, array $parameters = [], $domain = null, $locale = nul return $original; } - // If there is HTML in the translation, do not allow EditInPlace (it broke Content Tools) - if (false !== strpos($original, '<')) { - return $original; - } - $plain = $this->translator->trans($id, [], $domain, $locale); if (null === $domain) { @@ -81,8 +76,8 @@ public function trans($id, array $parameters = [], $domain = null, $locale = nul return sprintf('%s', $domain, $id, - $original, - $plain, + htmlspecialchars($original), + htmlspecialchars($plain), $domain, $locale, $original