diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c570431..c8ffb5a1 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,7 +39,9 @@ This release marked heavy refactorings on internal code structure with the creat - ODT Writer: Basic image writing - @ivanlanin - ODT Writer: Link writing - @ivanlanin - ODT Reader: Basic ODText Reader - @ivanlanin GH-71 -- Section: Ability to define gutter and line numbering +- Section: Ability to define gutter and line numbering - @ivanlanin +- Font: Small caps, all caps, and double strikethrough - @ivanlanin GH-151 +- Settings: Ability to use measurement unit other than twips with `setMeasurementUnit` - @ivanlanin GH-199 ### Bugfixes diff --git a/docs/elements.rst b/docs/elements.rst index 2ef5619c..c86d1074 100644 --- a/docs/elements.rst +++ b/docs/elements.rst @@ -112,9 +112,12 @@ Available font styles: - ``subScript`` Subscript, *true* or *false* - ``underline`` Underline, *dash*, *dotted*, etc. - ``strikethrough`` Strikethrough, *true* or *false* +- ``doubleStrikethrough`` Double strikethrough, *true* or *false* - ``color`` Font color, e.g. *FF0000* - ``fgColor`` Font highlight color, e.g. *yellow*, *green*, *blue* - ``bgColor`` Font background color, e.g. *FF0000* +- ``smallCaps`` Small caps, *true* or *false* +- ``allCaps`` All caps, *true* or *false* Paragraph style ^^^^^^^^^^^^^^^ diff --git a/docs/src/documentation.md b/docs/src/documentation.md index 0aa27ed4..bcf38a04 100644 --- a/docs/src/documentation.md +++ b/docs/src/documentation.md @@ -515,9 +515,12 @@ Available font styles: - `subScript` Subscript, *true* or *false* - `underline` Underline, *dash*, *dotted*, etc. - `strikethrough` Strikethrough, *true* or *false* +- `doubleStrikethrough` Double strikethrough, *true* or *false* - `color` Font color, e.g. *FF0000* - `fgColor` Font highlight color, e.g. *yellow*, *green*, *blue* - `bgColor` Font background color, e.g. *FF0000* +- `smallCaps` Small caps, *true* or *false* +- `allCaps` All caps, *true* or *false* #### Paragraph style diff --git a/samples/Sample_01_SimpleText.php b/samples/Sample_01_SimpleText.php index 659686d3..7202ed7e 100755 --- a/samples/Sample_01_SimpleText.php +++ b/samples/Sample_01_SimpleText.php @@ -4,7 +4,7 @@ include_once 'Sample_Header.php'; // New Word Document echo date('H:i:s') , " Create new PhpWord object" , EOL; $phpWord = new \PhpOffice\PhpWord\PhpWord(); -$phpWord->addFontStyle('rStyle', array('bold' => true, 'italic' => true, 'size' => 16)); +$phpWord->addFontStyle('rStyle', array('bold' => true, 'italic' => true, 'size' => 16, 'allCaps' => true, 'doubleStrikethrough' => true)); $phpWord->addParagraphStyle('pStyle', array('align' => 'center', 'spaceAfter' => 100)); $phpWord->addTitleStyle(1, array('bold' => true), array('spaceAfter' => 240)); @@ -34,6 +34,7 @@ $fontStyle['strikethrough'] = true; $fontStyle['superScript'] = true; $fontStyle['color'] = 'FF0000'; $fontStyle['fgColor'] = 'yellow'; +$fontStyle['smallCaps'] = true; $section->addText('I am inline styled.', $fontStyle); $section->addTextBreak(); diff --git a/src/PhpWord/Style/Font.php b/src/PhpWord/Style/Font.php index b4edeee3..3cfdf2ad 100644 --- a/src/PhpWord/Style/Font.php +++ b/src/PhpWord/Style/Font.php @@ -17,6 +17,11 @@ use PhpOffice\PhpWord\Exception\InvalidStyleException; */ class Font extends AbstractStyle { + /** + * Underline types + * + * @const string + */ const UNDERLINE_NONE = 'none'; const UNDERLINE_DASH = 'dash'; const UNDERLINE_DASHHEAVY = 'dashHeavy'; @@ -35,6 +40,12 @@ class Font extends AbstractStyle const UNDERLINE_WAVYDOUBLE = 'wavyDbl'; const UNDERLINE_WAVYHEAVY = 'wavyHeavy'; const UNDERLINE_WORDS = 'words'; + + /** + * Foreground colors + * + * @const string + */ const FGCOLOR_YELLOW = 'yellow'; const FGCOLOR_LIGHTGREEN = 'green'; const FGCOLOR_CYAN = 'cyan'; @@ -121,6 +132,13 @@ class Font extends AbstractStyle */ private $strikethrough = false; + /** + * Double strikethrough + * + * @var bool + */ + private $doubleStrikethrough = false; + /** * Font color * @@ -161,6 +179,22 @@ class Font extends AbstractStyle */ private $hint = PhpWord::DEFAULT_FONT_CONTENT_TYPE; + /** + * Small caps + * + * @var bool + * @link http://www.schemacentral.com/sc/ooxml/e-w_smallCaps-1.html + */ + private $smallCaps = false; + + /** + * All caps + * + * @var bool + * @link http://www.schemacentral.com/sc/ooxml/e-w_caps-1.html + */ + private $allCaps = false; + /** * Create new font style * @@ -387,6 +421,35 @@ class Font extends AbstractStyle public function setStrikethrough($value = false) { $this->strikethrough = $this->setBoolVal($value, $this->strikethrough); + if ($this->strikethrough) { + $this->doubleStrikethrough = false; + } + + return $this; + } + + /** + * Get double strikethrough + * + * @return bool + */ + public function getDoubleStrikethrough() + { + return $this->doubleStrikethrough; + } + + /** + * Set double strikethrough + * + * @param bool $value + * @return self + */ + public function setDoubleStrikethrough($value = false) + { + $this->doubleStrikethrough = $this->setBoolVal($value, $this->doubleStrikethrough); + if ($this->doubleStrikethrough) { + $this->strikethrough = false; + } return $this; } @@ -534,4 +597,56 @@ class Font extends AbstractStyle return $this; } + + /** + * Get small caps + * + * @return bool + */ + public function getSmallCaps() + { + return $this->smallCaps; + } + + /** + * Set small caps + * + * @param bool $value + * @return self + */ + public function setSmallCaps($value = false) + { + $this->smallCaps = $this->setBoolVal($value, $this->smallCaps); + if ($this->smallCaps) { + $this->allCaps = false; + } + + return $this; + } + + /** + * Get all caps + * + * @return bool + */ + public function getAllCaps() + { + return $this->allCaps; + } + + /** + * Set all caps + * + * @param bool $value + * @return self + */ + public function setAllCaps($value = false) + { + $this->allCaps = $this->setBoolVal($value, $this->allCaps); + if ($this->allCaps) { + $this->smallCaps = false; + } + + return $this; + } } diff --git a/src/PhpWord/Style/LineNumbering.php b/src/PhpWord/Style/LineNumbering.php index cb0b2ee8..fafa35e3 100644 --- a/src/PhpWord/Style/LineNumbering.php +++ b/src/PhpWord/Style/LineNumbering.php @@ -52,6 +52,8 @@ class LineNumbering extends AbstractStyle /** * Create a new instance + * + * @param array $style */ public function __construct($style = null) { diff --git a/src/PhpWord/Style/Section.php b/src/PhpWord/Style/Section.php index 246a9199..89caca7e 100644 --- a/src/PhpWord/Style/Section.php +++ b/src/PhpWord/Style/Section.php @@ -162,6 +162,9 @@ class Section extends Border /** * Set orientation + * + * @param string $value + * @return self */ public function setOrientation($value = null) { @@ -177,6 +180,8 @@ class Section extends Border $this->pageSizeW = $longSize; $this->pageSizeH = $shortSize; } + + return $this; } /** @@ -191,18 +196,22 @@ class Section extends Border /** * Set Portrait Orientation + * + * @return self */ public function setPortrait() { - $this->setOrientation(self::ORIENTATION_PORTRAIT); + return $this->setOrientation(self::ORIENTATION_PORTRAIT); } /** * Set Landscape Orientation + * + * @return self */ public function setLandscape() { - $this->setOrientation(self::ORIENTATION_LANDSCAPE); + return $this->setOrientation(self::ORIENTATION_LANDSCAPE); } /** diff --git a/src/PhpWord/Writer/HTML/Element/Text.php b/src/PhpWord/Writer/HTML/Element/Text.php index 4d348380..56839c34 100644 --- a/src/PhpWord/Writer/HTML/Element/Text.php +++ b/src/PhpWord/Writer/HTML/Element/Text.php @@ -31,8 +31,8 @@ class Text extends Element $html = ''; // Paragraph style $paragraphStyle = $this->element->getParagraphStyle(); - $paragraphStyleIsObject = ($paragraphStyle instanceof Paragraph); - if ($paragraphStyleIsObject) { + $pStyleIsObject = ($paragraphStyle instanceof Paragraph); + if ($pStyleIsObject) { $styleWriter = new ParagraphStyleWriter($paragraphStyle); $paragraphStyle = $styleWriter->write(); } @@ -45,7 +45,7 @@ class Text extends Element } if ($paragraphStyle && !$this->withoutP) { - $attribute = $paragraphStyleIsObject ? 'style' : 'class'; + $attribute = $pStyleIsObject ? 'style' : 'class'; $html .= "
"; } if ($fontStyle) { diff --git a/src/PhpWord/Writer/HTML/Element/TextRun.php b/src/PhpWord/Writer/HTML/Element/TextRun.php index e971b624..712c1b33 100644 --- a/src/PhpWord/Writer/HTML/Element/TextRun.php +++ b/src/PhpWord/Writer/HTML/Element/TextRun.php @@ -31,13 +31,13 @@ class TextRun extends Element if (count($elements) > 0) { // Paragraph style $paragraphStyle = $this->element->getParagraphStyle(); - $paragraphStyleIsObject = ($paragraphStyle instanceof Paragraph); - if ($paragraphStyleIsObject) { + $pStyleIsObject = ($paragraphStyle instanceof Paragraph); + if ($pStyleIsObject) { $styleWriter = new ParagraphStyleWriter($paragraphStyle); $paragraphStyle = $styleWriter->write(); } $tag = $this->withoutP ? 'span' : 'p'; - $attribute = $paragraphStyleIsObject ? 'style' : 'class'; + $attribute = $pStyleIsObject ? 'style' : 'class'; $html .= "<{$tag} {$attribute}=\"{$paragraphStyle}\">"; foreach ($elements as $element) { $elementWriter = new Element($this->parentWriter, $element, true); diff --git a/src/PhpWord/Writer/Word2007/Style/Font.php b/src/PhpWord/Writer/Word2007/Style/Font.php index 9f32fbd4..cc9b15fe 100644 --- a/src/PhpWord/Writer/Word2007/Style/Font.php +++ b/src/PhpWord/Writer/Word2007/Style/Font.php @@ -52,21 +52,13 @@ class Font extends AbstractStyle } $font = $this->style->getName(); - $bold = $this->style->getBold(); - $italic = $this->style->getItalic(); $color = $this->style->getColor(); $size = $this->style->getSize(); - $fgColor = $this->style->getFgColor(); $bgColor = $this->style->getBgColor(); - $strikethrough = $this->style->getStrikethrough(); - $underline = $this->style->getUnderline(); - $superscript = $this->style->getSuperScript(); - $subscript = $this->style->getSubScript(); - $hint = $this->style->getHint(); $this->xmlWriter->startElement('w:rPr'); - // Font + // Font name/family if ($font != PhpWord::DEFAULT_FONT_NAME) { $this->xmlWriter->startElement('w:rFonts'); $this->xmlWriter->writeAttribute('w:ascii', $font); @@ -74,13 +66,12 @@ class Font extends AbstractStyle $this->xmlWriter->writeAttribute('w:eastAsia', $font); $this->xmlWriter->writeAttribute('w:cs', $font); //Font Content Type - if ($hint != PhpWord::DEFAULT_FONT_CONTENT_TYPE) { - $this->xmlWriter->writeAttribute('w:hint', $hint); + if ($this->style->getHint() != PhpWord::DEFAULT_FONT_CONTENT_TYPE) { + $this->xmlWriter->writeAttribute('w:hint', $this->style->getHint()); } $this->xmlWriter->endElement(); } - // Color if ($color != PhpWord::DEFAULT_FONT_COLOR) { $this->xmlWriter->startElement('w:color'); @@ -99,32 +90,37 @@ class Font extends AbstractStyle } // Bold - if ($bold) { + if ($this->style->getBold()) { $this->xmlWriter->writeElement('w:b', null); } // Italic - if ($italic) { + if ($this->style->getItalic()) { $this->xmlWriter->writeElement('w:i', null); $this->xmlWriter->writeElement('w:iCs', null); } // Underline - if (!is_null($underline) && $underline != 'none') { + if ($this->style->getUnderline() != 'none') { $this->xmlWriter->startElement('w:u'); - $this->xmlWriter->writeAttribute('w:val', $underline); + $this->xmlWriter->writeAttribute('w:val', $this->style->getUnderline()); $this->xmlWriter->endElement(); } // Strikethrough - if ($strikethrough) { + if ($this->style->getStrikethrough()) { $this->xmlWriter->writeElement('w:strike', null); } + // Double strikethrough + if ($this->style->getDoubleStrikethrough()) { + $this->xmlWriter->writeElement('w:dstrike', null); + } + // Foreground-Color - if (!is_null($fgColor)) { + if (!is_null($this->style->getFgColor())) { $this->xmlWriter->startElement('w:highlight'); - $this->xmlWriter->writeAttribute('w:val', $fgColor); + $this->xmlWriter->writeAttribute('w:val', $this->style->getFgColor()); $this->xmlWriter->endElement(); } @@ -138,12 +134,22 @@ class Font extends AbstractStyle } // Superscript/subscript - if ($superscript || $subscript) { + if ($this->style->getSuperScript() || $this->style->getSubScript()) { $this->xmlWriter->startElement('w:vertAlign'); - $this->xmlWriter->writeAttribute('w:val', $superscript ? 'superscript' : 'subscript'); + $this->xmlWriter->writeAttribute('w:val', $this->style->getSuperScript() ? 'superscript' : 'subscript'); $this->xmlWriter->endElement(); } + // Small caps + if ($this->style->getSmallCaps()) { + $this->xmlWriter->writeElement('w:smallCaps', null); + } + + // All caps + if ($this->style->getAllCaps()) { + $this->xmlWriter->writeElement('w:caps', null); + } + $this->xmlWriter->endElement(); } diff --git a/src/PhpWord/Writer/Word2007/Style/MarginBorder.php b/src/PhpWord/Writer/Word2007/Style/MarginBorder.php index 25fbfbdb..ef6992db 100644 --- a/src/PhpWord/Writer/Word2007/Style/MarginBorder.php +++ b/src/PhpWord/Writer/Word2007/Style/MarginBorder.php @@ -9,8 +9,6 @@ namespace PhpOffice\PhpWord\Writer\Word2007\Style; -use PhpOffice\PhpWord\Settings; - /** * Margin border style writer * @@ -46,7 +44,6 @@ class MarginBorder extends AbstractStyle { $sides = array('top', 'left', 'right', 'bottom', 'insideH', 'insideV'); $sizeCount = count($this->sizes) - 1; - $unit = Settings::getMeasurementUnit(); for ($i = 0; $i < $sizeCount; $i++) { if (!is_null($this->sizes[$i])) { diff --git a/src/PhpWord/Writer/Word2007/Style/Table.php b/src/PhpWord/Writer/Word2007/Style/Table.php index cf7cbccf..1cdbe1c4 100644 --- a/src/PhpWord/Writer/Word2007/Style/Table.php +++ b/src/PhpWord/Writer/Word2007/Style/Table.php @@ -130,7 +130,6 @@ class Table extends AbstractStyle for ($i = 0; $i < 6; $i++) { if (!is_null($brdSz[$i])) { $hasBorders = true; - break; } } if ($hasBorders) { diff --git a/tests/PhpWord/Tests/SettingsTest.php b/tests/PhpWord/Tests/SettingsTest.php index e7968355..64a09994 100644 --- a/tests/PhpWord/Tests/SettingsTest.php +++ b/tests/PhpWord/Tests/SettingsTest.php @@ -52,4 +52,14 @@ class SettingsTest extends \PHPUnit_Framework_TestCase $this->assertEquals($domPdfPath, Settings::getPdfRendererPath()); $this->assertFalse(Settings::setPdfRendererPath('dummy/path')); } + + /** + * Test set/get measurement unit + */ + public function testSetGetMeasurementUnit() + { + $this->assertEquals(Settings::UNIT_TWIP, Settings::getMeasurementUnit()); + $this->assertTrue(Settings::setMeasurementUnit(Settings::UNIT_INCH)); + $this->assertFalse(Settings::setMeasurementUnit('foo')); + } } diff --git a/tests/PhpWord/Tests/Style/SectionTest.php b/tests/PhpWord/Tests/Style/SectionTest.php index ca75f7a2..8ebeccb3 100644 --- a/tests/PhpWord/Tests/Style/SectionTest.php +++ b/tests/PhpWord/Tests/Style/SectionTest.php @@ -24,19 +24,17 @@ class SettingsTest extends \PHPUnit_Framework_TestCase */ public function testSettingValue() { - // Section Settings $oSettings = new Section(); + $this->assertEquals('portrait', $oSettings->getOrientation()); + $this->assertEquals(11906, $oSettings->getPageSizeW()); + $this->assertEquals(16838, $oSettings->getPageSizeH()); + $oSettings->setSettingValue('orientation', 'landscape'); $this->assertEquals('landscape', $oSettings->getOrientation()); $this->assertEquals(16838, $oSettings->getPageSizeW()); $this->assertEquals(11906, $oSettings->getPageSizeH()); - $oSettings->setSettingValue('orientation', null); - $this->assertEquals('portrait', $oSettings->getOrientation()); - $this->assertEquals(11906, $oSettings->getPageSizeW()); - $this->assertEquals(16838, $oSettings->getPageSizeH()); - $iVal = rand(1, 1000); $oSettings->setSettingValue('borderSize', $iVal); $this->assertEquals(array($iVal, $iVal, $iVal, $iVal), $oSettings->getBorderSize()); @@ -55,6 +53,13 @@ class SettingsTest extends \PHPUnit_Framework_TestCase $iVal = rand(1, 1000); $oSettings->setSettingValue('headerHeight', $iVal); $this->assertEquals($iVal, $oSettings->getHeaderHeight()); + + $oSettings->setSettingValue('lineNumbering', array()); + $oSettings->setSettingValue('lineNumbering', array('start' => 1, 'increment' => 1, 'distance' => 240, 'restart' => 'newPage')); + $this->assertInstanceOf('PhpOffice\\PhpWord\\Style\\LineNumbering', $oSettings->getLineNumbering()); + + $oSettings->removeLineNumbering(); + $this->assertNull($oSettings->getLineNumbering()); } /** @@ -105,7 +110,7 @@ class SettingsTest extends \PHPUnit_Framework_TestCase $oSettings = new Section(); $oSettings->setPortrait(); - $this->assertNull($oSettings->getOrientation()); + $this->assertEquals('portrait', $oSettings->getOrientation()); $this->assertEquals(11906, $oSettings->getPageSizeW()); $this->assertEquals(16838, $oSettings->getPageSizeH()); } diff --git a/tests/PhpWord/Tests/Writer/Word2007/Part/DocumentTest.php b/tests/PhpWord/Tests/Writer/Word2007/Part/DocumentTest.php index d13a3e8c..0cc4895d 100644 --- a/tests/PhpWord/Tests/Writer/Word2007/Part/DocumentTest.php +++ b/tests/PhpWord/Tests/Writer/Word2007/Part/DocumentTest.php @@ -113,7 +113,7 @@ class DocumentTest extends \PHPUnit_Framework_TestCase $phpWord = new PhpWord(); $phpWord->addParagraphStyle('pStyle', array('align' => 'center')); // Style #1 - $phpWord->addFontStyle('fStyle', array('size' => '20')); // Style #2 + $phpWord->addFontStyle('fStyle', array('size' => '20', 'doubleStrikethrough' => true, 'allCaps' => true)); // Style #2 $phpWord->addTitleStyle(1, array('color' => '333333', 'bold' => true)); // Style #3 $fontStyle = new Font('text', array('align' => 'center')); $section = $phpWord->addSection(); @@ -391,6 +391,7 @@ class DocumentTest extends \PHPUnit_Framework_TestCase $styles['fgColor'] = 'yellow'; $styles['bgColor'] = 'FFFF00'; $styles['hint'] = 'eastAsia'; + $styles['smallCaps'] = true; $section = $phpWord->addSection(); $section->addText('Test', $styles); @@ -406,6 +407,7 @@ class DocumentTest extends \PHPUnit_Framework_TestCase $this->assertEquals('superscript', $doc->getElementAttribute("{$parent}/w:vertAlign", 'w:val')); $this->assertEquals($styles['color'], $doc->getElementAttribute("{$parent}/w:color", 'w:val')); $this->assertEquals($styles['fgColor'], $doc->getElementAttribute("{$parent}/w:highlight", 'w:val')); + $this->assertTrue($doc->elementExists("{$parent}/w:smallCaps")); } /**