From c7f0b94da971084718251b2f83f1974ad626061d Mon Sep 17 00:00:00 2001 From: Jan Pecha Date: Thu, 18 Apr 2024 08:45:10 +0200 Subject: [PATCH] Processors: added EntityProcessor --- src/Processors/EntityProcessor.php | 60 +++++++++++++++++++++++++++ src/Processors/TagProcessor.php | 2 +- tests/Translator/EntityProcessor.phpt | 30 ++++++++++++++ tests/Translator/HtmlTranslator.phpt | 7 ++++ tests/Translator/TextTranslator.phpt | 7 ++++ 5 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 src/Processors/EntityProcessor.php create mode 100644 tests/Translator/EntityProcessor.phpt diff --git a/src/Processors/EntityProcessor.php b/src/Processors/EntityProcessor.php new file mode 100644 index 0000000..4d0b318 --- /dev/null +++ b/src/Processors/EntityProcessor.php @@ -0,0 +1,60 @@ +textProcessor = $textProcessor; + } + + + public function processMessage($messageText) + { + if ($this->textProcessor === NULL) { + return new Ast\MessageText([$this->decodeEntities($messageText)]); + } + + $messageText = $this->textProcessor->processMessage($messageText); + $parts = []; + + foreach ($messageText->getChildren() as $child) { + if (is_string($child)) { + if ($child !== '') { + $parts[] = $this->decodeEntities($child); + } + + } else { + $parts[] = $child; + } + } + + return new Ast\MessageText($parts); + } + + + /** + * @param non-empty-string $messageText + * @return non-empty-string + */ + private function decodeEntities($messageText) + { + $messageText = html_entity_decode($messageText, ENT_QUOTES | ENT_SUBSTITUTE | ENT_XHTML, 'UTF-8'); + // ENT_XHTML - allows 'all' entities (like ENT_XML) + ' + + if ($messageText === '') { + throw new \Inteve\Translator\InvalidStateException('Decoded string is empty.'); + } + + return $messageText; + } + } diff --git a/src/Processors/TagProcessor.php b/src/Processors/TagProcessor.php index eb23cd2..5350389 100644 --- a/src/Processors/TagProcessor.php +++ b/src/Processors/TagProcessor.php @@ -23,7 +23,7 @@ public function __construct( array $emptyElements = ['br'] ) { - $this->textPartsProcessor = $textPartsProcessor !== NULL ? $textPartsProcessor : new ParametersProcessor; + $this->textPartsProcessor = $textPartsProcessor !== NULL ? $textPartsProcessor : new EntityProcessor(new ParametersProcessor); $this->emptyElements = []; foreach ($emptyElements as $emptyElement) { diff --git a/tests/Translator/EntityProcessor.phpt b/tests/Translator/EntityProcessor.phpt new file mode 100644 index 0000000..690609a --- /dev/null +++ b/tests/Translator/EntityProcessor.phpt @@ -0,0 +1,30 @@ +processMessage('lorem ipsum')); +}); + + +test('Named & codeded entity', function () { + $processor = new EntityProcessor; + Assert::equal(new Ast\MessageText([ + "lorem \xC2\xA0 \" ' ' \r \x20", + ]), $processor->processMessage('lorem   " ' ' ')); +}); + + +test('With parameters', function () { + $processor = new EntityProcessor(new ParametersProcessor); + Assert::equal(new Ast\MessageText([ + '{$test}', + new Ast\Parameter('name'), + ]), $processor->processMessage('{$test}{$name}')); +}); diff --git a/tests/Translator/HtmlTranslator.phpt b/tests/Translator/HtmlTranslator.phpt index daa6ef0..1d3aa12 100644 --- a/tests/Translator/HtmlTranslator.phpt +++ b/tests/Translator/HtmlTranslator.phpt @@ -19,6 +19,7 @@ function createTranslator($lang) 'homepage.hello' => 'Hello, {$name}!', 'homepage.unknow' => 'Hello, lorem {$name|lower}!', 'homepage.br' => 'Hello
friends', + 'homepage.entity' => 'A entity', ]), ]), new Translator\Processors\TagProcessor @@ -61,6 +62,12 @@ test('MessageId', function () { }); +test('Entities', function () { + $translator = createTranslator('en'); + Assert::same("A\xC2\xA0entity", (string) $translator->translate('homepage.entity')); +}); + + test('Prefix', function () { $translator = createTranslator('en')->prefix('homepage'); Assert::same('Hello, John!', (string) $translator->translate('hello', ['name' => 'John'])); diff --git a/tests/Translator/TextTranslator.phpt b/tests/Translator/TextTranslator.phpt index cd9fc29..746f620 100644 --- a/tests/Translator/TextTranslator.phpt +++ b/tests/Translator/TextTranslator.phpt @@ -23,6 +23,7 @@ function createTranslator($lang) 'homepage.hello' => 'Hello!', 'homepage.hello2' => 'Hello, {$name}!', 'homepage.br' => 'Hello
friends', + 'homepage.entity' => 'A entity', ]), ]), new Translator\Processors\TagProcessor @@ -76,6 +77,12 @@ test('MessageId', function () { }); +test('Entities', function () { + $translator = createTranslator('en'); + Assert::same("A\xC2\xA0entity", (string) $translator->translate('homepage.entity')); +}); + + test('Prefix', function () { $translator = createTranslator('en')->prefix('homepage'); Assert::same('Hello, John!', $translator->translate('hello2', ['name' => 'John']));