From 3a7dd774a2fa723a05b6c3345997f41f838a4b6c Mon Sep 17 00:00:00 2001 From: Sven Ahrens Date: Tue, 1 Sep 2020 18:13:25 +0200 Subject: [PATCH 1/6] Add support for mc:AlternateContent --- .gitignore | 3 +++ src/PhpWord/Reader/Word2007/AbstractPart.php | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/.gitignore b/.gitignore index dd858cea..da661ee3 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,6 @@ phpword.ini /.project /nbproject /.php_cs.cache +docker-compose.yml +/phpdocker +/public diff --git a/src/PhpWord/Reader/Word2007/AbstractPart.php b/src/PhpWord/Reader/Word2007/AbstractPart.php index 06dfe37b..17dbceb4 100644 --- a/src/PhpWord/Reader/Word2007/AbstractPart.php +++ b/src/PhpWord/Reader/Word2007/AbstractPart.php @@ -292,6 +292,19 @@ abstract class AbstractPart $parent->addTextBreak(); } elseif ($node->nodeName == 'w:tab') { $parent->addText("\t"); + } elseif ($node->nodeName == 'mc:AlternateContent') { + $hasChildren = $node->childNodes->length > 0; + + if ($hasChildren) { + $origin = $node->childNodes->item($node->childNodes->length - 1); + + if ($origin->nodeValue) { + // TextRun + $textContent = htmlspecialchars($origin->nodeValue, ENT_QUOTES, 'UTF-8'); + + $parent->addText($textContent, $fontStyle, $paragraphStyle); + } + } } elseif ($node->nodeName == 'w:t' || $node->nodeName == 'w:delText') { // TextRun $textContent = htmlspecialchars($xmlReader->getValue('.', $node), ENT_QUOTES, 'UTF-8'); From 63d1ffceb8f5aa627d706fc02d82b6ccd37a7691 Mon Sep 17 00:00:00 2001 From: Sven Ahrens Date: Tue, 1 Sep 2020 18:14:27 +0200 Subject: [PATCH 2/6] Restore gitignore --- .gitignore | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitignore b/.gitignore index da661ee3..dd858cea 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,3 @@ phpword.ini /.project /nbproject /.php_cs.cache -docker-compose.yml -/phpdocker -/public From 58e0200fbdb5634becb4c777f9624998935a38ff Mon Sep 17 00:00:00 2001 From: Sven Ahrens Date: Wed, 2 Sep 2020 12:12:48 +0200 Subject: [PATCH 3/6] Get fallback value instead of taking the last element --- src/PhpWord/Reader/Word2007/AbstractPart.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/PhpWord/Reader/Word2007/AbstractPart.php b/src/PhpWord/Reader/Word2007/AbstractPart.php index 17dbceb4..2bc71b3a 100644 --- a/src/PhpWord/Reader/Word2007/AbstractPart.php +++ b/src/PhpWord/Reader/Word2007/AbstractPart.php @@ -293,14 +293,14 @@ abstract class AbstractPart } elseif ($node->nodeName == 'w:tab') { $parent->addText("\t"); } elseif ($node->nodeName == 'mc:AlternateContent') { - $hasChildren = $node->childNodes->length > 0; - - if ($hasChildren) { - $origin = $node->childNodes->item($node->childNodes->length - 1); + if ($node->hasChildNodes()) { + // Get fallback instead of mc:Choice to make sure it is compatible + $fallbackElements = $node->getElementsByTagName('Fallback'); - if ($origin->nodeValue) { + if ($fallbackElements->length) { + $fallback = $fallbackElements->item(0); // TextRun - $textContent = htmlspecialchars($origin->nodeValue, ENT_QUOTES, 'UTF-8'); + $textContent = htmlspecialchars($fallback->nodeValue, ENT_QUOTES, 'UTF-8'); $parent->addText($textContent, $fontStyle, $paragraphStyle); } From ae34ae9518efc2bb6bdfc150e03b24fd72848702 Mon Sep 17 00:00:00 2001 From: Sven Ahrens Date: Wed, 2 Sep 2020 13:03:29 +0200 Subject: [PATCH 4/6] Add testcase --- composer.json | 2 +- tests/PhpWord/Reader/Word2007/ElementTest.php | 43 +++++++++++++++++++ .../PhpWord/_includes/AbstractTestReader.php | 2 +- 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index f5f751ec..e8720b7b 100644 --- a/composer.json +++ b/composer.json @@ -36,7 +36,7 @@ ], "scripts": { "test": [ - "phpunit --color=always" + "phpunit --color=always --filter testReadAlternateContent" ], "test-no-coverage": [ "phpunit --color=always --no-coverage" diff --git a/tests/PhpWord/Reader/Word2007/ElementTest.php b/tests/PhpWord/Reader/Word2007/ElementTest.php index cb72ef9f..a0875a67 100644 --- a/tests/PhpWord/Reader/Word2007/ElementTest.php +++ b/tests/PhpWord/Reader/Word2007/ElementTest.php @@ -25,6 +25,49 @@ use PhpOffice\PhpWord\Element\TrackChange; */ class ElementTest extends AbstractTestReader { + /** + * Test reading of alternate content value + */ + public function testReadAlternateContent() + { + $documentXml = ' + + + + + + + + + + + + + + Test node value + + + + + + + + + + '; + + $phpWord = $this->getDocumentFromString(array('document' => $documentXml)); + + $elements = $phpWord->getSection(0)->getElements(); + + $this->assertInstanceOf('PhpOffice\PhpWord\Element\TextRun', $elements[0]); + $this->assertInstanceOf('PhpOffice\PhpWord\Element\Text', $elements[0]->getElement(0)); + + $text = $elements[0]; + + $this->assertEquals('Test node value', trim($text->getElement(0)->getText())); + } + /** * Test reading of textbreak */ diff --git a/tests/PhpWord/_includes/AbstractTestReader.php b/tests/PhpWord/_includes/AbstractTestReader.php index d9097d71..12bd437a 100644 --- a/tests/PhpWord/_includes/AbstractTestReader.php +++ b/tests/PhpWord/_includes/AbstractTestReader.php @@ -24,7 +24,7 @@ abstract class AbstractTestReader extends \PHPUnit\Framework\TestCase { private $parts = array( 'styles' => array('class' => 'PhpOffice\PhpWord\Reader\Word2007\Styles', 'xml' => '{toReplace}'), - 'document' => array('class' => 'PhpOffice\PhpWord\Reader\Word2007\Document', 'xml' => '{toReplace}'), + 'document' => array('class' => 'PhpOffice\PhpWord\Reader\Word2007\Document', 'xml' => '{toReplace}'), 'footnotes' => array('class' => 'PhpOffice\PhpWord\Reader\Word2007\Footnotes', 'xml' => '{toReplace}'), 'endnotes' => array('class' => 'PhpOffice\PhpWord\Reader\Word2007\Endnotes', 'xml' => '{toReplace}'), 'settings' => array('class' => 'PhpOffice\PhpWord\Reader\Word2007\Settings', 'xml' => '{toReplace}'), From 51034af207cd5f39636a541b7705e33edb09a69c Mon Sep 17 00:00:00 2001 From: Sven Ahrens Date: Wed, 2 Sep 2020 13:03:49 +0200 Subject: [PATCH 5/6] Remove filter option --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index e8720b7b..f5f751ec 100644 --- a/composer.json +++ b/composer.json @@ -36,7 +36,7 @@ ], "scripts": { "test": [ - "phpunit --color=always --filter testReadAlternateContent" + "phpunit --color=always" ], "test-no-coverage": [ "phpunit --color=always --no-coverage" From 166a136f221b9d2c8dcfd0f740925492ce29d262 Mon Sep 17 00:00:00 2001 From: Sven Ahrens Date: Wed, 2 Sep 2020 14:36:08 +0200 Subject: [PATCH 6/6] Fix spacing --- tests/PhpWord/Reader/Word2007/ElementTest.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/PhpWord/Reader/Word2007/ElementTest.php b/tests/PhpWord/Reader/Word2007/ElementTest.php index a0875a67..d5db6be8 100644 --- a/tests/PhpWord/Reader/Word2007/ElementTest.php +++ b/tests/PhpWord/Reader/Word2007/ElementTest.php @@ -59,12 +59,9 @@ class ElementTest extends AbstractTestReader $phpWord = $this->getDocumentFromString(array('document' => $documentXml)); $elements = $phpWord->getSection(0)->getElements(); - $this->assertInstanceOf('PhpOffice\PhpWord\Element\TextRun', $elements[0]); $this->assertInstanceOf('PhpOffice\PhpWord\Element\Text', $elements[0]->getElement(0)); - $text = $elements[0]; - $this->assertEquals('Test node value', trim($text->getElement(0)->getText())); }