diff --git a/.scrutinizer.yml b/.scrutinizer.yml
index c8fe57cf63..291a6d60cd 100644
--- a/.scrutinizer.yml
+++ b/.scrutinizer.yml
@@ -1,3 +1,8 @@
+build:
+ nodes:
+ analysis:
+ tests:
+ override: [php-scrutinizer-run]
filter:
excluded_paths: [ 'vendor/*', 'tests/*', 'samples/*', 'src/PhpWord/Shared/PCLZip/*' ]
diff --git a/.travis.yml b/.travis.yml
index d63b7bb22c..281c263098 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -15,12 +15,9 @@ matrix:
include:
- php: 5.6
env: COVERAGE=1
- allow_failures:
- - php: 7.2
cache:
directories:
- - vendor
- $HOME/.composer/cache
- .php-cs.cache
@@ -38,7 +35,7 @@ before_script:
- if [ -z "$COVERAGE" ]; then phpenv config-rm xdebug.ini ; fi
## Composer
- composer self-update
- - composer install --prefer-source
+ - travis_wait composer install --prefer-source
## PHPDocumentor
- mkdir -p build/docs
- mkdir -p build/coverage
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c684a37d89..cdc4d67cd4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,7 +13,9 @@ v0.15.0 (?? ??? 2018)
- Add support for fixed Table Layout @aoloe @ekopach @troosan #841 #1276
- Add support for Cell Spacing @dox07 @troosan #1040
- Add parsing of formatting inside lists @atomicalnet @troosan #594
+- Added support for Vertically Raised or Lowered Text (w:position) @anrikun @troosan #640
- Add support for MACROBUTTON field @phryneas @troosan #1021
+- Add support for Hyphenation @Trainmaster #1282 (Document: `autoHyphenation`, `consecutiveHyphenLimit`, `hyphenationZone`, `doNotHyphenateCaps`, Paragraph: `suppressAutoHyphens`)
### Fixed
- Fix reading of docx default style - @troosan #1238
@@ -23,6 +25,7 @@ v0.15.0 (?? ??? 2018)
- Fix parsing of `` tag. @troosan #1274
- Bookmark are not writton as internal link in html writer @troosan #1263
- It should be possible to add a Footnote in a ListItemRun @troosan #1287 #1287
+- Fix parsing of Heading and Title formating @troosan @gthomas2 #465
### Changed
- Remove zend-stdlib dependency @Trainmaster #1284
@@ -475,4 +478,4 @@ This is the first release after a long development hiatus in [CodePlex](https://
- Basic CI with Travis - @Progi1984
- Added PHPWord_Exception and exception when could not copy the template - @Progi1984
- IMPROVED: Moved examples out of Classes directory - @Progi1984
-- IMPROVED: Advanced string replace in setValue for Template - @Esmeraldo [#49](http://phpword.codeplex.com/workitem/49)
\ No newline at end of file
+- IMPROVED: Advanced string replace in setValue for Template - @Esmeraldo [#49](http://phpword.codeplex.com/workitem/49)
diff --git a/docs/elements.rst b/docs/elements.rst
index d13abc5634..4d1b93838c 100644
--- a/docs/elements.rst
+++ b/docs/elements.rst
@@ -89,6 +89,7 @@ Titles
If you want to structure your document or build table of contents, you need titles or headings.
To add a title to the document, use the ``addTitleStyle`` and ``addTitle`` method.
+If `depth` is 0, a Title will be inserted, otherwise a Heading1, Heading2, ...
.. code-block:: php
@@ -98,7 +99,7 @@ To add a title to the document, use the ``addTitleStyle`` and ``addTitle`` metho
- ``depth``.
- ``$fontStyle``. See :ref:`font-style`.
- ``$paragraphStyle``. See :ref:`paragraph-style`.
-- ``$text``. Text to be displayed in the document.
+- ``$text``. Text to be displayed in the document. This can be `string` or a `\PhpOffice\PhpWord\Element\TextRun`
It's necessary to add a title style to your document because otherwise the title won't be detected as a real title.
diff --git a/docs/general.rst b/docs/general.rst
index 99d8b3bac0..f40a08c367 100644
--- a/docs/general.rst
+++ b/docs/general.rst
@@ -217,10 +217,10 @@ The default language of the document can be change with the following.
$phpWord->getSettings()->setThemeFontLang(new Language(Language::FR_BE));
-``Languge`` has 3 parameters, one for Latin languages, one for East Asian languages and one for Complex (Bi-Directional) languages.
+``Language`` has 3 parameters, one for Latin languages, one for East Asian languages and one for Complex (Bi-Directional) languages.
A couple of language codes are provided in the ``PhpOffice\PhpWord\ComplexType\Language`` class but any valid code/ID can be used.
-In case you are generating an RTF document the Language need to be set differently.
+In case you are generating an RTF document the language need to be set differently.
.. code-block:: php
@@ -290,3 +290,45 @@ To force an update of the fields present in the document, set updateFields to tr
.. code-block:: php
$phpWord->getSettings()->setUpdateFields(true);
+
+Hyphenation
+-----------
+Hyphenation describes the process of breaking words with hyphens. There are several options to control hyphenation.
+
+Auto hyphenation
+~~~~~~~~~~~~~~~~
+
+To automatically hyphenate text set ``autoHyphenation`` to ``true``.
+
+.. code-block:: php
+
+ $phpWord->getSettings()->setAutoHyphenation(true);
+
+Consecutive Hyphen Limit
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+The maximum number of consecutive lines of text ending with a hyphen can be controlled by the ``consecutiveHyphenLimit`` option.
+There is no limit if the option is not set or the provided value is ``0``.
+
+.. code-block:: php
+
+ $phpWord->getSettings()->setConsecutiveHyphenLimit(2);
+
+Hyphenation Zone
+~~~~~~~~~~~~~~~~
+
+The hyphenation zone (in *twip*) is the allowed amount of whitespace before hyphenation is applied.
+The smaller the hyphenation zone the more words are hyphenated. Or in other words, the wider the hyphenation zone the less words are hyphenated.
+
+.. code-block:: php
+
+ $phpWord->getSettings()->setHyphenationZone(\PhpOffice\PhpWord\Shared\Converter::cmToTwip(1));
+
+Hyphenate Caps
+~~~~~~~~~~~~~~
+
+To control whether or not words in all capital letters shall be hyphenated use the `doNotHyphenateCaps` option.
+
+.. code-block:: php
+
+ $phpWord->getSettings()->setDoNotHyphenateCaps(true);
diff --git a/docs/styles.rst b/docs/styles.rst
index 0ec0ec38d5..b4ed328d45 100644
--- a/docs/styles.rst
+++ b/docs/styles.rst
@@ -59,6 +59,7 @@ Available Font style options:
See ``\PhpOffice\PhpWord\Style\Font::UNDERLINE_...`` constants for more values
- ``lang``. Language, either a language code like *en-US*, *fr-BE*, etc. or an object (or as an array) if you need to set eastAsian or bidirectional languages
See ``\PhpOffice\PhpWord\Style\Language`` class for some language codes.
+- ``position``. The text position, raised or lowered, in half points
.. _paragraph-style:
@@ -81,6 +82,7 @@ Available Paragraph style options:
- ``spaceAfter``. Space after paragraph in *twip*.
- ``spacing``. Space between lines.
- ``spacingLineRule``. Line Spacing Rule. *auto*, *exact*, *atLeast*
+- ``suppressAutoHyphens``. Hyphenation for paragraph, *true* or *false*.
- ``tabs``. Set of custom tab stops.
- ``widowControl``. Allow first/last line to display on a separate page, *true* or *false*.
- ``contextualSpacing``. Ignore Spacing Above and Below When Using Identical Styles, *true* or *false*.
diff --git a/samples/Sample_17_TitleTOC.php b/samples/Sample_17_TitleTOC.php
index f99b73ea86..86e8e28cf7 100644
--- a/samples/Sample_17_TitleTOC.php
+++ b/samples/Sample_17_TitleTOC.php
@@ -12,13 +12,14 @@
// Define styles
$fontStyle12 = array('spaceAfter' => 60, 'size' => 12);
$fontStyle10 = array('size' => 10);
+$phpWord->addTitleStyle(null, array('size' => 22, 'bold' => true));
$phpWord->addTitleStyle(1, array('size' => 20, 'color' => '333333', 'bold' => true));
$phpWord->addTitleStyle(2, array('size' => 16, 'color' => '666666'));
$phpWord->addTitleStyle(3, array('size' => 14, 'italic' => true));
$phpWord->addTitleStyle(4, array('size' => 12));
// Add text elements
-$section->addText('Table of contents 1');
+$section->addTitle('Table of contents 1', 0);
$section->addTextBreak(2);
// Add TOC #1
diff --git a/src/PhpWord/Collection/AbstractCollection.php b/src/PhpWord/Collection/AbstractCollection.php
index 61709a5001..d49967cac7 100644
--- a/src/PhpWord/Collection/AbstractCollection.php
+++ b/src/PhpWord/Collection/AbstractCollection.php
@@ -27,14 +27,14 @@ abstract class AbstractCollection
/**
* Items
*
- * @var array
+ * @var \PhpOffice\PhpWord\Element\AbstractContainer[]
*/
private $items = array();
/**
* Get items
*
- * @return array
+ * @return \PhpOffice\PhpWord\Element\AbstractContainer[]
*/
public function getItems()
{
@@ -45,7 +45,7 @@ public function getItems()
* Get item by index
*
* @param int $index
- * @return mixed
+ * @return \PhpOffice\PhpWord\Element\AbstractContainer
*/
public function getItem($index)
{
@@ -60,7 +60,7 @@ public function getItem($index)
* Set item.
*
* @param int $index
- * @param mixed $item
+ * @param \PhpOffice\PhpWord\Element\AbstractContainer $item
*/
public function setItem($index, $item)
{
@@ -72,7 +72,7 @@ public function setItem($index, $item)
/**
* Add new item
*
- * @param mixed $item
+ * @param \PhpOffice\PhpWord\Element\AbstractContainer $item
* @return int
*/
public function addItem($item)
diff --git a/src/PhpWord/Element/AbstractContainer.php b/src/PhpWord/Element/AbstractContainer.php
index 507ff143e5..1cedbef01f 100644
--- a/src/PhpWord/Element/AbstractContainer.php
+++ b/src/PhpWord/Element/AbstractContainer.php
@@ -54,7 +54,7 @@ abstract class AbstractContainer extends AbstractElement
/**
* Elements collection
*
- * @var array
+ * @var \PhpOffice\PhpWord\Element\AbstractElement[]
*/
protected $elements = array();
@@ -164,6 +164,41 @@ public function getElements()
return $this->elements;
}
+ /**
+ * Returns the element at the requested position
+ *
+ * @param int $index
+ * @return \PhpOffice\PhpWord\Element\AbstractElement|null
+ */
+ public function getElement($index)
+ {
+ if (array_key_exists($index, $this->elements)) {
+ return $this->elements[$index];
+ }
+
+ return null;
+ }
+
+ /**
+ * Removes the element at requested index
+ *
+ * @param int|\PhpOffice\PhpWord\Element\AbstractElement $toRemove
+ */
+ public function removeElement($toRemove)
+ {
+ if (is_int($toRemove) && array_key_exists($toRemove, $this->elements)) {
+ unset($this->elements[$toRemove]);
+ } elseif ($toRemove instanceof \PhpOffice\PhpWord\Element\AbstractElement) {
+ foreach ($this->elements as $key => $element) {
+ if ($element->getElementId() === $toRemove->getElementId()) {
+ unset($this->elements[$key]);
+
+ return;
+ }
+ }
+ }
+ }
+
/**
* Count elements
*
diff --git a/src/PhpWord/Element/Bookmark.php b/src/PhpWord/Element/Bookmark.php
index 2eceb5ed89..8d4e0af53e 100644
--- a/src/PhpWord/Element/Bookmark.php
+++ b/src/PhpWord/Element/Bookmark.php
@@ -43,7 +43,7 @@ class Bookmark extends AbstractElement
*
* @param string $name
*/
- public function __construct($name)
+ public function __construct($name = '')
{
$this->name = CommonText::toUTF8($name);
}
diff --git a/src/PhpWord/Element/Field.php b/src/PhpWord/Element/Field.php
index 5aeffbc168..de50496520 100644
--- a/src/PhpWord/Element/Field.php
+++ b/src/PhpWord/Element/Field.php
@@ -17,8 +17,6 @@
namespace PhpOffice\PhpWord\Element;
-use PhpOffice\PhpWord\Style\Font;
-
/**
* Field element
*
@@ -215,46 +213,6 @@ public function getOptions()
return $this->options;
}
- /**
- * Set Text style
- *
- * @param \PhpOffice\PhpWord\Style\Font $style
- * @return \PhpOffice\PhpWord\Style\Font
- */
- public function setFontStyle($style = null)
- {
- if (!$style instanceof Font) {
- throw new \InvalidArgumentException('font style must be of type Font');
- }
-
- if ($style->isNoProof()) {
- $this->fontStyle = $style;
- } else {
- // make a copy of the font so the original is not altered
- $this->fontStyle = clone $style;
- $this->fontStyle->setNoProof(true);
- }
-
- return $this->fontStyle;
- }
-
- /**
- * Get Text style
- *
- * @return \PhpOffice\PhpWord\Style\Font
- */
- public function getFontStyle()
- {
- if ($this->fontStyle == null) {
- $font = new Font();
- $font->setNoProof(true);
-
- return $font;
- }
-
- return $this->fontStyle;
- }
-
/**
* Set Field text
*
diff --git a/src/PhpWord/Element/ListItem.php b/src/PhpWord/Element/ListItem.php
index 7f665b1b9f..cb55c5ae86 100644
--- a/src/PhpWord/Element/ListItem.php
+++ b/src/PhpWord/Element/ListItem.php
@@ -62,7 +62,7 @@ public function __construct($text, $depth = 0, $fontStyle = null, $listStyle = n
// Version >= 0.10.0 will pass numbering style name. Older version will use old method
if (!is_null($listStyle) && is_string($listStyle)) {
- $this->style = new ListItemStyle($listStyle);
+ $this->style = new ListItemStyle($listStyle); // @codeCoverageIgnore
} else {
$this->style = $this->setNewStyle(new ListItemStyle(), $listStyle, true);
}
diff --git a/src/PhpWord/Element/Title.php b/src/PhpWord/Element/Title.php
index 808af55ebb..ed06fa1342 100644
--- a/src/PhpWord/Element/Title.php
+++ b/src/PhpWord/Element/Title.php
@@ -28,7 +28,7 @@ class Title extends AbstractElement
/**
* Title Text content
*
- * @var string
+ * @var string|TextRun
*/
private $text;
@@ -56,15 +56,25 @@ class Title extends AbstractElement
/**
* Create a new Title Element
*
- * @param string $text
+ * @param string|TextRun $text
* @param int $depth
*/
public function __construct($text, $depth = 1)
{
- $this->text = CommonText::toUTF8($text);
+ if (isset($text)) {
+ if (is_string($text)) {
+ $this->text = CommonText::toUTF8($text);
+ } elseif ($text instanceof TextRun) {
+ $this->text = $text;
+ } else {
+ throw new \InvalidArgumentException('Invalid text, should be a string or a TextRun');
+ }
+ }
+
$this->depth = $depth;
- if (array_key_exists("Heading_{$this->depth}", Style::getStyles())) {
- $this->style = "Heading{$this->depth}";
+ $styleName = $depth === 0 ? 'Title' : "Heading_{$this->depth}";
+ if (array_key_exists($styleName, Style::getStyles())) {
+ $this->style = str_replace('_', '', $styleName);
}
return $this;
diff --git a/src/PhpWord/Metadata/Settings.php b/src/PhpWord/Metadata/Settings.php
index 728cc823fd..8ab5860948 100644
--- a/src/PhpWord/Metadata/Settings.php
+++ b/src/PhpWord/Metadata/Settings.php
@@ -130,6 +130,32 @@ class Settings
*/
private $decimalSymbol = '.';
+ /**
+ * Automatically hyphenate document contents when displayed
+ *
+ * @var bool|null
+ */
+ private $autoHyphenation;
+
+ /**
+ * Maximum number of consecutively hyphenated lines
+ *
+ * @var int|null
+ */
+ private $consecutiveHyphenLimit;
+
+ /**
+ * The allowed amount of whitespace before hyphenation is applied
+ * @var float|null
+ */
+ private $hyphenationZone;
+
+ /**
+ * Do not hyphenate words in all capital letters
+ * @var bool|null
+ */
+ private $doNotHyphenateCaps;
+
/**
* @return Protection
*/
@@ -387,4 +413,68 @@ public function setDecimalSymbol($decimalSymbol)
{
$this->decimalSymbol = $decimalSymbol;
}
+
+ /**
+ * @return bool|null
+ */
+ public function hasAutoHyphenation()
+ {
+ return $this->autoHyphenation;
+ }
+
+ /**
+ * @param bool $autoHyphenation
+ */
+ public function setAutoHyphenation($autoHyphenation)
+ {
+ $this->autoHyphenation = (bool) $autoHyphenation;
+ }
+
+ /**
+ * @return int|null
+ */
+ public function getConsecutiveHyphenLimit()
+ {
+ return $this->consecutiveHyphenLimit;
+ }
+
+ /**
+ * @param int $consecutiveHyphenLimit
+ */
+ public function setConsecutiveHyphenLimit($consecutiveHyphenLimit)
+ {
+ $this->consecutiveHyphenLimit = (int) $consecutiveHyphenLimit;
+ }
+
+ /**
+ * @return float|null
+ */
+ public function getHyphenationZone()
+ {
+ return $this->hyphenationZone;
+ }
+
+ /**
+ * @param float $hyphenationZone Measurement unit is twip
+ */
+ public function setHyphenationZone($hyphenationZone)
+ {
+ $this->hyphenationZone = $hyphenationZone;
+ }
+
+ /**
+ * @return null|bool
+ */
+ public function hasDoNotHyphenateCaps()
+ {
+ return $this->doNotHyphenateCaps;
+ }
+
+ /**
+ * @param bool $doNotHyphenateCaps
+ */
+ public function setDoNotHyphenateCaps($doNotHyphenateCaps)
+ {
+ $this->doNotHyphenateCaps = (bool) $doNotHyphenateCaps;
+ }
}
diff --git a/src/PhpWord/PhpWord.php b/src/PhpWord/PhpWord.php
index d7c2348a63..ff23f6ef25 100644
--- a/src/PhpWord/PhpWord.php
+++ b/src/PhpWord/PhpWord.php
@@ -212,6 +212,21 @@ public function getSections()
return $this->sections;
}
+ /**
+ * Returns the section at the requested position
+ *
+ * @param int $index
+ * @return \PhpOffice\PhpWord\Element\Section|null
+ */
+ public function getSection($index)
+ {
+ if (array_key_exists($index, $this->sections)) {
+ return $this->sections[$index];
+ }
+
+ return null;
+ }
+
/**
* Create new section
*
@@ -227,6 +242,17 @@ public function addSection($style = null)
return $section;
}
+ /**
+ * Sorts the sections using the callable passed
+ *
+ * @see http://php.net/manual/en/function.usort.php for usage
+ * @param callable $sorter
+ */
+ public function sortSections($sorter)
+ {
+ usort($this->sections, $sorter);
+ }
+
/**
* Get default font name
*
diff --git a/src/PhpWord/Reader/Word2007/AbstractPart.php b/src/PhpWord/Reader/Word2007/AbstractPart.php
index 1d61051652..2cbfba37cc 100644
--- a/src/PhpWord/Reader/Word2007/AbstractPart.php
+++ b/src/PhpWord/Reader/Word2007/AbstractPart.php
@@ -18,6 +18,7 @@
namespace PhpOffice\PhpWord\Reader\Word2007;
use PhpOffice\Common\XMLReader;
+use PhpOffice\PhpWord\Element\TextRun;
use PhpOffice\PhpWord\Element\TrackChange;
use PhpOffice\PhpWord\PhpWord;
@@ -103,12 +104,10 @@ protected function readParagraph(XMLReader $xmlReader, \DOMElement $domNode, $pa
{
// Paragraph style
$paragraphStyle = null;
- $headingMatches = array();
+ $headingDepth = null;
if ($xmlReader->elementExists('w:pPr', $domNode)) {
$paragraphStyle = $this->readParagraphStyle($xmlReader, $domNode);
- if (is_array($paragraphStyle) && isset($paragraphStyle['styleName'])) {
- preg_match('/Heading(\d)/', $paragraphStyle['styleName'], $headingMatches);
- }
+ $headingDepth = $this->getHeadingDepth($paragraphStyle);
}
// PreserveText
@@ -147,14 +146,19 @@ protected function readParagraph(XMLReader $xmlReader, \DOMElement $domNode, $pa
foreach ($nodes as $node) {
$this->readRun($xmlReader, $node, $listItemRun, $docPart, $paragraphStyle);
}
- } elseif (!empty($headingMatches)) {
- // Heading
- $textContent = '';
+ } elseif ($headingDepth !== null) {
+ // Heading or Title
+ $textContent = null;
$nodes = $xmlReader->getElements('w:r', $domNode);
- foreach ($nodes as $node) {
- $textContent .= $xmlReader->getValue('w:t', $node);
+ if ($nodes->length === 1) {
+ $textContent = $xmlReader->getValue('w:t', $nodes->item(0));
+ } else {
+ $textContent = new TextRun($paragraphStyle);
+ foreach ($nodes as $node) {
+ $this->readRun($xmlReader, $node, $textContent, $docPart, $paragraphStyle);
+ }
}
- $parent->addTitle($textContent, $headingMatches[1]);
+ $parent->addTitle($textContent, $headingDepth);
} else {
// Text and TextRun
$runCount = $xmlReader->countElements('w:r', $domNode);
@@ -176,6 +180,29 @@ protected function readParagraph(XMLReader $xmlReader, \DOMElement $domNode, $pa
}
}
+ /**
+ * Returns the depth of the Heading, returns 0 for a Title
+ *
+ * @param array $paragraphStyle
+ * @return number|null
+ */
+ private function getHeadingDepth(array $paragraphStyle = null)
+ {
+ if (is_array($paragraphStyle) && isset($paragraphStyle['styleName'])) {
+ if ('Title' === $paragraphStyle['styleName']) {
+ return 0;
+ }
+
+ $headingMatches = array();
+ preg_match('/Heading(\d)/', $paragraphStyle['styleName'], $headingMatches);
+ if (!empty($headingMatches)) {
+ return $headingMatches[1];
+ }
+ }
+
+ return null;
+ }
+
/**
* Read w:r.
*
@@ -212,10 +239,14 @@ protected function readRun(XMLReader $xmlReader, \DOMElement $domNode, $parent,
} else {
if ($xmlReader->elementExists('w:footnoteReference', $domNode)) {
// Footnote
- $parent->addFootnote();
+ $wId = $xmlReader->getAttribute('w:id', $domNode, 'w:footnoteReference');
+ $footnote = $parent->addFootnote();
+ $footnote->setRelationId($wId);
} elseif ($xmlReader->elementExists('w:endnoteReference', $domNode)) {
// Endnote
- $parent->addEndnote();
+ $wId = $xmlReader->getAttribute('w:id', $domNode, 'w:endnoteReference');
+ $endnote = $parent->addEndnote();
+ $endnote->setRelationId($wId);
} elseif ($xmlReader->elementExists('w:pict', $domNode)) {
// Image
$rId = $xmlReader->getAttribute('r:id', $domNode, 'w:pict/v:shape/v:imagedata');
@@ -333,20 +364,21 @@ protected function readParagraphStyle(XMLReader $xmlReader, \DOMElement $domNode
$styleNode = $xmlReader->getElement('w:pPr', $domNode);
$styleDefs = array(
- 'styleName' => array(self::READ_VALUE, array('w:pStyle', 'w:name')),
- 'alignment' => array(self::READ_VALUE, 'w:jc'),
- 'basedOn' => array(self::READ_VALUE, 'w:basedOn'),
- 'next' => array(self::READ_VALUE, 'w:next'),
- 'indent' => array(self::READ_VALUE, 'w:ind', 'w:left'),
- 'hanging' => array(self::READ_VALUE, 'w:ind', 'w:hanging'),
- 'spaceAfter' => array(self::READ_VALUE, 'w:spacing', 'w:after'),
- 'spaceBefore' => array(self::READ_VALUE, 'w:spacing', 'w:before'),
- 'widowControl' => array(self::READ_FALSE, 'w:widowControl'),
- 'keepNext' => array(self::READ_TRUE, 'w:keepNext'),
- 'keepLines' => array(self::READ_TRUE, 'w:keepLines'),
- 'pageBreakBefore' => array(self::READ_TRUE, 'w:pageBreakBefore'),
- 'contextualSpacing' => array(self::READ_TRUE, 'w:contextualSpacing'),
- 'bidi' => array(self::READ_TRUE, 'w:bidi'),
+ 'styleName' => array(self::READ_VALUE, array('w:pStyle', 'w:name')),
+ 'alignment' => array(self::READ_VALUE, 'w:jc'),
+ 'basedOn' => array(self::READ_VALUE, 'w:basedOn'),
+ 'next' => array(self::READ_VALUE, 'w:next'),
+ 'indent' => array(self::READ_VALUE, 'w:ind', 'w:left'),
+ 'hanging' => array(self::READ_VALUE, 'w:ind', 'w:hanging'),
+ 'spaceAfter' => array(self::READ_VALUE, 'w:spacing', 'w:after'),
+ 'spaceBefore' => array(self::READ_VALUE, 'w:spacing', 'w:before'),
+ 'widowControl' => array(self::READ_FALSE, 'w:widowControl'),
+ 'keepNext' => array(self::READ_TRUE, 'w:keepNext'),
+ 'keepLines' => array(self::READ_TRUE, 'w:keepLines'),
+ 'pageBreakBefore' => array(self::READ_TRUE, 'w:pageBreakBefore'),
+ 'contextualSpacing' => array(self::READ_TRUE, 'w:contextualSpacing'),
+ 'bidi' => array(self::READ_TRUE, 'w:bidi'),
+ 'suppressAutoHyphens' => array(self::READ_TRUE, 'w:suppressAutoHyphens'),
);
return $this->readStyleDefs($xmlReader, $styleNode, $styleDefs);
@@ -391,6 +423,7 @@ protected function readFontStyle(XMLReader $xmlReader, \DOMElement $domNode)
'fgColor' => array(self::READ_VALUE, 'w:highlight'),
'rtl' => array(self::READ_TRUE, 'w:rtl'),
'lang' => array(self::READ_VALUE, 'w:lang'),
+ 'position' => array(self::READ_VALUE, 'w:position'),
);
return $this->readStyleDefs($xmlReader, $styleNode, $styleDefs);
@@ -496,11 +529,9 @@ private function findPossibleAttribute(XMLReader $xmlReader, \DOMElement $node,
return $possibleAttribute;
}
}
- } else {
- return $attributes;
}
- return null;
+ return $attributes;
}
/**
@@ -548,7 +579,7 @@ protected function readStyleDefs(XMLReader $xmlReader, \DOMElement $parentNode =
*
* @param string $method
* @ignoreScrutinizerPatch
- * @param mixed $attributeValue
+ * @param string|null $attributeValue
* @param mixed $expected
* @return mixed
*/
@@ -578,7 +609,7 @@ private function readStyleDef($method, $attributeValue, $expected)
*/
private function isOn($value = null)
{
- return $value == null || $value == '1' || $value == 'true' || $value == 'on';
+ return $value === null || $value === '1' || $value === 'true' || $value === 'on';
}
/**
diff --git a/src/PhpWord/Reader/Word2007/Footnotes.php b/src/PhpWord/Reader/Word2007/Footnotes.php
index 61988723d9..b69b26061c 100644
--- a/src/PhpWord/Reader/Word2007/Footnotes.php
+++ b/src/PhpWord/Reader/Word2007/Footnotes.php
@@ -48,9 +48,6 @@ class Footnotes extends AbstractPart
*/
public function read(PhpWord $phpWord)
{
- $getMethod = "get{$this->collection}";
- $collection = $phpWord->$getMethod()->getItems();
-
$xmlReader = new XMLReader();
$xmlReader->getDomFromZip($this->docFile, $this->xmlFile);
$nodes = $xmlReader->getElements('*');
@@ -60,17 +57,41 @@ public function read(PhpWord $phpWord)
$type = $xmlReader->getAttribute('w:type', $node);
// Avoid w:type "separator" and "continuationSeparator"
- // Only look for or without w:type attribute
- if (is_null($type) && isset($collection[$id])) {
- $element = $collection[$id];
- $pNodes = $xmlReader->getElements('w:p/*', $node);
- foreach ($pNodes as $pNode) {
- $this->readRun($xmlReader, $pNode, $element, $this->collection);
+ // Only look for or without w:type attribute, or with w:type = normal
+ if ((is_null($type) || $type === 'normal')) {
+ $element = $this->getElement($phpWord, $id);
+ if ($element !== null) {
+ $pNodes = $xmlReader->getElements('w:p/*', $node);
+ foreach ($pNodes as $pNode) {
+ $this->readRun($xmlReader, $pNode, $element, $this->collection);
+ }
+ $addMethod = "add{$this->element}";
+ $phpWord->$addMethod($element);
}
- $addMethod = "add{$this->element}";
- $phpWord->$addMethod($element);
}
}
}
}
+
+ /**
+ * Searches for the element with the given relationId
+ *
+ * @param PhpWord $phpWord
+ * @param int $relationId
+ * @return \PhpOffice\PhpWord\Element\AbstractContainer|null
+ */
+ private function getElement(PhpWord $phpWord, $relationId)
+ {
+ $getMethod = "get{$this->collection}";
+ $collection = $phpWord->$getMethod()->getItems();
+
+ //not found by key, looping to search by relationId
+ foreach ($collection as $collectionElement) {
+ if ($collectionElement->getRelationId() == $relationId) {
+ return $collectionElement;
+ }
+ }
+
+ return null;
+ }
}
diff --git a/src/PhpWord/Reader/Word2007/Settings.php b/src/PhpWord/Reader/Word2007/Settings.php
index 581a546d09..ee057fe674 100644
--- a/src/PhpWord/Reader/Word2007/Settings.php
+++ b/src/PhpWord/Reader/Word2007/Settings.php
@@ -29,7 +29,18 @@
*/
class Settings extends AbstractPart
{
- private static $booleanProperties = array('hideSpellingErrors', 'hideGrammaticalErrors', 'trackRevisions', 'doNotTrackMoves', 'doNotTrackFormatting', 'evenAndOddHeaders');
+ private static $booleanProperties = array(
+ 'mirrorMargins',
+ 'hideSpellingErrors',
+ 'hideGrammaticalErrors',
+ 'trackRevisions',
+ 'doNotTrackMoves',
+ 'doNotTrackFormatting',
+ 'evenAndOddHeaders',
+ 'updateFields',
+ 'autoHyphenation',
+ 'doNotHyphenateCaps',
+ );
/**
* Read settings.xml.
@@ -157,4 +168,32 @@ protected function setRevisionView(XMLReader $xmlReader, PhpWord $phpWord, \DOME
$revisionView->setInkAnnotations(filter_var($xmlReader->getAttribute('w:inkAnnotations', $node), FILTER_VALIDATE_BOOLEAN));
$phpWord->getSettings()->setRevisionView($revisionView);
}
+
+ /**
+ * @param XMLReader $xmlReader
+ * @param PhpWord $phpWord
+ * @param \DOMElement $node
+ */
+ protected function setConsecutiveHyphenLimit(XMLReader $xmlReader, PhpWord $phpWord, \DOMElement $node)
+ {
+ $value = $xmlReader->getAttribute('w:val', $node);
+
+ if ($value !== null) {
+ $phpWord->getSettings()->setConsecutiveHyphenLimit($value);
+ }
+ }
+
+ /**
+ * @param XMLReader $xmlReader
+ * @param PhpWord $phpWord
+ * @param \DOMElement $node
+ */
+ protected function setHyphenationZone(XMLReader $xmlReader, PhpWord $phpWord, \DOMElement $node)
+ {
+ $value = $xmlReader->getAttribute('w:val', $node);
+
+ if ($value !== null) {
+ $phpWord->getSettings()->setHyphenationZone($value);
+ }
+ }
}
diff --git a/src/PhpWord/Shared/Html.php b/src/PhpWord/Shared/Html.php
index 7363580753..2c7cf1b5da 100644
--- a/src/PhpWord/Shared/Html.php
+++ b/src/PhpWord/Shared/Html.php
@@ -252,7 +252,7 @@ private static function parseText($node, $element, &$styles)
$styles['font'] = self::recursiveParseStylesInHierarchy($node, $styles['font']);
//alignment applies on paragraph, not on font. Let's copy it there
- if (isset($styles['font']['alignment'])) {
+ if (isset($styles['font']['alignment']) && is_array($styles['paragraph'])) {
$styles['paragraph']['alignment'] = $styles['font']['alignment'];
}
diff --git a/src/PhpWord/Style.php b/src/PhpWord/Style.php
index 1939aabac6..017b329003 100644
--- a/src/PhpWord/Style.php
+++ b/src/PhpWord/Style.php
@@ -95,7 +95,13 @@ public static function addNumberingStyle($styleName, $styleValues)
*/
public static function addTitleStyle($depth, $fontStyle, $paragraphStyle = null)
{
- return self::setStyleValues("Heading_{$depth}", new Font('title', $paragraphStyle), $fontStyle);
+ if ($depth == null) {
+ $styleName = 'Title';
+ } else {
+ $styleName = "Heading_{$depth}";
+ }
+
+ return self::setStyleValues($styleName, new Font('title', $paragraphStyle), $fontStyle);
}
/**
diff --git a/src/PhpWord/Style/Font.php b/src/PhpWord/Style/Font.php
index 03fb692c97..3095b79928 100644
--- a/src/PhpWord/Style/Font.php
+++ b/src/PhpWord/Style/Font.php
@@ -232,6 +232,7 @@ class Font extends AbstractStyle
/**
* Right to left languages
+ *
* @var bool
*/
private $rtl = false;
@@ -246,10 +247,19 @@ class Font extends AbstractStyle
/**
* Languages
+ *
* @var \PhpOffice\PhpWord\Style\Language
*/
private $lang;
+ /**
+ * Vertically Raised or Lowered Text
+ *
+ * @var int Signed Half-Point Measurement
+ * @see http://www.datypic.com/sc/ooxml/e-w_position-1.html
+ */
+ private $position;
+
/**
* Create new font style
*
@@ -294,6 +304,7 @@ public function getStyleValues()
'scale' => $this->getScale(),
'spacing' => $this->getSpacing(),
'kerning' => $this->getKerning(),
+ 'position' => $this->getPosition(),
),
'paragraph' => $this->getParagraph(),
'rtl' => $this->isRTL(),
@@ -926,4 +937,27 @@ public function getParagraphStyle()
{
return $this->getParagraph();
}
+
+ /**
+ * Get position
+ *
+ * @return int
+ */
+ public function getPosition()
+ {
+ return $this->position;
+ }
+
+ /**
+ * Set position
+ *
+ * @param int $value
+ * @return self
+ */
+ public function setPosition($value = null)
+ {
+ $this->position = $this->setIntVal($value, null);
+
+ return $this;
+ }
}
diff --git a/src/PhpWord/Style/Frame.php b/src/PhpWord/Style/Frame.php
index a8e1c69d20..bb684409b9 100644
--- a/src/PhpWord/Style/Frame.php
+++ b/src/PhpWord/Style/Frame.php
@@ -171,6 +171,14 @@ class Frame extends AbstractStyle
*/
private $wrap;
+ /**
+ * Vertically raised or lowered text
+ *
+ * @var int
+ * @see http://www.datypic.com/sc/ooxml/e-w_position-1.html
+ */
+ private $position;
+
/**
* Create a new instance
*
@@ -538,4 +546,27 @@ public function setWrap($value)
return $this;
}
+
+ /**
+ * Get position
+ *
+ * @return int
+ */
+ public function getPosition()
+ {
+ return $this->position;
+ }
+
+ /**
+ * Set position
+ *
+ * @param int $value
+ * @return self
+ */
+ public function setPosition($value = null)
+ {
+ $this->position = $this->setIntVal($value, null);
+
+ return $this;
+ }
}
diff --git a/src/PhpWord/Style/Paragraph.php b/src/PhpWord/Style/Paragraph.php
index 7e40d9e403..53a9b958fc 100644
--- a/src/PhpWord/Style/Paragraph.php
+++ b/src/PhpWord/Style/Paragraph.php
@@ -180,6 +180,13 @@ class Paragraph extends Border
*/
private $textAlignment;
+ /**
+ * Suppress hyphenation for paragraph
+ *
+ * @var bool
+ */
+ private $suppressAutoHyphens = false;
+
/**
* Set Style value
*
@@ -212,27 +219,28 @@ public function setStyleValue($key, $value)
public function getStyleValues()
{
$styles = array(
- 'name' => $this->getStyleName(),
- 'basedOn' => $this->getBasedOn(),
- 'next' => $this->getNext(),
- 'alignment' => $this->getAlignment(),
- 'indentation' => $this->getIndentation(),
- 'spacing' => $this->getSpace(),
- 'pagination' => array(
- 'widowControl' => $this->hasWidowControl(),
- 'keepNext' => $this->isKeepNext(),
- 'keepLines' => $this->isKeepLines(),
- 'pageBreak' => $this->hasPageBreakBefore(),
+ 'name' => $this->getStyleName(),
+ 'basedOn' => $this->getBasedOn(),
+ 'next' => $this->getNext(),
+ 'alignment' => $this->getAlignment(),
+ 'indentation' => $this->getIndentation(),
+ 'spacing' => $this->getSpace(),
+ 'pagination' => array(
+ 'widowControl' => $this->hasWidowControl(),
+ 'keepNext' => $this->isKeepNext(),
+ 'keepLines' => $this->isKeepLines(),
+ 'pageBreak' => $this->hasPageBreakBefore(),
),
- 'numbering' => array(
- 'style' => $this->getNumStyle(),
- 'level' => $this->getNumLevel(),
+ 'numbering' => array(
+ 'style' => $this->getNumStyle(),
+ 'level' => $this->getNumLevel(),
),
- 'tabs' => $this->getTabs(),
- 'shading' => $this->getShading(),
- 'contextualSpacing' => $this->hasContextualSpacing(),
- 'bidi' => $this->isBidi(),
- 'textAlignment' => $this->getTextAlignment(),
+ 'tabs' => $this->getTabs(),
+ 'shading' => $this->getShading(),
+ 'contextualSpacing' => $this->hasContextualSpacing(),
+ 'bidi' => $this->isBidi(),
+ 'textAlignment' => $this->getTextAlignment(),
+ 'suppressAutoHyphens' => $this->hasSuppressAutoHyphens(),
);
return $styles;
@@ -848,4 +856,20 @@ public function setTextAlignment($textAlignment)
return $this;
}
+
+ /**
+ * @return bool
+ */
+ public function hasSuppressAutoHyphens()
+ {
+ return $this->suppressAutoHyphens;
+ }
+
+ /**
+ * @param bool $suppressAutoHyphens
+ */
+ public function setSuppressAutoHyphens($suppressAutoHyphens)
+ {
+ $this->suppressAutoHyphens = (bool) $suppressAutoHyphens;
+ }
}
diff --git a/src/PhpWord/Writer/AbstractWriter.php b/src/PhpWord/Writer/AbstractWriter.php
index 538d9c0329..bb943d7ea5 100644
--- a/src/PhpWord/Writer/AbstractWriter.php
+++ b/src/PhpWord/Writer/AbstractWriter.php
@@ -216,7 +216,7 @@ public function setTempDir($value)
protected function getTempFile($filename)
{
// Temporary directory
- $this->setTempDir(Settings::getTempDir() . uniqid('/PHPWordWriter_') . '/');
+ $this->setTempDir(Settings::getTempDir() . uniqid('/PHPWordWriter_', true) . '/');
// Temporary file
$this->originalFilename = $filename;
diff --git a/src/PhpWord/Writer/ODText/Part/Content.php b/src/PhpWord/Writer/ODText/Part/Content.php
index 19d3e54ab0..f91ad5441e 100644
--- a/src/PhpWord/Writer/ODText/Part/Content.php
+++ b/src/PhpWord/Writer/ODText/Part/Content.php
@@ -222,8 +222,8 @@ private function getAutoStyles(PhpWord $phpWord)
* Table style can be null or string of the style name
*
* @param \PhpOffice\PhpWord\Element\AbstractContainer $container
- * @param int &$paragraphStyleCount
- * @param int &$fontStyleCount
+ * @param int $paragraphStyleCount
+ * @param int $fontStyleCount
* @todo Simplify the logic
*/
private function getContainerStyle($container, &$paragraphStyleCount, &$fontStyleCount)
@@ -254,9 +254,9 @@ private function getContainerStyle($container, &$paragraphStyleCount, &$fontStyl
/**
* Get style of individual element
*
- * @param \PhpOffice\PhpWord\Element\Text &$element
- * @param int &$paragraphStyleCount
- * @param int &$fontStyleCount
+ * @param \PhpOffice\PhpWord\Element\Text $element
+ * @param int $paragraphStyleCount
+ * @param int $fontStyleCount
*/
private function getElementStyle(&$element, &$paragraphStyleCount, &$fontStyleCount)
{
diff --git a/src/PhpWord/Writer/Word2007/Element/Image.php b/src/PhpWord/Writer/Word2007/Element/Image.php
index 7e33f75e4f..32a22a132f 100644
--- a/src/PhpWord/Writer/Word2007/Element/Image.php
+++ b/src/PhpWord/Writer/Word2007/Element/Image.php
@@ -19,6 +19,9 @@
use PhpOffice\Common\XMLWriter;
use PhpOffice\PhpWord\Element\Image as ImageElement;
+use PhpOffice\PhpWord\Style\Font as FontStyle;
+use PhpOffice\PhpWord\Style\Frame as FrameStyle;
+use PhpOffice\PhpWord\Writer\Word2007\Style\Font as FontStyleWriter;
use PhpOffice\PhpWord\Writer\Word2007\Style\Image as ImageStyleWriter;
/**
@@ -62,6 +65,16 @@ private function writeImage(XMLWriter $xmlWriter, ImageElement $element)
$this->writeCommentRangeStart();
$xmlWriter->startElement('w:r');
+
+ // Write position
+ $position = $style->getPosition();
+ if ($position && $style->getWrap() == FrameStyle::WRAP_INLINE) {
+ $fontStyle = new FontStyle('text');
+ $fontStyle->setPosition($position);
+ $fontStyleWriter = new FontStyleWriter($xmlWriter, $fontStyle);
+ $fontStyleWriter->write();
+ }
+
$xmlWriter->startElement('w:pict');
$xmlWriter->startElement('v:shape');
$xmlWriter->writeAttribute('type', '#_x0000_t75');
diff --git a/src/PhpWord/Writer/Word2007/Element/Title.php b/src/PhpWord/Writer/Word2007/Element/Title.php
index f204ab1617..80c0904d6a 100644
--- a/src/PhpWord/Writer/Word2007/Element/Title.php
+++ b/src/PhpWord/Writer/Word2007/Element/Title.php
@@ -47,27 +47,36 @@ public function write()
$xmlWriter->endElement();
}
- $rId = $element->getRelationId();
- $bookmarkRId = $element->getPhpWord()->addBookmark();
+ if ($element->getDepth() !== 0) {
+ $rId = $element->getRelationId();
+ $bookmarkRId = $element->getPhpWord()->addBookmark();
- // Bookmark start for TOC
- $xmlWriter->startElement('w:bookmarkStart');
- $xmlWriter->writeAttribute('w:id', $bookmarkRId);
- $xmlWriter->writeAttribute('w:name', "_Toc{$rId}");
- $xmlWriter->endElement();
+ // Bookmark start for TOC
+ $xmlWriter->startElement('w:bookmarkStart');
+ $xmlWriter->writeAttribute('w:id', $bookmarkRId);
+ $xmlWriter->writeAttribute('w:name', "_Toc{$rId}");
+ $xmlWriter->endElement(); //w:bookmarkStart
+ }
// Actual text
- $xmlWriter->startElement('w:r');
- $xmlWriter->startElement('w:t');
- $this->writeText($this->getText($element->getText()));
- $xmlWriter->endElement(); // w:t
- $xmlWriter->endElement(); // w:r
-
- // Bookmark end
- $xmlWriter->startElement('w:bookmarkEnd');
- $xmlWriter->writeAttribute('w:id', $bookmarkRId);
- $xmlWriter->endElement();
+ $text = $element->getText();
+ if (is_string($text)) {
+ $xmlWriter->startElement('w:r');
+ $xmlWriter->startElement('w:t');
+ $this->writeText($text);
+ $xmlWriter->endElement(); // w:t
+ $xmlWriter->endElement(); // w:r
+ } elseif ($text instanceof \PhpOffice\PhpWord\Element\AbstractContainer) {
+ $containerWriter = new Container($xmlWriter, $text);
+ $containerWriter->write();
+ }
- $xmlWriter->endElement();
+ if ($element->getDepth() !== 0) {
+ // Bookmark end
+ $xmlWriter->startElement('w:bookmarkEnd');
+ $xmlWriter->writeAttribute('w:id', $bookmarkRId);
+ $xmlWriter->endElement(); //w:bookmarkEnd
+ }
+ $xmlWriter->endElement(); //w:p
}
}
diff --git a/src/PhpWord/Writer/Word2007/Part/Settings.php b/src/PhpWord/Writer/Word2007/Part/Settings.php
index e56e2612bd..463ce0828d 100644
--- a/src/PhpWord/Writer/Word2007/Part/Settings.php
+++ b/src/PhpWord/Writer/Word2007/Part/Settings.php
@@ -149,12 +149,16 @@ private function getSettings()
$this->setOnOffValue('w:doNotTrackFormatting', $documentSettings->hasDoNotTrackFormatting());
$this->setOnOffValue('w:evenAndOddHeaders', $documentSettings->hasEvenAndOddHeaders());
$this->setOnOffValue('w:updateFields', $documentSettings->hasUpdateFields());
+ $this->setOnOffValue('w:autoHyphenation', $documentSettings->hasAutoHyphenation());
+ $this->setOnOffValue('w:doNotHyphenateCaps', $documentSettings->hasDoNotHyphenateCaps());
$this->setThemeFontLang($documentSettings->getThemeFontLang());
$this->setRevisionView($documentSettings->getRevisionView());
$this->setDocumentProtection($documentSettings->getDocumentProtection());
$this->setProofState($documentSettings->getProofState());
$this->setZoom($documentSettings->getZoom());
+ $this->setConsecutiveHyphenLimit($documentSettings->getConsecutiveHyphenLimit());
+ $this->setHyphenationZone($documentSettings->getHyphenationZone());
$this->setCompatibility();
}
@@ -162,16 +166,18 @@ private function getSettings()
* Adds a boolean attribute to the settings array
*
* @param string $settingName
- * @param bool $booleanValue
+ * @param bool|null $booleanValue
*/
private function setOnOffValue($settingName, $booleanValue)
{
- if ($booleanValue !== null && is_bool($booleanValue)) {
- if ($booleanValue) {
- $this->settings[$settingName] = array('@attributes' => array());
- } else {
- $this->settings[$settingName] = array('@attributes' => array('w:val' => 'false'));
- }
+ if (!is_bool($booleanValue)) {
+ return;
+ }
+
+ if ($booleanValue) {
+ $this->settings[$settingName] = array('@attributes' => array());
+ } else {
+ $this->settings[$settingName] = array('@attributes' => array('w:val' => 'false'));
}
}
@@ -278,6 +284,34 @@ private function setZoom($zoom = null)
}
}
+ /**
+ * @param int|null $consecutiveHyphenLimit
+ */
+ private function setConsecutiveHyphenLimit($consecutiveHyphenLimit)
+ {
+ if ($consecutiveHyphenLimit === null) {
+ return;
+ }
+
+ $this->settings['w:consecutiveHyphenLimit'] = array(
+ '@attributes' => array('w:val' => $consecutiveHyphenLimit),
+ );
+ }
+
+ /**
+ * @param float|null $hyphenationZone
+ */
+ private function setHyphenationZone($hyphenationZone)
+ {
+ if ($hyphenationZone === null) {
+ return;
+ }
+
+ $this->settings['w:hyphenationZone'] = array(
+ '@attributes' => array('w:val' => $hyphenationZone),
+ );
+ }
+
/**
* Get compatibility setting.
*/
diff --git a/src/PhpWord/Writer/Word2007/Part/Styles.php b/src/PhpWord/Writer/Word2007/Part/Styles.php
index 1cc948065b..03855f03c0 100644
--- a/src/PhpWord/Writer/Word2007/Part/Styles.php
+++ b/src/PhpWord/Writer/Word2007/Part/Styles.php
@@ -180,9 +180,15 @@ private function writeFontStyle(XMLWriter $xmlWriter, $styleName, FontStyle $sty
// Heading style
if ($styleType == 'title') {
$arrStyle = explode('_', $styleName);
- $styleId = 'Heading' . $arrStyle[1];
- $styleName = 'heading ' . $arrStyle[1];
- $styleLink = 'Heading' . $arrStyle[1] . 'Char';
+ if (count($arrStyle) > 1) {
+ $styleId = 'Heading' . $arrStyle[1];
+ $styleName = 'heading ' . $arrStyle[1];
+ $styleLink = 'Heading' . $arrStyle[1] . 'Char';
+ } else {
+ $styleId = $styleName;
+ $styleName = strtolower($styleName);
+ $styleLink = $styleName . 'Char';
+ }
$xmlWriter->writeAttribute('w:styleId', $styleId);
$xmlWriter->startElement('w:link');
diff --git a/src/PhpWord/Writer/Word2007/Style/Font.php b/src/PhpWord/Writer/Word2007/Style/Font.php
index a13db155db..5f2a84c0f4 100644
--- a/src/PhpWord/Writer/Word2007/Style/Font.php
+++ b/src/PhpWord/Writer/Word2007/Style/Font.php
@@ -151,6 +151,9 @@ private function writeStyle()
$xmlWriter->writeElementIf($styleName === null && $style->isRTL(), 'w:rtl');
}
+ // Position
+ $xmlWriter->writeElementIf($style->getPosition() !== null, 'w:position', 'w:val', $style->getPosition());
+
$xmlWriter->endElement();
}
diff --git a/src/PhpWord/Writer/Word2007/Style/Paragraph.php b/src/PhpWord/Writer/Word2007/Style/Paragraph.php
index 8915fb4c70..eeccc5c87e 100644
--- a/src/PhpWord/Writer/Word2007/Style/Paragraph.php
+++ b/src/PhpWord/Writer/Word2007/Style/Paragraph.php
@@ -112,6 +112,9 @@ private function writeStyle()
//Paragraph textAlignment
$xmlWriter->writeElementIf($styles['textAlignment'] !== null, 'w:textAlignment', 'w:val', $styles['textAlignment']);
+ // Hyphenation
+ $xmlWriter->writeElementIf($styles['suppressAutoHyphens'] === true, 'w:suppressAutoHyphens');
+
// Child style: alignment, indentation, spacing, and shading
$this->writeChildStyle($xmlWriter, 'Indentation', $styles['indentation']);
$this->writeChildStyle($xmlWriter, 'Spacing', $styles['spacing']);
diff --git a/tests/PhpWord/Element/SectionTest.php b/tests/PhpWord/Element/SectionTest.php
index 20f0f0f759..37096e2d9e 100644
--- a/tests/PhpWord/Element/SectionTest.php
+++ b/tests/PhpWord/Element/SectionTest.php
@@ -162,4 +162,35 @@ public function testAddHeaderException()
$object = new Section(1);
$object->addHeader('ODD');
}
+
+ /**
+ * @covers \PhpOffice\PhpWord\Element\AbstractContainer::removeElement
+ */
+ public function testRemoveElementByIndex()
+ {
+ $section = new Section(1);
+ $section->addText('firstText');
+ $section->addText('secondText');
+
+ $this->assertEquals(2, $section->countElements());
+ $section->removeElement(1);
+
+ $this->assertEquals(1, $section->countElements());
+ }
+
+ /**
+ * @covers \PhpOffice\PhpWord\Element\AbstractContainer::removeElement
+ */
+ public function testRemoveElementByElement()
+ {
+ $section = new Section(1);
+ $firstText = $section->addText('firstText');
+ $secondText = $section->addText('secondText');
+
+ $this->assertEquals(2, $section->countElements());
+ $section->removeElement($firstText);
+
+ $this->assertEquals(1, $section->countElements());
+ $this->assertEquals($secondText->getElementId(), $section->getElement(1)->getElementId());
+ }
}
diff --git a/tests/PhpWord/Element/TitleTest.php b/tests/PhpWord/Element/TitleTest.php
index 3ea6242f42..e99a80a63d 100644
--- a/tests/PhpWord/Element/TitleTest.php
+++ b/tests/PhpWord/Element/TitleTest.php
@@ -45,4 +45,25 @@ public function testStyleNull()
$this->assertNull($oTitle->getStyle());
}
+
+ /**
+ * Create new instance with TextRun
+ */
+ public function testConstructWithTextRun()
+ {
+ $oTextRun = new TextRun();
+ $oTextRun->addText('text');
+ $oTitle = new Title($oTextRun);
+
+ $this->assertInstanceOf('PhpOffice\\PhpWord\\Element\\TextRun', $oTitle->getText());
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ */
+ public function testConstructWithInvalidArgument()
+ {
+ $oPageBreak = new PageBreak();
+ new Title($oPageBreak);
+ }
}
diff --git a/tests/PhpWord/Metadata/SettingsTest.php b/tests/PhpWord/Metadata/SettingsTest.php
index 508635616f..07dc896291 100644
--- a/tests/PhpWord/Metadata/SettingsTest.php
+++ b/tests/PhpWord/Metadata/SettingsTest.php
@@ -172,4 +172,58 @@ public function testUpdateFields()
$oSettings->setUpdateFields(true);
$this->assertTrue($oSettings->hasUpdateFields());
}
+
+ public function testAutoHyphenation()
+ {
+ $oSettings = new Settings();
+ $oSettings->setAutoHyphenation(true);
+ $this->assertTrue($oSettings->hasAutoHyphenation());
+ }
+
+ public function testDefaultAutoHyphenation()
+ {
+ $oSettings = new Settings();
+ $this->assertNull($oSettings->hasAutoHyphenation());
+ }
+
+ public function testConsecutiveHyphenLimit()
+ {
+ $consecutiveHypenLimit = 2;
+ $oSettings = new Settings();
+ $oSettings->setConsecutiveHyphenLimit($consecutiveHypenLimit);
+ $this->assertSame($consecutiveHypenLimit, $oSettings->getConsecutiveHyphenLimit());
+ }
+
+ public function testDefaultConsecutiveHyphenLimit()
+ {
+ $oSettings = new Settings();
+ $this->assertNull($oSettings->getConsecutiveHyphenLimit());
+ }
+
+ public function testHyphenationZone()
+ {
+ $hyphenationZoneInTwip = 100;
+ $oSettings = new Settings();
+ $oSettings->setHyphenationZone($hyphenationZoneInTwip);
+ $this->assertSame($hyphenationZoneInTwip, $oSettings->getHyphenationZone());
+ }
+
+ public function testDefaultHyphenationZone()
+ {
+ $oSettings = new Settings();
+ $this->assertNull($oSettings->getHyphenationZone());
+ }
+
+ public function testDoNotHyphenateCaps()
+ {
+ $oSettings = new Settings();
+ $oSettings->setDoNotHyphenateCaps(true);
+ $this->assertTrue($oSettings->hasDoNotHyphenateCaps());
+ }
+
+ public function testDefaultDoNotHyphenateCaps()
+ {
+ $oSettings = new Settings();
+ $this->assertNull($oSettings->hasDoNotHyphenateCaps());
+ }
}
diff --git a/tests/PhpWord/PhpWordTest.php b/tests/PhpWord/PhpWordTest.php
index f8a224591c..3b1b5a3611 100644
--- a/tests/PhpWord/PhpWordTest.php
+++ b/tests/PhpWord/PhpWordTest.php
@@ -171,4 +171,58 @@ public function testCallUndefinedMethod()
$phpWord = new PhpWord();
$phpWord->undefinedMethod();
}
+
+ /**
+ * @covers \PhpOffice\PhpWord\PhpWord::getSection
+ */
+ public function testGetNotExistingSection()
+ {
+ $phpWord = new PhpWord();
+ $section = $phpWord->getSection(0);
+
+ $this->assertNull($section);
+ }
+
+ /**
+ * @covers \PhpOffice\PhpWord\PhpWord::getSection
+ */
+ public function testGetSection()
+ {
+ $phpWord = new PhpWord();
+ $phpWord->addSection();
+ $section = $phpWord->getSection(0);
+
+ $this->assertNotNull($section);
+ }
+
+ /**
+ * @covers \PhpOffice\PhpWord\PhpWord::sortSections
+ */
+ public function testSortSections()
+ {
+ $phpWord = new PhpWord();
+ $section1 = $phpWord->addSection();
+ $section1->addText('test1');
+ $section2 = $phpWord->addSection();
+ $section2->addText('test2');
+ $section2->addText('test3');
+
+ $this->assertEquals(1, $phpWord->getSection(0)->countElements());
+ $this->assertEquals(2, $phpWord->getSection(1)->countElements());
+
+ $phpWord->sortSections(function ($a, $b) {
+ $numElementsInA = $a->countElements();
+ $numElementsInB = $b->countElements();
+ if ($numElementsInA === $numElementsInB) {
+ return 0;
+ } elseif ($numElementsInA > $numElementsInB) {
+ return -1;
+ }
+
+ return 1;
+ });
+
+ $this->assertEquals(2, $phpWord->getSection(0)->countElements());
+ $this->assertEquals(1, $phpWord->getSection(1)->countElements());
+ }
}
diff --git a/tests/PhpWord/Reader/Word2007/ElementTest.php b/tests/PhpWord/Reader/Word2007/ElementTest.php
index c2648b6839..10c1ec9a15 100644
--- a/tests/PhpWord/Reader/Word2007/ElementTest.php
+++ b/tests/PhpWord/Reader/Word2007/ElementTest.php
@@ -36,9 +36,9 @@ public function testReadTextBreak()
';
- $phpWord = $this->getDocumentFromString($documentXml);
+ $phpWord = $this->getDocumentFromString(array('document' => $documentXml));
- $elements = $this->get($phpWord->getSections(), 0)->getElements();
+ $elements = $phpWord->getSection(0)->getElements();
$this->assertInstanceOf('PhpOffice\PhpWord\Element\TextBreak', $elements[0]);
$this->assertInstanceOf('PhpOffice\PhpWord\Element\Text', $elements[1]);
$this->assertEquals('test string', $elements[1]->getText());
@@ -70,17 +70,73 @@ public function testReadListItemRunWithFormatting()
';
- $phpWord = $this->getDocumentFromString($documentXml);
+ $phpWord = $this->getDocumentFromString(array('document' => $documentXml));
- $elements = $this->get($phpWord->getSections(), 0)->getElements();
- $this->assertInstanceOf('PhpOffice\PhpWord\Element\ListItemRun', $elements[0]);
- $this->assertEquals(0, $elements[0]->getDepth());
+ $sections = $phpWord->getSection(0);
+ $this->assertNull($sections->getElement(999));
+ $this->assertInstanceOf('PhpOffice\PhpWord\Element\ListItemRun', $sections->getElement(0));
+ $this->assertEquals(0, $sections->getElement(0)->getDepth());
- $listElements = $this->get($elements, 0)->getElements();
+ $listElements = $sections->getElement(0)->getElements();
$this->assertInstanceOf('PhpOffice\PhpWord\Element\Text', $listElements[0]);
$this->assertEquals('Two', $listElements[0]->getText());
$this->assertEquals(' with ', $listElements[1]->getText());
$this->assertEquals('bold', $listElements[2]->getText());
$this->assertTrue($listElements[2]->getFontStyle()->getBold());
}
+
+ /**
+ * Test reading Title style
+ */
+ public function testReadTitleStyle()
+ {
+ $documentXml = '
+
+
+
+
+ This is a non formatted title
+
+
+
+
+
+
+
+ This is a
+
+
+
+
+
+ bold
+
+
+ title
+
+ ';
+
+ $stylesXml = '
+
+
+
+
+
+ ';
+
+ $phpWord = $this->getDocumentFromString(array('document' => $documentXml, 'styles' => $stylesXml));
+
+ $elements = $phpWord->getSection(0)->getElements();
+ $this->assertInstanceOf('PhpOffice\PhpWord\Element\Title', $elements[0]);
+ /** @var \PhpOffice\PhpWord\Element\Title $title */
+ $title = $elements[0];
+ $this->assertEquals('Title', $title->getStyle());
+ $this->assertEquals('This is a non formatted title', $title->getText());
+
+ $this->assertInstanceOf('PhpOffice\PhpWord\Element\Title', $elements[1]);
+ /** @var \PhpOffice\PhpWord\Element\Title $formattedTitle */
+ $formattedTitle = $elements[1];
+ $this->assertEquals('Title', $formattedTitle->getStyle());
+ $this->assertInstanceOf('PhpOffice\PhpWord\Element\TextRun', $formattedTitle->getText());
+ }
}
diff --git a/tests/PhpWord/Reader/Word2007/PartTest.php b/tests/PhpWord/Reader/Word2007/PartTest.php
new file mode 100644
index 0000000000..0f7ecc7c90
--- /dev/null
+++ b/tests/PhpWord/Reader/Word2007/PartTest.php
@@ -0,0 +1,163 @@
+
+
+ This is a test
+
+
+
+
+
+
+
+
+
+
+ And another one
+
+
+
+
+
+
+
+ ';
+
+ $footnotesXml = '
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ footnote text
+
+
+ ';
+
+ $endnotesXml = '
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This is an endnote
+
+
+ ';
+
+ $phpWord = $this->getDocumentFromString(array('document' => $documentXml, 'footnotes' => $footnotesXml, 'endnotes' => $endnotesXml));
+
+ $elements = $phpWord->getSection(0)->getElements();
+ $this->assertInstanceOf('PhpOffice\PhpWord\Element\TextRun', $elements[0]);
+ /** @var \PhpOffice\PhpWord\Element\TextRun $textRun */
+ $textRun = $elements[0];
+
+ //test the text in the first paragraph
+ /** @var \PhpOffice\PhpWord\Element\Text $text */
+ $text = $elements[0]->getElement(0);
+ $this->assertInstanceOf('PhpOffice\PhpWord\Element\Text', $text);
+ $this->assertEquals('This is a test', $text->getText());
+
+ //test the presence of the footnote in the document.xml
+ /** @var \PhpOffice\PhpWord\Element\Footnote $footnote */
+ $documentFootnote = $textRun->getElement(1);
+ $this->assertInstanceOf('PhpOffice\PhpWord\Element\Footnote', $documentFootnote);
+ $this->assertEquals(1, $documentFootnote->getRelationId());
+
+ //test the presence of the footnote in the footnote.xml
+ /** @var \PhpOffice\PhpWord\Element\Footnote $footnote */
+ $footnote = $phpWord->getFootnotes()->getItem(1);
+ $this->assertInstanceOf('PhpOffice\PhpWord\Element\Footnote', $footnote);
+ $this->assertInstanceOf('PhpOffice\PhpWord\Element\Text', $footnote->getElement(0));
+ $this->assertEquals('footnote text', $footnote->getElement(0)->getText());
+ $this->assertEquals(1, $footnote->getRelationId());
+
+ //test the text in the second paragraph
+ /** @var \PhpOffice\PhpWord\Element\Text $text */
+ $text = $elements[1]->getElement(0);
+ $this->assertInstanceOf('PhpOffice\PhpWord\Element\Text', $text);
+ $this->assertEquals('And another one', $text->getText());
+
+ //test the presence of the endnote in the document.xml
+ /** @var \PhpOffice\PhpWord\Element\Endnote $endnote */
+ $documentEndnote = $elements[1]->getElement(1);
+ $this->assertInstanceOf('PhpOffice\PhpWord\Element\Endnote', $documentEndnote);
+ $this->assertEquals(2, $documentEndnote->getRelationId());
+
+ //test the presence of the endnote in the endnote.xml
+ /** @var \PhpOffice\PhpWord\Element\Endnote $endnote */
+ $endnote = $phpWord->getEndnotes()->getItem(1);
+ $this->assertInstanceOf('PhpOffice\PhpWord\Element\Endnote', $endnote);
+ $this->assertEquals(2, $endnote->getRelationId());
+ $this->assertInstanceOf('PhpOffice\PhpWord\Element\Text', $endnote->getElement(0));
+ $this->assertEquals('This is an endnote', $endnote->getElement(0)->getText());
+ }
+}
diff --git a/tests/PhpWord/Reader/Word2007/StyleTest.php b/tests/PhpWord/Reader/Word2007/StyleTest.php
index 4375df475a..93e4a1f048 100644
--- a/tests/PhpWord/Reader/Word2007/StyleTest.php
+++ b/tests/PhpWord/Reader/Word2007/StyleTest.php
@@ -37,9 +37,9 @@ public function testReadTableLayout()
';
- $phpWord = $this->getDocumentFromString($documentXml);
+ $phpWord = $this->getDocumentFromString(array('document' => $documentXml));
- $elements = $this->get($phpWord->getSections(), 0)->getElements();
+ $elements = $phpWord->getSection(0)->getElements();
$this->assertInstanceOf('PhpOffice\PhpWord\Element\Table', $elements[0]);
$this->assertInstanceOf('PhpOffice\PhpWord\Style\Table', $elements[0]->getStyle());
$this->assertEquals(Table::LAYOUT_FIXED, $elements[0]->getStyle()->getLayout());
@@ -56,9 +56,9 @@ public function testReadCellSpacing()
';
- $phpWord = $this->getDocumentFromString($documentXml);
+ $phpWord = $this->getDocumentFromString(array('document' => $documentXml));
- $elements = $this->get($phpWord->getSections(), 0)->getElements();
+ $elements = $phpWord->getSection(0)->getElements();
$this->assertInstanceOf('PhpOffice\PhpWord\Element\Table', $elements[0]);
$this->assertInstanceOf('PhpOffice\PhpWord\Style\Table', $elements[0]->getStyle());
$this->assertEquals(TblWidth::AUTO, $elements[0]->getStyle()->getUnit());
@@ -66,4 +66,28 @@ public function testReadCellSpacing()
$tableStyle = $elements[0]->getStyle();
$this->assertEquals(10.5, $tableStyle->getCellSpacing());
}
+
+ /**
+ * Test reading of position
+ */
+ public function testReadPosition()
+ {
+ $documentXml = '
+
+
+
+
+ This text is lowered
+
+ ';
+
+ $phpWord = $this->getDocumentFromString(array('document' => $documentXml));
+
+ $elements = $phpWord->getSection(0)->getElements();
+ $this->assertInstanceOf('PhpOffice\PhpWord\Element\Text', $elements[0]);
+ $this->assertInstanceOf('PhpOffice\PhpWord\Style\Font', $elements[0]->getFontStyle());
+ /** @var \PhpOffice\PhpWord\Style\Font $fontStyle */
+ $fontStyle = $elements[0]->getFontStyle();
+ $this->assertEquals(15, $fontStyle->getPosition());
+ }
}
diff --git a/tests/PhpWord/Style/ParagraphTest.php b/tests/PhpWord/Style/ParagraphTest.php
index e961f36a76..adf0ed4d30 100644
--- a/tests/PhpWord/Style/ParagraphTest.php
+++ b/tests/PhpWord/Style/ParagraphTest.php
@@ -67,23 +67,24 @@ public function testSetStyleValueNormal()
$object = new Paragraph();
$attributes = array(
- 'spaceAfter' => 240,
- 'spaceBefore' => 240,
- 'indent' => 1,
- 'hanging' => 1,
- 'spacing' => 120,
- 'spacingLineRule' => LineSpacingRule::AT_LEAST,
- 'basedOn' => 'Normal',
- 'next' => 'Normal',
- 'numStyle' => 'numStyle',
- 'numLevel' => 1,
- 'widowControl' => false,
- 'keepNext' => true,
- 'keepLines' => true,
- 'pageBreakBefore' => true,
- 'contextualSpacing' => true,
- 'textAlignment' => 'auto',
- 'bidi' => true,
+ 'spaceAfter' => 240,
+ 'spaceBefore' => 240,
+ 'indent' => 1,
+ 'hanging' => 1,
+ 'spacing' => 120,
+ 'spacingLineRule' => LineSpacingRule::AT_LEAST,
+ 'basedOn' => 'Normal',
+ 'next' => 'Normal',
+ 'numStyle' => 'numStyle',
+ 'numLevel' => 1,
+ 'widowControl' => false,
+ 'keepNext' => true,
+ 'keepLines' => true,
+ 'pageBreakBefore' => true,
+ 'contextualSpacing' => true,
+ 'textAlignment' => 'auto',
+ 'bidi' => true,
+ 'suppressAutoHyphens' => true,
);
foreach ($attributes as $key => $value) {
$get = $this->findGetter($key, $value, $object);
diff --git a/tests/PhpWord/Writer/Word2007/ElementTest.php b/tests/PhpWord/Writer/Word2007/ElementTest.php
index 887e8e5881..b59e369f5d 100644
--- a/tests/PhpWord/Writer/Word2007/ElementTest.php
+++ b/tests/PhpWord/Writer/Word2007/ElementTest.php
@@ -447,6 +447,9 @@ public function testCommentWithEndElement()
$this->assertTrue($doc->elementExists('/w:document/w:body/w:p/w:r/w:commentReference'));
}
+ /**
+ * Test Track changes
+ */
public function testTrackChange()
{
$phpWord = new PhpWord();
@@ -462,4 +465,30 @@ public function testTrackChange()
$this->assertEquals('author name', $doc->getElementAttribute('/w:document/w:body/w:p/w:ins', 'w:author'));
$this->assertTrue($doc->elementExists('/w:document/w:body/w:p/w:del/w:r/w:delText'));
}
+
+ /**
+ * Test Title and Headings
+ */
+ public function testTitleAndHeading()
+ {
+ $phpWord = new PhpWord();
+ $phpWord->addTitleStyle(0, array('size' => 14, 'italic' => true));
+ $phpWord->addTitleStyle(1, array('size' => 20, 'color' => '333333', 'bold' => true));
+
+ $section = $phpWord->addSection();
+ $section->addTitle('This is a title', 0);
+ $section->addTitle('Heading 1', 1);
+
+ $doc = TestHelperDOCX::getDocument($phpWord);
+
+ $this->assertTrue($doc->elementExists('/w:document/w:body/w:p[1]/w:r/w:t'));
+ $this->assertEquals('This is a title', $doc->getElement('/w:document/w:body/w:p[1]/w:r/w:t')->textContent);
+ $this->assertTrue($doc->elementExists('/w:document/w:body/w:p[1]/w:pPr/w:pStyle'));
+ $this->assertEquals('Title', $doc->getElementAttribute('/w:document/w:body/w:p[1]/w:pPr/w:pStyle', 'w:val'));
+
+ $this->assertTrue($doc->elementExists('/w:document/w:body/w:p[2]/w:r/w:t'));
+ $this->assertEquals('Heading 1', $doc->getElement('/w:document/w:body/w:p[2]/w:r/w:t')->textContent);
+ $this->assertTrue($doc->elementExists('/w:document/w:body/w:p[2]/w:pPr/w:pStyle'));
+ $this->assertEquals('Heading1', $doc->getElementAttribute('/w:document/w:body/w:p[2]/w:pPr/w:pStyle', 'w:val'));
+ }
}
diff --git a/tests/PhpWord/Writer/Word2007/Part/DocumentTest.php b/tests/PhpWord/Writer/Word2007/Part/DocumentTest.php
index 6998e717ee..39db602885 100644
--- a/tests/PhpWord/Writer/Word2007/Part/DocumentTest.php
+++ b/tests/PhpWord/Writer/Word2007/Part/DocumentTest.php
@@ -24,7 +24,6 @@
use PhpOffice\PhpWord\SimpleType\NumberFormat;
use PhpOffice\PhpWord\Style\Cell;
use PhpOffice\PhpWord\Style\Font;
-use PhpOffice\PhpWord\Style\Paragraph;
use PhpOffice\PhpWord\TestHelperDOCX;
/**
diff --git a/tests/PhpWord/Writer/Word2007/Part/SettingsTest.php b/tests/PhpWord/Writer/Word2007/Part/SettingsTest.php
index 50b444b80a..a45253a260 100644
--- a/tests/PhpWord/Writer/Word2007/Part/SettingsTest.php
+++ b/tests/PhpWord/Writer/Word2007/Part/SettingsTest.php
@@ -330,4 +330,68 @@ public function testDoNotTrackFormatting()
$element = $doc->getElement($path, $file);
$this->assertNotEquals('false', $element->getAttribute('w:val'));
}
+
+ public function testAutoHyphenation()
+ {
+ $phpWord = new PhpWord();
+ $phpWord->getSettings()->setAutoHyphenation(true);
+
+ $doc = TestHelperDOCX::getDocument($phpWord);
+
+ $file = 'word/settings.xml';
+
+ $path = '/w:settings/w:autoHyphenation';
+ $this->assertTrue($doc->elementExists($path, $file));
+
+ $element = $doc->getElement($path, $file);
+ $this->assertNotEquals('false', $element->getAttribute('w:val'));
+ }
+
+ public function testConsecutiveHyphenLimit()
+ {
+ $phpWord = new PhpWord();
+ $phpWord->getSettings()->setConsecutiveHyphenLimit(2);
+
+ $doc = TestHelperDOCX::getDocument($phpWord);
+
+ $file = 'word/settings.xml';
+
+ $path = '/w:settings/w:consecutiveHyphenLimit';
+ $this->assertTrue($doc->elementExists($path, $file));
+
+ $element = $doc->getElement($path, $file);
+ $this->assertSame('2', $element->getAttribute('w:val'));
+ }
+
+ public function testHyphenationZone()
+ {
+ $phpWord = new PhpWord();
+ $phpWord->getSettings()->setHyphenationZone(100);
+
+ $doc = TestHelperDOCX::getDocument($phpWord);
+
+ $file = 'word/settings.xml';
+
+ $path = '/w:settings/w:hyphenationZone';
+ $this->assertTrue($doc->elementExists($path, $file));
+
+ $element = $doc->getElement($path, $file);
+ $this->assertSame('100', $element->getAttribute('w:val'));
+ }
+
+ public function testDoNotHyphenateCaps()
+ {
+ $phpWord = new PhpWord();
+ $phpWord->getSettings()->setDoNotHyphenateCaps(true);
+
+ $doc = TestHelperDOCX::getDocument($phpWord);
+
+ $file = 'word/settings.xml';
+
+ $path = '/w:settings/w:doNotHyphenateCaps';
+ $this->assertTrue($doc->elementExists($path, $file));
+
+ $element = $doc->getElement($path, $file);
+ $this->assertNotEquals('false', $element->getAttribute('w:val'));
+ }
}
diff --git a/tests/PhpWord/Writer/Word2007/Style/FontTest.php b/tests/PhpWord/Writer/Word2007/Style/FontTest.php
index d36a303718..f66cf24ff4 100644
--- a/tests/PhpWord/Writer/Word2007/Style/FontTest.php
+++ b/tests/PhpWord/Writer/Word2007/Style/FontTest.php
@@ -65,4 +65,19 @@ public function testFontWithLang()
$path = '/w:document/w:body/w:p/w:r/w:rPr/w:lang';
$this->assertTrue($doc->elementExists($path, $file));
}
+
+ /**
+ * Test writing position
+ */
+ public function testPosition()
+ {
+ $phpWord = new \PhpOffice\PhpWord\PhpWord();
+ $section = $phpWord->addSection();
+ $section->addText('This text is lowered', array('position' => -20));
+ $doc = TestHelperDOCX::getDocument($phpWord, 'Word2007');
+
+ $path = '/w:document/w:body/w:p/w:r/w:rPr/w:position';
+ $this->assertTrue($doc->elementExists($path));
+ $this->assertEquals(-20, $doc->getElementAttribute($path, 'w:val'));
+ }
}
diff --git a/tests/PhpWord/Writer/Word2007/Style/ParagraphTest.php b/tests/PhpWord/Writer/Word2007/Style/ParagraphTest.php
index 9bc2756b32..1e5e1d13c7 100644
--- a/tests/PhpWord/Writer/Word2007/Style/ParagraphTest.php
+++ b/tests/PhpWord/Writer/Word2007/Style/ParagraphTest.php
@@ -17,6 +17,7 @@
namespace PhpOffice\PhpWord\Writer\Word2007\Style;
+use PhpOffice\PhpWord\Style\Paragraph as ParagraphStyle;
use PhpOffice\PhpWord\TestHelperDOCX;
/**
@@ -49,4 +50,18 @@ public function testParagraphNumbering()
$path = '/w:document/w:body/w:p/w:pPr/w:numPr/w:ilvl';
$this->assertTrue($doc->elementExists($path));
}
+
+ public function testSuppressAutoHyphens()
+ {
+ $paragraphStyle = new ParagraphStyle();
+ $paragraphStyle->setSuppressAutoHyphens(true);
+
+ $phpWord = new \PhpOffice\PhpWord\PhpWord();
+ $section = $phpWord->addSection();
+ $section->addText('test', null, $paragraphStyle);
+ $doc = TestHelperDOCX::getDocument($phpWord, 'Word2007');
+
+ $path = '/w:document/w:body/w:p/w:pPr/w:suppressAutoHyphens';
+ $this->assertTrue($doc->elementExists($path));
+ }
}
diff --git a/tests/PhpWord/_includes/AbstractTestReader.php b/tests/PhpWord/_includes/AbstractTestReader.php
index f138ac76d0..348cab98af 100644
--- a/tests/PhpWord/_includes/AbstractTestReader.php
+++ b/tests/PhpWord/_includes/AbstractTestReader.php
@@ -17,43 +17,48 @@
namespace PhpOffice\PhpWord;
-use PhpOffice\PhpWord\Reader\Word2007\Document;
-
/**
* Base class for Word2007 reader tests
*/
abstract class AbstractTestReader extends \PHPUnit\Framework\TestCase
{
+ private $parts = array(
+ 'styles' => array('class' => 'PhpOffice\PhpWord\Reader\Word2007\Styles', 'xml' => '{toReplace}'),
+ 'document' => array('class' => 'PhpOffice\PhpWord\Reader\Word2007\Document', 'xml' => '{toReplace}'),
+ 'footnotes' => array('class' => 'PhpOffice\PhpWord\Reader\Word2007\Footnotes', 'xml' => '{toReplace}'),
+ 'endnotes' => array('class' => 'PhpOffice\PhpWord\Reader\Word2007\Endnotes', 'xml' => '{toReplace}'),
+ 'settings' => array('class' => 'PhpOffice\PhpWord\Reader\Word2007\Settings', 'xml' => '{toReplace}'),
+ );
+
/**
* Builds a PhpWord instance based on the xml passed
*
* @param string $documentXml
+ * @param null|string $stylesXml
* @return \PhpOffice\PhpWord\PhpWord
*/
- protected function getDocumentFromString($documentXml)
+ protected function getDocumentFromString(array $partXmls = array())
{
- $phpWord = new PhpWord();
$file = __DIR__ . '/../_files/temp.docx';
$zip = new \ZipArchive();
$zip->open($file, \ZipArchive::CREATE);
- $zip->addFromString('document.xml', '' . $documentXml . '');
+ foreach ($this->parts as $partName => $part) {
+ if (array_key_exists($partName, $partXmls)) {
+ $zip->addFromString("{$partName}.xml", str_replace('{toReplace}', $partXmls[$partName], $this->parts[$partName]['xml']));
+ }
+ }
$zip->close();
- $documentReader = new Document($file, 'document.xml');
- $documentReader->read($phpWord);
+
+ $phpWord = new PhpWord();
+ foreach ($this->parts as $partName => $part) {
+ if (array_key_exists($partName, $partXmls)) {
+ $className = $this->parts[$partName]['class'];
+ $reader = new $className($file, "{$partName}.xml");
+ $reader->read($phpWord);
+ }
+ }
unlink($file);
return $phpWord;
}
-
- /**
- * Returns the element at position $index in the array
- *
- * @param array $array
- * @param number $index
- * @return mixed
- */
- protected function get(array $array, $index = 0)
- {
- return $array[$index];
- }
}