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 .
*/
/**
* class for creating elements used in containers like sections, footers and headers.
* @version 1.2
* @author Steffen Zeidler
* @copyright 2010-2012 Steffen Zeidler
* @package PHPRtfLite
* @subpackage PHPRtfLite_Element
*/
class PHPRtfLite_Element
{
/**
* @var string
*/
protected $_text = '';
/**
* @var boolean
*/
protected $_isRtfCode = false;
/**
* @var boolean
*/
protected $_convertTagsToRtf = false;
/**
* @var PHPRtfLite_Font
*/
protected $_font;
/**
* @var PHPRtfLite_ParFormat
*/
protected $_parFormat;
/**
* constructor
*
* @param PHPRtfLite $rtf
* @param string $text
* @param PHPRtfLite_Font $font
* @param PHPRtfLite_ParFormat $parFormat
*/
public function __construct(PHPRtfLite $rtf,
$text,
PHPRtfLite_Font $font = null,
PHPRtfLite_ParFormat $parFormat = null)
{
if ($font) {
$rtf->registerFont($font);
}
if ($parFormat) {
$rtf->registerParFormat($parFormat);
}
$this->_rtf = $rtf;
$this->_text = $text;
$this->_font = $font;
$this->_parFormat = $parFormat;
}
/**
* checks, if element is an empty paragraph
*
* @return boolean
*/
public function isEmptyParagraph()
{
return ($this->_parFormat && $this->_text == '\\par' && $this->_isRtfCode);
}
/**
* sets flag, that text tags shall be converted into rtf code
*/
public function setConvertTagsToRtf()
{
$this->_convertTagsToRtf = true;
}
/**
* sets rtf code
*/
public function setIsRtfCode()
{
$this->_isRtfCode = true;
}
/**
* returns true, if text is rtf code
*
* @return boolean
*/
public function isRtfCode()
{
return $this->_isRtfCode;
}
/**
* gets font
*
* @return PHPRtfLite_Font
*/
public function getFont()
{
return $this->_font;
}
/**
* gets par format
*
* @return PHPRtfLite_ParFormat
*/
public function getParFormat()
{
return $this->_parFormat;
}
/**
* converts text tags into rtf code
*
* @param string $text
* @param string $charset
* @return string
*/
public static function convertTagsToRtf($text, $charset)
{
$search = array(
// bold
'|(.*?)|smi',
'|(.*?)|smi',
// italic
'|(.*?)|smi',
'|(.*?)|smi',
// underline
'|(.*?)|smi',
// break
'|
|smi',
'||smi',
// horizontal rule
'|
|smi',
'||smi',
'||smi',
'||smi',
'||smi',
'||smi',
// tab
'||smi',
// bullet
'||smi',
'||smi',
'||smi',
'||smi',
'|(.*?)|smi',
'|(.*?)|smi',
// '||smi',
// '||smi'
);
$replace = array(
// bold
'\b \1\b0 ',
'\b \1\b0 ',
// italic
'\i \1\i0 ',
'\i \1\i0 ',
// underline
'\ul \1\ul0 ',
// break
'\line ',
'\line ',
// horizontal rule
'{\pard \brdrb \brdrs \brdrw10 \brsp20 \par}',
'\chdate ',
'\chdpl ',
'\chdpa ',
'\chtime ',
'\chpgn ',
// tab
'\tab ',
// bullet
'\bullet ',
'\chpgn ',
'{\field {\*\fldinst {NUMPAGES }}}',
'\sectnum ',
'{\super \1\super0}',
'{\sub \1\sub0}',
// '\page ',
// '\sect '
);
$text = preg_replace($search, $replace, $text);
$text = html_entity_decode($text, ENT_COMPAT, $charset);
return $text;
}
/**
* gets opening token
*
* @return string
*/
protected function getOpeningToken()
{
return '{';
}
/**
* gets closing token
*
* @return string
*/
protected function getClosingToken()
{
return '}';
}
/**
* renders the element
*/
public function render()
{
$stream = $this->_rtf->getWriter();
$text = $this->_text;
if (!$this->_isRtfCode) {
$charset = $this->_rtf->getCharset();
$text = PHPRtfLite::quoteRtfCode($text);
if ($this->_convertTagsToRtf) {
$text = self::convertTagsToRtf($text, $charset);
}
$text = PHPRtfLite_Utf8::getUnicodeEntities($text, $charset);
}
$stream->write($this->getOpeningToken());
if ($this->_font) {
$stream->write($this->_font->getContent());
}
if (!$this->isEmptyParagraph() || $this->_isRtfCode) {
$stream->write($text);
}
$stream->write($this->getClosingToken() . "\r\n");
}
}