Complex classes like Content often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use Content, and based on these observations, apply Extract Interface, too.
| 1 | <?php |
||
| 30 | class Content extends AbstractDecoratorWriter |
||
| 31 | { |
||
| 32 | /** |
||
| 33 | * Stores bullet styles for text shapes that include lists. |
||
| 34 | * |
||
| 35 | * @var [] |
||
| 36 | */ |
||
| 37 | protected $arrStyleBullet = array(); |
||
| 38 | |||
| 39 | /** |
||
| 40 | * Stores paragraph information for text shapes. |
||
| 41 | * |
||
| 42 | * @var array |
||
| 43 | */ |
||
| 44 | protected $arrStyleParagraph = array(); |
||
| 45 | |||
| 46 | /** |
||
| 47 | * Stores font styles for text shapes that include lists. |
||
| 48 | * |
||
| 49 | * @var Run[] |
||
| 50 | */ |
||
| 51 | protected $arrStyleTextFont = array(); |
||
| 52 | |||
| 53 | /** |
||
| 54 | * Used to track the current shape ID. |
||
| 55 | * |
||
| 56 | * @var integer |
||
| 57 | */ |
||
| 58 | protected $shapeId; |
||
| 59 | |||
| 60 | /** |
||
| 61 | * @return ZipInterface |
||
| 62 | */ |
||
| 63 | 59 | public function render() |
|
| 68 | |||
| 69 | |||
| 70 | |||
| 71 | /** |
||
| 72 | * Write content file to XML format |
||
| 73 | * |
||
| 74 | * @return string XML Output |
||
| 75 | * @throws \Exception |
||
| 76 | */ |
||
| 77 | 59 | public function writeContent() |
|
| 78 | { |
||
| 79 | // Create XML writer |
||
| 80 | 59 | $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); |
|
| 81 | 59 | $objWriter->startDocument('1.0', 'UTF-8'); |
|
| 82 | |||
| 83 | // office:document-content |
||
| 84 | 59 | $objWriter->startElement('office:document-content'); |
|
| 85 | 59 | $objWriter->writeAttribute('xmlns:office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0'); |
|
| 86 | 59 | $objWriter->writeAttribute('xmlns:style', 'urn:oasis:names:tc:opendocument:xmlns:style:1.0'); |
|
| 87 | 59 | $objWriter->writeAttribute('xmlns:text', 'urn:oasis:names:tc:opendocument:xmlns:text:1.0'); |
|
| 88 | 59 | $objWriter->writeAttribute('xmlns:table', 'urn:oasis:names:tc:opendocument:xmlns:table:1.0'); |
|
| 89 | 59 | $objWriter->writeAttribute('xmlns:draw', 'urn:oasis:names:tc:opendocument:xmlns:drawing:1.0'); |
|
| 90 | 59 | $objWriter->writeAttribute('xmlns:fo', 'urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0'); |
|
| 91 | 59 | $objWriter->writeAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink'); |
|
| 92 | 59 | $objWriter->writeAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/'); |
|
| 93 | 59 | $objWriter->writeAttribute('xmlns:meta', 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0'); |
|
| 94 | 59 | $objWriter->writeAttribute('xmlns:number', 'urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0'); |
|
| 95 | 59 | $objWriter->writeAttribute('xmlns:presentation', 'urn:oasis:names:tc:opendocument:xmlns:presentation:1.0'); |
|
| 96 | 59 | $objWriter->writeAttribute('xmlns:svg', 'urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0'); |
|
| 97 | 59 | $objWriter->writeAttribute('xmlns:chart', 'urn:oasis:names:tc:opendocument:xmlns:chart:1.0'); |
|
| 98 | 59 | $objWriter->writeAttribute('xmlns:dr3d', 'urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0'); |
|
| 99 | 59 | $objWriter->writeAttribute('xmlns:math', 'http://www.w3.org/1998/Math/MathML'); |
|
| 100 | 59 | $objWriter->writeAttribute('xmlns:form', 'urn:oasis:names:tc:opendocument:xmlns:form:1.0'); |
|
| 101 | 59 | $objWriter->writeAttribute('xmlns:script', 'urn:oasis:names:tc:opendocument:xmlns:script:1.0'); |
|
| 102 | 59 | $objWriter->writeAttribute('xmlns:ooo', 'http://openoffice.org/2004/office'); |
|
| 103 | 59 | $objWriter->writeAttribute('xmlns:ooow', 'http://openoffice.org/2004/writer'); |
|
| 104 | 59 | $objWriter->writeAttribute('xmlns:oooc', 'http://openoffice.org/2004/calc'); |
|
| 105 | 59 | $objWriter->writeAttribute('xmlns:dom', 'http://www.w3.org/2001/xml-events'); |
|
| 106 | 59 | $objWriter->writeAttribute('xmlns:xforms', 'http://www.w3.org/2002/xforms'); |
|
| 107 | 59 | $objWriter->writeAttribute('xmlns:xsd', 'http://www.w3.org/2001/XMLSchema'); |
|
| 108 | 59 | $objWriter->writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); |
|
| 109 | 59 | $objWriter->writeAttribute('xmlns:smil', 'urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0'); |
|
| 110 | 59 | $objWriter->writeAttribute('xmlns:anim', 'urn:oasis:names:tc:opendocument:xmlns:animation:1.0'); |
|
| 111 | 59 | $objWriter->writeAttribute('xmlns:rpt', 'http://openoffice.org/2005/report'); |
|
| 112 | 59 | $objWriter->writeAttribute('xmlns:of', 'urn:oasis:names:tc:opendocument:xmlns:of:1.2'); |
|
| 113 | 59 | $objWriter->writeAttribute('xmlns:rdfa', 'http://docs.oasis-open.org/opendocument/meta/rdfa#'); |
|
| 114 | 59 | $objWriter->writeAttribute('xmlns:field', 'urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0'); |
|
| 115 | 59 | $objWriter->writeAttribute('xmlns:officeooo', 'http://openoffice.org/2009/office'); |
|
| 116 | 59 | $objWriter->writeAttribute('office:version', '1.2'); |
|
| 117 | |||
| 118 | // office:automatic-styles |
||
| 119 | 59 | $objWriter->startElement('office:automatic-styles'); |
|
| 120 | |||
| 121 | 59 | $this->shapeId = 0; |
|
| 122 | 59 | $incSlide = 0; |
|
| 123 | 59 | foreach ($this->getPresentation()->getAllSlides() as $pSlide) { |
|
| 124 | // Slides |
||
| 125 | 59 | $this->writeStyleSlide($objWriter, $pSlide, $incSlide); |
|
| 126 | |||
| 127 | // Images |
||
| 128 | 59 | $shapes = $pSlide->getShapeCollection(); |
|
| 129 | 59 | foreach ($shapes as $shape) { |
|
| 130 | // Increment $this->shapeId |
||
| 131 | 51 | ++$this->shapeId; |
|
| 132 | |||
| 133 | // Check type |
||
| 134 | 51 | if ($shape instanceof RichText) { |
|
| 135 | 14 | $this->writeTxtStyle($objWriter, $shape); |
|
| 136 | 14 | } |
|
| 137 | 51 | if ($shape instanceof AbstractDrawing) { |
|
|
|
|||
| 138 | $this->writeDrawingStyle($objWriter, $shape); |
||
| 139 | } |
||
| 140 | 51 | if ($shape instanceof Line) { |
|
| 141 | 1 | $this->writeLineStyle($objWriter, $shape); |
|
| 142 | 1 | } |
|
| 143 | 51 | if ($shape instanceof Table) { |
|
| 144 | 7 | $this->writeTableStyle($objWriter, $shape); |
|
| 145 | 7 | } |
|
| 146 | 51 | if ($shape instanceof Group) { |
|
| 147 | 1 | $this->writeGroupStyle($objWriter, $shape); |
|
| 148 | 1 | } |
|
| 149 | 59 | } |
|
| 150 | |||
| 151 | 59 | $incSlide++; |
|
| 152 | 59 | } |
|
| 153 | // Style : Bullet |
||
| 154 | 59 | if (!empty($this->arrStyleBullet)) { |
|
| 155 | 14 | foreach ($this->arrStyleBullet as $key => $item) { |
|
| 156 | 14 | $oStyle = $item['oStyle']; |
|
| 157 | 14 | $arrLevel = explode(';', $item['level']); |
|
| 158 | // style:style |
||
| 159 | 14 | $objWriter->startElement('text:list-style'); |
|
| 160 | 14 | $objWriter->writeAttribute('style:name', 'L_' . $key); |
|
| 161 | 14 | foreach ($arrLevel as $level) { |
|
| 162 | 14 | if ($level != '') { |
|
| 163 | 14 | $oAlign = $item['oAlign_' . $level]; |
|
| 164 | // text:list-level-style-bullet |
||
| 165 | 14 | $objWriter->startElement('text:list-level-style-bullet'); |
|
| 166 | 14 | $objWriter->writeAttribute('text:level', $level + 1); |
|
| 167 | 14 | $objWriter->writeAttribute('text:bullet-char', $oStyle->getBulletChar()); |
|
| 168 | // style:list-level-properties |
||
| 169 | 14 | $objWriter->startElement('style:list-level-properties'); |
|
| 170 | 14 | if ($oAlign->getIndent() < 0) { |
|
| 171 | 1 | $objWriter->writeAttribute('text:space-before', CommonDrawing::pixelsToCentimeters($oAlign->getMarginLeft() - (-1 * $oAlign->getIndent())) . 'cm'); |
|
| 172 | 1 | $objWriter->writeAttribute('text:min-label-width', CommonDrawing::pixelsToCentimeters(-1 * $oAlign->getIndent()) . 'cm'); |
|
| 173 | 1 | } else { |
|
| 174 | 13 | $objWriter->writeAttribute('text:space-before', (CommonDrawing::pixelsToCentimeters($oAlign->getMarginLeft() - $oAlign->getIndent())) . 'cm'); |
|
| 175 | 13 | $objWriter->writeAttribute('text:min-label-width', CommonDrawing::pixelsToCentimeters($oAlign->getIndent()) . 'cm'); |
|
| 176 | } |
||
| 177 | |||
| 178 | 14 | $objWriter->endElement(); |
|
| 179 | // style:text-properties |
||
| 180 | 14 | $objWriter->startElement('style:text-properties'); |
|
| 181 | 14 | $objWriter->writeAttribute('fo:font-family', $oStyle->getBulletFont()); |
|
| 182 | 14 | $objWriter->writeAttribute('style:font-family-generic', 'swiss'); |
|
| 183 | 14 | $objWriter->writeAttribute('style:use-window-font-color', 'true'); |
|
| 184 | 14 | $objWriter->writeAttribute('fo:font-size', '100'); |
|
| 185 | 14 | $objWriter->endElement(); |
|
| 186 | 14 | $objWriter->endElement(); |
|
| 187 | 14 | } |
|
| 188 | 14 | } |
|
| 189 | 14 | $objWriter->endElement(); |
|
| 190 | 14 | } |
|
| 191 | 14 | } |
|
| 192 | // Style : Paragraph |
||
| 193 | 59 | if (!empty($this->arrStyleParagraph)) { |
|
| 194 | 14 | foreach ($this->arrStyleParagraph as $key => $item) { |
|
| 195 | // style:style |
||
| 196 | 14 | $objWriter->startElement('style:style'); |
|
| 197 | 14 | $objWriter->writeAttribute('style:name', 'P_' . $key); |
|
| 198 | 14 | $objWriter->writeAttribute('style:family', 'paragraph'); |
|
| 199 | // style:paragraph-properties |
||
| 200 | 14 | $objWriter->startElement('style:paragraph-properties'); |
|
| 201 | 14 | switch ($item->getAlignment()->getHorizontal()) { |
|
| 202 | 14 | case Alignment::HORIZONTAL_LEFT: |
|
| 203 | 14 | $objWriter->writeAttribute('fo:text-align', 'left'); |
|
| 204 | 14 | break; |
|
| 205 | 1 | case Alignment::HORIZONTAL_RIGHT: |
|
| 206 | 1 | $objWriter->writeAttribute('fo:text-align', 'right'); |
|
| 207 | 1 | break; |
|
| 208 | 1 | case Alignment::HORIZONTAL_CENTER: |
|
| 209 | 1 | $objWriter->writeAttribute('fo:text-align', 'center'); |
|
| 210 | 1 | break; |
|
| 211 | 1 | case Alignment::HORIZONTAL_JUSTIFY: |
|
| 212 | 1 | $objWriter->writeAttribute('fo:text-align', 'justify'); |
|
| 213 | 1 | break; |
|
| 214 | 1 | case Alignment::HORIZONTAL_DISTRIBUTED: |
|
| 215 | 1 | $objWriter->writeAttribute('fo:text-align', 'justify'); |
|
| 216 | 1 | break; |
|
| 217 | 1 | default: |
|
| 218 | 1 | $objWriter->writeAttribute('fo:text-align', 'left'); |
|
| 219 | 1 | break; |
|
| 220 | 14 | } |
|
| 221 | 14 | $objWriter->endElement(); |
|
| 222 | 14 | $objWriter->endElement(); |
|
| 223 | 14 | } |
|
| 224 | 14 | } |
|
| 225 | // Style : Text : Font |
||
| 226 | 59 | if (!empty($this->arrStyleTextFont)) { |
|
| 227 | 10 | foreach ($this->arrStyleTextFont as $key => $item) { |
|
| 228 | // style:style |
||
| 229 | 10 | $objWriter->startElement('style:style'); |
|
| 230 | 10 | $objWriter->writeAttribute('style:name', 'T_' . $key); |
|
| 231 | 10 | $objWriter->writeAttribute('style:family', 'text'); |
|
| 232 | // style:text-properties |
||
| 233 | 10 | $objWriter->startElement('style:text-properties'); |
|
| 234 | 10 | $objWriter->writeAttribute('fo:color', '#' . $item->getFont()->getColor()->getRGB()); |
|
| 235 | 10 | $objWriter->writeAttribute('fo:font-family', $item->getFont()->getName()); |
|
| 236 | 10 | $objWriter->writeAttribute('fo:font-size', $item->getFont()->getSize() . 'pt'); |
|
| 237 | // @todo : fo:font-style |
||
| 238 | 10 | if ($item->getFont()->isBold()) { |
|
| 239 | 1 | $objWriter->writeAttribute('fo:font-weight', 'bold'); |
|
| 240 | 1 | } |
|
| 241 | 10 | $objWriter->writeAttribute('fo:language', ($item->getLanguage() ? $item->getLanguage() : 'en-US')); |
|
| 242 | |||
| 243 | // @todo : style:text-underline-style |
||
| 244 | 10 | $objWriter->endElement(); |
|
| 245 | 10 | $objWriter->endElement(); |
|
| 246 | 10 | } |
|
| 247 | 10 | } |
|
| 248 | 59 | $objWriter->endElement(); |
|
| 249 | |||
| 250 | //=============================================== |
||
| 251 | // Body |
||
| 252 | //=============================================== |
||
| 253 | // office:body |
||
| 254 | 59 | $objWriter->startElement('office:body'); |
|
| 255 | // office:presentation |
||
| 256 | 59 | $objWriter->startElement('office:presentation'); |
|
| 257 | |||
| 258 | // Write slides |
||
| 259 | 59 | $slideCount = $this->getPresentation()->getSlideCount(); |
|
| 260 | 59 | $this->shapeId = 0; |
|
| 261 | 59 | for ($i = 0; $i < $slideCount; ++$i) { |
|
| 262 | 59 | $pSlide = $this->getPresentation()->getSlide($i); |
|
| 263 | 59 | $objWriter->startElement('draw:page'); |
|
| 264 | 59 | $name = $pSlide->getName(); |
|
| 265 | 59 | if (!is_null($name)) { |
|
| 266 | 1 | $objWriter->writeAttribute('draw:name', $name); |
|
| 267 | 1 | } |
|
| 268 | 59 | $objWriter->writeAttribute('draw:master-page-name', 'Standard'); |
|
| 269 | 59 | $objWriter->writeAttribute('draw:style-name', 'stylePage' . $i); |
|
| 270 | // Images |
||
| 271 | 59 | $shapes = $pSlide->getShapeCollection(); |
|
| 272 | 59 | foreach ($shapes as $shape) { |
|
| 273 | // Increment $this->shapeId |
||
| 274 | 51 | ++$this->shapeId; |
|
| 275 | |||
| 276 | // Check type |
||
| 277 | 51 | if ($shape instanceof RichText) { |
|
| 278 | 14 | $this->writeShapeTxt($objWriter, $shape); |
|
| 279 | 51 | } elseif ($shape instanceof Table) { |
|
| 280 | 7 | $this->writeShapeTable($objWriter, $shape); |
|
| 281 | 38 | } elseif ($shape instanceof Line) { |
|
| 282 | 1 | $this->writeShapeLine($objWriter, $shape); |
|
| 283 | 32 | } elseif ($shape instanceof Chart) { |
|
| 284 | 21 | $this->writeShapeChart($objWriter, $shape); |
|
| 285 | 32 | } elseif ($shape instanceof Media) { |
|
| 286 | 1 | $this->writeShapeMedia($objWriter, $shape); |
|
| 287 | 12 | } elseif ($shape instanceof ShapeDrawing\AbstractDrawingAdapter) { |
|
| 288 | 8 | $this->writeShapeDrawing($objWriter, $shape); |
|
| 289 | 11 | } elseif ($shape instanceof Group) { |
|
| 290 | 1 | $this->writeShapeGroup($objWriter, $shape); |
|
| 291 | 3 | } elseif ($shape instanceof Comment) { |
|
| 292 | 2 | $this->writeShapeComment($objWriter, $shape); |
|
| 293 | 2 | } |
|
| 294 | 59 | } |
|
| 295 | // Slide Note |
||
| 296 | 59 | if ($pSlide->getNote() instanceof Note) { |
|
| 297 | 59 | $this->writeSlideNote($objWriter, $pSlide->getNote()); |
|
| 298 | 59 | } |
|
| 299 | |||
| 300 | 59 | $objWriter->endElement(); |
|
| 301 | 59 | } |
|
| 302 | |||
| 303 | 59 | if ($this->getPresentation()->getPresentationProperties()->isLoopContinuouslyUntilEsc()) { |
|
| 304 | $objWriter->startElement('presentation:settings'); |
||
| 305 | $objWriter->writeAttribute('presentation:endless', 'true'); |
||
| 306 | $objWriter->writeAttribute('presentation:pause', 'P0s'); |
||
| 307 | $objWriter->writeAttribute('presentation:mouse-visible', 'false'); |
||
| 308 | $objWriter->endElement(); |
||
| 309 | } |
||
| 310 | // > office:presentation |
||
| 311 | 59 | $objWriter->endElement(); |
|
| 312 | // > office:body |
||
| 313 | 59 | $objWriter->endElement(); |
|
| 314 | // > office:document-content |
||
| 315 | 59 | $objWriter->endElement(); |
|
| 316 | |||
| 317 | // Return |
||
| 318 | 59 | return $objWriter->getData(); |
|
| 319 | } |
||
| 320 | |||
| 321 | /** |
||
| 322 | * Write picture |
||
| 323 | * |
||
| 324 | * @param \PhpOffice\Common\XMLWriter $objWriter |
||
| 325 | * @param \PhpOffice\PhpPresentation\Shape\Media $shape |
||
| 326 | */ |
||
| 327 | 1 | public function writeShapeMedia(XMLWriter $objWriter, Media $shape) |
|
| 328 | { |
||
| 329 | // draw:frame |
||
| 330 | 1 | $objWriter->startElement('draw:frame'); |
|
| 331 | 1 | $objWriter->writeAttribute('draw:name', $shape->getName()); |
|
| 332 | 1 | $objWriter->writeAttribute('svg:width', Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getWidth()), 3) . 'cm'); |
|
| 333 | 1 | $objWriter->writeAttribute('svg:height', Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getHeight()), 3) . 'cm'); |
|
| 334 | 1 | $objWriter->writeAttribute('svg:x', Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getOffsetX()), 3) . 'cm'); |
|
| 335 | 1 | $objWriter->writeAttribute('svg:y', Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getOffsetY()), 3) . 'cm'); |
|
| 336 | 1 | $objWriter->writeAttribute('draw:style-name', 'gr' . $this->shapeId); |
|
| 337 | // draw:frame > draw:plugin |
||
| 338 | 1 | $objWriter->startElement('draw:plugin'); |
|
| 339 | 1 | $objWriter->writeAttribute('xlink:href', 'Pictures/' . $shape->getIndexedFilename()); |
|
| 340 | 1 | $objWriter->writeAttribute('xlink:type', 'simple'); |
|
| 341 | 1 | $objWriter->writeAttribute('xlink:show', 'embed'); |
|
| 342 | 1 | $objWriter->writeAttribute('xlink:actuate', 'onLoad'); |
|
| 343 | 1 | $objWriter->writeAttribute('draw:mime-type', 'application/vnd.sun.star.media'); |
|
| 344 | |||
| 345 | 1 | $objWriter->startElement('draw:param'); |
|
| 346 | 1 | $objWriter->writeAttribute('draw:name', 'Loop'); |
|
| 347 | 1 | $objWriter->writeAttribute('draw:value', 'false'); |
|
| 348 | 1 | $objWriter->endElement(); |
|
| 349 | 1 | $objWriter->startElement('draw:param'); |
|
| 350 | 1 | $objWriter->writeAttribute('draw:name', 'Mute'); |
|
| 351 | 1 | $objWriter->writeAttribute('draw:value', 'false'); |
|
| 352 | 1 | $objWriter->endElement(); |
|
| 353 | 1 | $objWriter->startElement('draw:param'); |
|
| 354 | 1 | $objWriter->writeAttribute('draw:name', 'VolumeDB'); |
|
| 355 | 1 | $objWriter->writeAttribute('draw:value', 0); |
|
| 356 | 1 | $objWriter->endElement(); |
|
| 357 | 1 | $objWriter->startElement('draw:param'); |
|
| 358 | 1 | $objWriter->writeAttribute('draw:name', 'Zoom'); |
|
| 359 | 1 | $objWriter->writeAttribute('draw:value', 'fit'); |
|
| 360 | 1 | $objWriter->endElement(); |
|
| 361 | |||
| 362 | // draw:frame > ## draw:plugin |
||
| 363 | 1 | $objWriter->endElement(); |
|
| 364 | |||
| 365 | // ## draw:frame |
||
| 366 | 1 | $objWriter->endElement(); |
|
| 367 | 1 | } |
|
| 368 | |||
| 369 | /** |
||
| 370 | * Write picture |
||
| 371 | * |
||
| 372 | * @param \PhpOffice\Common\XMLWriter $objWriter |
||
| 373 | * @param \PhpOffice\PhpPresentation\Shape\AbstractDrawing $shape |
||
| 374 | */ |
||
| 375 | 9 | public function writeShapeDrawing(XMLWriter $objWriter, ShapeDrawing\AbstractDrawingAdapter $shape) |
|
| 415 | |||
| 416 | /** |
||
| 417 | * Write text |
||
| 418 | * |
||
| 419 | * @param \PhpOffice\Common\XMLWriter $objWriter |
||
| 420 | * @param \PhpOffice\PhpPresentation\Shape\RichText $shape |
||
| 421 | */ |
||
| 422 | 15 | public function writeShapeTxt(XMLWriter $objWriter, RichText $shape) |
|
| 423 | { |
||
| 424 | // draw:frame |
||
| 425 | 15 | $objWriter->startElement('draw:frame'); |
|
| 426 | 15 | $objWriter->writeAttribute('draw:style-name', 'gr' . $this->shapeId); |
|
| 427 | 15 | $objWriter->writeAttribute('svg:width', Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getWidth()), 3) . 'cm'); |
|
| 428 | 15 | $objWriter->writeAttribute('svg:height', Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getHeight()), 3) . 'cm'); |
|
| 429 | 15 | $objWriter->writeAttribute('svg:x', Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getOffsetX()), 3) . 'cm'); |
|
| 430 | 15 | $objWriter->writeAttribute('svg:y', Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getOffsetY()), 3) . 'cm'); |
|
| 431 | // draw:text-box |
||
| 432 | 15 | $objWriter->startElement('draw:text-box'); |
|
| 433 | |||
| 434 | 15 | $paragraphs = $shape->getParagraphs(); |
|
| 435 | 15 | $paragraphId = 0; |
|
| 436 | 15 | $sCstShpLastBullet = ''; |
|
| 437 | 15 | $iCstShpLastBulletLvl = 0; |
|
| 438 | 15 | $bCstShpHasBullet = false; |
|
| 439 | |||
| 440 | 15 | foreach ($paragraphs as $paragraph) { |
|
| 441 | // Close the bullet list |
||
| 442 | 15 | if ($sCstShpLastBullet != 'bullet' && $bCstShpHasBullet === true) { |
|
| 443 | for ($iInc = $iCstShpLastBulletLvl; $iInc >= 0; $iInc--) { |
||
| 444 | // text:list-item |
||
| 445 | $objWriter->endElement(); |
||
| 446 | // text:list |
||
| 447 | $objWriter->endElement(); |
||
| 448 | } |
||
| 449 | } |
||
| 450 | //=============================================== |
||
| 451 | // Paragraph |
||
| 452 | //=============================================== |
||
| 453 | 15 | if ($paragraph->getBulletStyle()->getBulletType() == 'none') { |
|
| 454 | 12 | ++$paragraphId; |
|
| 455 | // text:p |
||
| 456 | 12 | $objWriter->startElement('text:p'); |
|
| 457 | 12 | $objWriter->writeAttribute('text:style-name', 'P_' . $paragraph->getHashCode()); |
|
| 458 | |||
| 459 | // Loop trough rich text elements |
||
| 460 | 12 | $richtexts = $paragraph->getRichTextElements(); |
|
| 461 | 12 | $richtextId = 0; |
|
| 462 | 12 | foreach ($richtexts as $richtext) { |
|
| 463 | 6 | ++$richtextId; |
|
| 464 | 6 | if ($richtext instanceof TextElement || $richtext instanceof Run) { |
|
| 465 | // text:span |
||
| 466 | 6 | $objWriter->startElement('text:span'); |
|
| 467 | 6 | if ($richtext instanceof Run) { |
|
| 468 | 6 | $objWriter->writeAttribute('text:style-name', 'T_' . $richtext->getHashCode()); |
|
| 469 | 6 | } |
|
| 470 | 6 | if ($richtext->hasHyperlink() === true && $richtext->getHyperlink()->getUrl() != '') { |
|
| 471 | // text:a |
||
| 472 | 1 | $objWriter->startElement('text:a'); |
|
| 473 | 1 | $objWriter->writeAttribute('xlink:href', $richtext->getHyperlink()->getUrl()); |
|
| 474 | 1 | $objWriter->text($richtext->getText()); |
|
| 475 | 1 | $objWriter->endElement(); |
|
| 476 | 1 | } else { |
|
| 477 | 6 | $objWriter->text($richtext->getText()); |
|
| 478 | } |
||
| 479 | 6 | $objWriter->endElement(); |
|
| 480 | 6 | } elseif ($richtext instanceof BreakElement) { |
|
| 481 | // text:span |
||
| 482 | 1 | $objWriter->startElement('text:span'); |
|
| 483 | // text:line-break |
||
| 484 | 1 | $objWriter->startElement('text:line-break'); |
|
| 485 | 1 | $objWriter->endElement(); |
|
| 486 | 1 | $objWriter->endElement(); |
|
| 487 | 1 | } else { |
|
| 488 | //echo '<pre>'.print_r($richtext, true).'</pre>'; |
||
| 489 | } |
||
| 490 | 12 | } |
|
| 491 | 12 | $objWriter->endElement(); |
|
| 492 | //=============================================== |
||
| 493 | // Bullet list |
||
| 494 | //=============================================== |
||
| 495 | 15 | } elseif ($paragraph->getBulletStyle()->getBulletType() == 'bullet') { |
|
| 496 | 3 | $bCstShpHasBullet = true; |
|
| 497 | // Open the bullet list |
||
| 498 | 3 | if ($sCstShpLastBullet != 'bullet' || ($sCstShpLastBullet == $paragraph->getBulletStyle()->getBulletType() && $iCstShpLastBulletLvl < $paragraph->getAlignment()->getLevel())) { |
|
| 499 | // text:list |
||
| 500 | 3 | $objWriter->startElement('text:list'); |
|
| 501 | 3 | $objWriter->writeAttribute('text:style-name', 'L_' . $paragraph->getBulletStyle()->getHashCode()); |
|
| 502 | 3 | } |
|
| 503 | 3 | if ($sCstShpLastBullet == 'bullet') { |
|
| 504 | 2 | if ($iCstShpLastBulletLvl == $paragraph->getAlignment()->getLevel()) { |
|
| 505 | // text:list-item |
||
| 506 | 2 | $objWriter->endElement(); |
|
| 507 | 2 | } elseif ($iCstShpLastBulletLvl > $paragraph->getAlignment()->getLevel()) { |
|
| 508 | // text:list-item |
||
| 509 | 1 | $objWriter->endElement(); |
|
| 510 | // text:list |
||
| 511 | 1 | $objWriter->endElement(); |
|
| 512 | // text:list-item |
||
| 513 | 1 | $objWriter->endElement(); |
|
| 514 | 1 | } |
|
| 515 | 2 | } |
|
| 516 | |||
| 517 | // text:list-item |
||
| 518 | 3 | $objWriter->startElement('text:list-item'); |
|
| 519 | 3 | ++$paragraphId; |
|
| 520 | // text:p |
||
| 521 | 3 | $objWriter->startElement('text:p'); |
|
| 522 | 3 | $objWriter->writeAttribute('text:style-name', 'P_' . $paragraph->getHashCode()); |
|
| 523 | |||
| 524 | // Loop trough rich text elements |
||
| 525 | 3 | $richtexts = $paragraph->getRichTextElements(); |
|
| 526 | 3 | $richtextId = 0; |
|
| 527 | 3 | foreach ($richtexts as $richtext) { |
|
| 528 | 3 | ++$richtextId; |
|
| 529 | 3 | if ($richtext instanceof TextElement || $richtext instanceof Run) { |
|
| 530 | // text:span |
||
| 531 | 3 | $objWriter->startElement('text:span'); |
|
| 532 | 3 | if ($richtext instanceof Run) { |
|
| 533 | 3 | $objWriter->writeAttribute('text:style-name', 'T_' . $richtext->getHashCode()); |
|
| 534 | 3 | } |
|
| 535 | 3 | if ($richtext->hasHyperlink() === true && $richtext->getHyperlink()->getUrl() != '') { |
|
| 536 | // text:a |
||
| 537 | 1 | $objWriter->startElement('text:a'); |
|
| 538 | 1 | $objWriter->writeAttribute('xlink:href', $richtext->getHyperlink()->getUrl()); |
|
| 539 | 1 | $objWriter->text($richtext->getText()); |
|
| 540 | 1 | $objWriter->endElement(); |
|
| 541 | 1 | } else { |
|
| 542 | 3 | $objWriter->text($richtext->getText()); |
|
| 543 | } |
||
| 544 | 3 | $objWriter->endElement(); |
|
| 545 | 3 | } elseif ($richtext instanceof BreakElement) { |
|
| 546 | // text:span |
||
| 547 | 1 | $objWriter->startElement('text:span'); |
|
| 548 | // text:line-break |
||
| 549 | 1 | $objWriter->startElement('text:line-break'); |
|
| 550 | 1 | $objWriter->endElement(); |
|
| 551 | 1 | $objWriter->endElement(); |
|
| 552 | 1 | } else { |
|
| 553 | //echo '<pre>'.print_r($richtext, true).'</pre>'; |
||
| 554 | } |
||
| 555 | 3 | } |
|
| 556 | 3 | $objWriter->endElement(); |
|
| 557 | 3 | } |
|
| 558 | 15 | $sCstShpLastBullet = $paragraph->getBulletStyle()->getBulletType(); |
|
| 559 | 15 | $iCstShpLastBulletLvl = $paragraph->getAlignment()->getLevel(); |
|
| 560 | 15 | } |
|
| 561 | |||
| 562 | // Close the bullet list |
||
| 563 | 15 | if ($sCstShpLastBullet == 'bullet' && $bCstShpHasBullet === true) { |
|
| 564 | 3 | for ($iInc = $iCstShpLastBulletLvl; $iInc >= 0; $iInc--) { |
|
| 565 | // text:list-item |
||
| 566 | 3 | $objWriter->endElement(); |
|
| 567 | // text:list |
||
| 568 | 3 | $objWriter->endElement(); |
|
| 569 | 3 | } |
|
| 570 | 3 | } |
|
| 571 | |||
| 572 | // > draw:text-box |
||
| 573 | 15 | $objWriter->endElement(); |
|
| 574 | // > draw:frame |
||
| 575 | 15 | $objWriter->endElement(); |
|
| 576 | 15 | } |
|
| 577 | /** |
||
| 578 | * Write Comment |
||
| 579 | * @param XMLWriter $objWriter |
||
| 580 | * @param Comment $oShape |
||
| 581 | */ |
||
| 582 | 2 | public function writeShapeComment(XMLWriter $objWriter, Comment $oShape) |
|
| 598 | |||
| 599 | /** |
||
| 600 | * @param XMLWriter $objWriter |
||
| 601 | * @param Line $shape |
||
| 602 | */ |
||
| 603 | 1 | public function writeShapeLine(XMLWriter $objWriter, Line $shape) |
|
| 618 | |||
| 619 | /** |
||
| 620 | * Write table Shape |
||
| 621 | * @param XMLWriter $objWriter |
||
| 622 | * @param Table $shape |
||
| 623 | */ |
||
| 624 | 7 | public function writeShapeTable(XMLWriter $objWriter, Table $shape) |
|
| 705 | |||
| 706 | /** |
||
| 707 | * Write table Chart |
||
| 708 | * @param XMLWriter $objWriter |
||
| 709 | * @param Chart $shape |
||
| 710 | * @throws \Exception |
||
| 711 | */ |
||
| 712 | 21 | public function writeShapeChart(XMLWriter $objWriter, Chart $shape) |
|
| 737 | |||
| 738 | /** |
||
| 739 | * Writes a group of shapes |
||
| 740 | * |
||
| 741 | * @param XMLWriter $objWriter |
||
| 742 | * @param Group $group |
||
| 743 | */ |
||
| 744 | 1 | public function writeShapeGroup(XMLWriter $objWriter, Group $group) |
|
| 772 | |||
| 773 | /** |
||
| 774 | * Writes the style information for a group of shapes |
||
| 775 | * |
||
| 776 | * @param XMLWriter $objWriter |
||
| 777 | * @param Group $group |
||
| 778 | */ |
||
| 779 | 1 | public function writeGroupStyle(XMLWriter $objWriter, Group $group) |
|
| 801 | |||
| 802 | /** |
||
| 803 | * Write the default style information for a RichText shape |
||
| 804 | * |
||
| 805 | * @param \PhpOffice\Common\XMLWriter $objWriter |
||
| 806 | * @param \PhpOffice\PhpPresentation\Shape\RichText $shape |
||
| 807 | */ |
||
| 808 | 14 | public function writeTxtStyle(XMLWriter $objWriter, RichText $shape) |
|
| 913 | |||
| 914 | /** |
||
| 915 | * Write the default style information for an AbstractDrawing |
||
| 916 | * |
||
| 917 | * @param \PhpOffice\Common\XMLWriter $objWriter |
||
| 918 | * @param \PhpOffice\PhpPresentation\Shape\AbstractDrawing $shape |
||
| 919 | */ |
||
| 920 | public function writeDrawingStyle(XMLWriter $objWriter, AbstractDrawing $shape) |
||
| 939 | |||
| 940 | /** |
||
| 941 | * Write the default style information for a Line shape. |
||
| 942 | * |
||
| 943 | * @param XMLWriter $objWriter |
||
| 944 | * @param Line $shape |
||
| 945 | */ |
||
| 946 | 1 | public function writeLineStyle(XMLWriter $objWriter, Line $shape) |
|
| 974 | |||
| 975 | /** |
||
| 976 | * Write the default style information for a Table shape |
||
| 977 | * |
||
| 978 | * @param XMLWriter $objWriter |
||
| 979 | * @param Table $shape |
||
| 980 | */ |
||
| 981 | 7 | public function writeTableStyle(XMLWriter $objWriter, Table $shape) |
|
| 1083 | |||
| 1084 | /** |
||
| 1085 | * Write the slide note |
||
| 1086 | * @param XMLWriter $objWriter |
||
| 1087 | * @param \PhpOffice\PhpPresentation\Slide\Note $note |
||
| 1088 | */ |
||
| 1089 | 59 | public function writeSlideNote(XMLWriter $objWriter, Note $note) |
|
| 1107 | |||
| 1108 | /** |
||
| 1109 | * Write style of a slide |
||
| 1110 | * @param XMLWriter $objWriter |
||
| 1111 | * @param Slide $slide |
||
| 1112 | * @param int $incPage |
||
| 1113 | */ |
||
| 1114 | 59 | public function writeStyleSlide(XMLWriter $objWriter, Slide $slide, $incPage) |
|
| 1306 | |||
| 1307 | |||
| 1308 | /** |
||
| 1309 | * @param XMLWriter $objWriter |
||
| 1310 | * @param Shadow $oShadow |
||
| 1311 | * @todo Improve for supporting any direction (https://sinepost.wordpress.com/2012/02/16/theyve-got-atan-you-want-atan2/) |
||
| 1312 | */ |
||
| 1313 | 1 | protected function writeStylePartShadow(XMLWriter $objWriter, Shadow $oShadow) |
|
| 1348 | } |
||
| 1349 |
This error could be the result of:
1. Missing dependencies
PHP Analyzer uses your
composer.jsonfile (if available) to determine the dependencies of your project and to determine all the available classes and functions. It expects thecomposer.jsonto be in the root folder of your repository.Are you sure this class is defined by one of your dependencies, or did you maybe not list a dependency in either the
requireorrequire-devsection?2. Missing use statement
PHP does not complain about undefined classes in
ìnstanceofchecks. For example, the following PHP code will work perfectly fine:If you have not tested against this specific condition, such errors might go unnoticed.