Ingen beskrivning

Numbering.php 7.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  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. * @link https://github.com/PHPOffice/PHPWord
  14. * @copyright 2010-2014 PHPWord contributors
  15. * @license http://www.gnu.org/licenses/lgpl.txt LGPL version 3
  16. */
  17. namespace PhpOffice\PhpWord\Writer\Word2007\Part;
  18. use PhpOffice\PhpWord\Shared\XMLWriter;
  19. use PhpOffice\PhpWord\Style\Numbering as NumberingStyle;
  20. use PhpOffice\PhpWord\Style\NumberingLevel;
  21. use PhpOffice\PhpWord\Style;
  22. /**
  23. * Word2007 numbering part writer: word/numbering.xml
  24. *
  25. * @since 0.10.0
  26. */
  27. class Numbering extends AbstractPart
  28. {
  29. /**
  30. * Write part
  31. *
  32. * @return string
  33. */
  34. public function write()
  35. {
  36. $xmlWriter = $this->getXmlWriter();
  37. $styles = Style::getStyles();
  38. $drawingSchema = 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing';
  39. $xmlWriter->startDocument('1.0', 'UTF-8', 'yes');
  40. $xmlWriter->startElement('w:numbering');
  41. $xmlWriter->writeAttribute('xmlns:ve', 'http://schemas.openxmlformats.org/markup-compatibility/2006');
  42. $xmlWriter->writeAttribute('xmlns:o', 'urn:schemas-microsoft-com:office:office');
  43. $xmlWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
  44. $xmlWriter->writeAttribute('xmlns:m', 'http://schemas.openxmlformats.org/officeDocument/2006/math');
  45. $xmlWriter->writeAttribute('xmlns:v', 'urn:schemas-microsoft-com:vml');
  46. $xmlWriter->writeAttribute('xmlns:wp', $drawingSchema);
  47. $xmlWriter->writeAttribute('xmlns:w10', 'urn:schemas-microsoft-com:office:word');
  48. $xmlWriter->writeAttribute('xmlns:w', 'http://schemas.openxmlformats.org/wordprocessingml/2006/main');
  49. $xmlWriter->writeAttribute('xmlns:wne', 'http://schemas.microsoft.com/office/word/2006/wordml');
  50. // Abstract numbering definitions
  51. foreach ($styles as $style) {
  52. if ($style instanceof NumberingStyle) {
  53. $levels = $style->getLevels();
  54. $xmlWriter->startElement('w:abstractNum');
  55. $xmlWriter->writeAttribute('w:abstractNumId', $style->getIndex());
  56. $xmlWriter->startElement('w:nsid');
  57. $xmlWriter->writeAttribute('w:val', $this->getRandomHexNumber());
  58. $xmlWriter->endElement(); // w:nsid
  59. $xmlWriter->startElement('w:multiLevelType');
  60. $xmlWriter->writeAttribute('w:val', $style->getType());
  61. $xmlWriter->endElement(); // w:multiLevelType
  62. if (is_array($levels)) {
  63. foreach ($levels as $level) {
  64. $this->writeLevel($xmlWriter, $level);
  65. }
  66. }
  67. $xmlWriter->endElement(); // w:abstractNum
  68. }
  69. }
  70. // Numbering definition instances
  71. foreach ($styles as $style) {
  72. if ($style instanceof NumberingStyle) {
  73. $xmlWriter->startElement('w:num');
  74. $xmlWriter->writeAttribute('w:numId', $style->getIndex());
  75. $xmlWriter->startElement('w:abstractNumId');
  76. $xmlWriter->writeAttribute('w:val', $style->getIndex());
  77. $xmlWriter->endElement(); // w:abstractNumId
  78. $xmlWriter->endElement(); // w:num
  79. }
  80. }
  81. $xmlWriter->endElement(); // w:numbering
  82. return $xmlWriter->getData();
  83. }
  84. /**
  85. * Write level.
  86. *
  87. * @param \PhpOffice\PhpWord\Shared\XMLWriter $xmlWriter
  88. * @param \PhpOffice\PhpWord\Style\NumberingLevel $level
  89. * @return void
  90. */
  91. private function writeLevel(XMLWriter $xmlWriter, NumberingLevel $level)
  92. {
  93. $xmlWriter->startElement('w:lvl');
  94. $xmlWriter->writeAttribute('w:ilvl', $level->getLevel());
  95. // Numbering level properties
  96. $properties = array(
  97. 'start' => 'start',
  98. 'format' => 'numFmt',
  99. 'restart' => 'lvlRestart',
  100. 'pStyle' => 'pStyle',
  101. 'suffix' => 'suff',
  102. 'text' => 'lvlText',
  103. 'align' => 'lvlJc'
  104. );
  105. foreach ($properties as $property => $nodeName) {
  106. $getMethod = "get{$property}";
  107. if (!is_null($level->$getMethod())) {
  108. $xmlWriter->startElement("w:{$nodeName}");
  109. $xmlWriter->writeAttribute('w:val', $level->$getMethod());
  110. $xmlWriter->endElement(); // w:start
  111. }
  112. }
  113. // Paragraph & font styles
  114. $this->writeParagraph($xmlWriter, $level);
  115. $this->writeFont($xmlWriter, $level);
  116. $xmlWriter->endElement(); // w:lvl
  117. }
  118. /**
  119. * Write level paragraph.
  120. *
  121. * @since 0.11.0
  122. *
  123. * @param \PhpOffice\PhpWord\Shared\XMLWriter $xmlWriter
  124. * @param \PhpOffice\PhpWord\Style\NumberingLevel $level
  125. * @return void
  126. * @todo Use paragraph style writer
  127. */
  128. private function writeParagraph(XMLWriter $xmlWriter, NumberingLevel $level)
  129. {
  130. $tabPos = $level->getTabPos();
  131. $left = $level->getLeft();
  132. $hanging = $level->getHanging();
  133. $xmlWriter->startElement('w:pPr');
  134. $xmlWriter->startElement('w:tabs');
  135. $xmlWriter->startElement('w:tab');
  136. $xmlWriter->writeAttribute('w:val', 'num');
  137. $xmlWriter->writeAttributeIf($tabPos !== null, 'w:pos', $tabPos);
  138. $xmlWriter->endElement(); // w:tab
  139. $xmlWriter->endElement(); // w:tabs
  140. $xmlWriter->startElement('w:ind');
  141. $xmlWriter->writeAttributeIf($left !== null, 'w:left', $left);
  142. $xmlWriter->writeAttributeIf($hanging !== null, 'w:hanging', $hanging);
  143. $xmlWriter->endElement(); // w:ind
  144. $xmlWriter->endElement(); // w:pPr
  145. }
  146. /**
  147. * Write level font.
  148. *
  149. * @since 0.11.0
  150. *
  151. * @param \PhpOffice\PhpWord\Shared\XMLWriter $xmlWriter
  152. * @param \PhpOffice\PhpWord\Style\NumberingLevel $level
  153. * @return void
  154. * @todo Use font style writer
  155. */
  156. private function writeFont(XMLWriter $xmlWriter, NumberingLevel $level)
  157. {
  158. $font = $level->getFont();
  159. $hint = $level->getHint();
  160. $xmlWriter->startElement('w:rPr');
  161. $xmlWriter->startElement('w:rFonts');
  162. $xmlWriter->writeAttributeIf($font !== null, 'w:ascii', $font);
  163. $xmlWriter->writeAttributeIf($font !== null, 'w:hAnsi', $font);
  164. $xmlWriter->writeAttributeIf($font !== null, 'w:cs', $font);
  165. $xmlWriter->writeAttributeIf($hint !== null, 'w:hint', $hint);
  166. $xmlWriter->endElement(); // w:rFonts
  167. $xmlWriter->endElement(); // w:rPr
  168. }
  169. /**
  170. * Get random hexadecimal number value
  171. *
  172. * @param int $length
  173. * @return string
  174. */
  175. private function getRandomHexNumber($length = 8)
  176. {
  177. return strtoupper(substr(md5(rand()), 0, $length));
  178. }
  179. }