Skip to content

Commit

Permalink
Add RTL aligning of tables
Browse files Browse the repository at this point in the history
  • Loading branch information
troosan committed Jan 3, 2019
1 parent 4d76bae commit f91863e
Show file tree
Hide file tree
Showing 9 changed files with 100 additions and 1 deletion.
23 changes: 23 additions & 0 deletions samples/Sample_36_RTL.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,29 @@
$textrun = $section->addTextRun(array('alignment' => \PhpOffice\PhpWord\SimpleType\Jc::END));
$textrun->addText('سلام این یک پاراگراف راست به چپ است', array('rtl' => true));

$section->addText('Table visually presented as RTL');
$style = array('rtl' => true, 'size' => 12);
$tableStyle = array('borderSize' => 6, 'borderColor' => '000000', 'width' => 5000, 'unit' => \PhpOffice\PhpWord\SimpleType\TblWidth::PERCENT, 'bidiVisual' => true);

$table = $section->addTable($tableStyle);
$cellHCentered = array('alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER);
$cellHEnd = array('alignment' => \PhpOffice\PhpWord\SimpleType\Jc::END);
$cellVCentered = array('valign' => \PhpOffice\PhpWord\Style\Cell::VALIGN_CENTER);

//Vidually bidirectinal table
$table->addRow();
$cell = $table->addCell(500, $cellVCentered);
$textrun = $cell->addTextRun($cellHCentered);
$textrun->addText('ردیف', $style);

$cell = $table->addCell(11000);
$textrun = $cell->addTextRun($cellHEnd);
$textrun->addText('سوالات', $style);

$cell = $table->addCell(500, $cellVCentered);
$textrun = $cell->addTextRun($cellHCentered);
$textrun->addText('بارم', $style);

// Save file
echo write($phpWord, basename(__FILE__, '.php'), $writers);
if (!CLI) {
Expand Down
2 changes: 1 addition & 1 deletion samples/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
<a class="btn btn-lg btn-primary" href="http://phpword.readthedocs.org/" role="button"><i class="fa fa-book fa-lg" title="Docs"></i> Read the Docs</a>
</p>
</div>
<?php
<?php
}
if (!CLI) {
echo '<h3>Requirement check:</h3>';
Expand Down
1 change: 1 addition & 0 deletions src/PhpWord/Reader/Word2007/AbstractPart.php
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,7 @@ protected function readTableStyle(XMLReader $xmlReader, \DOMElement $domNode)
$styleDefs["border{$ucfSide}Style"] = array(self::READ_VALUE, "w:tblBorders/w:$side", 'w:val');
}
$styleDefs['layout'] = array(self::READ_VALUE, 'w:tblLayout', 'w:type');
$styleDefs['bidiVisual'] = array(self::READ_TRUE, 'w:bidiVisual');
$styleDefs['cellSpacing'] = array(self::READ_VALUE, 'w:tblCellSpacing', 'w:w');
$style = $this->readStyleDefs($xmlReader, $styleNode, $styleDefs);

Expand Down
32 changes: 32 additions & 0 deletions src/PhpWord/Style/Table.php
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,14 @@ class Table extends Border
*/
private $columnWidths;

/**
* Visually Right to Left Table
*
* @see http://www.datypic.com/sc/ooxml/e-w_bidiVisual-1.html
* @var bool
*/
private $bidiVisual = false;

/**
* Create new table style
*
Expand Down Expand Up @@ -775,4 +783,28 @@ public function setColumnWidths(array $value = null)
{
$this->columnWidths = $value;
}

/**
* Get bidiVisual
*
* @return bool
*/
public function isBidiVisual()
{
return $this->bidiVisual;
}

/**
* Set bidiVisual
*
* @param bool $bidi
* Set to true to visually present table as Right to Left
* @return self
*/
public function setBidiVisual($bidi)
{
$this->bidiVisual = $bidi;

return $this;
}
}
4 changes: 4 additions & 0 deletions src/PhpWord/Writer/ODText/Style/Paragraph.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,10 @@ public function write()
$xmlWriter->writeAttribute('fo:margin-bottom', $marginBottom . 'cm');
$xmlWriter->writeAttribute('fo:text-align', $style->getAlignment());
}

//Right to left
$xmlWriter->writeAttributeIf($style->isBidi(), 'style:writing-mode', 'rl-tb');

$xmlWriter->endElement(); //style:paragraph-properties

$xmlWriter->endElement(); //style:style
Expand Down
1 change: 1 addition & 0 deletions src/PhpWord/Writer/ODText/Style/Table.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public function write()
//$xmlWriter->writeAttribute('style:width', 'table');
$xmlWriter->writeAttribute('style:rel-width', 100);
$xmlWriter->writeAttribute('table:align', 'center');
$xmlWriter->writeAttributeIf($style->isBidiVisual(), 'style:writing-mode', 'rl-tb');
$xmlWriter->endElement(); // style:table-properties
$xmlWriter->endElement(); // style:style

Expand Down
3 changes: 3 additions & 0 deletions src/PhpWord/Writer/Word2007/Style/Table.php
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,9 @@ private function writeStyle(XMLWriter $xmlWriter, TableStyle $style)
$styleWriter = new TablePosition($xmlWriter, $style->getPosition());
$styleWriter->write();

//Right to left
$xmlWriter->writeElementIf($style->isBidiVisual() !== null, 'w:bidiVisual', 'w:val', $this->writeOnOf($style->isBidiVisual()));

$this->writeMargin($xmlWriter, $style);
$this->writeBorder($xmlWriter, $style);

Expand Down
18 changes: 18 additions & 0 deletions tests/PhpWord/Reader/Word2007/StyleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,24 @@ public function testReadIndent()
$this->assertSame(2160, $tableStyle->getIndent()->getValue());
}

public function testReadTableRTL()
{
$documentXml = '<w:tbl>
<w:tblPr>
<w:bidiVisual w:val="1"/>
</w:tblPr>
</w:tbl>';

$phpWord = $this->getDocumentFromString(array('document' => $documentXml));

$elements = $phpWord->getSection(0)->getElements();
$this->assertInstanceOf('PhpOffice\PhpWord\Element\Table', $elements[0]);
$this->assertInstanceOf('PhpOffice\PhpWord\Style\Table', $elements[0]->getStyle());
/** @var \PhpOffice\PhpWord\Style\Table $tableStyle */
$tableStyle = $elements[0]->getStyle();
$this->assertTrue($tableStyle->isBidiVisual());
}

public function testReadHidden()
{
$documentXml = '<w:p>
Expand Down
17 changes: 17 additions & 0 deletions tests/PhpWord/Writer/Word2007/Style/TableTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -141,4 +141,21 @@ public function testIndent()
$this->assertSame($value, (int) $doc->getElementAttribute($path, 'w:w'));
$this->assertSame($type, $doc->getElementAttribute($path, 'w:type'));
}

public function testRigthToLeft()
{
$tableStyle = new Table();
$tableStyle->setBidiVisual(true);

$phpWord = new \PhpOffice\PhpWord\PhpWord();
$section = $phpWord->addSection();
$table = $section->addTable($tableStyle);
$table->addRow();

$doc = TestHelperDOCX::getDocument($phpWord, 'Word2007');

$path = '/w:document/w:body/w:tbl/w:tblPr/w:bidiVisual';
$this->assertTrue($doc->elementExists($path));
$this->assertEquals('1', $doc->getElementAttribute($path, 'w:val'));
}
}

0 comments on commit f91863e

Please sign in to comment.