From a676af30dd3d5de827b6cc534ff9e74883bc2455 Mon Sep 17 00:00:00 2001 From: Ivan Lanin Date: Tue, 29 Apr 2014 01:18:01 +0700 Subject: [PATCH] ODText Reader: Basic ODText reader --- CHANGELOG.md | 1 + samples/Sample_24_ReadODText.php | 14 +++ samples/resources/Sample_24_ReadODText.odt | Bin 0 -> 11758 bytes src/PhpWord/IOFactory.php | 2 +- src/PhpWord/Reader/ODText.php | 86 ++++++++++++++++++ src/PhpWord/Reader/ODText/AbstractPart.php | 67 ++++++++++++++ src/PhpWord/Reader/ODText/Content.php | 57 ++++++++++++ src/PhpWord/Style/Font.php | 2 +- tests/PhpWord/Tests/Reader/ODTextTest.php | 31 +++++++ .../PhpWord/Tests/_files/documents/reader.odt | Bin 0 -> 11758 bytes 10 files changed, 258 insertions(+), 2 deletions(-) create mode 100644 samples/Sample_24_ReadODText.php create mode 100644 samples/resources/Sample_24_ReadODText.odt create mode 100644 src/PhpWord/Reader/ODText.php create mode 100644 src/PhpWord/Reader/ODText/AbstractPart.php create mode 100644 src/PhpWord/Reader/ODText/Content.php create mode 100644 tests/PhpWord/Tests/Reader/ODTextTest.php create mode 100644 tests/PhpWord/Tests/_files/documents/reader.odt diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d44ce1d48..9f4f07ddd4 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ This release marked heavy refactorings on internal code structure with the creat - DOCX Writer: Create `word/settings.xml` and `word/webSettings.xml` dynamically - @ivanlanin - ODT Writer: Basic image writing - @ivanlanin - ODT Writer: Link writing - @ivanlanin +- ODT Reader: Basic ODText Reader - @ivanlanin ### Bugfixes diff --git a/samples/Sample_24_ReadODText.php b/samples/Sample_24_ReadODText.php new file mode 100644 index 0000000000..bb5332e662 --- /dev/null +++ b/samples/Sample_24_ReadODText.php @@ -0,0 +1,14 @@ +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 zH(2AJwVVSmereadRelationships($docFile); + + $readerParts = array( + 'content.xml' => 'Content', + ); + + foreach ($readerParts as $xmlFile => $partName) { + $this->readPart($phpWord, $relationships, $partName, $docFile, $xmlFile); + } + + return $phpWord; + } + + /** + * Read document part + * + * @param \PhpOffice\PhpWord\PhpWord $phpWord + * @param array $relationships + * @param string $partName + * @param string $docFile + * @param string $xmlFile + */ + private function readPart(PhpWord &$phpWord, $relationships, $partName, $docFile, $xmlFile) + { + $partClass = "PhpOffice\\PhpWord\\Reader\\ODText\\{$partName}"; + if (class_exists($partClass)) { + $part = new $partClass($docFile, $xmlFile); + $part->setRels($relationships); + $part->read($phpWord); + } + + } + + /** + * Read all relationship files + * + * @param string $docFile + * @return array + */ + private function readRelationships($docFile) + { + $rels = array(); + $xmlFile = 'META-INF/manifest.xml'; + $xmlReader = new XMLReader(); + $xmlReader->getDomFromZip($docFile, $xmlFile); + $nodes = $xmlReader->getElements('manifest:file-entry'); + foreach ($nodes as $node) { + $type = $xmlReader->getAttribute('manifest:media-type', $node); + $target = $xmlReader->getAttribute('manifest:full-path', $node); + $rels[] = array('type' => $type, 'target' => $target); + } + + return $rels; + } +} diff --git a/src/PhpWord/Reader/ODText/AbstractPart.php b/src/PhpWord/Reader/ODText/AbstractPart.php new file mode 100644 index 0000000000..a0cc75de6e --- /dev/null +++ b/src/PhpWord/Reader/ODText/AbstractPart.php @@ -0,0 +1,67 @@ +docFile = $docFile; + $this->xmlFile = $xmlFile; + } + + /** + * Set relationships + * + * @param array $value + */ + public function setRels($value) + { + $this->rels = $value; + } +} diff --git a/src/PhpWord/Reader/ODText/Content.php b/src/PhpWord/Reader/ODText/Content.php new file mode 100644 index 0000000000..c0bb49c68c --- /dev/null +++ b/src/PhpWord/Reader/ODText/Content.php @@ -0,0 +1,57 @@ +getDomFromZip($this->docFile, $this->xmlFile); + + $nodes = $xmlReader->getElements('office:body/office:text/*'); + if ($nodes->length > 0) { + $section = $phpWord->addSection(); + foreach ($nodes as $node) { + // $styleName = $xmlReader->getAttribute('text:style-name', $node); + switch ($node->nodeName) { + + case 'text:h': // Heading + $depth = $xmlReader->getAttribute('text:outline-level', $node); + $section->addTitle($node->nodeValue, $depth); + break; + + case 'text:p': // Paragraph + $section->addText($node->nodeValue); + 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); + } + break; + } + } + } + } +} diff --git a/src/PhpWord/Style/Font.php b/src/PhpWord/Style/Font.php index 32332acedd..b4edeee329 100644 --- a/src/PhpWord/Style/Font.php +++ b/src/PhpWord/Style/Font.php @@ -203,7 +203,7 @@ public function setArrayStyle(array $style = array()) /** * Get font name * - * @return bool + * @return string */ public function getName() { diff --git a/tests/PhpWord/Tests/Reader/ODTextTest.php b/tests/PhpWord/Tests/Reader/ODTextTest.php new file mode 100644 index 0000000000..6136b0c483 --- /dev/null +++ b/tests/PhpWord/Tests/Reader/ODTextTest.php @@ -0,0 +1,31 @@ +assertInstanceOf('PhpOffice\\PhpWord\\PhpWord', $object); + } +} diff --git a/tests/PhpWord/Tests/_files/documents/reader.odt b/tests/PhpWord/Tests/_files/documents/reader.odt new file mode 100644 index 0000000000000000000000000000000000000000..9e18e61917e66eef0736944d35d1224939160068 GIT binary patch literal 11758 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