From 260bb75fc21660bc087824530a4c31100af10c62 Mon Sep 17 00:00:00 2001 From: "Yurii.sio2" Date: Sat, 8 Dec 2018 00:22:04 +0200 Subject: [PATCH] Fix TemplateProcessor :: fixBrokenMacros; (#1502) * Fix TemplateProcessor :: fixBrokenMacros; * add unit test for fixBrokenMacros --- CHANGELOG.md | 1 + src/PhpWord/TemplateProcessor.php | 10 ++---- tests/PhpWord/TemplateProcessorTest.php | 32 +++++++++++++++++++ .../_includes/TestableTemplateProcesor.php | 30 +++++++++++++++++ 4 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 tests/PhpWord/_includes/TestableTemplateProcesor.php diff --git a/CHANGELOG.md b/CHANGELOG.md index a273326a..735f6d4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ v0.16.0 (xx dec 2018) ### Fixed - Fix regex in `cloneBlock` function @nicoder #1269 - HTML Title Writer loses text when Title contains a TextRun instead a string. @begnini #1436 +- Fix regex in fixBrokenMacros, make it less greedy @MuriloSo @brainwood @yurii-sio2 #1502 #1345 - 240 twips are being added to line spacing, should not happen when using lineRule fixed @troosan #1509 #1505 - Adding table layout to the generated HTML @aarangara #1441 - Fix loading of Sharepoint document @Garrcomm #1498 diff --git a/src/PhpWord/TemplateProcessor.php b/src/PhpWord/TemplateProcessor.php index 0d4bfdeb..86d0c07d 100644 --- a/src/PhpWord/TemplateProcessor.php +++ b/src/PhpWord/TemplateProcessor.php @@ -442,17 +442,13 @@ class TemplateProcessor */ protected function fixBrokenMacros($documentPart) { - $fixedDocumentPart = $documentPart; - - $fixedDocumentPart = preg_replace_callback( - '|\$[^{]*\{[^}]*\}|U', + return preg_replace_callback( + '/\$(?:\{|[^{$]*\>\{)[^}$]*\}/U', function ($match) { return strip_tags($match[0]); }, - $fixedDocumentPart + $documentPart ); - - return $fixedDocumentPart; } /** diff --git a/tests/PhpWord/TemplateProcessorTest.php b/tests/PhpWord/TemplateProcessorTest.php index 1513486e..8839200d 100644 --- a/tests/PhpWord/TemplateProcessorTest.php +++ b/tests/PhpWord/TemplateProcessorTest.php @@ -277,6 +277,38 @@ final class TemplateProcessorTest extends \PHPUnit\Framework\TestCase } } + /** + * Template macros can be fixed. + * + * @covers ::fixBrokenMacros + * @test + */ + public function testFixBrokenMacros() + { + $templateProcessor = new TestableTemplateProcesor(); + + $fixed = $templateProcessor->fixBrokenMacros('normal text'); + $this->assertEquals('normal text', $fixed); + + $fixed = $templateProcessor->fixBrokenMacros('${documentContent}'); + $this->assertEquals('${documentContent}', $fixed); + + $fixed = $templateProcessor->fixBrokenMacros('${documentContent}'); + $this->assertEquals('${documentContent}', $fixed); + + $fixed = $templateProcessor->fixBrokenMacros('$1500${documentContent}'); + $this->assertEquals('$1500${documentContent}', $fixed); + + $fixed = $templateProcessor->fixBrokenMacros('$1500${documentContent}'); + $this->assertEquals('$1500${documentContent}', $fixed); + + $fixed = $templateProcessor->fixBrokenMacros('25$ plus some info {hint}'); + $this->assertEquals('25$ plus some info {hint}', $fixed); + + $fixed = $templateProcessor->fixBrokenMacros('$15,000.00. ${variable_name}'); + $this->assertEquals('$15,000.00. ${variable_name}', $fixed); + } + public function testMainPartNameDetection() { $templateProcessor = new TemplateProcessor(__DIR__ . '/_files/templates/document22-xml.docx'); diff --git a/tests/PhpWord/_includes/TestableTemplateProcesor.php b/tests/PhpWord/_includes/TestableTemplateProcesor.php new file mode 100644 index 00000000..f76da417 --- /dev/null +++ b/tests/PhpWord/_includes/TestableTemplateProcesor.php @@ -0,0 +1,30 @@ +