diff --git a/docs/changes/1.x/1.5.0.md b/docs/changes/1.x/1.5.0.md
index b96865bada..ad49fea2e6 100644
--- a/docs/changes/1.x/1.5.0.md
+++ b/docs/changes/1.x/1.5.0.md
@@ -11,9 +11,10 @@
### Miscellaneous
- Update phpstan/phpstan requirement from ^0.12.88 || ^1.0.0 to ^0.12.88 || ^1.0.0 || ^2.0.0 by [@dependabot](https://github.com/dependabot) & [@Progi1984](https://github.com/Progi1984) in [#2736](https://github.com/PHPOffice/PHPWord/pull/2736)
+- Created visual test suite to ensure all parts of styles are working as expected, by [@rasamassen](https://github.com/rasamassen) in [#2849](https://github.com/PHPOffice/PHPWord/pull/2849)
### Deprecations
### BC Breaks
-### Notes
\ No newline at end of file
+### Notes
diff --git a/samples/Sample_Header.php b/samples/Sample_Header.php
index 57bb10a4c6..7812357612 100644
--- a/samples/Sample_Header.php
+++ b/samples/Sample_Header.php
@@ -54,6 +54,7 @@
// Populate samples
$files = '';
+$testFiles = '';
if ($handle = opendir('.')) {
$sampleFiles = [];
while (false !== ($sampleFile = readdir($handle))) {
@@ -67,6 +68,10 @@
$name = str_replace('_', ' ', preg_replace('/(Sample_|\.php)/', '', $file));
$files .= "
{$name}";
}
+ if (preg_match('/^TestSuite_/', $file)) {
+ $name = str_replace('_', ' ', preg_replace('/(TestSuite_|\.php)/', '', $file));
+ $testFiles .= "{$name}";
+ }
}
}
@@ -164,6 +169,12 @@ function getEndingNotes(array $writers, string $filename): string
+
-
-
diff --git a/samples/TestSuite_Style_Border.php b/samples/TestSuite_Style_Border.php
new file mode 100644
index 0000000000..623d20d5d1
--- /dev/null
+++ b/samples/TestSuite_Style_Border.php
@@ -0,0 +1,95 @@
+getSettings()->setThemeFontLang($languageEnGb);
+$phpWord->addTitleStyle(1, ['bold' => true, 'underline' => 'single', 'size' => 18]);
+$phpWord->addTitleStyle(2, ['bold' => true, 'underline' => 'single']);
+$section = $phpWord->addSection(['borderColor' => '00FF00', 'borderSize' => 12, 'marginLeft' => 1000, 'marginRight' => 400, 'marginTop' => 800, 'marginBottom' => 200]);
+
+$section->addTitle('Testing All Border Styles', 1);
+$section->addTextBreak();
+
+// Section Border.
+$section->addTitle('Section Border', 2);
+$section->addText('This section has a green border 12 twip thick, with a left margin of 1000, right margin of 400, top margin of 800, and bottom margin of 200');
+$section->addTextBreak();
+
+// Paragraph Border.
+$section->addTitle('Paragraph Border', 2);
+$section->addText('Border red, 40 twip thick.', null, ['borderColor' => Font::FGCOLOR_RED, 'borderSize' => 40]);
+$section->addText('Top cyan border, double line 20 twip thick', null, ['borderTopColor' => Font::FGCOLOR_CYAN, 'borderTopSize' => 20, 'borderTopStyle' => Border::DOUBLE]);
+$section->addText('Left cyan border, double line 20 twip thick', null, ['borderLeftColor' => Font::FGCOLOR_CYAN, 'borderLeftSize' => 20, 'borderLeftStyle' => Border::DOUBLE]);
+$section->addText('Right cyan border, double line 20 twip thick', null, ['borderRightColor' => Font::FGCOLOR_CYAN, 'borderRightSize' => 20, 'borderRightStyle' => Border::DOUBLE]);
+$section->addText('Bottom cyan border, double line 20 twip thick', null, ['borderBottomColor' => Font::FGCOLOR_CYAN, 'borderBottomSize' => 20, 'borderBottomStyle' => Border::DOUBLE]);
+$section->addText('Paragraphs don\'t have margins.');
+$section->addTextBreak();
+
+// Table Border.
+$section->addTitle('Table Border', 2);
+$section->addText('TODO');
+$section->addTextBreak();
+
+// Row Border.
+$section->addTitle('Row Border', 2);
+$section->addText('Not Yet Implemented in Row Style');
+$section->addTextBreak();
+
+// Cell Border.
+$section->addTitle('Cell Border', 2);
+$section->addText('TODO');
+$section->addTextBreak();
+
+// Font Border.
+$section->addTitle('Font Border, aka Character Border', 2);
+$section->addText('Not Yet Implemented in Font Style');
+$section->addTextBreak();
+
+// Border Styles.
+$section->addTitle('Border Styles', 2);
+$section->addText('Top border single line, bottom border dash dot stroke', null, ['borderTopStyle' => Border::SINGLE, 'borderBottomStyle' => Border::DASH_DOT_STROKED, 'borderTopColor' => Font::FGCOLOR_BLACK, 'borderTopSize' => 20, 'borderBottomColor' => Font::FGCOLOR_BLUE, 'borderBottomSize' => 20]);
+$section->addText('Top border dashed, bottom border dash small gap', null, ['borderTopStyle' => Border::DASHED, 'borderBottomStyle' => Border::DASH_SMALL_GAP, 'borderTopColor' => Font::FGCOLOR_BLACK, 'borderTopSize' => 20, 'borderBottomColor' => Font::FGCOLOR_BLUE, 'borderBottomSize' => 20]);
+$section->addText('Top border dot dash, bottom border dot dot dash', null, ['borderTopStyle' => Border::DOT_DASH, 'borderBottomStyle' => Border::DOT_DOT_DASH, 'borderTopColor' => Font::FGCOLOR_BLACK, 'borderTopSize' => 20, 'borderBottomColor' => Font::FGCOLOR_BLUE, 'borderBottomSize' => 20]);
+$section->addText('Top border dotted, bottom border double line', null, ['borderTopStyle' => Border::DOTTED, 'borderBottomStyle' => Border::DOUBLE, 'borderTopColor' => Font::FGCOLOR_BLACK, 'borderTopSize' => 20, 'borderBottomColor' => Font::FGCOLOR_BLUE, 'borderBottomSize' => 20]);
+$section->addText('Top border double wave, bottom border inset', null, ['borderTopStyle' => Border::DOUBLE_WAVE, 'borderBottomStyle' => Border::INSET, 'borderTopColor' => Font::FGCOLOR_BLACK, 'borderTopSize' => 20, 'borderBottomColor' => Font::FGCOLOR_BLUE, 'borderBottomSize' => 20]);
+$section->addTextBreak();
+$section->addText('No borders. Border set to nil and none.', null, ['borderTopStyle' => Border::NIL, 'borderBottomStyle' => Border::NONE, 'borderTopColor' => Font::FGCOLOR_BLACK, 'borderTopSize' => 20, 'borderBottomColor' => Font::FGCOLOR_BLUE, 'borderBottomSize' => 20]);
+$section->addTextBreak();
+$section->addText('Top border outset, bottom border thick', null, ['borderTopStyle' => Border::OUTSET, 'borderBottomStyle' => Border::THICK, 'borderTopColor' => Font::FGCOLOR_BLACK, 'borderTopSize' => 20, 'borderBottomColor' => Font::FGCOLOR_BLUE, 'borderBottomSize' => 20]);
+$section->addText('Top border thick thin large gap, bottom border thick thin medium gap', null, ['borderTopStyle' => Border::THICK_THIN_LARGE_GAP, 'borderBottomStyle' => Border::THICK_THIN_MEDIUM_GAP, 'borderTopColor' => Font::FGCOLOR_BLACK, 'borderTopSize' => 20, 'borderBottomColor' => Font::FGCOLOR_BLUE, 'borderBottomSize' => 20]);
+$section->addText('Top border thick thin small gap, bottom border thin thick large gap', null, ['borderTopStyle' => Border::THICK_THIN_SMALL_GAP, 'borderBottomStyle' => Border::THIN_THICK_LARGE_GAP, 'borderTopColor' => Font::FGCOLOR_BLACK, 'borderTopSize' => 20, 'borderBottomColor' => Font::FGCOLOR_BLUE, 'borderBottomSize' => 20]);
+$section->addText('Top border tin thick medium gap, bottom border thin thick small gap', null, ['borderTopStyle' => Border::THIN_THICK_MEDIUM_GAP, 'borderBottomStyle' => Border::THIN_THICK_SMALL_GAP, 'borderTopColor' => Font::FGCOLOR_BLACK, 'borderTopSize' => 20, 'borderBottomColor' => Font::FGCOLOR_BLUE, 'borderBottomSize' => 20]);
+$section->addText('Top border thin thick thin large gap, bottom border thin thick thin medium gap', null, ['borderTopStyle' => Border::THIN_THICK_THINLARGE_GAP, 'borderBottomStyle' => Border::THIN_THICK_THIN_MEDIUM_GAP, 'borderTopColor' => Font::FGCOLOR_BLACK, 'borderTopSize' => 20, 'borderBottomColor' => Font::FGCOLOR_BLUE, 'borderBottomSize' => 20]);
+$section->addText('Top border thin thick thin small gap, bottom border three d emboss', null, ['borderTopStyle' => Border::THIN_THICK_THIN_SMALL_GAP, 'borderBottomStyle' => Border::THREE_D_EMBOSS, 'borderTopColor' => Font::FGCOLOR_BLACK, 'borderTopSize' => 20, 'borderBottomColor' => Font::FGCOLOR_BLUE, 'borderBottomSize' => 20]);
+$section->addText('Top border three d engrave, bottom border triple line', null, ['borderTopStyle' => Border::THREE_D_ENGRAVE, 'borderBottomStyle' => Border::TRIPLE, 'borderTopColor' => Font::FGCOLOR_BLACK, 'borderTopSize' => 20, 'borderBottomColor' => Font::FGCOLOR_BLUE, 'borderBottomSize' => 20]);
+$section->addText('Top border wave, bottom border single line', null, ['borderTopStyle' => Border::WAVE, 'borderBottomStyle' => Border::SINGLE, 'borderTopColor' => Font::FGCOLOR_BLACK, 'borderTopSize' => 20, 'borderBottomColor' => Font::FGCOLOR_BLUE, 'borderBottomSize' => 20]);
+
+// Section Border.
+$section = $phpWord->addSection(['borderLeftColor' => Font::FGCOLOR_MAGENTA, 'borderLeftSize' => 100, 'borderLeftStyle' => Border::DOUBLE_WAVE]);
+$section->addTitle('Section Border', 2);
+$section->addText('This is just a left border, magenta, double wave, 100 twip thick. Default margins.');
+
+// Section Border.
+$section = $phpWord->addSection(['borderRightColor' => Font::FGCOLOR_MAGENTA, 'borderRightSize' => 50, 'borderRightStyle' => Border::DOUBLE_WAVE, 'borderBottomColor' => Font::FGCOLOR_MAGENTA, 'borderBottomSize' => 50, 'borderBottomStyle' => Border::DOUBLE_WAVE]);
+$section->addTitle('Section Border', 2);
+$section->addText('This is just a right and bottom border, magenta, double wave, 50 twip thick. Default margins.');
+
+// Section Border.
+$section = $phpWord->addSection(['borderTopColor' => Font::FGCOLOR_MAGENTA, 'borderTopSize' => 400, 'borderTopStyle' => Border::TRIPLE]);
+$section->addTitle('Section Border', 2);
+$section->addText('This is top border, magenta, triple line, 400 twip thick. Default margins.');
+
+// Save file
+echo write($phpWord, basename(__FILE__, '.php'), $writers);
+if (!CLI) {
+ include_once 'Sample_Footer.php';
+}
diff --git a/samples/TestSuite_Style_Font.php b/samples/TestSuite_Style_Font.php
new file mode 100644
index 0000000000..5fede6f5c2
--- /dev/null
+++ b/samples/TestSuite_Style_Font.php
@@ -0,0 +1,155 @@
+getSettings()->setThemeFontLang($languageEnGb);
+$phpWord->addTitleStyle(1, ['bold' => true, 'underline' => 'single', 'size' => 18]);
+$phpWord->addTitleStyle(2, ['bold' => true, 'underline' => 'single']);
+$section = $phpWord->addSection();
+
+$section->addTitle('Testing All Font Styles', 1);
+$section->addText('See also: Style > Language');
+$section->addText('See also: Style > Shading');
+$section->addText('See also: Style > Spacing');
+$section->addTextBreak();
+
+// Default Font.
+$phpWord->setDefaultFontName('Verdana');
+$phpWord->setDefaultFontColor('341539');
+$phpWord->setDefaultFontSize(11);
+$section->addTitle('Default Font', 2);
+$section->addText('Default font is Verdana, dark purple (#341539 or rgb 52,21,57), size 11');
+$section->addTextBreak();
+
+// Name.
+$section->addTitle('Name', 2);
+$section->addText('Arial', ['name' => 'Arial']);
+$section->addText('Times New Roman', ['name' => 'Times New Roman']);
+$section->addText('monospace', ['name' => 'monospace']);
+$section->addText('Fallback aka Font Family set to serif', ['name' => 'Junkmail Garbage', 'fallback' => 'serif']);
+$section->addText('Fallback aka Font Family set to sans-serif', ['name' => 'Junkmail Garbage', 'fallback' => 'sans-serif']);
+$section->addText('Todo: Test Hint, Ascii, Ansi, and EastAsia, and CS');
+$section->addTextBreak();
+
+// RTL.
+$section->addTitle('Right-to-Left', 2);
+$section->addText('Hey, this font is going the other way!', ['rtl' => true]);
+$section->addText('!yaw rehto eht gniog si tnof siht ,yeH', ['rtl' => true]);
+$section->addTextBreak();
+
+// Language.
+$section->addTitle('Language', 2);
+$section->addText('C\'est du français.', ['lang' => 'fr-FR']);
+$section->addText('זה עברית.', ['lang' => 'he-IL']);
+$section->addText('이것은 한국어입니다', ['name' => 'ko-KR']);
+$section->addTextBreak();
+
+// Color.
+$section->addTitle('Color', 2);
+$section->addText('Dark Green', ['color' => Font::FGCOLOR_DARKGREEN]);
+$section->addText('Red', ['color' => Font::FGCOLOR_RED]);
+$section->addText('Blue', ['color' => Font::FGCOLOR_BLUE]);
+$section->addTextBreak();
+
+// Size.
+$section->addTitle('Size', 2);
+$section->addText('8 point font', ['size' => 8]);
+$section->addText('14 point font', ['size' => 14]);
+$section->addText('24 point font', ['size' => 24]);
+$section->addTextBreak();
+
+// Bold, italic.
+$section->addTitle('Bold/Italic', 2);
+$section->addText('Bold', ['bold' => true]);
+$section->addText('Italic', ['italic' => true]);
+$section->addTextBreak();
+
+// Strikethrough, double strikethrough.
+$section->addTitle('Strikethrough', 2);
+$section->addText('Strikethrough', ['strikethrough' => true]);
+$section->addText('Double Strikethrough', ['doubleStrikethrough' => true]);
+$section->addTextBreak();
+
+// Small caps, all caps.
+$section->addTitle('Caps', 2);
+$section->addText('This Is A Small Caps Sentence.', ['smallCaps' => true]);
+$section->addText('This Is An All-Caps Sentence.', ['allCaps' => true]);
+$section->addTextBreak();
+
+// Hidden.
+$section->addTitle('Hidden Text (you should not be able to see the next line)', 2);
+$section->addText('This sentence is hidden.', ['hidden' => true]);
+$section->addTextBreak();
+
+// Underline.
+$section->addTitle('Underline', 2);
+$textrun = $section->addTextRun();
+$textrun->addText('This text is ');
+$textrun->addText('underline none, ', ['underline' => Font::UNDERLINE_NONE]);
+$textrun->addText('underline dash, ', ['underline' => Font::UNDERLINE_DASH]);
+$textrun->addText('underline dash heavy, ', ['underline' => Font::UNDERLINE_DASHHEAVY]);
+$textrun->addText('underline dash long, ', ['underline' => Font::UNDERLINE_DASHLONG]);
+$textrun->addText('underline dash long heavy, ', ['underline' => Font::UNDERLINE_DASHLONGHEAVY]);
+$textrun->addText('underline single, ', ['underline' => Font::UNDERLINE_SINGLE]);
+$textrun->addText('underline double, ', ['underline' => Font::UNDERLINE_DOUBLE]);
+$textrun->addText('underline heavy, ', ['underline' => Font::UNDERLINE_HEAVY]);
+$textrun->addText('underline dot dash, ', ['underline' => Font::UNDERLINE_DOTDASH]);
+$textrun->addText('underline dot dash heavy, ', ['underline' => Font::UNDERLINE_DOTDASHHEAVY]);
+$textrun->addText('underline dot dot dash, ', ['underline' => Font::UNDERLINE_DOTDOTDASH]);
+$textrun->addText('underline dot dot dash heavy, ', ['underline' => Font::UNDERLINE_DOTDOTDASHHEAVY]);
+$textrun->addText('underline dotted, ', ['underline' => Font::UNDERLINE_DOTTED]);
+$textrun->addText('underline dotted heavy, ', ['underline' => Font::UNDERLINE_DOTTEDHEAVY]);
+$textrun->addText('underline wavy, ', ['underline' => Font::UNDERLINE_WAVY]);
+$textrun->addText('underline wavy double, ', ['underline' => Font::UNDERLINE_WAVYDOUBLE]);
+$textrun->addText('underline wavy heavy, ', ['underline' => Font::UNDERLINE_WAVYHEAVY]);
+$textrun->addText('only the words are underlined and not the spaces.', ['underline' => Font::UNDERLINE_WORDS]);
+$section->addTextBreak();
+
+// Foreground Color.
+$section->addTitle('Foreground Color, aka Highlight', 2);
+$section->addText('Highlight yellow', ['fgColor' => Font::FGCOLOR_YELLOW]);
+$section->addText('Highlight cyan', ['fgColor' => Font::FGCOLOR_CYAN]);
+$section->addText('Highlight light gray', ['fgColor' => Font::FGCOLOR_LIGHTGRAY]);
+$section->addTextBreak();
+
+// Superscript, subscript, position.
+$section->addTitle('Super/subscript', 2);
+$textrun = $section->addTextRun();
+$textrun->addText('This text is ');
+$textrun->addText('superscript', ['superScript' => true]);
+$textrun->addText(' and ');
+$textrun->addText('subscript', ['subScript' => true]);
+$textrun = $section->addTextRun();
+$textrun->addText('This text is ');
+$textrun->addText('raised half a step', ['position' => 8]);
+$textrun->addText(' and ');
+$textrun->addText('lowered half a step', ['position' => -8]);
+$section->addTextBreak();
+
+// noProof.
+$section->addTitle('No Proof', 2);
+$section->addText('Even thoughdffds pthispdsentence spdfi is full of tyhpeing errors, there should be no proofing.', ['noProof' => true]);
+$section->addTextBreak();
+
+// Whitespace.
+$section->addTitle('For HTML Only', 2);
+$section->addText('Lots of whitespace here.', ['whiteSpace' => 'pre-wrap']);
+$section->addTextBreak();
+
+// Contains Paragraph.
+$section->addTitle('Font with embedded Paragraph Style', 2);
+$section->addText('This text should be centered.', ['paragraph' => ['align' => 'center']]);
+
+// Save file
+echo write($phpWord, basename(__FILE__, '.php'), $writers);
+if (!CLI) {
+ include_once 'Sample_Footer.php';
+}
diff --git a/samples/TestSuite_Style_Indentation.php b/samples/TestSuite_Style_Indentation.php
new file mode 100644
index 0000000000..4e954433d2
--- /dev/null
+++ b/samples/TestSuite_Style_Indentation.php
@@ -0,0 +1,51 @@
+getSettings()->setThemeFontLang($languageEnGb);
+$phpWord->addTitleStyle(1, ['bold' => true, 'underline' => 'single', 'size' => 18]);
+$phpWord->addTitleStyle(2, ['bold' => true, 'underline' => 'single']);
+$section = $phpWord->addSection();
+
+$section->addTitle('Testing All Indentation Styles', 1);
+$section->addTextBreak();
+
+// Left and Right.
+$section->addTitle('Left and Right', 2);
+$section->addText('Left 1440, Right 1440. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['indentation' => ['left' => 1440, 'right' => 1440]]);
+$section->addText('Left 7200, Right 7200', null, ['indentation' => ['left' => 7200, 'right' => 7200]]);
+$section->addText('Left -1440, Right -1440. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['indentation' => ['left' => -1440, 'right' => -1440]]);
+$section->addTextBreak();
+
+// First Line.
+$section->addTitle('First Line', 2);
+$section->addText('First Line 1440. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['indentation' => ['firstLine' => 1440]]);
+$section->addText('First Line -360. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['indentation' => ['firstLine' => -360]]);
+$section->addText('First Line Character 1440. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['indentation' => ['firstLineChars' => 1440]]);
+$section->addText('First Line Character -360. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['indentation' => ['firstLineChars' => -360]]);
+$section->addText('First Line & First Line Character 1440. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['indentation' => ['firstLine' => 1440, 'firstLineChars' => 1440]]);
+$section->addText('First Line 1440, First Line Character 2880. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['indentation' => ['firstLine' => 1440, 'firstLineChars' => 2880]]);
+$section->addTextBreak();
+
+// Hanging.
+$section->addTitle('Hanging', 2);
+$section->addText('Hanging 360. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['indentation' => ['hanging' => 360]]);
+$section->addText('Hanging -360. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['indentation' => ['hanging' => -360]]);
+$section->addTextBreak();
+
+// Hanging vs First Line.
+$section->addTitle('Hanging vs. First Line. Who will win?', 2);
+$section->addText('Hanging, First Line, and First Line Character all 360. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['indentation' => ['firstLine' => 360, 'firstLineChars' => 360, 'hanging' => 360]]);
+$section->addText('Hanging, First Line, and First Line Character all -360. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['indentation' => ['firstLine' => -360, 'firstLineChars' => -360, 'hanging' => -360]]);
+
+// Save file
+echo write($phpWord, basename(__FILE__, '.php'), $writers);
+if (!CLI) {
+ include_once 'Sample_Footer.php';
+}
diff --git a/samples/TestSuite_Style_Paragraph.php b/samples/TestSuite_Style_Paragraph.php
new file mode 100644
index 0000000000..30c65bbb4e
--- /dev/null
+++ b/samples/TestSuite_Style_Paragraph.php
@@ -0,0 +1,78 @@
+getSettings()->setThemeFontLang($languageEnGb);
+$phpWord->addTitleStyle(1, ['bold' => true, 'underline' => 'single', 'size' => 18]);
+$phpWord->addTitleStyle(2, ['bold' => true, 'underline' => 'single']);
+$section = $phpWord->addSection();
+
+$section->addTitle('Testing All Paragraph Styles', 1);
+$section->addText('See also: Style > Border');
+$section->addText('See also: Style > Indentation');
+$section->addText('See also: Style > Numbering');
+$section->addText('See also: Style > Shading');
+$section->addText('See also: Style > Spacing');
+$section->addText('See also: Style > Tab');
+$section->addTextBreak();
+
+// Default Paragraph.
+$phpWord->setDefaultParagraphStyle(['alignment' => Jc::CENTER]);
+$section->addTitle('Default Paragraph Style', 2);
+$section->addText('Default paragraph is centered.');
+$section->addTextBreak();
+
+// Pagination.
+$section->addTitle('Pagination', 2);
+$section->addText('The following items are false: widow/orphan control, keep lines together, keep lines with next, and page break before.', null, ['alignment' => Jc::START, 'keepLines' => false, 'keepNext' => false, 'pageBreakBefore' => false, 'widowControl' => false]);
+$section->addText('The following items are true: widow/orphan control, keep lines together, keep lines with next, and page break before.', null, ['alignment' => Jc::START, 'keepLines' => true, 'keepNext' => true, 'pageBreakBefore' => true, 'widowControl' => true]);
+$section->addTextBreak();
+
+// Alignment.
+$section->addTitle('Alignment', 2);
+$section->addText('Start (aka left)', null, ['alignment' => Jc::START]);
+$section->addText('Center', null, ['alignment' => Jc::CENTER]);
+$section->addText('End (aka right)', null, ['alignment' => Jc::END]);
+$section->addText('Both (aka justify). Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['alignment' => Jc::BOTH]);
+$section->addText('For NumTab and Number Level. See Style > Numbering', null, ['alignment' => Jc::NUM_TAB]);
+$section->addText('Distributed. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['alignment' => Jc::DISTRIBUTE]);
+$section->addText('Lef for compare. Lorem Ipsum คือ เนื้อหาจำลองแบบเรียบๆ ที่ใช้กันในธุรกิจงานพิมพ์หรืองานเรียงพิมพ์ มันได้กลายมาเป็นเนื้อหาจำลองมาตรฐานของธุรกิจดังกล่าวมาตั้งแต่ศตวรรษที่ 16 เมื่อเครื่องพิมพ์โนเนมเครื่องหนึ่งนำรางตัวพิมพ์มาสลับสับตำแหน่งตัวอักษรเพื่อทำหนังสือตัวอย่าง Lorem Ipsum อยู่ยงคงกระพันมาไม่ใช่แค่เพียงห้าศตวรรษ แต่อยู่มาจนถึงยุคที่พลิกโฉมเข้าสู่งานเรียงพิมพ์ด้วยวิธีทางอิเล็กทรอนิกส์ และยังคงสภาพเดิมไว้อย่างไม่มีการเปลี่ยนแปลง มันได้รับความนิยมมากขึ้นในยุค ค.ศ. 1960 เมื่อแผ่น Letraset วางจำหน่ายโดยมีข้อความบนนั้นเป็น Lorem Ipsum และล่าสุดกว่านั้น คือเมื่อซอฟท์แวร์การทำสื่อสิ่งพิมพ์ (Desktop Publishing) อย่าง Aldus PageMaker ได้รวมเอา Lorem Ipsum เวอร์ชั่นต่างๆ เข้าไว้ในซอฟท์แวร์ด้วย', ['language' => 'th-TH'], ['alignment' => Jc::START]);
+$section->addText('Thai Distributed. Lorem Ipsum คือ เนื้อหาจำลองแบบเรียบๆ ที่ใช้กันในธุรกิจงานพิมพ์หรืองานเรียงพิมพ์ มันได้กลายมาเป็นเนื้อหาจำลองมาตรฐานของธุรกิจดังกล่าวมาตั้งแต่ศตวรรษที่ 16 เมื่อเครื่องพิมพ์โนเนมเครื่องหนึ่งนำรางตัวพิมพ์มาสลับสับตำแหน่งตัวอักษรเพื่อทำหนังสือตัวอย่าง Lorem Ipsum อยู่ยงคงกระพันมาไม่ใช่แค่เพียงห้าศตวรรษ แต่อยู่มาจนถึงยุคที่พลิกโฉมเข้าสู่งานเรียงพิมพ์ด้วยวิธีทางอิเล็กทรอนิกส์ และยังคงสภาพเดิมไว้อย่างไม่มีการเปลี่ยนแปลง มันได้รับความนิยมมากขึ้นในยุค ค.ศ. 1960 เมื่อแผ่น Letraset วางจำหน่ายโดยมีข้อความบนนั้นเป็น Lorem Ipsum และล่าสุดกว่านั้น คือเมื่อซอฟท์แวร์การทำสื่อสิ่งพิมพ์ (Desktop Publishing) อย่าง Aldus PageMaker ได้รวมเอา Lorem Ipsum เวอร์ชั่นต่างๆ เข้าไว้ในซอฟท์แวร์ด้วย', ['language' => 'th-TH'], ['alignment' => Jc::THAI_DISTRIBUTE]);
+$section->addText('High Kashida (Arabic Script). هناك حقيقة مثبتة منذ زمن طويل وهي أن المحتوى المقروء لصفحة ما سيلهي القارئ عن التركيز على الشكل الخارجي للنص أو شكل توضع الفقرات في الصفحة التي يقرأها. ولذلك يتم استخدام طريقة لوريم إيبسوم لأنها تعطي توزيعاَ طبيعياَ -إلى حد ما- للأحرف عوضاً عن استخدام "هنا يوجد محتوى نصي، هنا يوجد محتوى نصي" فتجعلها تبدو (أي الأحرف) وكأنها نص مقروء. العديد من برامح النشر المكتبي وبرامح تحرير صفحات الويب تستخدم لوريم إيبسوم بشكل إفتراضي كنموذج عن النص، وإذا قمت بإدخال "lorem ipsum" في أي محرك بحث ستظهر العديد من المواقع الحديثة العهد في نتائج البحث. على مدى السنين ظهرت نسخ جديدة ومختلفة من نص لوريم إيبسوم، أحياناً عن طريق الصدفة، وأحياناً عن عمد كإدخال بعض العبارات الفكاهية إليها.', ['language' => 'ar-SA', 'rtl' => true], ['alignment' => Jc::HIGH_KASHIDA]);
+$section->addText('Medium Kashida (Arabic Script). هناك حقيقة مثبتة منذ زمن طويل وهي أن المحتوى المقروء لصفحة ما سيلهي القارئ عن التركيز على الشكل الخارجي للنص أو شكل توضع الفقرات في الصفحة التي يقرأها. ولذلك يتم استخدام طريقة لوريم إيبسوم لأنها تعطي توزيعاَ طبيعياَ -إلى حد ما- للأحرف عوضاً عن استخدام "هنا يوجد محتوى نصي، هنا يوجد محتوى نصي" فتجعلها تبدو (أي الأحرف) وكأنها نص مقروء. العديد من برامح النشر المكتبي وبرامح تحرير صفحات الويب تستخدم لوريم إيبسوم بشكل إفتراضي كنموذج عن النص، وإذا قمت بإدخال "lorem ipsum" في أي محرك بحث ستظهر العديد من المواقع الحديثة العهد في نتائج البحث. على مدى السنين ظهرت نسخ جديدة ومختلفة من نص لوريم إيبسوم، أحياناً عن طريق الصدفة، وأحياناً عن عمد كإدخال بعض العبارات الفكاهية إليها.', ['language' => 'ar-SA', 'rtl' => true], ['alignment' => Jc::MEDIUM_KASHIDA]);
+$section->addText('Low Kashida (Arabic Script). هناك حقيقة مثبتة منذ زمن طويل وهي أن المحتوى المقروء لصفحة ما سيلهي القارئ عن التركيز على الشكل الخارجي للنص أو شكل توضع الفقرات في الصفحة التي يقرأها. ولذلك يتم استخدام طريقة لوريم إيبسوم لأنها تعطي توزيعاَ طبيعياَ -إلى حد ما- للأحرف عوضاً عن استخدام "هنا يوجد محتوى نصي، هنا يوجد محتوى نصي" فتجعلها تبدو (أي الأحرف) وكأنها نص مقروء. العديد من برامح النشر المكتبي وبرامح تحرير صفحات الويب تستخدم لوريم إيبسوم بشكل إفتراضي كنموذج عن النص، وإذا قمت بإدخال "lorem ipsum" في أي محرك بحث ستظهر العديد من المواقع الحديثة العهد في نتائج البحث. على مدى السنين ظهرت نسخ جديدة ومختلفة من نص لوريم إيبسوم، أحياناً عن طريق الصدفة، وأحياناً عن عمد كإدخال بعض العبارات الفكاهية إليها.', ['language' => 'ar-SA', 'rtl' => true], ['alignment' => Jc::LOW_KASHIDA]);
+$section->addTextBreak();
+
+// Bidirectional.
+$section->addTitle('Bidirectional', 2);
+$section->addText('Left to right paragraph. هناك حقيقة مثبتة منذ زمن طويل وهي أن المحتوى المقروء لصفحة ما سيلهي القارئ عن التركيز على الشكل الخارجي للنص أو شكل توضع الفقرات في الصفحة التي يقرأها. ولذلك يتم استخدام طريقة لوريم إيبسوم لأنها تعطي توزيعاَ طبيعياَ -إلى حد ما- للأحرف عوضاً عن استخدام "هنا يوجد محتوى نصي، هنا يوجد محتوى نصي" فتجعلها تبدو (أي الأحرف) وكأنها نص مقروء. العديد من برامح النشر المكتبي وبرامح تحرير صفحات الويب تستخدم لوريم إيبسوم بشكل إفتراضي كنموذج عن النص، وإذا قمت بإدخال "lorem ipsum" في أي محرك بحث ستظهر العديد من المواقع الحديثة العهد في نتائج البحث. على مدى السنين ظهرت نسخ جديدة ومختلفة من نص لوريم إيبسوم، أحياناً عن طريق الصدفة، وأحياناً عن عمد كإدخال بعض العبارات الفكاهية إليها', ['language' => 'ar-SA']);
+$section->addText('Right to left paragraph. هناك حقيقة مثبتة منذ زمن طويل وهي أن المحتوى المقروء لصفحة ما سيلهي القارئ عن التركيز على الشكل الخارجي للنص أو شكل توضع الفقرات في الصفحة التي يقرأها. ولذلك يتم استخدام طريقة لوريم إيبسوم لأنها تعطي توزيعاَ طبيعياَ -إلى حد ما- للأحرف عوضاً عن استخدام "هنا يوجد محتوى نصي، هنا يوجد محتوى نصي" فتجعلها تبدو (أي الأحرف) وكأنها نص مقروء. العديد من برامح النشر المكتبي وبرامح تحرير صفحات الويب تستخدم لوريم إيبسوم بشكل إفتراضي كنموذج عن النص، وإذا قمت بإدخال "lorem ipsum" في أي محرك بحث ستظهر العديد من المواقع الحديثة العهد في نتائج البحث. على مدى السنين ظهرت نسخ جديدة ومختلفة من نص لوريم إيبسوم، أحياناً عن طريق الصدفة، وأحياناً عن عمد كإدخال بعض العبارات الفكاهية إليها', ['language' => 'ar-SA'], ['bidi' => true]);
+$section->addTextBreak();
+
+// Text Alignment and Hyphenation.
+$section->addTitle('Text Alignment and Hyphenation', 2);
+$section->addText('TODO');
+$section->addText('For contextual spacing, see Style > Spacing');
+$section->addTextBreak();
+
+// Based On and Next.
+$section->addTitle('Based On and Next', 2);
+$phpWord->addParagraphStyle('pDefault', ['alignment' => Jc::START, 'keepLines' => true, 'keepNext' => true, 'pageBreakBefore' => true, 'widowControl' => true]);
+$phpWord->addParagraphStyle('pUndo', ['basedOn' => 'pDefault', 'keepLines' => false, 'keepNext' => false, 'pageBreakBefore' => false, 'widowControl' => false]);
+$section->addText('Left align. The following items are true: widow/orphan control, keep lines together, keep lines with next, and page break before.', null, 'pDefault');
+$section->addText('Still left align, but now all items are false.', null, 'pUndo');
+$section->addText('TODO: Next');
+
+// Save file
+echo write($phpWord, basename(__FILE__, '.php'), $writers);
+if (!CLI) {
+ include_once 'Sample_Footer.php';
+}
diff --git a/samples/TestSuite_Style_Shading.php b/samples/TestSuite_Style_Shading.php
new file mode 100644
index 0000000000..41146d70cd
--- /dev/null
+++ b/samples/TestSuite_Style_Shading.php
@@ -0,0 +1,132 @@
+getSettings()->setThemeFontLang($languageEnGb);
+$phpWord->addTitleStyle(1, ['bold' => true, 'underline' => 'single', 'size' => 18]);
+$phpWord->addTitleStyle(2, ['bold' => true, 'underline' => 'single']);
+$section = $phpWord->addSection();
+
+$section->addTitle('Testing All Shading Styles', 1);
+$section->addTextBreak();
+
+// Fill.
+$section->addTitle('Fill', 2);
+$section->addText('Paragraph. Color Yellow, Fill Red.', null, ['shading' => ['fill' => FontStyle::FGCOLOR_RED]]);
+$section->addText('Font. Color Yellow, Fill Red.', ['shading' => ['fill' => FontStyle::FGCOLOR_RED]]);
+$section->addTextBreak();
+
+// Color.
+$section->addTitle('Color using Solid Pattern', 2);
+$section->addText('Paragraph. Color Yellow, Fill Red.', null, ['shading' => ['color' => FontStyle::FGCOLOR_YELLOW, 'pattern' => ShadingStyle::PATTERN_SOLID]]);
+$section->addText('Font. Color Yellow, Fill Red.', ['shading' => ['color' => FontStyle::FGCOLOR_YELLOW, 'pattern' => ShadingStyle::PATTERN_SOLID]]);
+$section->addTextBreak();
+
+// Color and Fill.
+$section->addTitle('Color using Solid Pattern and Fill. Which will win?', 2);
+$section->addText('Paragraph. Color Yellow, Fill Red.', null, ['shading' => ['fill' => FontStyle::FGCOLOR_RED, 'color' => FontStyle::FGCOLOR_YELLOW, 'pattern' => ShadingStyle::PATTERN_SOLID]]);
+$section->addText('Font. Color Yellow, Fill Red.', ['shading' => ['fill' => FontStyle::FGCOLOR_RED, 'color' => FontStyle::FGCOLOR_YELLOW, 'pattern' => ShadingStyle::PATTERN_SOLID]]);
+$section->addTextBreak();
+
+// Color and Fill.
+$section->addTitle('Color using Diagonal Cross Pattern and Fill', 2);
+$section->addText('Paragraph. Color Yellow, Fill Red.', null, ['shading' => ['fill' => FontStyle::FGCOLOR_RED, 'color' => FontStyle::FGCOLOR_YELLOW, 'pattern' => ShadingStyle::PATTERN_DCROSS]]);
+$section->addText('Font. Color Yellow, Fill Red.', ['shading' => ['fill' => FontStyle::FGCOLOR_RED, 'color' => FontStyle::FGCOLOR_YELLOW, 'pattern' => ShadingStyle::PATTERN_DCROSS]]);
+$section->addTextBreak();
+
+// Pattern.
+$section->addTitle('Patterns', 2);
+$textrun = $section->addTextRun();
+$textrun->addText('This text uses the patterns: ');
+$textrun->addText('Solid, ', ['size' => 24, 'shading' => ['color' => FontStyle::FGCOLOR_BLUE, 'pattern' => ShadingStyle::PATTERN_SOLID]]);
+$textrun->addText('Clear, ', ['size' => 24, 'shading' => ['color' => FontStyle::FGCOLOR_BLUE, 'pattern' => ShadingStyle::PATTERN_CLEAR]]);
+$textrun->addText('Horizontal Stripe, ', ['size' => 24, 'shading' => ['color' => FontStyle::FGCOLOR_BLUE, 'pattern' => ShadingStyle::PATTERN_HSTRIPE]]);
+$textrun->addText('Vertical Stripe, ', ['size' => 24, 'shading' => ['color' => FontStyle::FGCOLOR_BLUE, 'pattern' => ShadingStyle::PATTERN_VSTRIPE]]);
+$textrun->addText('Diagonal Stripe, ', ['size' => 24, 'shading' => ['color' => FontStyle::FGCOLOR_BLUE, 'pattern' => ShadingStyle::PATTERN_DSTRIPE]]);
+$textrun->addText('Horizontal Cross, ', ['size' => 24, 'shading' => ['color' => FontStyle::FGCOLOR_BLUE, 'pattern' => ShadingStyle::PATTERN_HCROSS]]);
+$textrun->addText('Diagonal Cross, ', ['size' => 24, 'shading' => ['color' => FontStyle::FGCOLOR_BLUE, 'pattern' => ShadingStyle::PATTERN_DCROSS]]);
+$section->addTextBreak();
+
+// Pattern.
+$section->addTitle('Patterns with Fill', 2);
+$textrun = $section->addTextRun();
+$textrun->addText('Same as previous, with red fill: ');
+$textrun->addText('Solid, ', ['size' => 24, 'shading' => ['fill' => FontStyle::FGCOLOR_RED, 'color' => FontStyle::FGCOLOR_BLUE, 'pattern' => ShadingStyle::PATTERN_SOLID]]);
+$textrun->addText('Clear, ', ['size' => 24, 'shading' => ['fill' => FontStyle::FGCOLOR_RED, 'color' => FontStyle::FGCOLOR_BLUE, 'pattern' => ShadingStyle::PATTERN_CLEAR]]);
+$textrun->addText('Horizontal Stripe, ', ['size' => 24, 'shading' => ['fill' => FontStyle::FGCOLOR_RED, 'color' => FontStyle::FGCOLOR_BLUE, 'pattern' => ShadingStyle::PATTERN_HSTRIPE]]);
+$textrun->addText('Vertical Stripe, ', ['size' => 24, 'shading' => ['fill' => FontStyle::FGCOLOR_RED, 'color' => FontStyle::FGCOLOR_BLUE, 'pattern' => ShadingStyle::PATTERN_VSTRIPE]]);
+$textrun->addText('Diagonal Stripe, ', ['size' => 24, 'shading' => ['fill' => FontStyle::FGCOLOR_RED, 'color' => FontStyle::FGCOLOR_BLUE, 'pattern' => ShadingStyle::PATTERN_DSTRIPE]]);
+$textrun->addText('Horizontal Cross, ', ['size' => 24, 'shading' => ['fill' => FontStyle::FGCOLOR_RED, 'color' => FontStyle::FGCOLOR_BLUE, 'pattern' => ShadingStyle::PATTERN_HCROSS]]);
+$textrun->addText('Diagonal Cross, ', ['size' => 24, 'shading' => ['fill' => FontStyle::FGCOLOR_RED, 'color' => FontStyle::FGCOLOR_BLUE, 'pattern' => ShadingStyle::PATTERN_DCROSS]]);
+$section->addTextBreak();
+
+// Table
+$rows = 3;
+$cols = 3;
+
+$section->addTitle('Table Fill Yellow', 2);
+$tableFill = ['shading' => ['fill' => FontStyle::FGCOLOR_YELLOW]];
+$phpWord->addTableStyle('fillYellow', $tableFill);
+$table = $section->addTable('fillYellow');
+for ($r = 1; $r <= $rows; ++$r) {
+ $table->addRow();
+ for ($c = 1; $c <= $cols; ++$c) {
+ $table->addCell(1750)->addText("Row {$r}, Cell {$c}");
+ }
+}
+$section->addTextBreak();
+
+$section->addTitle('Table Color Light Green, Pattern Solid', 2);
+$tableColor = ['shading' => ['color' => FontStyle::FGCOLOR_LIGHTGREEN, 'pattern' => ShadingStyle::PATTERN_SOLID]];
+$phpWord->addTableStyle('colorYellow', $tableColor);
+$table = $section->addTable('colorYellow');
+for ($r = 1; $r <= $rows; ++$r) {
+ $table->addRow();
+ for ($c = 1; $c <= $cols; ++$c) {
+ $table->addCell(1750)->addText("Row {$r}, Cell {$c}");
+ }
+}
+$section->addTextBreak();
+
+$section->addTitle('Table Color Yellow, Pattern vStripe', 2);
+$tablePattern = ['shading' => ['color' => FontStyle::FGCOLOR_YELLOW, 'pattern' => ShadingStyle::PATTERN_VSTRIPE]];
+$phpWord->addTableStyle('patternYellow', $tablePattern);
+$table = $section->addTable('patternYellow');
+for ($r = 1; $r <= $rows; ++$r) {
+ $table->addRow();
+ for ($c = 1; $c <= $cols; ++$c) {
+ $table->addCell(1750)->addText("Row {$r}, Cell {$c}");
+ }
+}
+$section->addTextBreak();
+
+// Cell
+$rows = 3;
+$cols = 3;
+
+$section->addTitle('Cell Shading, using the same options as the previous tables', 2);
+$cellStyle1 = ['shading' => ['fill' => FontStyle::FGCOLOR_YELLOW]];
+$cellStyle2 = ['shading' => ['color' => FontStyle::FGCOLOR_LIGHTGREEN, 'pattern' => ShadingStyle::PATTERN_SOLID]];
+$cellStyle3 = ['shading' => ['color' => FontStyle::FGCOLOR_YELLOW, 'pattern' => ShadingStyle::PATTERN_VSTRIPE]];
+$table = $section->addTable();
+for ($r = 1; $r <= $rows; ++$r) {
+ $table->addRow();
+ for ($c = 1; $c <= $cols; ++$c) {
+ $table->addCell(1750, ${'cellStyle' . $c})->addText("Row {$r}, Cell {$c}");
+ }
+}
+
+// Save file
+echo write($phpWord, basename(__FILE__, '.php'), $writers);
+if (!CLI) {
+ include_once 'Sample_Footer.php';
+}
diff --git a/samples/TestSuite_Style_Spacing.php b/samples/TestSuite_Style_Spacing.php
new file mode 100644
index 0000000000..8b5b0375b2
--- /dev/null
+++ b/samples/TestSuite_Style_Spacing.php
@@ -0,0 +1,62 @@
+getSettings()->setThemeFontLang($languageEnGb);
+$phpWord->addTitleStyle(1, ['bold' => true, 'underline' => 'single', 'size' => 18]);
+$phpWord->addTitleStyle(2, ['bold' => true, 'underline' => 'single']);
+$section = $phpWord->addSection();
+
+$section->addTitle('Testing All Spacing Styles', 1);
+$section->addTextBreak();
+
+// Before and After.
+$section->addTitle('Before and After', 2);
+$section->addText('No Spacing.', null, ['space' => ['before' => 0, 'after' => 0, 'line' => 0]]);
+$section->addText('Before 360, After 360. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['space' => ['before' => 360, 'after' => 360, 'line' => 0]]);
+$section->addText('No Spacing.', null, ['space' => ['before' => 0, 'after' => 0, 'line' => 0]]);
+$section->addTextBreak();
+
+// Line Rule Auto.
+$section->addTitle('Line Rule Auto', 2);
+$textRun = $section->addTextRun(['space' => ['line' => 240]]);
+$textRun->addText('Line 240, aka 2 or Double. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.');
+$textRun->addText(' Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.', ['size' => 24]);
+$textRun->addText(' Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
+$section->addText('Line 480, aka 3 or Triple. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['space' => ['line' => 480]]);
+$section->addText('Line -120, aka 0.5 or Half. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['space' => ['line' => -120]]);
+$section->addText('Line -360 (not possible). Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['space' => ['line' => -360]]);
+$section->addTextBreak();
+
+// Line Rule Exact.
+$section->addTitle('Line Rule Exact', 2);
+$textRun = $section->addTextRun(['space' => ['line' => 240, 'lineRule' => LineSpacing::EXACT]]);
+$textRun->addText('Line 240, aka 12pt. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.');
+$textRun->addText(' Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.', ['size' => 24]);
+$textRun->addText(' Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
+$section->addText('Line 120, aka 6pt. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['space' => ['line' => 120, 'lineRule' => LineSpacing::EXACT]]);
+$section->addText('Line -120 (not possible). Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['space' => ['line' => -240, 'lineRule' => LineSpacing::EXACT]]);
+$section->addTextBreak();
+
+// Line Rule At Least.
+$section->addTitle('Line Rule At Least', 2);
+$textRun = $section->addTextRun(['space' => ['line' => 360, 'lineRule' => LineSpacing::AT_LEAST]]);
+$textRun->addText('Line 240, aka 12pt. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.');
+$textRun->addText(' Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.', ['size' => 36]);
+$textRun->addText(' Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
+$section->addText('Line 480, aka 24pt. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['space' => ['line' => 480, 'lineRule' => LineSpacing::AT_LEAST]]);
+$section->addText('Line -240 (not possible). Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', null, ['space' => ['line' => -240, 'lineRule' => LineSpacing::AT_LEAST]]);
+
+// Save file
+echo write($phpWord, basename(__FILE__, '.php'), $writers);
+if (!CLI) {
+ include_once 'Sample_Footer.php';
+}
diff --git a/samples/TestSuite_Style_Tab.php b/samples/TestSuite_Style_Tab.php
new file mode 100644
index 0000000000..80e0d6440f
--- /dev/null
+++ b/samples/TestSuite_Style_Tab.php
@@ -0,0 +1,57 @@
+getSettings()->setThemeFontLang($languageEnGb);
+$phpWord->addTitleStyle(1, ['bold' => true, 'underline' => 'single', 'size' => 18]);
+$phpWord->addTitleStyle(2, ['bold' => true, 'underline' => 'single']);
+$section = $phpWord->addSection();
+
+$section->addTitle('Testing All Tab Styles', 1);
+$section->addTextBreak();
+
+// Tab Stop Type.
+$section->addTitle('Tab Stop Type', 2);
+$section->addText("Tab\tLeft 2880", null, ['tabs' => [new TabStyle(TabStyle::TAB_STOP_LEFT, 2880)]]);
+$section->addText("Tab\tCenter 2880", null, ['tabs' => [new TabStyle(TabStyle::TAB_STOP_CENTER, 2880)]]);
+$section->addText("Tab\tRight 2880", null, ['tabs' => [new TabStyle(TabStyle::TAB_STOP_RIGHT, 2880)]]);
+$section->addText("Tab\tDecimal 28.80", null, ['tabs' => [new TabStyle(TabStyle::TAB_STOP_DECIMAL, 2880)]]);
+$section->addText("Tab\tBar 2880", null, ['tabs' => [new TabStyle(TabStyle::TAB_STOP_BAR, 2880)]]);
+$section->addText("Tab\tNum 2880", null, ['tabs' => [new TabStyle(TabStyle::TAB_STOP_NUM, 2880)]]);
+$section->addTextBreak();
+
+// Tab Leader.
+$section->addTitle('Tab Leader', 2);
+$section->addText("Tab\tNone", null, ['tabs' => [new TabStyle(TabStyle::TAB_STOP_LEFT, 1440, TabStyle::TAB_LEADER_NONE)]]);
+$section->addText("Tab\tDot", null, ['tabs' => [new TabStyle(TabStyle::TAB_STOP_LEFT, 1440, TabStyle::TAB_LEADER_DOT)]]);
+$section->addText("Tab\tHyphen", null, ['tabs' => [new TabStyle(TabStyle::TAB_STOP_LEFT, 1440, TabStyle::TAB_LEADER_HYPHEN)]]);
+$section->addText("Tab\tUnderscore", null, ['tabs' => [new TabStyle(TabStyle::TAB_STOP_LEFT, 1440, TabStyle::TAB_LEADER_UNDERSCORE)]]);
+$section->addText("Tab\tHeavy", null, ['tabs' => [new TabStyle(TabStyle::TAB_STOP_LEFT, 1440, TabStyle::TAB_LEADER_HEAVY)]]);
+$section->addText("Tab\tMiddledot", null, ['tabs' => [new TabStyle(TabStyle::TAB_STOP_LEFT, 1440, TabStyle::TAB_LEADER_MIDDLEDOT)]]);
+$section->addTextBreak();
+
+// Multiple Tabs.
+$section->addTitle('Multiple Tabs', 2);
+$section->addText("\tMultiple Tabs at Left 1440\tCenter 5000\tRight 9340", null, ['tabs' => [new TabStyle(TabStyle::TAB_STOP_LEFT, 1440), new TabStyle(TabStyle::TAB_STOP_CENTER, 5000), new TabStyle(TabStyle::TAB_STOP_RIGHT, 9340)]]);
+$section->addTextBreak();
+
+// Clearing Tabs.
+$section->addTitle('Clearing Tabs', 2);
+$phpWord->addParagraphStyle('pTabs', ['tabs' => [new TabStyle(TabStyle::TAB_STOP_LEFT, 1440), new TabStyle(TabStyle::TAB_STOP_CENTER, 5000), new TabStyle(TabStyle::TAB_STOP_RIGHT, 9340)]]);
+$phpWord->addParagraphStyle('pTabsClear', ['basedOn' => 'pTabs', 'tabs' => [new TabStyle(TabStyle::TAB_STOP_CLEAR, 9340)]]);
+$section->addText("\tThis paragraph\tmatches the previous\twith multiple tabs", null, 'pTabs');
+$section->addText("\tThis paragraph does\tnot\thave the right tab", null, 'pTabsClear');
+
+// Save file
+echo write($phpWord, basename(__FILE__, '.php'), $writers);
+if (!CLI) {
+ include_once 'Sample_Footer.php';
+}
diff --git a/src/PhpWord/Writer/HTML/Element/Table.php b/src/PhpWord/Writer/HTML/Element/Table.php
index b66e2f8c92..25c55a940b 100644
--- a/src/PhpWord/Writer/HTML/Element/Table.php
+++ b/src/PhpWord/Writer/HTML/Element/Table.php
@@ -58,6 +58,7 @@ public function write()
$cellBgColor = $cellStyle->getBgColor();
$cellFgColor = null;
if ($cellBgColor && $cellBgColor !== 'auto') {
+ $cellBgColor = \PhpOffice\PhpWord\Shared\Converter::stringToRgb($cellBgColor);
$red = hexdec(substr($cellBgColor, 0, 2));
$green = hexdec(substr($cellBgColor, 2, 2));
$blue = hexdec(substr($cellBgColor, 4, 2));