From f91863ed6431cb5e7eb6920385f51696951e4f9e Mon Sep 17 00:00:00 2001
From: troosan
Date: Thu, 3 Jan 2019 11:33:56 +0100
Subject: [PATCH 1/2] Add RTL aligning of tables
---
samples/Sample_36_RTL.php | 23 +++++++++++++
samples/index.php | 2 +-
src/PhpWord/Reader/Word2007/AbstractPart.php | 1 +
src/PhpWord/Style/Table.php | 32 +++++++++++++++++++
src/PhpWord/Writer/ODText/Style/Paragraph.php | 4 +++
src/PhpWord/Writer/ODText/Style/Table.php | 1 +
src/PhpWord/Writer/Word2007/Style/Table.php | 3 ++
tests/PhpWord/Reader/Word2007/StyleTest.php | 18 +++++++++++
.../Writer/Word2007/Style/TableTest.php | 17 ++++++++++
9 files changed, 100 insertions(+), 1 deletion(-)
diff --git a/samples/Sample_36_RTL.php b/samples/Sample_36_RTL.php
index 615557d78e..ca93b14df3 100644
--- a/samples/Sample_36_RTL.php
+++ b/samples/Sample_36_RTL.php
@@ -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) {
diff --git a/samples/index.php b/samples/index.php
index 3dbc09ffc4..20b56b8317 100644
--- a/samples/index.php
+++ b/samples/index.php
@@ -22,7 +22,7 @@
Read the Docs
-Requirement check:';
diff --git a/src/PhpWord/Reader/Word2007/AbstractPart.php b/src/PhpWord/Reader/Word2007/AbstractPart.php
index a7816b19ea..bb4a3a4944 100644
--- a/src/PhpWord/Reader/Word2007/AbstractPart.php
+++ b/src/PhpWord/Reader/Word2007/AbstractPart.php
@@ -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);
diff --git a/src/PhpWord/Style/Table.php b/src/PhpWord/Style/Table.php
index caf2c580d4..f777ac671f 100644
--- a/src/PhpWord/Style/Table.php
+++ b/src/PhpWord/Style/Table.php
@@ -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
*
@@ -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;
+ }
}
diff --git a/src/PhpWord/Writer/ODText/Style/Paragraph.php b/src/PhpWord/Writer/ODText/Style/Paragraph.php
index 223d02f047..f247dcc11c 100644
--- a/src/PhpWord/Writer/ODText/Style/Paragraph.php
+++ b/src/PhpWord/Writer/ODText/Style/Paragraph.php
@@ -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
diff --git a/src/PhpWord/Writer/ODText/Style/Table.php b/src/PhpWord/Writer/ODText/Style/Table.php
index c64dee4f4f..646f2e44ca 100644
--- a/src/PhpWord/Writer/ODText/Style/Table.php
+++ b/src/PhpWord/Writer/ODText/Style/Table.php
@@ -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
diff --git a/src/PhpWord/Writer/Word2007/Style/Table.php b/src/PhpWord/Writer/Word2007/Style/Table.php
index 7f49be7c38..443d670582 100644
--- a/src/PhpWord/Writer/Word2007/Style/Table.php
+++ b/src/PhpWord/Writer/Word2007/Style/Table.php
@@ -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);
diff --git a/tests/PhpWord/Reader/Word2007/StyleTest.php b/tests/PhpWord/Reader/Word2007/StyleTest.php
index 4a7add16ef..ad48dcba12 100644
--- a/tests/PhpWord/Reader/Word2007/StyleTest.php
+++ b/tests/PhpWord/Reader/Word2007/StyleTest.php
@@ -147,6 +147,24 @@ public function testReadIndent()
$this->assertSame(2160, $tableStyle->getIndent()->getValue());
}
+ public function testReadTableRTL()
+ {
+ $documentXml = '
+
+
+
+ ';
+
+ $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 = '
diff --git a/tests/PhpWord/Writer/Word2007/Style/TableTest.php b/tests/PhpWord/Writer/Word2007/Style/TableTest.php
index ec3b2483b1..8e5cb63415 100644
--- a/tests/PhpWord/Writer/Word2007/Style/TableTest.php
+++ b/tests/PhpWord/Writer/Word2007/Style/TableTest.php
@@ -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'));
+ }
}
From 6aae8bdccb9aca8ba3b40aa0e5ab942fe7eddc10 Mon Sep 17 00:00:00 2001
From: troosan
Date: Thu, 3 Jan 2019 11:36:28 +0100
Subject: [PATCH 2/2] update doc and release note
---
CHANGELOG.md | 1 +
docs/styles.rst | 3 ++-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 735264f13b..c7030a5bb9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
v0.17.0 (?? ??? 2019)
----------------------
### Added
+- Add RightToLeft table presentation. @troosan #1550
### Fixed
diff --git a/docs/styles.rst b/docs/styles.rst
index 31d04a3b3a..2be6eb94b5 100644
--- a/docs/styles.rst
+++ b/docs/styles.rst
@@ -108,11 +108,12 @@ Available Table style options:
- ``border(Top|Right|Bottom|Left)Size``. Border size in *twip*.
- ``cellMargin(Top|Right|Bottom|Left)``. Cell margin in *twip*.
- ``indent``. Table indent from leading margin. Must be an instance of ``\PhpOffice\PhpWord\ComplexType\TblWidth``.
-- ``width``. Table width in percent.
+- ``width``. Table width in Fiftieths of a Percent or Twentieths of a Point.
- ``unit``. The unit to use for the width. One of ``\PhpOffice\PhpWord\SimpleType\TblWidth``. Defaults to *auto*.
- ``layout``. Table layout, either *fixed* or *autofit* See ``\PhpOffice\PhpWord\Style\Table`` for constants.
- ``cellSpacing`` Cell spacing in *twip*
- ``position`` Floating Table Positioning, see below for options
+- ``bidiVisual`` Present table as Right-To-Left
Floating Table Positioning options: