From f7f0bd134305dcab3875b62fda175d11fba4cc51 Mon Sep 17 00:00:00 2001 From: Cip Date: Fri, 29 Aug 2014 10:26:41 +0300 Subject: [PATCH 01/24] commit --- docs/elements.rst | 7 ++ samples/Sample_31_TrackChanges.php | 23 +++++ src/PhpWord/Element/AbstractElement.php | 29 ++++++ src/PhpWord/Element/ChangedElement.php | 92 ++++++++++++++++++++ src/PhpWord/Writer/Word2007/Element/Text.php | 54 +++++++++++- 5 files changed, 203 insertions(+), 2 deletions(-) create mode 100644 samples/Sample_31_TrackChanges.php create mode 100644 src/PhpWord/Element/ChangedElement.php diff --git a/docs/elements.rst b/docs/elements.rst index eb70f9ad9b..106e4a2c51 100644 --- a/docs/elements.rst +++ b/docs/elements.rst @@ -71,6 +71,13 @@ as follow: $section->addText($text, [$fontStyle], [$paragraphStyle]); $textrun = $section->addTextRun([$paragraphStyle]); +If you want to enable track changes on added text you can mark it as INSERTED or DELETED by a specific user at a given time: + +.. code-block:: php + + $text = $section->addText('Hello World!'); + $text->setChanged(\PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED, 'Fred', time()); + Text styles ~~~~~~~~~~~ diff --git a/samples/Sample_31_TrackChanges.php b/samples/Sample_31_TrackChanges.php new file mode 100644 index 0000000000..7a47cf2c81 --- /dev/null +++ b/samples/Sample_31_TrackChanges.php @@ -0,0 +1,23 @@ +addSection(); + +$text = $section->addText('Hello World!'); + +$text = $section->addText('Hello World!'); +$text->setChanged(\PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED, 'Fred', time()-1800); + +$text = $section->addText('Hello World!'); +$text->setChanged(\PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED, 'Barney', time()-3600); + +// Save file +echo write($phpWord, basename(__FILE__, '.php'), $writers); +if (!CLI) { + include_once 'Sample_Footer.php'; +} diff --git a/src/PhpWord/Element/AbstractElement.php b/src/PhpWord/Element/AbstractElement.php index ca45ef23f9..60c8683dc3 100644 --- a/src/PhpWord/Element/AbstractElement.php +++ b/src/PhpWord/Element/AbstractElement.php @@ -93,6 +93,13 @@ abstract class AbstractElement */ private $nestedLevel = 0; + /** + * changed element info + * + * @var object + */ + private $changed; + /** * Get PhpWord * @@ -262,4 +269,26 @@ protected function setStyle($styleObject, $styleValue = null, $returnObject = fa return $style; } + + /** + * Set changed + * + * @param int $type TYPE_INSERTED|TYPE_DELETED + * @param string $author + * @param timestamp $date allways in UTC + */ + public function setChanged($type, $author, $date) + { + $this->changed = new ChangedElement($type, $author, $date); + } + + /** + * Get changed + * + * @return object + */ + public function getChanged() + { + return $this->changed; + } } diff --git a/src/PhpWord/Element/ChangedElement.php b/src/PhpWord/Element/ChangedElement.php new file mode 100644 index 0000000000..c2d11f30e0 --- /dev/null +++ b/src/PhpWord/Element/ChangedElement.php @@ -0,0 +1,92 @@ +changeType = $changeType; + $this->author = $author; + $this->date = $date; + } + + /** + * Get change type + * + * @return int + */ + public function getChangeType() + { + return $this->changeType; + } + + /** + * Get author name of change + * + * @return string + */ + public function getAuthor() + { + return $this->author; + } + + /** + * Get date of change + * + * @return timestamp + */ + public function getDate() + { + return $this->date; + } +} diff --git a/src/PhpWord/Writer/Word2007/Element/Text.php b/src/PhpWord/Writer/Word2007/Element/Text.php index 64c4b766cb..3de0c1ce87 100644 --- a/src/PhpWord/Writer/Word2007/Element/Text.php +++ b/src/PhpWord/Writer/Word2007/Element/Text.php @@ -41,16 +41,27 @@ public function write() $this->writeOpeningWP(); + $this->writeOpeningChanged(); + $xmlWriter->startElement('w:r'); - $this->writeFontStyle(); + $textElement = 'w:t'; + //'w:delText' in case of deleted text + $changed = $element->getChanged(); + if ($changed instanceof \PhpOffice\PhpWord\Element\ChangedElement) { + if ($changed->getChangeType() == \PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED) { + $textElement = 'w:delText'; + } + } + $xmlWriter->startElement($textElement); - $xmlWriter->startElement('w:t'); $xmlWriter->writeAttribute('xml:space', 'preserve'); $xmlWriter->writeRaw($this->getText($element->getText())); $xmlWriter->endElement(); $xmlWriter->endElement(); // w:r + $this->writeClosingChanged(); + $this->writeClosingWP(); } @@ -119,4 +130,43 @@ protected function writeFontStyle() $styleWriter->setIsInline(true); $styleWriter->write(); } + + /** + * Write opening of changed element + */ + protected function writeOpeningChanged() + { + $element = $this->getElement(); + $changed = $element->getChanged(); + + $xmlWriter = $this->getXmlWriter(); + + if ($changed instanceof \PhpOffice\PhpWord\Element\ChangedElement) { + if (($changed->getChangeType() == \PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED)) { + $xmlWriter->startElement('w:ins'); + } elseif ($changed->getChangeType() == \PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED) { + $xmlWriter->startElement('w:del'); + } + $xmlWriter->writeAttribute('w:author', $changed->getAuthor()); + $date = $changed->getDate(); + $date = date("Y-m-d\TH:i:s\Z", $date); + $xmlWriter->writeAttribute('w:date', $date); + $xmlWriter->writeAttribute('w:id', $element->getElementId()); + } + } + + /** + * Write ending + */ + protected function writeClosingChanged() + { + $element = $this->getElement(); + $changed = $element->getChanged(); + + $xmlWriter = $this->getXmlWriter(); + + if ($changed instanceof \PhpOffice\PhpWord\Element\ChangedElement) { + $xmlWriter->endElement(); // w:ins|w:del + } + } } From 932bef8663f8582dc8a9f25419457d506c73fa7f Mon Sep 17 00:00:00 2001 From: Cip Date: Fri, 5 Sep 2014 16:05:21 +0300 Subject: [PATCH 02/24] add changed information to HTML writer --- src/PhpWord/Writer/HTML/Element/Text.php | 33 ++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/PhpWord/Writer/HTML/Element/Text.php b/src/PhpWord/Writer/HTML/Element/Text.php index 52e7a6b5a5..0426ae0e47 100644 --- a/src/PhpWord/Writer/HTML/Element/Text.php +++ b/src/PhpWord/Writer/HTML/Element/Text.php @@ -116,6 +116,27 @@ protected function writeOpening() $content .= ""; } + //open changed tag + $element = $this->element; + $changed = $element->getChanged(); + if ($changed instanceof \PhpOffice\PhpWord\Element\ChangedElement) { + if (($changed->getChangeType() == \PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED)) { + $content .= 'getChangeType() == \PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED) { + $content .= 'getDate()); + $changedProp = array('changed' => array('author'=>$changed->getAuthor(), + 'date'=>$date, + 'id'=>$element->getElementId())); + $content .= json_encode($changedProp); + $content .= '\' '; + $date_user = date("Y-m-d H:i:s", $changed->getDate()); + $content .= 'title="'.$changed->getAuthor().' - '.$date_user.'" '; + $content .= '>'; + } + return $content; } @@ -127,6 +148,18 @@ protected function writeOpening() protected function writeClosing() { $content = ''; + + //close changed tag + $element = $this->element; + $changed = $element->getChanged(); + if ($changed instanceof \PhpOffice\PhpWord\Element\ChangedElement) { + if (($changed->getChangeType() == \PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED)) { + $content .= ''; + } elseif ($changed->getChangeType() == \PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED) { + $content .= ''; + } + } + if (!$this->withoutP) { $content .= $this->closingText; $content .= "

" . PHP_EOL; From 0154b4e84cfafd8801c2942df2d1ead82190b71c Mon Sep 17 00:00:00 2001 From: Cip Date: Tue, 9 Sep 2014 10:45:45 +0300 Subject: [PATCH 03/24] add missing writeFontStyle --- src/PhpWord/Writer/Word2007/Element/Text.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/PhpWord/Writer/Word2007/Element/Text.php b/src/PhpWord/Writer/Word2007/Element/Text.php index 3de0c1ce87..8d660f3fa9 100644 --- a/src/PhpWord/Writer/Word2007/Element/Text.php +++ b/src/PhpWord/Writer/Word2007/Element/Text.php @@ -45,6 +45,8 @@ public function write() $xmlWriter->startElement('w:r'); + $this->writeFontStyle(); + $textElement = 'w:t'; //'w:delText' in case of deleted text $changed = $element->getChanged(); From c2ecafac228e3c895f17425d696c6fd42f2518c4 Mon Sep 17 00:00:00 2001 From: Cip Date: Thu, 21 Dec 2017 16:00:08 +0200 Subject: [PATCH 04/24] commit --- src/PhpWord/Autoloader.php | 55 ++++++++++++++++++++ src/PhpWord/Element/ChangedElement.php | 3 +- src/PhpWord/Reader/ODText/Content.php | 22 ++++++++ src/PhpWord/Reader/Word2007/AbstractPart.php | 28 ++++++++-- src/PhpWord/Writer/HTML/Element/Text.php | 5 +- 5 files changed, 103 insertions(+), 10 deletions(-) create mode 100644 src/PhpWord/Autoloader.php diff --git a/src/PhpWord/Autoloader.php b/src/PhpWord/Autoloader.php new file mode 100644 index 0000000000..c467f836c3 --- /dev/null +++ b/src/PhpWord/Autoloader.php @@ -0,0 +1,55 @@ +changeType = $changeType; - $this->author = $author; - $this->date = $date; } /** diff --git a/src/PhpWord/Reader/ODText/Content.php b/src/PhpWord/Reader/ODText/Content.php index 8843d8a276..d64e0b6c6f 100644 --- a/src/PhpWord/Reader/ODText/Content.php +++ b/src/PhpWord/Reader/ODText/Content.php @@ -48,6 +48,25 @@ public function read(PhpWord $phpWord) $section->addTitle($node->nodeValue, $depth); break; case 'text:p': // Paragraph + //\Yii::info($node, 'debug'); + //\Yii::info($node->nodeValue, 'debug'); + //\Yii::info($node->hasChildNodes(), 'debug'); + + $children = $node->childNodes; + foreach ($children as $child) { + switch($child->nodeName){ + case 'text:change-start': + \Yii::info($child->getAttribute('text:change-id'), 'debug'); + break; + case 'text:change-end': + \Yii::info($child->getAttribute('text:change-id'), 'debug'); + break; + case 'text:change': + \Yii::info($child->getAttribute('text:change-id'), 'debug'); + break; + } + } + $section->addText($node->nodeValue); break; case 'text:list': // List @@ -56,6 +75,9 @@ public function read(PhpWord $phpWord) // $listStyleName = $xmlReader->getAttribute('text:style-name', $listItem); $section->addListItem($listItem->nodeValue, 0); } + break; + case 'text:tracked-changes': + break; } } diff --git a/src/PhpWord/Reader/Word2007/AbstractPart.php b/src/PhpWord/Reader/Word2007/AbstractPart.php index 6a48fd4681..0dc51c4155 100644 --- a/src/PhpWord/Reader/Word2007/AbstractPart.php +++ b/src/PhpWord/Reader/Word2007/AbstractPart.php @@ -99,8 +99,7 @@ public function setRels($value) * @todo Get font style for preserve text */ protected function readParagraph(XMLReader $xmlReader, \DOMElement $domNode, $parent, $docPart = 'document') - { - // Paragraph style + { // Paragraph style $paragraphStyle = null; $headingMatches = array(); if ($xmlReader->elementExists('w:pPr', $domNode)) { @@ -156,8 +155,10 @@ protected function readParagraph(XMLReader $xmlReader, \DOMElement $domNode, $pa } else { // Text and TextRun $runCount = $xmlReader->countElements('w:r', $domNode); + $insCount = $xmlReader->countElements('w:ins', $domNode); + $delCount = $xmlReader->countElements('w:del', $domNode); $linkCount = $xmlReader->countElements('w:hyperlink', $domNode); - $runLinkCount = $runCount + $linkCount; + $runLinkCount = $runCount + $insCount + $delCount + $linkCount; if (0 == $runLinkCount) { $parent->addTextBreak(null, $paragraphStyle); } else { @@ -185,6 +186,13 @@ protected function readParagraph(XMLReader $xmlReader, \DOMElement $domNode, $pa */ protected function readRun(XMLReader $xmlReader, \DOMElement $domNode, $parent, $docPart, $paragraphStyle = null) { + if (in_array($domNode->nodeName, ['w:ins', 'w:del'])) { + $nodes = $xmlReader->getElements('*', $domNode); + foreach ($nodes as $node) { + return $this->readRun($xmlReader, $node, $parent, $docPart, $paragraphStyle); + } + } + if (!in_array($domNode->nodeName, array('w:r', 'w:hyperlink'))) { return; } @@ -228,8 +236,18 @@ protected function readRun(XMLReader $xmlReader, \DOMElement $domNode, $parent, } } else { // TextRun - $textContent = $xmlReader->getValue('w:t', $domNode); - $parent->addText($textContent, $fontStyle, $paragraphStyle); + if($domNode->parentNode->nodeName == 'w:del') { + $textContent = $xmlReader->getValue('w:delText', $domNode); + } else { + $textContent = $xmlReader->getValue('w:t', $domNode); + } + $element = $parent->addText($textContent, $fontStyle, $paragraphStyle); + if (in_array($domNode->parentNode->nodeName, ['w:ins', 'w:del'])) { + $type = ($domNode->parentNode->nodeName == 'w:del')?\PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED:\PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED; + $author=$domNode->parentNode->getAttribute('w:author'); + $date = \DateTime::createFromFormat ('Y-m-d\TH:i:s\Z', $domNode->parentNode->getAttribute('w:date')); + $element->setChanged($type, $author, $date); + } } } } diff --git a/src/PhpWord/Writer/HTML/Element/Text.php b/src/PhpWord/Writer/HTML/Element/Text.php index 528f51054e..1566089c00 100644 --- a/src/PhpWord/Writer/HTML/Element/Text.php +++ b/src/PhpWord/Writer/HTML/Element/Text.php @@ -131,13 +131,12 @@ protected function writeOpening() $content .= 'getDate()); $changedProp = array('changed' => array('author'=>$changed->getAuthor(), - 'date'=>$date, + 'date'=>$changed->getDate()->format('Y-m-d\TH:i:s\Z'), 'id'=>$element->getElementId())); $content .= json_encode($changedProp); $content .= '\' '; - $date_user = date("Y-m-d H:i:s", $changed->getDate()); + $date_user = $changed->getDate()->format('Y-m-d H:i:s'); $content .= 'title="'.$changed->getAuthor().' - '.$date_user.'" '; $content .= '>'; } From b602b1dd7a05f23ce9a79a8cdf63b23d9490c60c Mon Sep 17 00:00:00 2001 From: Cip Date: Thu, 21 Dec 2017 16:00:28 +0200 Subject: [PATCH 05/24] commit --- src/PhpWord/Autoloader.php | 55 -------------------------------------- 1 file changed, 55 deletions(-) delete mode 100644 src/PhpWord/Autoloader.php diff --git a/src/PhpWord/Autoloader.php b/src/PhpWord/Autoloader.php deleted file mode 100644 index c467f836c3..0000000000 --- a/src/PhpWord/Autoloader.php +++ /dev/null @@ -1,55 +0,0 @@ - Date: Fri, 22 Dec 2017 15:39:25 +0200 Subject: [PATCH 06/24] commit --- src/PhpWord/Element/AbstractElement.php | 2 +- src/PhpWord/Reader/ODText/Content.php | 49 +++++++++++++++++++------ 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/src/PhpWord/Element/AbstractElement.php b/src/PhpWord/Element/AbstractElement.php index 41ea69f3ac..80a49d33c7 100644 --- a/src/PhpWord/Element/AbstractElement.php +++ b/src/PhpWord/Element/AbstractElement.php @@ -98,7 +98,7 @@ abstract class AbstractElement * * @var object */ - private $changed; + public $changed; /** * Parent container type diff --git a/src/PhpWord/Reader/ODText/Content.php b/src/PhpWord/Reader/ODText/Content.php index d64e0b6c6f..b21f616cb5 100644 --- a/src/PhpWord/Reader/ODText/Content.php +++ b/src/PhpWord/Reader/ODText/Content.php @@ -36,6 +36,8 @@ public function read(PhpWord $phpWord) { $xmlReader = new XMLReader(); $xmlReader->getDomFromZip($this->docFile, $this->xmlFile); + + $trackedChanges = []; $nodes = $xmlReader->getElements('office:body/office:text/*'); if ($nodes->length > 0) { @@ -48,26 +50,38 @@ public function read(PhpWord $phpWord) $section->addTitle($node->nodeValue, $depth); break; case 'text:p': // Paragraph - //\Yii::info($node, 'debug'); - //\Yii::info($node->nodeValue, 'debug'); - //\Yii::info($node->hasChildNodes(), 'debug'); - $children = $node->childNodes; foreach ($children as $child) { switch($child->nodeName){ case 'text:change-start': - \Yii::info($child->getAttribute('text:change-id'), 'debug'); - break; + $changeId = $child->getAttribute('text:change-id'); + if(isset($trackedChanges[$changeId])) { + $changed = $trackedChanges[$changeId]; + } + break; case 'text:change-end': - \Yii::info($child->getAttribute('text:change-id'), 'debug'); - break; + unset($changed); + break; case 'text:change': - \Yii::info($child->getAttribute('text:change-id'), 'debug'); - break; + $changeId = $child->getAttribute('text:change-id'); + if(isset($trackedChanges[$changeId])) { + $changed = $trackedChanges[$changeId]; + } + break; } } - $section->addText($node->nodeValue); + $element = $section->addText($node->nodeValue); + if(isset($changed)) { + $element->changed = $changed['changed']; + if(isset($changed['textNodes'])) { + foreach ($changed['textNodes'] as $changedNode) { + $element = $section->addText($changedNode->nodeValue); + $element->changed = $changed['changed']; + } + } + } + break; case 'text:list': // List $listItems = $xmlReader->getElements('text:list-item/text:p', $node); @@ -77,7 +91,18 @@ public function read(PhpWord $phpWord) } break; case 'text:tracked-changes': - + $changedRegions = $xmlReader->getElements('text:changed-region', $node); + foreach ($changedRegions as $changedRegion) { + $type = ($changedRegion->firstChild->nodeName == 'text:insertion')?\PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED:\PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED; + $author = $xmlReader->getElements('office:change-info/dc:creator', $changedRegion->firstChild)[0]->nodeValue; + $date = $xmlReader->getElements('office:change-info/dc:date', $changedRegion->firstChild)[0]->nodeValue; + $date = preg_replace('/\.\d+$/', '', $date); + $date = \DateTime::createFromFormat ('Y-m-d\TH:i:s', $date); + $changed = new \PhpOffice\PhpWord\Element\ChangedElement($type, $author, $date); + $textNodes = $xmlReader->getElements('text:deletion/text:p', $changedRegion); + $trackedChanges[$changedRegion->getAttribute('text:id')] = ['changed'=>$changed, + 'textNodes'=>$textNodes]; + } break; } } From b1d07ab6b28cff9855822ba3d6baa7c1c201fe0f Mon Sep 17 00:00:00 2001 From: Cip Date: Fri, 22 Dec 2017 15:47:58 +0200 Subject: [PATCH 07/24] commit --- src/PhpWord/Writer/HTML/Element/Text.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PhpWord/Writer/HTML/Element/Text.php b/src/PhpWord/Writer/HTML/Element/Text.php index 1566089c00..672ff66a44 100644 --- a/src/PhpWord/Writer/HTML/Element/Text.php +++ b/src/PhpWord/Writer/HTML/Element/Text.php @@ -136,8 +136,8 @@ protected function writeOpening() 'id'=>$element->getElementId())); $content .= json_encode($changedProp); $content .= '\' '; - $date_user = $changed->getDate()->format('Y-m-d H:i:s'); - $content .= 'title="'.$changed->getAuthor().' - '.$date_user.'" '; + $dateUser = $changed->getDate()->format('Y-m-d H:i:s'); + $content .= 'title="'.$changed->getAuthor().' - '.$dateUser.'" '; $content .= '>'; } From 60588b3a82e47c9901e785d74a6a42d8a817dc7e Mon Sep 17 00:00:00 2001 From: Cip Date: Mon, 8 Jan 2018 11:21:27 +0200 Subject: [PATCH 08/24] commit --- src/PhpWord/Reader/ODText/Content.php | 42 ++++++++++---------- src/PhpWord/Reader/Word2007/AbstractPart.php | 12 +++--- src/PhpWord/Writer/Word2007/Element/Text.php | 4 +- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/PhpWord/Reader/ODText/Content.php b/src/PhpWord/Reader/ODText/Content.php index b21f616cb5..c0b041bbaf 100644 --- a/src/PhpWord/Reader/ODText/Content.php +++ b/src/PhpWord/Reader/ODText/Content.php @@ -37,7 +37,7 @@ public function read(PhpWord $phpWord) $xmlReader = new XMLReader(); $xmlReader->getDomFromZip($this->docFile, $this->xmlFile); - $trackedChanges = []; + $trackedChanges = array(); $nodes = $xmlReader->getElements('office:body/office:text/*'); if ($nodes->length > 0) { @@ -52,29 +52,29 @@ public function read(PhpWord $phpWord) case 'text:p': // Paragraph $children = $node->childNodes; foreach ($children as $child) { - switch($child->nodeName){ - case 'text:change-start': - $changeId = $child->getAttribute('text:change-id'); - if(isset($trackedChanges[$changeId])) { - $changed = $trackedChanges[$changeId]; - } + switch ($child->nodeName){ + case 'text:change-start': + $changeId = $child->getAttribute('text:change-id'); + if (isset($trackedChanges[$changeId])) { + $changed = $trackedChanges[$changeId]; + } break; - case 'text:change-end': - unset($changed); + case 'text:change-end': + unset($changed); break; - case 'text:change': - $changeId = $child->getAttribute('text:change-id'); - if(isset($trackedChanges[$changeId])) { - $changed = $trackedChanges[$changeId]; - } + case 'text:change': + $changeId = $child->getAttribute('text:change-id'); + if (isset($trackedChanges[$changeId])) { + $changed = $trackedChanges[$changeId]; + } break; - } + } } $element = $section->addText($node->nodeValue); - if(isset($changed)) { + if (isset($changed)) { $element->changed = $changed['changed']; - if(isset($changed['textNodes'])) { + if (isset($changed['textNodes'])) { foreach ($changed['textNodes'] as $changedNode) { $element = $section->addText($changedNode->nodeValue); $element->changed = $changed['changed']; @@ -82,15 +82,15 @@ public function read(PhpWord $phpWord) } } - break; + break; case 'text:list': // List $listItems = $xmlReader->getElements('text:list-item/text:p', $node); foreach ($listItems as $listItem) { // $listStyleName = $xmlReader->getAttribute('text:style-name', $listItem); $section->addListItem($listItem->nodeValue, 0); } - break; - case 'text:tracked-changes': + break; + case 'text:tracked-changes': $changedRegions = $xmlReader->getElements('text:changed-region', $node); foreach ($changedRegions as $changedRegion) { $type = ($changedRegion->firstChild->nodeName == 'text:insertion')?\PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED:\PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED; @@ -103,7 +103,7 @@ public function read(PhpWord $phpWord) $trackedChanges[$changedRegion->getAttribute('text:id')] = ['changed'=>$changed, 'textNodes'=>$textNodes]; } - break; + break; } } } diff --git a/src/PhpWord/Reader/Word2007/AbstractPart.php b/src/PhpWord/Reader/Word2007/AbstractPart.php index 0dc51c4155..b41dcae4ce 100644 --- a/src/PhpWord/Reader/Word2007/AbstractPart.php +++ b/src/PhpWord/Reader/Word2007/AbstractPart.php @@ -98,8 +98,8 @@ public function setRels($value) * * @todo Get font style for preserve text */ - protected function readParagraph(XMLReader $xmlReader, \DOMElement $domNode, $parent, $docPart = 'document') - { // Paragraph style + protected function readParagraph(XMLReader $xmlReader, \DOMElement $domNode, $parent, $docPart = 'document') { + // Paragraph style $paragraphStyle = null; $headingMatches = array(); if ($xmlReader->elementExists('w:pPr', $domNode)) { @@ -186,7 +186,7 @@ protected function readParagraph(XMLReader $xmlReader, \DOMElement $domNode, $pa */ protected function readRun(XMLReader $xmlReader, \DOMElement $domNode, $parent, $docPart, $paragraphStyle = null) { - if (in_array($domNode->nodeName, ['w:ins', 'w:del'])) { + if (in_array($domNode->nodeName, array('w:ins', 'w:del'))) { $nodes = $xmlReader->getElements('*', $domNode); foreach ($nodes as $node) { return $this->readRun($xmlReader, $node, $parent, $docPart, $paragraphStyle); @@ -236,16 +236,16 @@ protected function readRun(XMLReader $xmlReader, \DOMElement $domNode, $parent, } } else { // TextRun - if($domNode->parentNode->nodeName == 'w:del') { + if ($domNode->parentNode->nodeName == 'w:del') { $textContent = $xmlReader->getValue('w:delText', $domNode); - } else { + } else { $textContent = $xmlReader->getValue('w:t', $domNode); } $element = $parent->addText($textContent, $fontStyle, $paragraphStyle); if (in_array($domNode->parentNode->nodeName, ['w:ins', 'w:del'])) { $type = ($domNode->parentNode->nodeName == 'w:del')?\PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED:\PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED; $author=$domNode->parentNode->getAttribute('w:author'); - $date = \DateTime::createFromFormat ('Y-m-d\TH:i:s\Z', $domNode->parentNode->getAttribute('w:date')); + $date = \DateTime::createFromFormat('Y-m-d\TH:i:s\Z', $domNode->parentNode->getAttribute('w:date')); $element->setChanged($type, $author, $date); } } diff --git a/src/PhpWord/Writer/Word2007/Element/Text.php b/src/PhpWord/Writer/Word2007/Element/Text.php index 12edd3a8cd..e8b9f91bac 100644 --- a/src/PhpWord/Writer/Word2007/Element/Text.php +++ b/src/PhpWord/Writer/Word2007/Element/Text.php @@ -39,7 +39,7 @@ public function write() $changed = $element->getChanged(); if ($changed) { - $this->writeOpeningChanged(); + $this->writeOpeningChanged(); } $xmlWriter->startElement('w:r'); @@ -49,7 +49,7 @@ public function write() $textElement = 'w:t'; //'w:delText' in case of deleted text if (($changed) && ($changed->getChangeType() == \PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED)) { - $textElement = 'w:delText'; + $textElement = 'w:delText'; } $xmlWriter->startElement($textElement); From 0244ad86be4494aed8a7f620f615b7db90a66a07 Mon Sep 17 00:00:00 2001 From: Cip Date: Mon, 8 Jan 2018 11:41:39 +0200 Subject: [PATCH 09/24] commit --- src/PhpWord/Reader/ODText/Content.php | 23 ++++++++++---------- src/PhpWord/Reader/Word2007/AbstractPart.php | 2 +- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/PhpWord/Reader/ODText/Content.php b/src/PhpWord/Reader/ODText/Content.php index c0b041bbaf..b2d242e2f2 100644 --- a/src/PhpWord/Reader/ODText/Content.php +++ b/src/PhpWord/Reader/ODText/Content.php @@ -52,22 +52,22 @@ public function read(PhpWord $phpWord) case 'text:p': // Paragraph $children = $node->childNodes; foreach ($children as $child) { - switch ($child->nodeName){ + switch ($child->nodeName) { case 'text:change-start': $changeId = $child->getAttribute('text:change-id'); if (isset($trackedChanges[$changeId])) { $changed = $trackedChanges[$changeId]; } - break; + break; case 'text:change-end': unset($changed); - break; + break; case 'text:change': $changeId = $child->getAttribute('text:change-id'); if (isset($trackedChanges[$changeId])) { $changed = $trackedChanges[$changeId]; } - break; + break; } } @@ -81,29 +81,30 @@ public function read(PhpWord $phpWord) } } } - - break; + break; case 'text:list': // List $listItems = $xmlReader->getElements('text:list-item/text:p', $node); foreach ($listItems as $listItem) { // $listStyleName = $xmlReader->getAttribute('text:style-name', $listItem); $section->addListItem($listItem->nodeValue, 0); } - break; + break; case 'text:tracked-changes': $changedRegions = $xmlReader->getElements('text:changed-region', $node); foreach ($changedRegions as $changedRegion) { $type = ($changedRegion->firstChild->nodeName == 'text:insertion')?\PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED:\PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED; - $author = $xmlReader->getElements('office:change-info/dc:creator', $changedRegion->firstChild)[0]->nodeValue; - $date = $xmlReader->getElements('office:change-info/dc:date', $changedRegion->firstChild)[0]->nodeValue; + $creatorNode = $xmlReader->getElements('office:change-info/dc:creator', $changedRegion->firstChild); + $author = $creatorNode[0]->nodeValue; + $dateNode = $xmlReader->getElements('office:change-info/dc:date', $changedRegion->firstChild); + $date = $dateNode[0]->nodeValue; $date = preg_replace('/\.\d+$/', '', $date); - $date = \DateTime::createFromFormat ('Y-m-d\TH:i:s', $date); + $date = \DateTime::createFromFormat('Y-m-d\TH:i:s', $date); $changed = new \PhpOffice\PhpWord\Element\ChangedElement($type, $author, $date); $textNodes = $xmlReader->getElements('text:deletion/text:p', $changedRegion); $trackedChanges[$changedRegion->getAttribute('text:id')] = ['changed'=>$changed, 'textNodes'=>$textNodes]; } - break; + break; } } } diff --git a/src/PhpWord/Reader/Word2007/AbstractPart.php b/src/PhpWord/Reader/Word2007/AbstractPart.php index b41dcae4ce..6ed937e80c 100644 --- a/src/PhpWord/Reader/Word2007/AbstractPart.php +++ b/src/PhpWord/Reader/Word2007/AbstractPart.php @@ -242,7 +242,7 @@ protected function readRun(XMLReader $xmlReader, \DOMElement $domNode, $parent, $textContent = $xmlReader->getValue('w:t', $domNode); } $element = $parent->addText($textContent, $fontStyle, $paragraphStyle); - if (in_array($domNode->parentNode->nodeName, ['w:ins', 'w:del'])) { + if (in_array($domNode->parentNode->nodeName, array('w:ins', 'w:del'))) { $type = ($domNode->parentNode->nodeName == 'w:del')?\PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED:\PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED; $author=$domNode->parentNode->getAttribute('w:author'); $date = \DateTime::createFromFormat('Y-m-d\TH:i:s\Z', $domNode->parentNode->getAttribute('w:date')); From 317d676a250c99ed1567c01a3f80b8f0f5819120 Mon Sep 17 00:00:00 2001 From: Cip Date: Mon, 8 Jan 2018 12:05:23 +0200 Subject: [PATCH 10/24] commit --- src/PhpWord/Reader/ODText/Content.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PhpWord/Reader/ODText/Content.php b/src/PhpWord/Reader/ODText/Content.php index b2d242e2f2..f1c4ff7739 100644 --- a/src/PhpWord/Reader/ODText/Content.php +++ b/src/PhpWord/Reader/ODText/Content.php @@ -101,8 +101,8 @@ public function read(PhpWord $phpWord) $date = \DateTime::createFromFormat('Y-m-d\TH:i:s', $date); $changed = new \PhpOffice\PhpWord\Element\ChangedElement($type, $author, $date); $textNodes = $xmlReader->getElements('text:deletion/text:p', $changedRegion); - $trackedChanges[$changedRegion->getAttribute('text:id')] = ['changed'=>$changed, - 'textNodes'=>$textNodes]; + $trackedChanges[$changedRegion->getAttribute('text:id')] = array('changed'=>$changed, + 'textNodes'=>$textNodes); } break; } From 252aec0cd533231284d93474bbacb4052f7ab6d6 Mon Sep 17 00:00:00 2001 From: Cip Date: Mon, 15 Jan 2018 12:25:21 +0200 Subject: [PATCH 11/24] commit --- src/PhpWord/Reader/Word2007/AbstractPart.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/PhpWord/Reader/Word2007/AbstractPart.php b/src/PhpWord/Reader/Word2007/AbstractPart.php index 6ed937e80c..22b120b311 100644 --- a/src/PhpWord/Reader/Word2007/AbstractPart.php +++ b/src/PhpWord/Reader/Word2007/AbstractPart.php @@ -98,7 +98,8 @@ public function setRels($value) * * @todo Get font style for preserve text */ - protected function readParagraph(XMLReader $xmlReader, \DOMElement $domNode, $parent, $docPart = 'document') { + protected function readParagraph(XMLReader $xmlReader, \DOMElement $domNode, $parent, $docPart = 'document') + { // Paragraph style $paragraphStyle = null; $headingMatches = array(); From aad3e476957501e00f1558ff3f1a0cac365dfdc5 Mon Sep 17 00:00:00 2001 From: Cip Date: Mon, 15 Jan 2018 16:39:29 +0200 Subject: [PATCH 12/24] commit --- samples/Sample_31_TrackChanges.php | 6 ++-- src/PhpWord/Element/AbstractElement.php | 2 +- src/PhpWord/Element/ChangedElement.php | 30 ++++++++++---------- src/PhpWord/Reader/ODText/Content.php | 4 +-- src/PhpWord/Reader/Word2007/AbstractPart.php | 2 +- src/PhpWord/Writer/HTML/Element/Text.php | 4 +-- src/PhpWord/Writer/Word2007/Element/Text.php | 8 +++--- 7 files changed, 28 insertions(+), 28 deletions(-) diff --git a/samples/Sample_31_TrackChanges.php b/samples/Sample_31_TrackChanges.php index 7a47cf2c81..a94e57c0c7 100644 --- a/samples/Sample_31_TrackChanges.php +++ b/samples/Sample_31_TrackChanges.php @@ -2,7 +2,7 @@ include_once 'Sample_Header.php'; // New Word Document -echo date('H:i:s') , " Create new PhpWord object" , EOL; +echo date('H:i:s') , ' Create new PhpWord object' , EOL; $phpWord = new \PhpOffice\PhpWord\PhpWord(); // New portrait section @@ -11,10 +11,10 @@ $text = $section->addText('Hello World!'); $text = $section->addText('Hello World!'); -$text->setChanged(\PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED, 'Fred', time()-1800); +$text->setChanged(\PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED, 'Fred', time() - 1800); $text = $section->addText('Hello World!'); -$text->setChanged(\PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED, 'Barney', time()-3600); +$text->setChanged(\PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED, 'Barney', time() - 3600); // Save file echo write($phpWord, basename(__FILE__, '.php'), $writers); diff --git a/src/PhpWord/Element/AbstractElement.php b/src/PhpWord/Element/AbstractElement.php index 80a49d33c7..198893736e 100644 --- a/src/PhpWord/Element/AbstractElement.php +++ b/src/PhpWord/Element/AbstractElement.php @@ -450,7 +450,7 @@ public function getChanged() { return $this->changed; } - + /** * Set enum value * diff --git a/src/PhpWord/Element/ChangedElement.php b/src/PhpWord/Element/ChangedElement.php index 6dbd0dd69d..b352df6cd9 100644 --- a/src/PhpWord/Element/ChangedElement.php +++ b/src/PhpWord/Element/ChangedElement.php @@ -10,7 +10,7 @@ * file that was distributed with this source code. For the full list of * contributors, visit https://github.com/PHPOffice/PHPWord/contributors. * - * @link https://github.com/PHPOffice/PHPWord + * @see https://github.com/PHPOffice/PHPWord * @copyright 2010-2014 PHPWord contributors * @license http://www.gnu.org/licenses/lgpl.txt LGPL version 3 */ @@ -23,22 +23,22 @@ class ChangedElement extends TrackChange { /** - * change type TYPE_INSERTED|TYPE_DELETED - * - * @var int - */ + * change type TYPE_INSERTED|TYPE_DELETED + * + * @var int + */ private $changeType; const TYPE_INSERTED = 1; const TYPE_DELETED = 2; /** - * Create a new Changed Element - * - * @param int $changeType - * @param string $author - * @param timestamp $date allways in UTC - */ + * Create a new Changed Element + * + * @param int $changeType + * @param string $author + * @param timestamp $date allways in UTC + */ public function __construct($changeType, $author, $date) { parent::__construct($author, $date); @@ -46,10 +46,10 @@ public function __construct($changeType, $author, $date) } /** - * Get change type - * - * @return int - */ + * Get change type + * + * @return int + */ public function getChangeType() { return $this->changeType; diff --git a/src/PhpWord/Reader/ODText/Content.php b/src/PhpWord/Reader/ODText/Content.php index f1c4ff7739..b026278723 100644 --- a/src/PhpWord/Reader/ODText/Content.php +++ b/src/PhpWord/Reader/ODText/Content.php @@ -92,7 +92,7 @@ public function read(PhpWord $phpWord) case 'text:tracked-changes': $changedRegions = $xmlReader->getElements('text:changed-region', $node); foreach ($changedRegions as $changedRegion) { - $type = ($changedRegion->firstChild->nodeName == 'text:insertion')?\PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED:\PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED; + $type = ($changedRegion->firstChild->nodeName == 'text:insertion') ? \PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED : \PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED; $creatorNode = $xmlReader->getElements('office:change-info/dc:creator', $changedRegion->firstChild); $author = $creatorNode[0]->nodeValue; $dateNode = $xmlReader->getElements('office:change-info/dc:date', $changedRegion->firstChild); @@ -102,7 +102,7 @@ public function read(PhpWord $phpWord) $changed = new \PhpOffice\PhpWord\Element\ChangedElement($type, $author, $date); $textNodes = $xmlReader->getElements('text:deletion/text:p', $changedRegion); $trackedChanges[$changedRegion->getAttribute('text:id')] = array('changed'=>$changed, - 'textNodes'=>$textNodes); + 'textNodes'=>$textNodes, ); } break; } diff --git a/src/PhpWord/Reader/Word2007/AbstractPart.php b/src/PhpWord/Reader/Word2007/AbstractPart.php index 22b120b311..5a484c261c 100644 --- a/src/PhpWord/Reader/Word2007/AbstractPart.php +++ b/src/PhpWord/Reader/Word2007/AbstractPart.php @@ -244,7 +244,7 @@ protected function readRun(XMLReader $xmlReader, \DOMElement $domNode, $parent, } $element = $parent->addText($textContent, $fontStyle, $paragraphStyle); if (in_array($domNode->parentNode->nodeName, array('w:ins', 'w:del'))) { - $type = ($domNode->parentNode->nodeName == 'w:del')?\PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED:\PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED; + $type = ($domNode->parentNode->nodeName == 'w:del') ? \PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED : \PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED; $author=$domNode->parentNode->getAttribute('w:author'); $date = \DateTime::createFromFormat('Y-m-d\TH:i:s\Z', $domNode->parentNode->getAttribute('w:date')); $element->setChanged($type, $author, $date); diff --git a/src/PhpWord/Writer/HTML/Element/Text.php b/src/PhpWord/Writer/HTML/Element/Text.php index 672ff66a44..b5099e4195 100644 --- a/src/PhpWord/Writer/HTML/Element/Text.php +++ b/src/PhpWord/Writer/HTML/Element/Text.php @@ -133,11 +133,11 @@ protected function writeOpening() $changedProp = array('changed' => array('author'=>$changed->getAuthor(), 'date'=>$changed->getDate()->format('Y-m-d\TH:i:s\Z'), - 'id'=>$element->getElementId())); + 'id'=>$element->getElementId(), )); $content .= json_encode($changedProp); $content .= '\' '; $dateUser = $changed->getDate()->format('Y-m-d H:i:s'); - $content .= 'title="'.$changed->getAuthor().' - '.$dateUser.'" '; + $content .= 'title="' . $changed->getAuthor() . ' - ' . $dateUser . '" '; $content .= '>'; } diff --git a/src/PhpWord/Writer/Word2007/Element/Text.php b/src/PhpWord/Writer/Word2007/Element/Text.php index e8b9f91bac..5884bd3e02 100644 --- a/src/PhpWord/Writer/Word2007/Element/Text.php +++ b/src/PhpWord/Writer/Word2007/Element/Text.php @@ -64,8 +64,8 @@ public function write() } /** - * Write opening of changed element - */ + * Write opening of changed element + */ protected function writeOpeningChanged() { $element = $this->getElement(); @@ -86,8 +86,8 @@ protected function writeOpeningChanged() } /** - * Write ending - */ + * Write ending + */ protected function writeClosingChanged() { $element = $this->getElement(); From 414f1641c4c3ec6badb6cecbdf71b001079ddbcf Mon Sep 17 00:00:00 2001 From: Cip Date: Mon, 15 Jan 2018 17:07:29 +0200 Subject: [PATCH 13/24] commit --- src/PhpWord/Element/ChangedElement.php | 2 +- src/PhpWord/Reader/ODText/Content.php | 8 ++++---- src/PhpWord/Reader/Word2007/AbstractPart.php | 2 +- src/PhpWord/Writer/HTML/Element/Text.php | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/PhpWord/Element/ChangedElement.php b/src/PhpWord/Element/ChangedElement.php index b352df6cd9..39b0fb00c7 100644 --- a/src/PhpWord/Element/ChangedElement.php +++ b/src/PhpWord/Element/ChangedElement.php @@ -30,7 +30,7 @@ class ChangedElement extends TrackChange private $changeType; const TYPE_INSERTED = 1; - const TYPE_DELETED = 2; + const TYPE_DELETED = 2; /** * Create a new Changed Element diff --git a/src/PhpWord/Reader/ODText/Content.php b/src/PhpWord/Reader/ODText/Content.php index b026278723..ec029f9a9b 100644 --- a/src/PhpWord/Reader/ODText/Content.php +++ b/src/PhpWord/Reader/ODText/Content.php @@ -36,7 +36,7 @@ public function read(PhpWord $phpWord) { $xmlReader = new XMLReader(); $xmlReader->getDomFromZip($this->docFile, $this->xmlFile); - + $trackedChanges = array(); $nodes = $xmlReader->getElements('office:body/office:text/*'); @@ -101,11 +101,11 @@ public function read(PhpWord $phpWord) $date = \DateTime::createFromFormat('Y-m-d\TH:i:s', $date); $changed = new \PhpOffice\PhpWord\Element\ChangedElement($type, $author, $date); $textNodes = $xmlReader->getElements('text:deletion/text:p', $changedRegion); - $trackedChanges[$changedRegion->getAttribute('text:id')] = array('changed'=>$changed, - 'textNodes'=>$textNodes, ); + $trackedChanges[$changedRegion->getAttribute('text:id')] = array('changed' => $changed, + 'textNodes'=> $textNodes, ); } break; - } + } } } } diff --git a/src/PhpWord/Reader/Word2007/AbstractPart.php b/src/PhpWord/Reader/Word2007/AbstractPart.php index 5a484c261c..6905fc3123 100644 --- a/src/PhpWord/Reader/Word2007/AbstractPart.php +++ b/src/PhpWord/Reader/Word2007/AbstractPart.php @@ -245,7 +245,7 @@ protected function readRun(XMLReader $xmlReader, \DOMElement $domNode, $parent, $element = $parent->addText($textContent, $fontStyle, $paragraphStyle); if (in_array($domNode->parentNode->nodeName, array('w:ins', 'w:del'))) { $type = ($domNode->parentNode->nodeName == 'w:del') ? \PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED : \PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED; - $author=$domNode->parentNode->getAttribute('w:author'); + $author = $domNode->parentNode->getAttribute('w:author'); $date = \DateTime::createFromFormat('Y-m-d\TH:i:s\Z', $domNode->parentNode->getAttribute('w:date')); $element->setChanged($type, $author, $date); } diff --git a/src/PhpWord/Writer/HTML/Element/Text.php b/src/PhpWord/Writer/HTML/Element/Text.php index b5099e4195..720d8fdb2e 100644 --- a/src/PhpWord/Writer/HTML/Element/Text.php +++ b/src/PhpWord/Writer/HTML/Element/Text.php @@ -131,9 +131,9 @@ protected function writeOpening() $content .= ' array('author'=>$changed->getAuthor(), - 'date'=>$changed->getDate()->format('Y-m-d\TH:i:s\Z'), - 'id'=>$element->getElementId(), )); + $changedProp = array('changed' => array('author'=> $changed->getAuthor(), + 'date' => $changed->getDate()->format('Y-m-d\TH:i:s\Z'), + 'id' => $element->getElementId(), )); $content .= json_encode($changedProp); $content .= '\' '; $dateUser = $changed->getDate()->format('Y-m-d H:i:s'); From 4a87b6326d2ef46178f592670c87f7e3c41193f2 Mon Sep 17 00:00:00 2001 From: Cip Date: Wed, 17 Jan 2018 15:08:07 +0200 Subject: [PATCH 14/24] commit --- src/PhpWord/Reader/ODText/Content.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PhpWord/Reader/ODText/Content.php b/src/PhpWord/Reader/ODText/Content.php index ec029f9a9b..4f42c12f95 100644 --- a/src/PhpWord/Reader/ODText/Content.php +++ b/src/PhpWord/Reader/ODText/Content.php @@ -105,7 +105,7 @@ public function read(PhpWord $phpWord) 'textNodes'=> $textNodes, ); } break; - } + } } } } From 35d0484a6d1e9615de1c332236311466b82d6499 Mon Sep 17 00:00:00 2001 From: Cip Date: Wed, 17 Jan 2018 15:35:02 +0200 Subject: [PATCH 15/24] commit --- src/PhpWord/Element/ChangedElement.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PhpWord/Element/ChangedElement.php b/src/PhpWord/Element/ChangedElement.php index 39b0fb00c7..72a80fa24c 100644 --- a/src/PhpWord/Element/ChangedElement.php +++ b/src/PhpWord/Element/ChangedElement.php @@ -37,7 +37,7 @@ class ChangedElement extends TrackChange * * @param int $changeType * @param string $author - * @param timestamp $date allways in UTC + * @param \DateTime $date */ public function __construct($changeType, $author, $date) { From e35f30a65a4656780e9fff584806cbe1e62aca32 Mon Sep 17 00:00:00 2001 From: Cip Date: Wed, 17 Jan 2018 15:48:36 +0200 Subject: [PATCH 16/24] commit --- src/PhpWord/Element/ChangedElement.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PhpWord/Element/ChangedElement.php b/src/PhpWord/Element/ChangedElement.php index 72a80fa24c..38dfa3cb27 100644 --- a/src/PhpWord/Element/ChangedElement.php +++ b/src/PhpWord/Element/ChangedElement.php @@ -37,7 +37,7 @@ class ChangedElement extends TrackChange * * @param int $changeType * @param string $author - * @param \DateTime $date + * @param \DateTime $date */ public function __construct($changeType, $author, $date) { From 42b6549f1ca30aeab5688a6997936589efe1ea2b Mon Sep 17 00:00:00 2001 From: Cip Date: Wed, 17 Jan 2018 16:50:52 +0200 Subject: [PATCH 17/24] commit --- src/PhpWord/Reader/Word2007/AbstractPart.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/PhpWord/Reader/Word2007/AbstractPart.php b/src/PhpWord/Reader/Word2007/AbstractPart.php index 6905fc3123..dc8fd35401 100644 --- a/src/PhpWord/Reader/Word2007/AbstractPart.php +++ b/src/PhpWord/Reader/Word2007/AbstractPart.php @@ -14,7 +14,6 @@ * @copyright 2010-2017 PHPWord contributors * @license http://www.gnu.org/licenses/lgpl.txt LGPL version 3 */ - namespace PhpOffice\PhpWord\Reader\Word2007; use PhpOffice\Common\XMLReader; @@ -193,7 +192,7 @@ protected function readRun(XMLReader $xmlReader, \DOMElement $domNode, $parent, return $this->readRun($xmlReader, $node, $parent, $docPart, $paragraphStyle); } } - + if (!in_array($domNode->nodeName, array('w:r', 'w:hyperlink'))) { return; } From ef63c92ac22ac92bf465863b86365c68bfa53f5f Mon Sep 17 00:00:00 2001 From: Cip Date: Wed, 17 Jan 2018 16:52:10 +0200 Subject: [PATCH 18/24] commit --- src/PhpWord/Reader/ODText/Content.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/PhpWord/Reader/ODText/Content.php b/src/PhpWord/Reader/ODText/Content.php index 4f42c12f95..7f4b44e8a1 100644 --- a/src/PhpWord/Reader/ODText/Content.php +++ b/src/PhpWord/Reader/ODText/Content.php @@ -14,7 +14,6 @@ * @copyright 2010-2017 PHPWord contributors * @license http://www.gnu.org/licenses/lgpl.txt LGPL version 3 */ - namespace PhpOffice\PhpWord\Reader\ODText; use PhpOffice\Common\XMLReader; @@ -70,7 +69,6 @@ public function read(PhpWord $phpWord) break; } } - $element = $section->addText($node->nodeValue); if (isset($changed)) { $element->changed = $changed['changed']; From 7689ad32cfcb21020fc8750c1574bf6cabd952a2 Mon Sep 17 00:00:00 2001 From: Cip Date: Wed, 17 Jan 2018 16:53:32 +0200 Subject: [PATCH 19/24] commit --- src/PhpWord/Writer/HTML/Element/Text.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PhpWord/Writer/HTML/Element/Text.php b/src/PhpWord/Writer/HTML/Element/Text.php index 720d8fdb2e..cc5d1c59bc 100644 --- a/src/PhpWord/Writer/HTML/Element/Text.php +++ b/src/PhpWord/Writer/HTML/Element/Text.php @@ -163,7 +163,7 @@ protected function writeClosing() $content .= ''; } } - + if (!$this->withoutP) { if (Settings::isOutputEscapingEnabled()) { $content .= $this->escaper->escapeHtml($this->closingText); From 86f3558ffb5e49411f3194d8f41b6fc1f966e2f5 Mon Sep 17 00:00:00 2001 From: troosan Date: Thu, 25 Jan 2018 22:28:48 +0100 Subject: [PATCH 20/24] refactor track changes --- samples/Sample_31_TrackChanges.php | 23 ----- samples/Sample_39_TrackChanges.php | 29 ++++++ samples/resources/Sample_11_ReadWord2007.docx | Bin 67881 -> 63320 bytes samples/resources/Sample_24_ReadODText.odt | Bin 11952 -> 11540 bytes src/PhpWord/Element/AbstractContainer.php | 2 +- src/PhpWord/Element/AbstractElement.php | 34 ++++--- src/PhpWord/Element/ChangedElement.php | 57 ----------- src/PhpWord/Element/Comment.php | 4 +- src/PhpWord/Element/TrackChange.php | 31 +++++- src/PhpWord/Reader/ODText/Content.php | 18 ++-- src/PhpWord/Reader/Word2007/AbstractPart.php | 9 +- src/PhpWord/Writer/HTML/Element/Text.php | 93 ++++++++++++------ src/PhpWord/Writer/ODText/Element/Text.php | 58 +++++++---- src/PhpWord/Writer/ODText/Part/Content.php | 54 ++++++++++ src/PhpWord/Writer/Word2007/Element/Text.php | 48 ++++----- tests/PhpWord/Element/TrackChangeTest.php | 44 +++++++++ tests/PhpWord/Writer/Word2007/ElementTest.php | 17 ++++ 17 files changed, 340 insertions(+), 181 deletions(-) delete mode 100644 samples/Sample_31_TrackChanges.php create mode 100644 samples/Sample_39_TrackChanges.php delete mode 100644 src/PhpWord/Element/ChangedElement.php create mode 100644 tests/PhpWord/Element/TrackChangeTest.php diff --git a/samples/Sample_31_TrackChanges.php b/samples/Sample_31_TrackChanges.php deleted file mode 100644 index a94e57c0c7..0000000000 --- a/samples/Sample_31_TrackChanges.php +++ /dev/null @@ -1,23 +0,0 @@ -addSection(); - -$text = $section->addText('Hello World!'); - -$text = $section->addText('Hello World!'); -$text->setChanged(\PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED, 'Fred', time() - 1800); - -$text = $section->addText('Hello World!'); -$text->setChanged(\PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED, 'Barney', time() - 3600); - -// Save file -echo write($phpWord, basename(__FILE__, '.php'), $writers); -if (!CLI) { - include_once 'Sample_Footer.php'; -} diff --git a/samples/Sample_39_TrackChanges.php b/samples/Sample_39_TrackChanges.php new file mode 100644 index 0000000000..e6a3066864 --- /dev/null +++ b/samples/Sample_39_TrackChanges.php @@ -0,0 +1,29 @@ +addSection(); +$textRun = $section->addTextRun(); + +$text = $textRun->addText('Hello World! Time to '); + +$text = $textRun->addText('wake ', array('bold' => true)); +$text->setChangeInfo(TrackChange::INSERTED, 'Fred', time() - 1800); + +$text = $textRun->addText('up'); +$text->setTrackChange(new TrackChange(TrackChange::INSERTED, 'Fred')); + +$text = $textRun->addText('go to sleep'); +$text->setChangeInfo(TrackChange::DELETED, 'Barney', new \DateTime('@' . (time() - 3600))); + +// Save file +echo write($phpWord, basename(__FILE__, '.php'), $writers); +if (!CLI) { + include_once 'Sample_Footer.php'; +} diff --git a/samples/resources/Sample_11_ReadWord2007.docx b/samples/resources/Sample_11_ReadWord2007.docx index c9a50f485a3c8d942fc7982061c5905f342c7634..3faf6f1213f13e82466ef29200862498d2ef7014 100644 GIT binary patch delta 52080 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

g(bZr8|pUC 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 P4(J~eD8+I5jWl8rRIjFz2 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

m|{ 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 HOYQ#wPQ_E} literal 11952 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 = $trackChange; + } + + /** + * Gets the trackChange information + * + * @return TrackChange */ - public function setChanged($type, $author, $date) + public function getTrackChange() { - $this->changed = new ChangedElement($type, $author, $date); + return $this->trackChange; } /** - * Get changed + * Set changed * - * @return object + * @param string $type INSERTED|DELETED + * @param string $author + * @param null|int|\DateTime $date allways in UTC */ - public function getChanged() + public function setChangeInfo($type, $author, $date = null) { - return $this->changed; + $this->trackChange = new TrackChange($type, $author, $date); } /** diff --git a/src/PhpWord/Element/ChangedElement.php b/src/PhpWord/Element/ChangedElement.php deleted file mode 100644 index 39b0fb00c7..0000000000 --- a/src/PhpWord/Element/ChangedElement.php +++ /dev/null @@ -1,57 +0,0 @@ -changeType = $changeType; - } - - /** - * Get change type - * - * @return int - */ - public function getChangeType() - { - return $this->changeType; - } -} diff --git a/src/PhpWord/Element/Comment.php b/src/PhpWord/Element/Comment.php index 188369292c..205ff598b9 100644 --- a/src/PhpWord/Element/Comment.php +++ b/src/PhpWord/Element/Comment.php @@ -55,12 +55,12 @@ class Comment extends TrackChange * Create a new Comment Element * * @param string $author - * @param \DateTime $date + * @param null|\DateTime $date * @param string $initials */ public function __construct($author, $date = null, $initials = null) { - parent::__construct($author, $date); + parent::__construct(null, $author, $date); $this->initials = $initials; } diff --git a/src/PhpWord/Element/TrackChange.php b/src/PhpWord/Element/TrackChange.php index d14fc201db..1202221022 100644 --- a/src/PhpWord/Element/TrackChange.php +++ b/src/PhpWord/Element/TrackChange.php @@ -20,14 +20,25 @@ /** * TrackChange element * @see http://datypic.com/sc/ooxml/t-w_CT_TrackChange.html + * @see http://datypic.com/sc/ooxml/t-w_CT_RunTrackChange.html */ class TrackChange extends AbstractContainer { + const INSERTED = 'INSERTED'; + const DELETED = 'DELETED'; + /** * @var string Container type */ protected $container = 'TrackChange'; + /** + * The type of change, (insert or delete), not applicable for PhpOffice\PhpWord\Element\Comment + * + * @var string + */ + private $changeType; + /** * Author * @@ -45,13 +56,17 @@ class TrackChange extends AbstractContainer /** * Create a new TrackChange Element * + * @param string $changeType * @param string $author - * @param \DateTime $date + * @param null|int|\DateTime $date */ - public function __construct($author, \DateTime $date = null) + public function __construct($changeType = null, $author = null, $date = null) { + $this->changeType = $changeType; $this->author = $author; - $this->date = $date; + if ($date != null) { + $this->date = ($date instanceof \DateTime) ? $date : new \DateTime('@' . $date); + } return $this; } @@ -75,4 +90,14 @@ public function getDate() { return $this->date; } + + /** + * Get the Change type + * + * @return string + */ + public function getChangeType() + { + return $this->changeType; + } } diff --git a/src/PhpWord/Reader/ODText/Content.php b/src/PhpWord/Reader/ODText/Content.php index ec029f9a9b..fc70b39e82 100644 --- a/src/PhpWord/Reader/ODText/Content.php +++ b/src/PhpWord/Reader/ODText/Content.php @@ -19,6 +19,7 @@ use PhpOffice\Common\XMLReader; use PhpOffice\PhpWord\PhpWord; +use PhpOffice\PhpWord\Element\TrackChange; /** * Content reader @@ -70,14 +71,14 @@ public function read(PhpWord $phpWord) break; } } - + $element = $section->addText($node->nodeValue); - if (isset($changed)) { - $element->changed = $changed['changed']; + if (isset($changed) && is_array($changed)) { + $element->trackChange = $changed['changed']; if (isset($changed['textNodes'])) { foreach ($changed['textNodes'] as $changedNode) { $element = $section->addText($changedNode->nodeValue); - $element->changed = $changed['changed']; + $element->trackChange = $changed['changed']; } } } @@ -92,20 +93,19 @@ public function read(PhpWord $phpWord) case 'text:tracked-changes': $changedRegions = $xmlReader->getElements('text:changed-region', $node); foreach ($changedRegions as $changedRegion) { - $type = ($changedRegion->firstChild->nodeName == 'text:insertion') ? \PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED : \PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED; + $type = ($changedRegion->firstChild->nodeName == 'text:insertion') ? TrackChange::INSERTED : TrackChange::DELETED; $creatorNode = $xmlReader->getElements('office:change-info/dc:creator', $changedRegion->firstChild); $author = $creatorNode[0]->nodeValue; $dateNode = $xmlReader->getElements('office:change-info/dc:date', $changedRegion->firstChild); $date = $dateNode[0]->nodeValue; $date = preg_replace('/\.\d+$/', '', $date); $date = \DateTime::createFromFormat('Y-m-d\TH:i:s', $date); - $changed = new \PhpOffice\PhpWord\Element\ChangedElement($type, $author, $date); + $changed = new TrackChange($type, $author, $date); $textNodes = $xmlReader->getElements('text:deletion/text:p', $changedRegion); - $trackedChanges[$changedRegion->getAttribute('text:id')] = array('changed' => $changed, - 'textNodes'=> $textNodes, ); + $trackedChanges[$changedRegion->getAttribute('text:id')] = array('changed' => $changed, 'textNodes'=> $textNodes); } break; - } + } } } } diff --git a/src/PhpWord/Reader/Word2007/AbstractPart.php b/src/PhpWord/Reader/Word2007/AbstractPart.php index 6905fc3123..bce93c4b24 100644 --- a/src/PhpWord/Reader/Word2007/AbstractPart.php +++ b/src/PhpWord/Reader/Word2007/AbstractPart.php @@ -19,6 +19,8 @@ use PhpOffice\Common\XMLReader; use PhpOffice\PhpWord\PhpWord; +use PhpOffice\PhpWord\Element\TrackChange; +use PhpOffice\PhpWord\Element\AbstractElement; /** * Abstract part reader @@ -193,7 +195,7 @@ protected function readRun(XMLReader $xmlReader, \DOMElement $domNode, $parent, return $this->readRun($xmlReader, $node, $parent, $docPart, $paragraphStyle); } } - + if (!in_array($domNode->nodeName, array('w:r', 'w:hyperlink'))) { return; } @@ -242,12 +244,13 @@ protected function readRun(XMLReader $xmlReader, \DOMElement $domNode, $parent, } else { $textContent = $xmlReader->getValue('w:t', $domNode); } + /** @var AbstractElement $element */ $element = $parent->addText($textContent, $fontStyle, $paragraphStyle); if (in_array($domNode->parentNode->nodeName, array('w:ins', 'w:del'))) { - $type = ($domNode->parentNode->nodeName == 'w:del') ? \PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED : \PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED; + $type = ($domNode->parentNode->nodeName == 'w:del') ? TrackChange::DELETED : TrackChange::INSERTED; $author = $domNode->parentNode->getAttribute('w:author'); $date = \DateTime::createFromFormat('Y-m-d\TH:i:s\Z', $domNode->parentNode->getAttribute('w:date')); - $element->setChanged($type, $author, $date); + $element->setChangeInfo($type, $author, $date); } } } diff --git a/src/PhpWord/Writer/HTML/Element/Text.php b/src/PhpWord/Writer/HTML/Element/Text.php index 720d8fdb2e..9f8f7773c5 100644 --- a/src/PhpWord/Writer/HTML/Element/Text.php +++ b/src/PhpWord/Writer/HTML/Element/Text.php @@ -17,6 +17,7 @@ namespace PhpOffice\PhpWord\Writer\HTML\Element; +use PhpOffice\PhpWord\Element\TrackChange; use PhpOffice\PhpWord\Settings; use PhpOffice\PhpWord\Style\Font; use PhpOffice\PhpWord\Style\Paragraph; @@ -121,25 +122,8 @@ protected function writeOpening() $content .= ""; } - //open changed tag - $element = $this->element; - $changed = $element->getChanged(); - if ($changed instanceof \PhpOffice\PhpWord\Element\ChangedElement) { - if (($changed->getChangeType() == \PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED)) { - $content .= 'getChangeType() == \PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED) { - $content .= ' array('author'=> $changed->getAuthor(), - 'date' => $changed->getDate()->format('Y-m-d\TH:i:s\Z'), - 'id' => $element->getElementId(), )); - $content .= json_encode($changedProp); - $content .= '\' '; - $dateUser = $changed->getDate()->format('Y-m-d H:i:s'); - $content .= 'title="' . $changed->getAuthor() . ' - ' . $dateUser . '" '; - $content .= '>'; - } + //open track change tag + $content .= $this->writeTrackChangeOpening(); return $content; } @@ -153,17 +137,9 @@ protected function writeClosing() { $content = ''; - //close changed tag - $element = $this->element; - $changed = $element->getChanged(); - if ($changed instanceof \PhpOffice\PhpWord\Element\ChangedElement) { - if (($changed->getChangeType() == \PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED)) { - $content .= ''; - } elseif ($changed->getChangeType() == \PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED) { - $content .= ''; - } - } - + //close track change tag + $content .= $this->writeTrackChangeClosing(); + if (!$this->withoutP) { if (Settings::isOutputEscapingEnabled()) { $content .= $this->escaper->escapeHtml($this->closingText); @@ -177,6 +153,63 @@ protected function writeClosing() return $content; } + /** + * writes the track change opening tag + * + * @return string the HTML, an empty string if no track change information + */ + private function writeTrackChangeOpening() + { + $changed = $this->element->getTrackChange(); + if ($changed == null) { + return ''; + } + + $content = ''; + if (($changed->getChangeType() == TrackChange::INSERTED)) { + $content .= 'getChangeType() == TrackChange::DELETED) { + $content .= ' array('author'=> $changed->getAuthor(), 'id' => $this->element->getElementId())); + if ($changed->getDate() != null) { + $changedProp['changed']['date'] = $changed->getDate()->format('Y-m-d\TH:i:s\Z'); + } + $content .= json_encode($changedProp); + $content .= '\' '; + $content .= 'title="' . $changed->getAuthor(); + if ($changed->getDate() != null) { + $dateUser = $changed->getDate()->format('Y-m-d H:i:s'); + $content .= ' - ' . $dateUser; + } + $content .= '">'; + + return $content; + } + + /** + * writes the track change closing tag + * + * @return string the HTML, an empty string if no track change information + */ + private function writeTrackChangeClosing() + { + $changed = $this->element->getTrackChange(); + if ($changed == null) { + return ''; + } + + $content = ''; + if (($changed->getChangeType() == TrackChange::INSERTED)) { + $content .= ''; + } elseif ($changed->getChangeType() == TrackChange::DELETED) { + $content .= ''; + } + + return $content; + } + /** * Write paragraph style * diff --git a/src/PhpWord/Writer/ODText/Element/Text.php b/src/PhpWord/Writer/ODText/Element/Text.php index 1fc0b80028..4744feb8b3 100644 --- a/src/PhpWord/Writer/ODText/Element/Text.php +++ b/src/PhpWord/Writer/ODText/Element/Text.php @@ -18,6 +18,7 @@ namespace PhpOffice\PhpWord\Writer\ODText\Element; use PhpOffice\PhpWord\Exception\Exception; +use PhpOffice\PhpWord\Element\TrackChange; /** * Text element writer @@ -51,29 +52,50 @@ public function write() if (!$this->withoutP) { $xmlWriter->startElement('text:p'); // text:p } - if (empty($fontStyle)) { - if (empty($paragraphStyle)) { - $xmlWriter->writeAttribute('text:style-name', 'P1'); - } elseif (is_string($paragraphStyle)) { - $xmlWriter->writeAttribute('text:style-name', $paragraphStyle); - } - $this->writeText($element->getText()); + if ($element->getTrackChange() != null && $element->getTrackChange()->getChangeType() == TrackChange::DELETED) { + $xmlWriter->startElement('text:change'); + $xmlWriter->writeAttribute('text:change-id', $element->getTrackChange()->getElementId()); + $xmlWriter->endElement(); } else { - if (empty($paragraphStyle)) { - $xmlWriter->writeAttribute('text:style-name', 'Standard'); - } elseif (is_string($paragraphStyle)) { - $xmlWriter->writeAttribute('text:style-name', $paragraphStyle); - } - // text:span - $xmlWriter->startElement('text:span'); - if (is_string($fontStyle)) { - $xmlWriter->writeAttribute('text:style-name', $fontStyle); + $isInsertion = $element->getTrackChange() != null && $element->getTrackChange()->getChangeType() == TrackChange::INSERTED; + if (empty($fontStyle)) { + if (empty($paragraphStyle)) { + $xmlWriter->writeAttribute('text:style-name', 'P1'); + } elseif (is_string($paragraphStyle)) { + $xmlWriter->writeAttribute('text:style-name', $paragraphStyle); + } + $this->writeChangeInsertion(true, $element->getTrackChange()); + $this->writeText($element->getText()); + $this->writeChangeInsertion(false, $element->getTrackChange()); + } else { + if (empty($paragraphStyle)) { + $xmlWriter->writeAttribute('text:style-name', 'Standard'); + } elseif (is_string($paragraphStyle)) { + $xmlWriter->writeAttribute('text:style-name', $paragraphStyle); + } + // text:span + $xmlWriter->startElement('text:span'); + if (is_string($fontStyle)) { + $xmlWriter->writeAttribute('text:style-name', $fontStyle); + } + $this->writeChangeInsertion(true, $element->getTrackChange()); + $this->writeText($element->getText()); + $this->writeChangeInsertion(false, $element->getTrackChange()); + $xmlWriter->endElement(); } - $this->writeText($element->getText()); - $xmlWriter->endElement(); } if (!$this->withoutP) { $xmlWriter->endElement(); // text:p } } + + private function writeChangeInsertion($start = true, TrackChange $trackChange = null) + { + if ($trackChange == null || $trackChange->getChangeType() != TrackChange::INSERTED) { + return; + } + $xmlWriter->startElement('text:change-' . ($start ? 'start' : 'end')); + $xmlWriter->writeAttribute('text:change-id', $element->getTrackChange()->getElementId()); + $xmlWriter->endElement(); + } } diff --git a/src/PhpWord/Writer/ODText/Part/Content.php b/src/PhpWord/Writer/ODText/Part/Content.php index 8ae4dca9c7..35d1843a30 100644 --- a/src/PhpWord/Writer/ODText/Part/Content.php +++ b/src/PhpWord/Writer/ODText/Part/Content.php @@ -29,6 +29,8 @@ use PhpOffice\PhpWord\Style\Table as TableStyle; use PhpOffice\PhpWord\Writer\ODText\Element\Container; use PhpOffice\PhpWord\Writer\ODText\Style\Paragraph as ParagraphStyleWriter; +use PhpOffice\PhpWord\Element\AbstractContainer; +use PhpOffice\PhpWord\Element\TrackChange; /** * ODText content part writer: content.xml @@ -74,6 +76,40 @@ public function write() $xmlWriter->startElement('office:body'); $xmlWriter->startElement('office:text'); + // Tracked changes declarations + $trackedChanges = array(); + $sections = $phpWord->getSections(); + foreach ($sections as $section) { + $this->collectTrackedChanges($section, $trackedChanges); + } + $xmlWriter->startElement('text:tracked-changes'); + foreach ($trackedChanges as $trackedElement) { + $trackedChange = $trackedElement->getTrackChange(); + $xmlWriter->startElement('text:changed-region'); + $trackedChange->setElementId(); + $xmlWriter->writeAttribute('text:id', $trackedChange->getElementId()); + + if (($trackedChange->getChangeType() == TrackChange::INSERTED)) { + $xmlWriter->startElement('text:insertion'); + } elseif ($trackedChange->getChangeType() == TrackChange::DELETED) { + $xmlWriter->startElement('text:deletion'); + } + + $xmlWriter->startElement('office:change-info'); + $xmlWriter->writeElement('dc:creator', $trackedChange->getAuthor()); + if ($trackedChange->getDate() != null) { + $xmlWriter->writeElement('dc:date', $trackedChange->getDate()->format('Y-m-d\TH:i:s\Z')); + } + $xmlWriter->endElement(); // office:change-info + if ($trackedChange->getChangeType() == TrackChange::DELETED) { + $xmlWriter->writeElement('text:p', $trackedElement->getText()); + } + + $xmlWriter->endElement(); // text:insertion|text:deletion + $xmlWriter->endElement(); // text:changed-region + } + $xmlWriter->endElement(); // text:tracked-changes + // Sequence declarations $sequences = array('Illustration', 'Table', 'Text', 'Drawing'); $xmlWriter->startElement('text:sequence-decls'); @@ -242,4 +278,22 @@ private function getElementStyle(&$element, &$paragraphStyleCount, &$fontStyleCo $element->setParagraphStyle("P{$paragraphStyleCount}"); } } + + /** + * + * @param AbstractContainer $container + * @param \PhpOffice\PhpWord\Element\AbstractElement[] $trackedChanges + */ + private function collectTrackedChanges(AbstractContainer $container, &$trackedChanges = array()) + { + $elements = $container->getElements(); + foreach ($elements as $element) { + if ($element->getTrackChange() != null) { + $trackedChanges[] = $element; + } + if (is_callable(array($element, 'getElements'))) { + $this->collectTrackedChanges($element, $trackedChanges); + } + } + } } diff --git a/src/PhpWord/Writer/Word2007/Element/Text.php b/src/PhpWord/Writer/Word2007/Element/Text.php index 5884bd3e02..130b912bad 100644 --- a/src/PhpWord/Writer/Word2007/Element/Text.php +++ b/src/PhpWord/Writer/Word2007/Element/Text.php @@ -17,6 +17,8 @@ namespace PhpOffice\PhpWord\Writer\Word2007\Element; +use PhpOffice\PhpWord\Element\TrackChange; + /** * Text element writer * @@ -37,10 +39,7 @@ public function write() $this->startElementP(); - $changed = $element->getChanged(); - if ($changed) { - $this->writeOpeningChanged(); - } + $this->writeOpeningTrackChange(); $xmlWriter->startElement('w:r'); @@ -48,7 +47,8 @@ public function write() $textElement = 'w:t'; //'w:delText' in case of deleted text - if (($changed) && ($changed->getChangeType() == \PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED)) { + $changed = $element->getTrackChange(); + if ($changed != null && $changed->getChangeType() == TrackChange::DELETED) { $textElement = 'w:delText'; } $xmlWriter->startElement($textElement); @@ -58,7 +58,7 @@ public function write() $xmlWriter->endElement(); $xmlWriter->endElement(); // w:r - $this->writeClosingChanged(); + $this->writeClosingTrackChange(); $this->endElementP(); // w:p } @@ -66,37 +66,39 @@ public function write() /** * Write opening of changed element */ - protected function writeOpeningChanged() + protected function writeOpeningTrackChange() { - $element = $this->getElement(); - $changed = $element->getChanged(); + $changed = $this->getElement()->getTrackChange(); + if ($changed == null) { + return; + } $xmlWriter = $this->getXmlWriter(); - if ($changed instanceof \PhpOffice\PhpWord\Element\ChangedElement) { - if (($changed->getChangeType() == \PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED)) { - $xmlWriter->startElement('w:ins'); - } elseif ($changed->getChangeType() == \PhpOffice\PhpWord\Element\ChangedElement::TYPE_DELETED) { - $xmlWriter->startElement('w:del'); - } - $xmlWriter->writeAttribute('w:author', $changed->getAuthor()); + if (($changed->getChangeType() == TrackChange::INSERTED)) { + $xmlWriter->startElement('w:ins'); + } elseif ($changed->getChangeType() == TrackChange::DELETED) { + $xmlWriter->startElement('w:del'); + } + $xmlWriter->writeAttribute('w:author', $changed->getAuthor()); + if ($changed->getDate() != null) { $xmlWriter->writeAttribute('w:date', $changed->getDate()->format('Y-m-d\TH:i:s\Z')); - $xmlWriter->writeAttribute('w:id', $element->getElementId()); } + $xmlWriter->writeAttribute('w:id', $this->getElement()->getElementId()); } /** * Write ending */ - protected function writeClosingChanged() + protected function writeClosingTrackChange() { - $element = $this->getElement(); - $changed = $element->getChanged(); + $changed = $this->getElement()->getTrackChange(); + if ($changed == null) { + return; + } $xmlWriter = $this->getXmlWriter(); - if ($changed instanceof \PhpOffice\PhpWord\Element\ChangedElement) { - $xmlWriter->endElement(); // w:ins|w:del - } + $xmlWriter->endElement(); // w:ins|w:del } } diff --git a/tests/PhpWord/Element/TrackChangeTest.php b/tests/PhpWord/Element/TrackChangeTest.php new file mode 100644 index 0000000000..3249f10be3 --- /dev/null +++ b/tests/PhpWord/Element/TrackChangeTest.php @@ -0,0 +1,44 @@ +setTrackChange($oTrackChange); + + $this->assertInstanceOf('PhpOffice\\PhpWord\\Element\\TrackChange', $oTrackChange); + $this->assertEquals($author, $oTrackChange->getAuthor()); + $this->assertEquals($date, $oTrackChange->getDate()); + $this->assertEquals(TrackChange::INSERTED, $oTrackChange->getChangeType()); + } +} diff --git a/tests/PhpWord/Writer/Word2007/ElementTest.php b/tests/PhpWord/Writer/Word2007/ElementTest.php index 12f810ce79..910d48681b 100644 --- a/tests/PhpWord/Writer/Word2007/ElementTest.php +++ b/tests/PhpWord/Writer/Word2007/ElementTest.php @@ -23,6 +23,7 @@ use PhpOffice\PhpWord\Element\TextRun; use PhpOffice\PhpWord\PhpWord; use PhpOffice\PhpWord\TestHelperDOCX; +use PhpOffice\PhpWord\Element\TrackChange; /** * Test class for PhpOffice\PhpWord\Writer\Word2007\Element subnamespace @@ -415,4 +416,20 @@ public function testCommentWithEndElement() $this->assertTrue($doc->elementExists('/w:document/w:body/w:p/w:commentRangeEnd')); $this->assertTrue($doc->elementExists('/w:document/w:body/w:p/w:r/w:commentReference')); } + + public function testTrackChange() + { + $phpWord = new PhpWord(); + $section = $phpWord->addSection(); + $text = $section->addText('my dummy text'); + $text->setChangeInfo(TrackChange::INSERTED, 'author name'); + $text2 = $section->addText('my other text'); + $text2->setTrackChange(new TrackChange(TrackChange::DELETED, 'another author', new \DateTime())); + + $doc = TestHelperDOCX::getDocument($phpWord); + echo $doc->printXml(); + $this->assertTrue($doc->elementExists('/w:document/w:body/w:p/w:ins/w:r')); + $this->assertEquals('author name', $doc->getElementAttribute('/w:document/w:body/w:p/w:ins', 'w:author')); + $this->assertTrue($doc->elementExists('/w:document/w:body/w:p/w:del/w:r/w:delText')); + } } From cac427ceaa3d5efa008ad96dd3fa518f10ac2d5d Mon Sep 17 00:00:00 2001 From: troosan Date: Fri, 2 Feb 2018 22:10:44 +0100 Subject: [PATCH 21/24] set the style --- src/PhpWord/Reader/Word2007/Styles.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PhpWord/Reader/Word2007/Styles.php b/src/PhpWord/Reader/Word2007/Styles.php index c6e64e45f5..8719641ec2 100644 --- a/src/PhpWord/Reader/Word2007/Styles.php +++ b/src/PhpWord/Reader/Word2007/Styles.php @@ -56,7 +56,7 @@ public function read(PhpWord $phpWord) if ($paragraphDefaults !== null) { $paragraphDefaultStyle = $this->readParagraphStyle($xmlReader, $paragraphDefaults); if ($paragraphDefaultStyle != null) { - $phpWord->setDefaultParagraphStyle(); + $phpWord->setDefaultParagraphStyle($paragraphDefaultStyle); } } From 75abbd6b0dcbcc6786cef39ee206287ef2803195 Mon Sep 17 00:00:00 2001 From: troosan Date: Fri, 2 Feb 2018 22:22:44 +0100 Subject: [PATCH 22/24] update documentation and release note [ci skip] --- CHANGELOG.md | 1 + docs/elements.rst | 26 +++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d6f8b2da00..dddb187e1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ v0.15.0 (?? ??? 2018) ### Added - Parsing of "align" HTML attribute - @troosan #1231 - Parse formatting inside HTML lists - @troosan @samimussbach #1239 #945 #1215 #508 +- Add support for Track changes @Cip @troosan #1262 ### Fixed - fix reading of docx default style - @troosan #1238 diff --git a/docs/elements.rst b/docs/elements.rst index 02eebce30f..367b743cd3 100644 --- a/docs/elements.rst +++ b/docs/elements.rst @@ -472,4 +472,28 @@ The comment can contain formatted text. Once the comment has been added, it can // link the comment to the text you just created $text->setCommentStart($comment); -If no end is set for a comment using the ``setCommentEnd``, the comment will be ended automatically at the end of the element it is started on. \ No newline at end of file +If no end is set for a comment using the ``setCommentEnd``, the comment will be ended automatically at the end of the element it is started on. + +Track Changes +------------- + +Track changes can be set on text elements. There are 2 ways to set the change information on an element. +Either by calling the `setChangeInfo()`, or by setting the `TrackChange` instance on the element with `setTrackChange()`. + +.. code-block:: php + $phpWord = new \PhpOffice\PhpWord\PhpWord(); + + // New portrait section + $section = $phpWord->addSection(); + $textRun = $section->addTextRun(); + + $text = $textRun->addText('Hello World! Time to '); + + $text = $textRun->addText('wake ', array('bold' => true)); + $text->setChangeInfo(TrackChange::INSERTED, 'Fred', time() - 1800); + + $text = $textRun->addText('up'); + $text->setTrackChange(new TrackChange(TrackChange::INSERTED, 'Fred')); + + $text = $textRun->addText('go to sleep'); + $text->setChangeInfo(TrackChange::DELETED, 'Barney', new \DateTime('@' . (time() - 3600))); From 2256f24b8347a9a2114007f7f7bf266909f3d9a1 Mon Sep 17 00:00:00 2001 From: troosan Date: Fri, 2 Feb 2018 22:30:52 +0100 Subject: [PATCH 23/24] Update the changelog and doc [ci skip] --- CHANGELOG.md | 2 +- docs/elements.rst | 8 ++++---- samples/Sample_16_Object.php | 2 +- src/PhpWord/Element/AbstractContainer.php | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dddb187e1e..f82759dc10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ v0.15.0 (?? ??? 2018) ### Added - Parsing of "align" HTML attribute - @troosan #1231 - Parse formatting inside HTML lists - @troosan @samimussbach #1239 #945 #1215 #508 -- Add support for Track changes @Cip @troosan #1262 +- Add support for Track changes @Cip @troosan #354 #1262 ### Fixed - fix reading of docx default style - @troosan #1238 diff --git a/docs/elements.rst b/docs/elements.rst index 367b743cd3..7df3b16359 100644 --- a/docs/elements.rst +++ b/docs/elements.rst @@ -31,7 +31,7 @@ column shows the containers while the rows lists the elements. +-------+-----------------+-----------+----------+----------+---------+------------+------------+ | 11 | Watermark | - | v | - | - | - | - | +-------+-----------------+-----------+----------+----------+---------+------------+------------+ -| 12 | Object | v | v | v | v | v | v | +| 12 | OLEObject | v | v | v | v | v | v | +-------+-----------------+-----------+----------+----------+---------+------------+------------+ | 13 | TOC | v | - | - | - | - | - | +-------+-----------------+-----------+----------+----------+---------+------------+------------+ @@ -283,11 +283,11 @@ Objects ------- You can add OLE embeddings, such as Excel spreadsheets or PowerPoint -presentations to the document by using ``addObject`` method. +presentations to the document by using ``addOLEObject`` method. .. code-block:: php - $section->addObject($src, [$style]); + $section->addOLEObject($src, [$style]); Table of contents ----------------- @@ -316,7 +316,7 @@ Footnotes & endnotes You can create footnotes with ``addFootnote`` and endnotes with ``addEndnote`` in texts or textruns, but it's recommended to use textrun to have better layout. You can use ``addText``, ``addLink``, -``addTextBreak``, ``addImage``, ``addObject`` on footnotes and endnotes. +``addTextBreak``, ``addImage``, ``addOLEObject`` on footnotes and endnotes. On textrun: diff --git a/samples/Sample_16_Object.php b/samples/Sample_16_Object.php index 8b05b9e8ac..c4db7f6106 100644 --- a/samples/Sample_16_Object.php +++ b/samples/Sample_16_Object.php @@ -9,7 +9,7 @@ $section = $phpWord->addSection(); $section->addText('You can open this OLE object by double clicking on the icon:'); $section->addTextBreak(2); -$section->addObject('resources/_sheet.xls'); +$section->addOLEObject('resources/_sheet.xls'); // Save file echo write($phpWord, basename(__FILE__, '.php'), $writers); diff --git a/src/PhpWord/Element/AbstractContainer.php b/src/PhpWord/Element/AbstractContainer.php index 9ec1fa324e..8c1f3c33dd 100644 --- a/src/PhpWord/Element/AbstractContainer.php +++ b/src/PhpWord/Element/AbstractContainer.php @@ -81,7 +81,7 @@ public function __call($function, $args) { $elements = array( 'Text', 'TextRun', 'Bookmark', 'Link', 'PreserveText', 'TextBreak', - 'ListItem', 'ListItemRun', 'Table', 'Image', 'Object', + 'ListItem', 'ListItemRun', 'Table', 'Image', 'Object', 'OLEObject', 'Footnote', 'Endnote', 'CheckBox', 'TextBox', 'Field', 'Line', 'Shape', 'Title', 'TOC', 'PageBreak', 'Chart', 'FormField', 'SDT', 'Comment', From 5ca78ad6ab6c8dd339256f7ddf816f0916b1e141 Mon Sep 17 00:00:00 2001 From: troosan Date: Sun, 4 Feb 2018 21:10:19 +0100 Subject: [PATCH 24/24] fix scrutinizer issues --- src/PhpWord/Element/AbstractContainer.php | 2 +- src/PhpWord/Element/TrackChange.php | 2 +- src/PhpWord/Reader/ODText/Content.php | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/PhpWord/Element/AbstractContainer.php b/src/PhpWord/Element/AbstractContainer.php index 8c1f3c33dd..4a5f83f536 100644 --- a/src/PhpWord/Element/AbstractContainer.php +++ b/src/PhpWord/Element/AbstractContainer.php @@ -157,7 +157,7 @@ protected function addElement($elementName) /** * Get all elements * - * @return array[\PhpOffice\PhpWord\Element\AbstractElement] + * @return \PhpOffice\PhpWord\Element\AbstractElement[] */ public function getElements() { diff --git a/src/PhpWord/Element/TrackChange.php b/src/PhpWord/Element/TrackChange.php index 9f40fd0ff6..dde616cc21 100644 --- a/src/PhpWord/Element/TrackChange.php +++ b/src/PhpWord/Element/TrackChange.php @@ -64,7 +64,7 @@ public function __construct($changeType = null, $author = null, $date = null) { $this->changeType = $changeType; $this->author = $author; - if ($date != null) { + if ($date !== null) { $this->date = ($date instanceof \DateTime) ? $date : new \DateTime('@' . $date); } } diff --git a/src/PhpWord/Reader/ODText/Content.php b/src/PhpWord/Reader/ODText/Content.php index 4ce44d67c9..7a7a046837 100644 --- a/src/PhpWord/Reader/ODText/Content.php +++ b/src/PhpWord/Reader/ODText/Content.php @@ -74,11 +74,11 @@ public function read(PhpWord $phpWord) $element = $section->addText($node->nodeValue); if (isset($changed) && is_array($changed)) { - $element->trackChange = $changed['changed']; + $element->setTrackChange($changed['changed']); if (isset($changed['textNodes'])) { foreach ($changed['textNodes'] as $changedNode) { $element = $section->addText($changedNode->nodeValue); - $element->trackChange = $changed['changed']; + $element->setTrackChange($changed['changed']); } } }