From 5bdcf4480659156d6388b0a9532bf4e8a417a265 Mon Sep 17 00:00:00 2001 From: Adekunle Date: Wed, 23 Mar 2022 15:21:44 +0100 Subject: [PATCH 1/5] added support for REF field --- src/PhpWord/Element/Field.php | 4 + src/PhpWord/Writer/Word2007/Element/Field.php | 94 +++++++++++++++++++ 2 files changed, 98 insertions(+) diff --git a/src/PhpWord/Element/Field.php b/src/PhpWord/Element/Field.php index b371bb80d7..ed4225f3f1 100644 --- a/src/PhpWord/Element/Field.php +++ b/src/PhpWord/Element/Field.php @@ -91,6 +91,10 @@ class Field extends AbstractElement ], 'options' => ['Path', 'PreserveFormat'], ], + 'REF' => array( + 'properties' => array('name' => ''), + 'options' => array('f', 'h', 'n', 'p', 'r', 't', 'w'), + ), ]; /** diff --git a/src/PhpWord/Writer/Word2007/Element/Field.php b/src/PhpWord/Writer/Word2007/Element/Field.php index 4d7c2a0b46..d96dc39078 100644 --- a/src/PhpWord/Writer/Word2007/Element/Field.php +++ b/src/PhpWord/Writer/Word2007/Element/Field.php @@ -226,4 +226,98 @@ private function buildPropertiesAndOptions(\PhpOffice\PhpWord\Element\Field $ele return $propertiesAndOptions; } + + /** + * Writes a REF field + * + * @param \PhpOffice\PhpWord\Element\Field $element + */ + protected function writeRef(\PhpOffice\PhpWord\Element\Field $element) + { + $xmlWriter = $this->getXmlWriter(); + $this->startElementP(); + + $xmlWriter->startElement('w:r'); + $xmlWriter->startElement('w:fldChar'); + $xmlWriter->writeAttribute('w:fldCharType', 'begin'); + $xmlWriter->endElement(); // w:fldChar + $xmlWriter->endElement(); // w:r + + $instruction = ' ' . $element->getType() . ' '; + + foreach ($element->getProperties() as $property) { + $instruction .= $property . ' '; + } + foreach ($element->getOptions() as $optionKey => $optionValue) { + $instruction .= $this->convertRefOption($optionKey, $optionValue) . ' '; + } + + $xmlWriter->startElement('w:r'); + $this->writeFontStyle(); + $xmlWriter->startElement('w:instrText'); + $xmlWriter->writeAttribute('xml:space', 'preserve'); + $xmlWriter->text($instruction); + $xmlWriter->endElement(); // w:instrText + $xmlWriter->endElement(); // w:r + + if ($element->getText() != null) { + if ($element->getText() instanceof \PhpOffice\PhpWord\Element\TextRun) { + $containerWriter = new Container($xmlWriter, $element->getText(), true); + $containerWriter->write(); + + $xmlWriter->startElement('w:r'); + $xmlWriter->startElement('w:instrText'); + $xmlWriter->text('"' . $this->buildPropertiesAndOptions($element)); + $xmlWriter->endElement(); // w:instrText + $xmlWriter->endElement(); // w:r + + $xmlWriter->startElement('w:r'); + $xmlWriter->startElement('w:instrText'); + $xmlWriter->writeAttribute('xml:space', 'preserve'); + $xmlWriter->text(' '); + $xmlWriter->endElement(); // w:instrText + $xmlWriter->endElement(); // w:r + } + } + + $xmlWriter->startElement('w:r'); + $xmlWriter->startElement('w:fldChar'); + $xmlWriter->writeAttribute('w:fldCharType', 'separate'); + $xmlWriter->endElement(); // w:fldChar + $xmlWriter->endElement(); // w:r + + $xmlWriter->startElement('w:r'); + $xmlWriter->startElement('w:rPr'); + $xmlWriter->startElement('w:noProof'); + $xmlWriter->endElement(); // w:noProof + $xmlWriter->endElement(); // w:rPr + $xmlWriter->writeElement('w:t', $element->getText() != null && is_string($element->getText()) ? $element->getText() : '1'); + $xmlWriter->endElement(); // w:r + + $xmlWriter->startElement('w:r'); + $xmlWriter->startElement('w:fldChar'); + $xmlWriter->writeAttribute('w:fldCharType', 'end'); + $xmlWriter->endElement(); // w:fldChar + $xmlWriter->endElement(); // w:r + + $this->endElementP(); // w:p + } + + private function convertRefOption($optionKey, $optionValue) + { + if ($optionKey === 'NumberSeperatorSequence') { + return '\\d ' . $optionValue; + } + + switch ($optionValue) { + case 'IncrementAndInsertText': return '\\f'; + case 'CreateHyperLink': return '\\h'; + case 'NoTrailingPeriod': return '\\n'; + case 'IncludeAboveOrBelow': return '\\p'; + case 'InsertParagraphNumberRelativeContext': return '\\r'; + case 'SuppressNonDelimeterNonNumericalText': return '\\t'; + case 'InsertParagraphNumberFullContext': return '\\w'; + default: return ''; + } + } } From d6c275cdfa80508426a1611b9dd6bb524c684f5e Mon Sep 17 00:00:00 2001 From: Adekunle Date: Wed, 23 Mar 2022 16:58:54 +0100 Subject: [PATCH 2/5] Spelling correction --- src/PhpWord/Writer/Word2007/Element/Field.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PhpWord/Writer/Word2007/Element/Field.php b/src/PhpWord/Writer/Word2007/Element/Field.php index d96dc39078..21f4f9706f 100644 --- a/src/PhpWord/Writer/Word2007/Element/Field.php +++ b/src/PhpWord/Writer/Word2007/Element/Field.php @@ -315,7 +315,7 @@ private function convertRefOption($optionKey, $optionValue) case 'NoTrailingPeriod': return '\\n'; case 'IncludeAboveOrBelow': return '\\p'; case 'InsertParagraphNumberRelativeContext': return '\\r'; - case 'SuppressNonDelimeterNonNumericalText': return '\\t'; + case 'SuppressNonDelimiterNonNumericalText': return '\\t'; case 'InsertParagraphNumberFullContext': return '\\w'; default: return ''; } From 10b9800c529238aeee9eff3fb1d2bbf521b5b8ac Mon Sep 17 00:00:00 2001 From: Adekunle Date: Wed, 23 Mar 2022 18:55:46 +0100 Subject: [PATCH 3/5] UnitTest and fixes --- src/PhpWord/Writer/Word2007/Element/Field.php | 24 ++++--- .../Writer/Word2007/Element/FieldTest.php | 62 +++++++++++++++++++ 2 files changed, 78 insertions(+), 8 deletions(-) create mode 100644 tests/PhpWord/Writer/Word2007/Element/FieldTest.php diff --git a/src/PhpWord/Writer/Word2007/Element/Field.php b/src/PhpWord/Writer/Word2007/Element/Field.php index 21f4f9706f..f393883b1b 100644 --- a/src/PhpWord/Writer/Word2007/Element/Field.php +++ b/src/PhpWord/Writer/Word2007/Element/Field.php @@ -310,14 +310,22 @@ private function convertRefOption($optionKey, $optionValue) } switch ($optionValue) { - case 'IncrementAndInsertText': return '\\f'; - case 'CreateHyperLink': return '\\h'; - case 'NoTrailingPeriod': return '\\n'; - case 'IncludeAboveOrBelow': return '\\p'; - case 'InsertParagraphNumberRelativeContext': return '\\r'; - case 'SuppressNonDelimiterNonNumericalText': return '\\t'; - case 'InsertParagraphNumberFullContext': return '\\w'; - default: return ''; + case 'IncrementAndInsertText': + return '\\f'; + case 'CreateHyperLink': + return '\\h'; + case 'NoTrailingPeriod': + return '\\n'; + case 'IncludeAboveOrBelow': + return '\\p'; + case 'InsertParagraphNumberRelativeContext': + return '\\r'; + case 'SuppressNonDelimiterNonNumericalText': + return '\\t'; + case 'InsertParagraphNumberFullContext': + return '\\w'; + default: + return ''; } } } diff --git a/tests/PhpWord/Writer/Word2007/Element/FieldTest.php b/tests/PhpWord/Writer/Word2007/Element/FieldTest.php new file mode 100644 index 0000000000..cf8e0fc834 --- /dev/null +++ b/tests/PhpWord/Writer/Word2007/Element/FieldTest.php @@ -0,0 +1,62 @@ +addSection(); + $section->addField( + 'REF', + array( + 'name' => 'my-bookmark', + ), + array( + 'InsertParagraphNumberRelativeContext', + 'CreateHyperLink', + ) + ); + + $section->addListItem('line one item'); + $section->addListItem('line two item'); + $section->addBookmark('my-bookmark'); + $section->addListItem('line three item'); + + $doc = TestHelperDOCX::getDocument($phpWord, 'Word2007'); + + $refFieldPath = '/w:document/w:body/w:p[1]/w:r[2]/w:instrText'; + + $this->assertTrue($doc->elementExists($refFieldPath)); + + $bookMarkElement = $doc->getElement($refFieldPath); + + $this->assertNotNull($bookMarkElement); + + $this->assertEquals(' REF my-bookmark \r \h ', $bookMarkElement->textContent); + + $bookmarkPath = '/w:document/w:body/w:bookmarkStart'; + + $this->assertTrue($doc->elementExists($bookmarkPath)); + $this->assertEquals('my-bookmark', $doc->getElementAttribute("$bookmarkPath", 'w:name')); + } +} From c8951d16c951ad0284ec78dad25dee373511741d Mon Sep 17 00:00:00 2001 From: Adekunle Date: Thu, 24 Mar 2022 10:18:08 +0100 Subject: [PATCH 4/5] updated documentation --- docs/elements.rst | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/elements.rst diff --git a/docs/elements.rst b/docs/elements.rst new file mode 100644 index 0000000000..e69de29bb2 From 195a32633c254803b4dacfbde62716e6634ba3c4 Mon Sep 17 00:00:00 2001 From: Adekunle Adekoya Date: Tue, 14 May 2024 09:02:41 +0100 Subject: [PATCH 5/5] Update doc docs/elements.rst. Aded ref support --- docs/elements.rst | 0 docs/usage/elements/field.md | 9 +++++++++ 2 files changed, 9 insertions(+) delete mode 100644 docs/elements.rst diff --git a/docs/elements.rst b/docs/elements.rst deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/usage/elements/field.md b/docs/usage/elements/field.md index fe8e9756fc..415b4d170e 100644 --- a/docs/usage/elements/field.md +++ b/docs/usage/elements/field.md @@ -8,6 +8,7 @@ Currently the following fields are supported: - XE - INDEX - FILENAME +- REF ``` php addField('XE', array(), array(), $fieldText); //this actually adds the index $section->addField('INDEX', array(), array('\\e " " \\h "A" \\c "3"'), 'right click to update index'); + +//Adding reference to a bookmark +$fieldText->addField('REF', [ + 'name' => 'bookmark' + ], [ + 'InsertParagraphNumberRelativeContext', + 'CreateHyperLink', + ]); ```