This file is part of PHPRtfLite. PHPRtfLite is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. PHPRtfLite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with PHPRtfLite. If not, see . */ /** * Base class for rtf containers. * @version 1.2 * @author Steffen Zeidler * @copyright 2010-2012 Steffen Zeidler * @package PHPRtfLite * @subpackage PHPRtfLite_Container */ abstract class PHPRtfLite_Container_Base { /** * @var PHPRtfLite */ protected $_rtf; /** * @var array */ protected $_elements = array(); /** * @var string */ protected $_pard = '\pard '; /** * constructor * * @param PHPRtfLite $rtf */ public function __construct(PHPRtfLite $rtf) { $this->_rtf = $rtf; } /** * gets rtf object * * @return PHPRtfLite */ public function getRtf() { return $this->_rtf; } /** * counts container elements * * @return integer */ public function countElements() { return count($this->_elements); } /** * gets container elements * * @return array */ public function getElements() { return $this->_elements; } /** * adds element with rtf code directly * (no converting will be made by PHPRtfLite) * * @param string $code * @param PHPRtfLite_Font $font * @param PHPRtfLite_ParFormat $parFormat * @return PHPRtfLite_Element */ public function writeRtfCode($code, PHPRtfLite_Font $font = null, PHPRtfLite_ParFormat $parFormat = null) { $element = new PHPRtfLite_Element($this->_rtf, $code, $font, $parFormat); $element->setIsRtfCode(); $this->_elements[] = $element; return $element; } /** * adds element with plain rtf code directly * (no converting will be made by PHPRtfLite - even no opening and closing curly brackets) * * @param string $code * @return PHPRtfLite_Element */ public function writePlainRtfCode($code) { $element = new PHPRtfLite_Element_Plain($this->_rtf, $code); $element->setIsRtfCode(); $this->_elements[] = $element; return $element; } /** * adds empty paragraph to container. * * @param PHPRtfLite_Font $font * @param PHPRtfLite_ParFormat $parFormat * @return PHPRtfLite_Element */ public function addEmptyParagraph(PHPRtfLite_Font $font = null, PHPRtfLite_ParFormat $parFormat = null) { if ($parFormat === null) { $parFormat = new PHPRtfLite_ParFormat(); } $element = new PHPRtfLite_Element($this->_rtf, '\\par', $font, $parFormat); $element->setIsRtfCode(); $this->_elements[] = $element; return $element; } /** * writes text to container. * * @param string $text Text. Also you can use html style tags. Possible tags:
* strong, b- bold;
* em - ;
* i - italic;
* u - underline;
* br - line break;
* chdate - current date;
* chdpl - current date in long format;
* chdpa - current date in abbreviated format;
* chtime - current time;
* chpgn, pagenum - page number ;
* tab - tab * sectnum - section number;
* line - line break;
* page - page break;
* sect - section break;
* @param PHPRtfLite_Font $font font of text * @param PHPRtfLite_ParFormat $parFormat paragraph format, if null, text is written in the same paragraph. * @param boolean $convertTagsToRtf if false, then html style tags are not replaced with rtf code * @return PHPRtfLite_Element */ public function writeText($text, PHPRtfLite_Font $font = null, PHPRtfLite_ParFormat $parFormat = null, $convertTagsToRtf = true) { $element = new PHPRtfLite_Element($this->_rtf, $text, $font, $parFormat); if ($convertTagsToRtf) { $element->setConvertTagsToRtf(); } $this->_elements[] = $element; return $element; } /** * writes hyperlink to container. * * @param string $hyperlink hyperlink url (etc. "http://www.phprtf.com") * @param string $text hyperlink text, if empty, hyperlink is written in previous paragraph format. * @param PHPRtfLite_Font $font * @param PHPRtfLite_ParFormat $parFormat * @param boolean $convertTagsToRtf if false, then html style tags are not replaced with rtf code * @return PHPRtfLite_Element */ public function writeHyperLink($hyperlink, $text, PHPRtfLite_Font $font = null, PHPRtfLite_ParFormat $parFormat = null, $convertTagsToRtf = true) { $element = new PHPRtfLite_Element_Hyperlink($this->_rtf, $text, $font, $parFormat); $element->setHyperlink($hyperlink); if ($convertTagsToRtf) { $element->setConvertTagsToRtf(); } $this->_elements[] = $element; return $element; } /** * adds table to element container. * * @param string $alignment Alingment of table. Represented by class constants PHPRtfLite_Table::ALIGN_*
* Possible values:
* PHPRtfLite_Table::ALIGN_LEFT => 'left',
* PHPRtfLite_Table::ALIGN_CENTER => 'center',
* PHPRtfLite_Table::ALIGN_RIGHT => 'right'
* * @return PHPRtfLite_Table */ public function addTable($alignment = PHPRtfLite_Table::ALIGN_LEFT) { $table = new PHPRtfLite_Table($this, $alignment); $this->_elements[] = $table; return $table; } /** * adds image to element container. * * @param string $fileName name of image file. * @param PHPRtfLite_ParFormat $parFormat paragraph format, ff null image will appear in the same paragraph. * @param float $width if null image is displayed by it's height. * @param float $height if null image is displayed by it's width. * If boths parameters are null, image is displayed as it is. * * @return PHPRtfLite_Image */ public function addImage($fileName, PHPRtfLite_ParFormat $parFormat = null, $width = null, $height = null) { $image = PHPRtfLite_Image::createFromFile($this->_rtf, $fileName, $width, $height); if ($parFormat) { $image->setParFormat($parFormat); } $this->_elements[] = $image; return $image; } /** * adds image to element container. * * @param string $string name of image file. * @param string $type class constants of PHPRtfLite_Image: TYPE_JPEG, TYPE_PNG, TYPE_WMF * @param PHPRtfLite_ParFormat $parFormat paragraph format, ff null image will appear in the same paragraph. * @param float $width if null image is displayed by it's height. * @param float $height if null image is displayed by it's width. * If boths parameters are null, image is displayed as it is. * * @return PHPRtfLite_Image */ public function addImageFromString( $string, $type, PHPRtfLite_ParFormat $parFormat = null, $width = null, $height = null ) { $image = PHPRtfLite_Image::createFromString($this->_rtf, $string, $type, $width, $height); if ($parFormat) { $image->setParFormat($parFormat); } $this->_elements[] = $image; return $image; } /** * adds element * * @param $element */ public function addElement($element) { $this->_elements[] = $element; } /** * renders rtf code for that container * * @return string rtf code */ public function render() { $stream = $this->_rtf->getWriter(); if ($this instanceof PHPRtfLite_Table_Cell && $this->countElements() == 0) { $stream->write('{'); $font = $this->getCellFont($this); if ($font) { $stream->write($font->getContent()); } if ((!$this->isVerticalMerged() && !$this->isHorizontalMerged()) || $this->isVerticalMergedFirstInRange()) { $stream->write('{\~}'); } $stream->write('}\intbl'); } $lastKey = $this->countElements() - 1; foreach ($this->_elements as $key => $element) { if ($this instanceof PHPRtfLite_Table_Cell && !($element instanceof PHPRtfLite_Table)) { // table cell initialization $stream->write('\intbl\itap' . $this->getTable()->getNestDepth() . "\r\n"); $stream->write($this->getCellAlignment()); } if ($element instanceof PHPRtfLite_Element_Plain) { $element->render(); continue; } $parFormat = null; if (!($element instanceof PHPRtfLite_Table)) { $parFormat = $element->getParFormat(); } if ($parFormat) { $stream->write($this->_pard); if ($this instanceof PHPRtfLite_Table_Cell && $lastKey != $key) { $stream->write('{'); } $stream->write($parFormat->getContent()); } $font = $this->getCellFont($element); if ($font) { $stream->write($font->getContent()); } $element->render(); if ($this->needToAddParagraphEnd($key)) { $stream->write('\par '); } if ($font) { $stream->write($font->getClosingContent()); } if ($parFormat && $this instanceof PHPRtfLite_Table_Cell && $lastKey != $key) { $stream->write('}'); } } } /** * checks, if a \par has to be added * * @param integer $key * @return boolean */ private function needToAddParagraphEnd($key) { if (isset($this->_elements[$key + 1])) { $nextElement = $this->_elements[$key + 1]; $element = $this->_elements[$key]; $isNextElementTable = $nextElement instanceof PHPRtfLite_Table; if ($nextElement instanceof PHPRtfLite_List && $element instanceof PHPRtfLite_Element) { return true; } if ($element instanceof PHPRtfLite_Table && $element->getNestDepth() == 1) { return !$element->getPreventEmptyParagraph(); } if ($element instanceof PHPRtfLite_Element) { return (!$element->isEmptyParagraph() && ($isNextElementTable || $nextElement->getParFormat())); } if ($element instanceof PHPRtfLite_Image) { return ($isNextElementTable || $nextElement->getParFormat()); } if ($nextElement instanceof PHPRtfLite_List) { return true; } } return false; } /** * gets font if container is a cell * * @param PHPRtfLite_Table $element * @return PHPRtfLite_Font $font */ private function getCellFont($element) { if ($this instanceof PHPRtfLite_Table_Cell && !($element instanceof PHPRtfLite_Table_Nested)) { return $this->getFont(); } return false; } }