123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874 |
- <?php
- /**
- * This file is part of PHPWord - A pure PHP library for reading and writing
- * word processing documents.
- *
- * PHPWord is free software distributed under the terms of the GNU Lesser
- * General Public License version 3 as published by the Free Software Foundation.
- *
- * For the full copyright and license information, please read the LICENSE
- * file that was distributed with this source code. For the full list of
- * contributors, visit https://github.com/PHPOffice/PHPWord/contributors.
- *
- * @see https://github.com/PHPOffice/PHPWord
- * @copyright 2010-2018 PHPWord contributors
- * @license http://www.gnu.org/licenses/lgpl.txt LGPL version 3
- */
- namespace PhpOffice\PhpWord\Style;
- use PhpOffice\PhpWord\Exception\InvalidStyleException;
- use PhpOffice\PhpWord\Shared\Text;
- use PhpOffice\PhpWord\SimpleType\Jc;
- use PhpOffice\PhpWord\SimpleType\TextAlignment;
- /**
- * Paragraph style
- *
- * OOXML:
- * - General: alignment, outline level
- * - Indentation: left, right, firstline, hanging
- * - Spacing: before, after, line spacing
- * - Pagination: widow control, keep next, keep line, page break before
- * - Formatting exception: suppress line numbers, don't hyphenate
- * - Textbox options
- * - Tabs
- * - Shading
- * - Borders
- *
- * OpenOffice:
- * - Indents & spacing
- * - Alignment
- * - Text flow
- * - Outline & numbering
- * - Tabs
- * - Dropcaps
- * - Tabs
- * - Borders
- * - Background
- *
- * @see http://www.schemacentral.com/sc/ooxml/t-w_CT_PPr.html
- */
- class Paragraph extends Border
- {
- /**
- * @const int One line height equals 240 twip
- */
- const LINE_HEIGHT = 240;
- /**
- * Aliases
- *
- * @var array
- */
- protected $aliases = array('line-height' => 'lineHeight', 'line-spacing' => 'spacing');
- /**
- * Parent style
- *
- * @var string
- */
- private $basedOn = 'Normal';
- /**
- * Style for next paragraph
- *
- * @var string
- */
- private $next;
- /**
- * @var string
- */
- private $alignment = '';
- /**
- * Indentation
- *
- * @var \PhpOffice\PhpWord\Style\Indentation|null
- */
- private $indentation;
- /**
- * Spacing
- *
- * @var \PhpOffice\PhpWord\Style\Spacing
- */
- private $spacing;
- /**
- * Text line height
- *
- * @var int
- */
- private $lineHeight;
- /**
- * Allow first/last line to display on a separate page
- *
- * @var bool
- */
- private $widowControl = true;
- /**
- * Keep paragraph with next paragraph
- *
- * @var bool
- */
- private $keepNext = false;
- /**
- * Keep all lines on one page
- *
- * @var bool
- */
- private $keepLines = false;
- /**
- * Start paragraph on next page
- *
- * @var bool
- */
- private $pageBreakBefore = false;
- /**
- * Numbering style name
- *
- * @var string
- */
- private $numStyle;
- /**
- * Numbering level
- *
- * @var int
- */
- private $numLevel = 0;
- /**
- * Set of Custom Tab Stops
- *
- * @var \PhpOffice\PhpWord\Style\Tab[]
- */
- private $tabs = array();
- /**
- * Shading
- *
- * @var \PhpOffice\PhpWord\Style\Shading
- */
- private $shading;
- /**
- * Ignore Spacing Above and Below When Using Identical Styles
- *
- * @var bool
- */
- private $contextualSpacing = false;
- /**
- * Right to Left Paragraph Layout
- *
- * @var bool
- */
- private $bidi = false;
- /**
- * Vertical Character Alignment on Line
- *
- * @var string
- */
- private $textAlignment;
- /**
- * Suppress hyphenation for paragraph
- *
- * @var bool
- */
- private $suppressAutoHyphens = false;
- /**
- * Set Style value
- *
- * @param string $key
- * @param mixed $value
- * @return self
- */
- public function setStyleValue($key, $value)
- {
- $key = Text::removeUnderscorePrefix($key);
- if ('indent' == $key || 'hanging' == $key) {
- $value = $value * 720; // 720 twips is 0.5 inch
- }
- return parent::setStyleValue($key, $value);
- }
- /**
- * Get style values
- *
- * An experiment to retrieve all style values in one function. This will
- * reduce function call and increase cohesion between functions. Should be
- * implemented in all styles.
- *
- * @ignoreScrutinizerPatch
- * @return array
- */
- 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(),
- ),
- 'numbering' => array(
- 'style' => $this->getNumStyle(),
- 'level' => $this->getNumLevel(),
- ),
- 'tabs' => $this->getTabs(),
- 'shading' => $this->getShading(),
- 'contextualSpacing' => $this->hasContextualSpacing(),
- 'bidi' => $this->isBidi(),
- 'textAlignment' => $this->getTextAlignment(),
- 'suppressAutoHyphens' => $this->hasSuppressAutoHyphens(),
- );
- return $styles;
- }
- /**
- * @since 0.13.0
- *
- * @return string
- */
- public function getAlignment()
- {
- return $this->alignment;
- }
- /**
- * @since 0.13.0
- *
- * @param string $value
- *
- * @return self
- */
- public function setAlignment($value)
- {
- if (Jc::isValid($value)) {
- $this->alignment = $value;
- }
- return $this;
- }
- /**
- * @deprecated 0.13.0 Use the `getAlignment` method instead.
- *
- * @return string
- *
- * @codeCoverageIgnore
- */
- public function getAlign()
- {
- return $this->getAlignment();
- }
- /**
- * @deprecated 0.13.0 Use the `setAlignment` method instead.
- *
- * @param string $value
- *
- * @return self
- *
- * @codeCoverageIgnore
- */
- public function setAlign($value = null)
- {
- return $this->setAlignment($value);
- }
- /**
- * Get parent style ID
- *
- * @return string
- */
- public function getBasedOn()
- {
- return $this->basedOn;
- }
- /**
- * Set parent style ID
- *
- * @param string $value
- * @return self
- */
- public function setBasedOn($value = 'Normal')
- {
- $this->basedOn = $value;
- return $this;
- }
- /**
- * Get style for next paragraph
- *
- * @return string
- */
- public function getNext()
- {
- return $this->next;
- }
- /**
- * Set style for next paragraph
- *
- * @param string $value
- * @return self
- */
- public function setNext($value = null)
- {
- $this->next = $value;
- return $this;
- }
- /**
- * Get shading
- *
- * @return \PhpOffice\PhpWord\Style\Indentation
- */
- public function getIndentation()
- {
- return $this->indentation;
- }
- /**
- * Set shading
- *
- * @param mixed $value
- * @return self
- */
- public function setIndentation($value = null)
- {
- $this->setObjectVal($value, 'Indentation', $this->indentation);
- return $this;
- }
- /**
- * Get indentation
- *
- * @return int
- */
- public function getIndent()
- {
- return $this->getChildStyleValue($this->indentation, 'left');
- }
- /**
- * Set indentation
- *
- * @param int $value
- * @return self
- */
- public function setIndent($value = null)
- {
- return $this->setIndentation(array('left' => $value));
- }
- /**
- * Get hanging
- *
- * @return int
- */
- public function getHanging()
- {
- return $this->getChildStyleValue($this->indentation, 'hanging');
- }
- /**
- * Set hanging
- *
- * @param int $value
- * @return self
- */
- public function setHanging($value = null)
- {
- return $this->setIndentation(array('hanging' => $value));
- }
- /**
- * Get spacing
- *
- * @return \PhpOffice\PhpWord\Style\Spacing
- * @todo Rename to getSpacing in 1.0
- */
- public function getSpace()
- {
- return $this->spacing;
- }
- /**
- * Set spacing
- *
- * @param mixed $value
- * @return self
- * @todo Rename to setSpacing in 1.0
- */
- public function setSpace($value = null)
- {
- $this->setObjectVal($value, 'Spacing', $this->spacing);
- return $this;
- }
- /**
- * Get space before paragraph
- *
- * @return int
- */
- public function getSpaceBefore()
- {
- return $this->getChildStyleValue($this->spacing, 'before');
- }
- /**
- * Set space before paragraph
- *
- * @param int $value
- * @return self
- */
- public function setSpaceBefore($value = null)
- {
- return $this->setSpace(array('before' => $value));
- }
- /**
- * Get space after paragraph
- *
- * @return int
- */
- public function getSpaceAfter()
- {
- return $this->getChildStyleValue($this->spacing, 'after');
- }
- /**
- * Set space after paragraph
- *
- * @param int $value
- * @return self
- */
- public function setSpaceAfter($value = null)
- {
- return $this->setSpace(array('after' => $value));
- }
- /**
- * Get spacing between lines
- *
- * @return int|float
- */
- public function getSpacing()
- {
- return $this->getChildStyleValue($this->spacing, 'line');
- }
- /**
- * Set spacing between lines
- *
- * @param int|float $value
- * @return self
- */
- public function setSpacing($value = null)
- {
- return $this->setSpace(array('line' => $value));
- }
- /**
- * Get spacing line rule
- *
- * @return string
- */
- public function getSpacingLineRule()
- {
- return $this->getChildStyleValue($this->spacing, 'lineRule');
- }
- /**
- * Set the spacing line rule
- *
- * @param string $value Possible values are defined in LineSpacingRule
- * @return \PhpOffice\PhpWord\Style\Paragraph
- */
- public function setSpacingLineRule($value)
- {
- return $this->setSpace(array('lineRule' => $value));
- }
- /**
- * Get line height
- *
- * @return int|float
- */
- public function getLineHeight()
- {
- return $this->lineHeight;
- }
- /**
- * Set the line height
- *
- * @param int|float|string $lineHeight
- *
- * @throws \PhpOffice\PhpWord\Exception\InvalidStyleException
- * @return self
- */
- public function setLineHeight($lineHeight)
- {
- if (is_string($lineHeight)) {
- $lineHeight = (float) (preg_replace('/[^0-9\.\,]/', '', $lineHeight));
- }
- if ((!is_int($lineHeight) && !is_float($lineHeight)) || !$lineHeight) {
- throw new InvalidStyleException('Line height must be a valid number');
- }
- $this->lineHeight = $lineHeight;
- $this->setSpacing(($lineHeight - 1) * self::LINE_HEIGHT);
- $this->setSpacingLineRule(\PhpOffice\PhpWord\SimpleType\LineSpacingRule::AUTO);
- return $this;
- }
- /**
- * Get allow first/last line to display on a separate page setting
- *
- * @return bool
- */
- public function hasWidowControl()
- {
- return $this->widowControl;
- }
- /**
- * Set keep paragraph with next paragraph setting
- *
- * @param bool $value
- * @return self
- */
- public function setWidowControl($value = true)
- {
- $this->widowControl = $this->setBoolVal($value, $this->widowControl);
- return $this;
- }
- /**
- * Get keep paragraph with next paragraph setting
- *
- * @return bool
- */
- public function isKeepNext()
- {
- return $this->keepNext;
- }
- /**
- * Set keep paragraph with next paragraph setting
- *
- * @param bool $value
- * @return self
- */
- public function setKeepNext($value = true)
- {
- $this->keepNext = $this->setBoolVal($value, $this->keepNext);
- return $this;
- }
- /**
- * Get keep all lines on one page setting
- *
- * @return bool
- */
- public function isKeepLines()
- {
- return $this->keepLines;
- }
- /**
- * Set keep all lines on one page setting
- *
- * @param bool $value
- * @return self
- */
- public function setKeepLines($value = true)
- {
- $this->keepLines = $this->setBoolVal($value, $this->keepLines);
- return $this;
- }
- /**
- * Get start paragraph on next page setting
- *
- * @return bool
- */
- public function hasPageBreakBefore()
- {
- return $this->pageBreakBefore;
- }
- /**
- * Set start paragraph on next page setting
- *
- * @param bool $value
- * @return self
- */
- public function setPageBreakBefore($value = true)
- {
- $this->pageBreakBefore = $this->setBoolVal($value, $this->pageBreakBefore);
- return $this;
- }
- /**
- * Get numbering style name
- *
- * @return string
- */
- public function getNumStyle()
- {
- return $this->numStyle;
- }
- /**
- * Set numbering style name
- *
- * @param string $value
- * @return self
- */
- public function setNumStyle($value)
- {
- $this->numStyle = $value;
- return $this;
- }
- /**
- * Get numbering level
- *
- * @return int
- */
- public function getNumLevel()
- {
- return $this->numLevel;
- }
- /**
- * Set numbering level
- *
- * @param int $value
- * @return self
- */
- public function setNumLevel($value = 0)
- {
- $this->numLevel = $this->setIntVal($value, $this->numLevel);
- return $this;
- }
- /**
- * Get tabs
- *
- * @return \PhpOffice\PhpWord\Style\Tab[]
- */
- public function getTabs()
- {
- return $this->tabs;
- }
- /**
- * Set tabs
- *
- * @param array $value
- * @return self
- */
- public function setTabs($value = null)
- {
- if (is_array($value)) {
- $this->tabs = $value;
- }
- return $this;
- }
- /**
- * Get allow first/last line to display on a separate page setting
- *
- * @deprecated 0.10.0
- *
- * @codeCoverageIgnore
- */
- public function getWidowControl()
- {
- return $this->hasWidowControl();
- }
- /**
- * Get keep paragraph with next paragraph setting
- *
- * @deprecated 0.10.0
- *
- * @codeCoverageIgnore
- */
- public function getKeepNext()
- {
- return $this->isKeepNext();
- }
- /**
- * Get keep all lines on one page setting
- *
- * @deprecated 0.10.0
- *
- * @codeCoverageIgnore
- */
- public function getKeepLines()
- {
- return $this->isKeepLines();
- }
- /**
- * Get start paragraph on next page setting
- *
- * @deprecated 0.10.0
- *
- * @codeCoverageIgnore
- */
- public function getPageBreakBefore()
- {
- return $this->hasPageBreakBefore();
- }
- /**
- * Get shading
- *
- * @return \PhpOffice\PhpWord\Style\Shading
- */
- public function getShading()
- {
- return $this->shading;
- }
- /**
- * Set shading
- *
- * @param mixed $value
- * @return self
- */
- public function setShading($value = null)
- {
- $this->setObjectVal($value, 'Shading', $this->shading);
- return $this;
- }
- /**
- * Get contextualSpacing
- *
- * @return bool
- */
- public function hasContextualSpacing()
- {
- return $this->contextualSpacing;
- }
- /**
- * Set contextualSpacing
- *
- * @param bool $contextualSpacing
- * @return self
- */
- public function setContextualSpacing($contextualSpacing)
- {
- $this->contextualSpacing = $contextualSpacing;
- return $this;
- }
- /**
- * Get bidirectional
- *
- * @return bool
- */
- public function isBidi()
- {
- return $this->bidi;
- }
- /**
- * Set bidi
- *
- * @param bool $bidi
- * Set to true to write from right to left
- * @return self
- */
- public function setBidi($bidi)
- {
- $this->bidi = $bidi;
- return $this;
- }
- /**
- * Get textAlignment
- *
- * @return string
- */
- public function getTextAlignment()
- {
- return $this->textAlignment;
- }
- /**
- * Set textAlignment
- *
- * @param string $textAlignment
- * @return self
- */
- public function setTextAlignment($textAlignment)
- {
- TextAlignment::validate($textAlignment);
- $this->textAlignment = $textAlignment;
- return $this;
- }
- /**
- * @return bool
- */
- public function hasSuppressAutoHyphens()
- {
- return $this->suppressAutoHyphens;
- }
- /**
- * @param bool $suppressAutoHyphens
- */
- public function setSuppressAutoHyphens($suppressAutoHyphens)
- {
- $this->suppressAutoHyphens = (bool) $suppressAutoHyphens;
- }
- }
|