Skip to content

Commit 838b63e

Browse files
committed
Handle custom macro chars
Update main regexp so that the full macro is matched (only `{{var}` was matched instead of `{{var}}`, which is a problem because we want to move tags after the whole macro)
1 parent 2a0307a commit 838b63e

File tree

2 files changed

+31
-9
lines changed

2 files changed

+31
-9
lines changed

src/PhpWord/TemplateProcessor.php

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,14 +1063,24 @@ public function saveAs($fileName): void
10631063
*/
10641064
protected function fixBrokenMacros($documentPart)
10651065
{
1066-
$brokenMacroOpeningChars = substr(self::$macroOpeningChars, 0, 1);
1067-
$endMacroOpeningChars = substr(self::$macroOpeningChars, 1);
1068-
$macroClosingChars = self::$macroClosingChars;
1069-
10701066
return preg_replace_callback(
1071-
'/\\' . $brokenMacroOpeningChars . '(?:\\' . $endMacroOpeningChars . '|[^{$]*\>\{)[^' . $macroClosingChars . '$]*\}/U',
1067+
sprintf(
1068+
'/%s.+%s/U',
1069+
implode('', array_map(
1070+
function (string $char) {
1071+
return preg_quote($char) . '(?:<[^>]+>)*';
1072+
},
1073+
str_split(self::$macroOpeningChars)
1074+
)),
1075+
implode('', array_map(
1076+
function (string $char) {
1077+
return '(?:<[^>]+>)*' . preg_quote($char);
1078+
},
1079+
str_split(self::$macroClosingChars)
1080+
))
1081+
),
10721082
function ($match) {
1073-
preg_match_all('/<.+?\s*\/?\s*>/si', $match[0], $tags);
1083+
preg_match_all('/<[^>]+>/s', $match[0], $tags);
10741084
$tags = implode('', $tags[0]);
10751085
$tags = str_replace('<w:t>', '<w:t xml:space="preserve">', $tags);
10761086

tests/PhpWordTests/TemplateProcessorTest.php

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1294,19 +1294,31 @@ public function testFixBrokenMacrosWithCustomMacro(): void
12941294
self::assertEquals('<w:r><w:t>{{documentContent}}</w:t></w:r>', $fixed);
12951295

12961296
$fixed = $templateProcessor->fixBrokenMacros('<w:r><w:t>{</w:t><w:t>{documentContent}}</w:t></w:r>');
1297-
self::assertEquals('<w:r><w:t>{{documentContent}}</w:t></w:r>', $fixed);
1297+
self::assertEquals('<w:r><w:t>{{documentContent}}</w:t><w:t xml:space="preserve"></w:t></w:r>', $fixed);
1298+
1299+
$fixed = $templateProcessor->fixBrokenMacros('<w:r><w:t>{</w:t><w:t>{documentContent}}</w:t></w:r>');
1300+
self::assertEquals('<w:r><w:t>{{documentContent}}</w:t><w:t xml:space="preserve"></w:t></w:r>', $fixed);
12981301

12991302
$fixed = $templateProcessor->fixBrokenMacros('<w:r><w:t>$1500</w:t><w:t>{{documentContent}}</w:t></w:r>');
13001303
self::assertEquals('<w:r><w:t>$1500</w:t><w:t>{{documentContent}}</w:t></w:r>', $fixed);
13011304

13021305
$fixed = $templateProcessor->fixBrokenMacros('<w:r><w:t>$1500</w:t><w:t>{</w:t><w:t>{documentContent}}</w:t></w:r>');
1303-
self::assertEquals('<w:r><w:t>$1500</w:t><w:t>{{documentContent}}</w:t></w:r>', $fixed);
1306+
self::assertEquals('<w:r><w:t>$1500</w:t><w:t>{{documentContent}}</w:t><w:t xml:space="preserve"></w:t></w:r>', $fixed);
13041307

13051308
$fixed = $templateProcessor->fixBrokenMacros('<w:r><w:t>25$ plus some info {hint}</w:t></w:r>');
13061309
self::assertEquals('<w:r><w:t>25$ plus some info {hint}</w:t></w:r>', $fixed);
13071310

13081311
$fixed = $templateProcessor->fixBrokenMacros('<w:t>$</w:t></w:r><w:bookmarkStart w:id="0" w:name="_GoBack"/><w:bookmarkEnd w:id="0"/><w:r><w:t xml:space="preserve">15,000.00. </w:t></w:r><w:r w:rsidR="0056499B"><w:t>{</w:t></w:r><w:r w:rsidR="00573DFD" w:rsidRPr="00573DFD"><w:rPr><w:iCs/></w:rPr><w:t>{</w:t></w:r><w:proofErr w:type="spellStart"/><w:r w:rsidR="00573DFD" w:rsidRPr="00573DFD"><w:rPr><w:iCs/></w:rPr><w:t>variable_name</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r w:rsidR="00573DFD" w:rsidRPr="00573DFD"><w:rPr><w:iCs/></w:rPr><w:t>}}</w:t></w:r>');
1309-
self::assertEquals('<w:t>$</w:t></w:r><w:bookmarkStart w:id="0" w:name="_GoBack"/><w:bookmarkEnd w:id="0"/><w:r><w:t xml:space="preserve">15,000.00. </w:t></w:r><w:r w:rsidR="0056499B"><w:t>{{variable_name}}</w:t></w:r>', $fixed);
1312+
self::assertEquals('<w:t>$</w:t></w:r><w:bookmarkStart w:id="0" w:name="_GoBack"/><w:bookmarkEnd w:id="0"/><w:r><w:t xml:space="preserve">15,000.00. </w:t></w:r><w:r w:rsidR="0056499B"><w:t>{{variable_name}}</w:t></w:r><w:r w:rsidR="00573DFD" w:rsidRPr="00573DFD"><w:rPr><w:iCs/></w:rPr><w:t xml:space="preserve"></w:t></w:r><w:proofErr w:type="spellStart"/><w:r w:rsidR="00573DFD" w:rsidRPr="00573DFD"><w:rPr><w:iCs/></w:rPr><w:t xml:space="preserve"></w:t></w:r><w:proofErr w:type="spellEnd"/><w:r w:rsidR="00573DFD" w:rsidRPr="00573DFD"><w:rPr><w:iCs/></w:rPr><w:t xml:space="preserve"></w:t></w:r>', $fixed);
1313+
1314+
$fixed = $templateProcessor->fixBrokenMacros('<w:r><w:t>before {{</w:t></w:r><w:r><w:t xml:space="preserve">variable}} </w:t></w:r><w:r><w:t>after</w:t></w:r>');
1315+
self::assertEquals('<w:r><w:t>before {{variable}}</w:t></w:r><w:r><w:t xml:space="preserve"> </w:t></w:r><w:r><w:t>after</w:t></w:r>', $fixed);
1316+
1317+
$fixed = $templateProcessor->fixBrokenMacros('<w:r><w:t>before {{</w:t></w:r><w:r><w:t>variable</w:t></w:r><w:r><w:t xml:space="preserve">}} </w:t></w:r><w:r><w:t>after</w:t></w:r>');
1318+
self::assertEquals('<w:r><w:t>before {{variable}}</w:t></w:r><w:r><w:t xml:space="preserve"></w:t></w:r><w:r><w:t xml:space="preserve"> </w:t></w:r><w:r><w:t>after</w:t></w:r>', $fixed);
1319+
1320+
$fixed = $templateProcessor->fixBrokenMacros('<w:r><w:t>{{</w:t></w:r><w:r><w:t>variable1</w:t></w:r><w:r><w:t>}} {{</w:t></w:r><w:r><w:t>variable2</w:t></w:r><w:r><w:t>}}</w:t></w:r>');
1321+
self::assertEquals('<w:r><w:t>{{variable1}}</w:t></w:r><w:r><w:t xml:space="preserve"></w:t></w:r><w:r><w:t xml:space="preserve"> {{variable2}}</w:t></w:r><w:r><w:t xml:space="preserve"></w:t></w:r><w:r><w:t xml:space="preserve"></w:t></w:r>', $fixed);
13101322
}
13111323

13121324
/**

0 commit comments

Comments
 (0)