Content.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. /**
  3. * This file is part of PHPWord - A pure PHP library for reading and writing
  4. * word processing documents.
  5. *
  6. * PHPWord is free software distributed under the terms of the GNU Lesser
  7. * General Public License version 3 as published by the Free Software Foundation.
  8. *
  9. * For the full copyright and license information, please read the LICENSE
  10. * file that was distributed with this source code. For the full list of
  11. * contributors, visit https://github.com/PHPOffice/PHPWord/contributors.
  12. *
  13. * @see https://github.com/PHPOffice/PHPWord
  14. * @copyright 2010-2018 PHPWord contributors
  15. * @license http://www.gnu.org/licenses/lgpl.txt LGPL version 3
  16. */
  17. namespace PhpOffice\PhpWord\Reader\ODText;
  18. use PhpOffice\PhpWord\Element\TrackChange;
  19. use PhpOffice\PhpWord\PhpWord;
  20. use PhpOffice\PhpWord\Shared\XMLReader;
  21. /**
  22. * Content reader
  23. *
  24. * @since 0.10.0
  25. */
  26. class Content extends AbstractPart
  27. {
  28. /**
  29. * Read content.xml.
  30. *
  31. * @param \PhpOffice\PhpWord\PhpWord $phpWord
  32. */
  33. public function read(PhpWord $phpWord)
  34. {
  35. $xmlReader = new XMLReader();
  36. $xmlReader->getDomFromZip($this->docFile, $this->xmlFile);
  37. $trackedChanges = array();
  38. $nodes = $xmlReader->getElements('office:body/office:text/*');
  39. if ($nodes->length > 0) {
  40. $section = $phpWord->addSection();
  41. foreach ($nodes as $node) {
  42. // $styleName = $xmlReader->getAttribute('text:style-name', $node);
  43. switch ($node->nodeName) {
  44. case 'text:h': // Heading
  45. $depth = $xmlReader->getAttribute('text:outline-level', $node);
  46. $section->addTitle($node->nodeValue, $depth);
  47. break;
  48. case 'text:p': // Paragraph
  49. $children = $node->childNodes;
  50. foreach ($children as $child) {
  51. switch ($child->nodeName) {
  52. case 'text:change-start':
  53. $changeId = $child->getAttribute('text:change-id');
  54. if (isset($trackedChanges[$changeId])) {
  55. $changed = $trackedChanges[$changeId];
  56. }
  57. break;
  58. case 'text:change-end':
  59. unset($changed);
  60. break;
  61. case 'text:change':
  62. $changeId = $child->getAttribute('text:change-id');
  63. if (isset($trackedChanges[$changeId])) {
  64. $changed = $trackedChanges[$changeId];
  65. }
  66. break;
  67. }
  68. }
  69. $element = $section->addText($node->nodeValue);
  70. if (isset($changed) && is_array($changed)) {
  71. $element->setTrackChange($changed['changed']);
  72. if (isset($changed['textNodes'])) {
  73. foreach ($changed['textNodes'] as $changedNode) {
  74. $element = $section->addText($changedNode->nodeValue);
  75. $element->setTrackChange($changed['changed']);
  76. }
  77. }
  78. }
  79. break;
  80. case 'text:list': // List
  81. $listItems = $xmlReader->getElements('text:list-item/text:p', $node);
  82. foreach ($listItems as $listItem) {
  83. // $listStyleName = $xmlReader->getAttribute('text:style-name', $listItem);
  84. $section->addListItem($listItem->nodeValue, 0);
  85. }
  86. break;
  87. case 'text:tracked-changes':
  88. $changedRegions = $xmlReader->getElements('text:changed-region', $node);
  89. foreach ($changedRegions as $changedRegion) {
  90. $type = ($changedRegion->firstChild->nodeName == 'text:insertion') ? TrackChange::INSERTED : TrackChange::DELETED;
  91. $creatorNode = $xmlReader->getElements('office:change-info/dc:creator', $changedRegion->firstChild);
  92. $author = $creatorNode[0]->nodeValue;
  93. $dateNode = $xmlReader->getElements('office:change-info/dc:date', $changedRegion->firstChild);
  94. $date = $dateNode[0]->nodeValue;
  95. $date = preg_replace('/\.\d+$/', '', $date);
  96. $date = \DateTime::createFromFormat('Y-m-d\TH:i:s', $date);
  97. $changed = new TrackChange($type, $author, $date);
  98. $textNodes = $xmlReader->getElements('text:deletion/text:p', $changedRegion);
  99. $trackedChanges[$changedRegion->getAttribute('text:id')] = array('changed' => $changed, 'textNodes'=> $textNodes);
  100. }
  101. break;
  102. }
  103. }
  104. }
  105. }
  106. }