Added line height to font style

This commit is contained in:
Gabriel Bull 2014-03-09 15:03:53 -04:00
parent 5efcec842e
commit 9966508a62
5 changed files with 210 additions and 91 deletions

View File

@ -30,46 +30,63 @@
*/
class PHPWord_Section_Text
{
/**
* Text content
*
* @var string
*/
private $_text;
private $text;
/**
* Text style
*
* @var PHPWord_Style_Font
*/
private $_styleFont;
private $fontStyle;
/**
* Paragraph style
*
* @var \PHPWord_Style_Paragraph
* @var PHPWord_Style_Paragraph
*/
private $_styleParagraph;
private $paragraphStyle;
/**
* Create a new Text Element
*
* @var string $text
* @var mixed $style
* @param string $text
* @param null|array|\PHPWord_Style_Font $fontStyle
* @param null|array|\PHPWord_Style_Paragraph $paragraphStyle
*/
public function __construct($text = null, $styleFont = null, $styleParagraph = null)
public function __construct($text = null, $fontStyle = null, $paragraphStyle = null)
{
// Set font style
$this->setFontStyle($styleFont);
$this->setText($text);
$paragraphStyle = $this->setParagraphStyle($paragraphStyle);
$this->setFontStyle($fontStyle, $paragraphStyle);
}
// Set paragraph style
$this->setParagraphStyle($styleParagraph);
$this->_text = $text;
return $this;
/**
* Set Text style
*
* @param null|array|\PHPWord_Style_Font $style
* @param null|array|\PHPWord_Style_Paragraph $paragraphStyle
* @return PHPWord_Style_Font
* @throws \Exception
*/
public function setFontStyle($style = null, $paragraphStyle = null)
{
if ($style instanceof PHPWord_Style_Font) {
$this->fontStyle = $style;
} elseif (is_array($style)) {
$this->fontStyle = new PHPWord_Style_Font('text', $paragraphStyle);
$this->fontStyle->setArrayStyle($style);
} elseif (null === $style) {
$this->fontStyle = new PHPWord_Style_Font('text', $paragraphStyle);
} else {
throw new Exception('Expected array or PHPWord_Style_Font');
}
return $this->fontStyle;
}
/**
@ -79,28 +96,29 @@ class PHPWord_Section_Text
*/
public function getFontStyle()
{
return $this->_styleFont;
return $this->fontStyle;
}
/**
* Set Text style
* Set Paragraph style
*
* @return PHPWord_Style_Font
* @param null|array|\PHPWord_Style_Paragraph $style
* @return null|\PHPWord_Style_Paragraph
* @throws \Exception
*/
public function setFontStyle($styleFont)
public function setParagraphStyle($style = null)
{
if (is_array($styleFont)) {
$this->_styleFont = new PHPWord_Style_Font('text');
foreach ($styleFont as $key => $value) {
if (substr($key, 0, 1) != '_') {
$key = '_' . $key;
}
$this->_styleFont->setStyleValue($key, $value);
}
if (is_array($style)) {
$this->paragraphStyle = new PHPWord_Style_Paragraph;
$this->paragraphStyle->setArrayStyle($style);
} elseif ($style instanceof PHPWord_Style_Paragraph) {
$this->paragraphStyle = $style;
} elseif (null === $style) {
$this->paragraphStyle = new PHPWord_Style_Paragraph;
} else {
$this->_styleFont = $styleFont;
throw new Exception('Expected array or PHPWord_Style_Paragraph');
}
return $this->paragraphStyle;
}
/**
@ -110,35 +128,17 @@ class PHPWord_Section_Text
*/
public function getParagraphStyle()
{
return $this->_styleParagraph;
return $this->paragraphStyle;
}
/**
* Set Paragraph style
*
* @param array|\PHPWord_Style_Paragraph $styleParagraph
* @return \PHPWord_Style_Paragraph
* @throws \Exception
* @param string $text
* @return $this
*/
public function setParagraphStyle($styleParagraph)
public function setText($text)
{
if (is_array($styleParagraph)) {
$this->_styleParagraph = new PHPWord_Style_Paragraph();
foreach ($styleParagraph as $key => $value) {
if ($key === 'line-height') {
null;
} elseif (substr($key, 0, 1) != '_') {
$key = '_' . $key;
}
$this->_styleParagraph->setStyleValue($key, $value);
}
} elseif ($styleParagraph instanceof PHPWord_Style_Paragraph) {
$this->_styleParagraph = $styleParagraph;
} else {
throw new Exception('Expected array or PHPWord_Style_Paragraph');
}
return $this->_styleParagraph;
$this->text = $text;
return $this;
}
/**
@ -148,6 +148,6 @@ class PHPWord_Section_Text
*/
public function getText()
{
return $this->_text;
return $this->text;
}
}

View File

@ -25,6 +25,8 @@
* @version 0.7.0
*/
use PHPWord\Exceptions\InvalidStyleException;
/**
* Class PHPWord_Style_Font
*/
@ -84,103 +86,118 @@ class PHPWord_Style_Font
*
* @var int|float
*/
private $_name;
private $_name = PHPWord::DEFAULT_FONT_NAME;
/**
* Font size
*
* @var int|float
*/
private $_size;
private $_size = PHPWord::DEFAULT_FONT_SIZE;
/**
* Bold
*
* @var bool
*/
private $_bold;
private $_bold = false;
/**
* Italics
*
* @var bool
*/
private $_italic;
private $_italic = false;
/**
* Superscript
*
* @var bool
*/
private $_superScript;
private $_superScript = false;
/**
* Subscript
*
* @var bool
*/
private $_subScript;
private $_subScript = false;
/**
* Underline mode
*
* @var string
*/
private $_underline;
private $_underline = PHPWord_Style_Font::UNDERLINE_NONE;
/**
* Strikethrough
*
* @var bool
*/
private $_strikethrough;
private $_strikethrough = false;
/**
* Font color
*
* @var string
*/
private $_color;
private $_color = PHPWord::DEFAULT_FONT_COLOR;
/**
* Foreground/highlight
*
* @var string
*/
private $_fgColor;
private $_fgColor = null;
/**
* Text line height
*
* @var int
*/
private $lineHeight = 1.0;
/**
* New font style
*
* @param string $type Type of font
* @param array $styleParagraph Paragraph styles definition
* @param array $paragraphStyle Paragraph styles definition
* @throws \Exception
*/
public function __construct($type = 'text', $styleParagraph = null)
public function __construct($type = 'text', $paragraphStyle = null)
{
$this->_type = $type;
$this->_name = PHPWord::DEFAULT_FONT_NAME;
$this->_size = PHPWord::DEFAULT_FONT_SIZE;
$this->_bold = false;
$this->_italic = false;
$this->_superScript = false;
$this->_subScript = false;
$this->_underline = PHPWord_Style_Font::UNDERLINE_NONE;
$this->_strikethrough = false;
$this->_color = PHPWord::DEFAULT_FONT_COLOR;
$this->_fgColor = null;
if (!is_null($styleParagraph)) {
$paragraph = new PHPWord_Style_Paragraph();
foreach ($styleParagraph as $key => $value) {
if (substr($key, 0, 1) != '_') {
if ($paragraphStyle instanceof PHPWord_Style_Paragraph) {
$this->_paragraphStyle = $paragraphStyle;
} elseif (is_array($paragraphStyle)) {
$this->_paragraphStyle = new PHPWord_Style_Paragraph;
$this->_paragraphStyle->setArrayStyle($paragraphStyle);
} elseif (null === $paragraphStyle) {
$this->_paragraphStyle = new PHPWord_Style_Paragraph;
} else {
throw new Exception('Expected array or PHPWord_Style_Paragraph');
}
}
/**
* @param array $style
* @return $this
*/
public function setArrayStyle(array $style = array())
{
foreach ($style as $key => $value) {
if ($key === 'line-height') {
$this->setLineHeight($value);
null;
} elseif (substr($key, 0, 1) !== '_') {
$key = '_' . $key;
}
$paragraph->setStyleValue($key, $value);
}
$this->_paragraphStyle = $paragraph;
} else {
$this->_paragraphStyle = null;
$this->setStyleValue($key, $value);
}
return $this;
}
/**
@ -465,4 +482,35 @@ class PHPWord_Style_Font
{
return $this->_paragraphStyle;
}
/**
* Set the line height
*
* @param int|float|string $lineHeight
* @return $this
* @throws \PHPWord\Exceptions\InvalidStyleException
*/
public function setLineHeight($lineHeight)
{
if (is_string($lineHeight)) {
$lineHeight = floatval(preg_replace('/[^0-9\.\,]/', '', $lineHeight));
}
if ((!is_integer($lineHeight) && !is_float($lineHeight)) || !$lineHeight) {
throw new InvalidStyleException('Line height must be a valid number');
}
$this->lineHeight = $lineHeight;
$this->getParagraphStyle()->setLineHeight($lineHeight);
return $this;
}
/**
* @return int|float
*/
public function getLineHeight()
{
return $this->lineHeight;
}
}

View File

@ -34,7 +34,7 @@ class PHPWord_Style_Paragraph
{
const LINE_HEIGHT = 240;
/*
/**
* Text line height
*
* @var int
@ -132,6 +132,24 @@ class PHPWord_Style_Paragraph
*/
private $_pageBreakBefore = false;
/**
* @param array $style
* @return $this
*/
public function setArrayStyle(array $style = array())
{
foreach ($style as $key => $value) {
if ($key === 'line-height') {
null;
} elseif (substr($key, 0, 1) !== '_') {
$key = '_' . $key;
}
$this->setStyleValue($key, $value);
}
return $this;
}
/**
* Set Style value
*
@ -482,7 +500,7 @@ class PHPWord_Style_Paragraph
}
/**
* @return int
* @return int|float
*/
public function getLineHeight()
{

View File

@ -39,6 +39,7 @@ the following lines to your ``composer.json``.
* [Section settings](#section-settings)
* [Section page numbering](#section-page-numbering)
3. [Texts](#texts)
* [Attributes](#text-attributes)
4. [Paragraph Style](#paragraph-style)
* [Attributes](#paragraph-style-attributes)
5. [Tables](#tables)
@ -184,6 +185,21 @@ $textrun->addText('I am italic, array('italic' => true));
$textrun->addText('I am colored, array('color' => 'AACC00'));
```
<a name="text-attributes"></a>
##### Attributes
* ``size`` text size, e.g. _20_, _22_,
* ``name`` font name, e.g. _Arial_
* ``bold`` text is bold, _true_ or _false_
* ``italic`` text is italic, _true_ or _false_
* ``superScript`` text is super script, _true_ or _false_
* ``subScript`` text is sub script, _true_ or _false_
* ``underline`` text is underline, _true_ or _false_
* ``strikethrough`` text is strikethrough, _true_ or _false_
* ``color`` text color, e.g. _FF0000_
* ``fgColor`` fgColor
* ``line-height`` text line height, e.g. _1.0_, _1.5_, ect...
<a name="paragraph-style"></a>
#### Paragraph Style

View File

@ -4,6 +4,7 @@ namespace PHPWord\Tests\Style;
use PHPUnit_Framework_TestCase;
use PHPWord;
use PHPWord_Style_Font;
use PHPWord\Tests\TestHelperDOCX;
/**
* Class FontTest
@ -13,6 +14,11 @@ use PHPWord_Style_Font;
*/
class FontTest extends \PHPUnit_Framework_TestCase
{
public function tearDown()
{
TestHelperDOCX::clear();
}
/**
* Test initiation for style type and paragraph style
*/
@ -77,4 +83,35 @@ class FontTest extends \PHPUnit_Framework_TestCase
$this->assertEquals($value, $object->$get());
}
}
public function testLineHeight()
{
$PHPWord = new PHPWord();
$section = $PHPWord->createSection();
// Test style array
$text = $section->addText('This is a test', array(
'line-height' => 2.0
));
$doc = TestHelperDOCX::getDocument($PHPWord);
$element = $doc->getElement('/w:document/w:body/w:p/w:pPr/w:spacing');
$lineHeight = $element->getAttribute('w:line');
$lineRule = $element->getAttribute('w:lineRule');
$this->assertEquals(480, $lineHeight);
$this->assertEquals('auto', $lineRule);
// Test setter
$text->getFontStyle()->setLineHeight(3.0);
$doc = TestHelperDOCX::getDocument($PHPWord);
$element = $doc->getElement('/w:document/w:body/w:p/w:pPr/w:spacing');
$lineHeight = $element->getAttribute('w:line');
$lineRule = $element->getAttribute('w:lineRule');
$this->assertEquals(720, $lineHeight);
$this->assertEquals('auto', $lineRule);
}
}