From 220365514ac350ffc38bcd811e72ead2cda909f8 Mon Sep 17 00:00:00 2001 From: Jake Jackson Date: Wed, 30 Sep 2026 14:06:10 +1000 Subject: [PATCH] Count tr, td and th:nth-child from the stack of open elements The legacy tr, td and th:nth-child and :first-child rules took a row's or cell's position from mPDF's row and column counters, with a row group start recorded by each thead, tbody and tfoot. They now read the styled element's nthChild from the stack of open elements, as the selector matcher does, and the counters and Tag::startRowGroup() are gone. The stack now leaves an element a browser moves out of a table, such as a or written between cells, out of the table part's children, and with allow_html_optional_endtags off it still closes a cell, row or row group when the next one opens, as mPDF lays them out. A bookmark before the first cell no longer makes td:first-child miss it. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG-GRAVITYPDF.md | 2 + src/Css/CssMerger.php | 55 ++---- src/Tag/TBody.php | 2 - src/Tag/TFoot.php | 2 - src/Tag/THead.php | 2 - src/Tag/Tag.php | 13 -- src/TracksOpenElements.php | 62 ++++++- tests/Mpdf/Css/CssMergerTest.php | 40 +++-- tests/Mpdf/NthChildSelectorTest.php | 157 ++++++++++++++++++ tests/Mpdf/OpenElementStackTest.php | 33 ++++ tests/Mpdf/StructuralSelectorTest.php | 6 + tests/Mpdf/StyledElementPathTest.php | 20 +++ tests/Mpdf/StyledPathRecordingMpdf.php | 9 + .../NthChildTableContextsSnapshotTest.php | 126 ++++++++++++++ .../NthChildTableStylesheetSnapshotTest.php | 141 ++++++++++++++++ .../snapshots/nth-child-table-contexts.pdf | Bin 0 -> 44889 bytes .../snapshots/nth-child-table-stylesheet.pdf | Bin 0 -> 67115 bytes 17 files changed, 592 insertions(+), 78 deletions(-) create mode 100644 tests/Snapshots/NthChildTableContextsSnapshotTest.php create mode 100644 tests/Snapshots/NthChildTableStylesheetSnapshotTest.php create mode 100644 tests/data/snapshots/nth-child-table-contexts.pdf create mode 100644 tests/data/snapshots/nth-child-table-stylesheet.pdf diff --git a/CHANGELOG-GRAVITYPDF.md b/CHANGELOG-GRAVITYPDF.md index 746bc8453..a1853f3db 100644 --- a/CHANGELOG-GRAVITYPDF.md +++ b/CHANGELOG-GRAVITYPDF.md @@ -376,6 +376,7 @@ These changes do not change output. * **Branch alias.** The Composer branch alias maps `dev-gravitypdf` to `8.x-dev`. [#3] * **Open elements.** `WriteHTML()` keeps a stack of the elements open in the HTML it reads, so that CSS rules can be matched against an element's parents, ancestors and earlier siblings rather than only the blocks mPDF lays out. Each element carries its position among its siblings and a record of the siblings before it. `Mpdf::getOpenElements()` reads it. [#533] * **Compiled selectors.** A rule whose selector the legacy parser cannot read is compiled into its compound selectors, the combinators between them and its specificity, and filed under its rightmost compound for the selector matcher. A selector list is split at the commas outside parentheses, brackets and strings, so `:is(h1, h2)` and `[title="a,b"]` stay whole. [#538] [#619] +* **nth-child in tables from the open elements.** `tr`, `td` and `th:nth-child()` and `:first-child` take a row's or cell's position among its siblings from the stack of open elements, as the selector matcher does, instead of from mPDF's row and column counters. An element a browser moves out of a table, such as a `` or `` written between two cells, is not counted, and with `allow_html_optional_endtags` off a cell, row or row group with no end tag is closed by the next one, as mPDF lays it out. [#538] [#629] [mpdf/mpdf#7]: https://github.com/mpdf/mpdf/issues/7 [mpdf/mpdf#83]: https://github.com/mpdf/mpdf/issues/83 @@ -818,3 +819,4 @@ These changes do not change output. [#625]: https://github.com/GravityPDF/mpdf/pull/625 [#627]: https://github.com/GravityPDF/mpdf/pull/627 [#628]: https://github.com/GravityPDF/mpdf/pull/628 +[#629]: https://github.com/GravityPDF/mpdf/pull/629 diff --git a/src/Css/CssMerger.php b/src/Css/CssMerger.php index cb0f41c2f..8e5959dcc 100644 --- a/src/Css/CssMerger.php +++ b/src/Css/CssMerger.php @@ -901,8 +901,11 @@ protected function mergeNthChildCss($sourceSelectors, &$targetProperties, $tag) * The nth-child rules in a node of the stylesheet that match the row or cell being opened. * * Only the nth-child keys CssManager::readCss() recorded are looked up, each directly in the node, so a node must - * come from the stylesheet it read. Where several match, a later rule overrides an earlier one, so they are returned - * in the order the node holds them. + * come from the stylesheet it read. The row or cell is counted by its place among its element siblings on the + * stack of open elements: a row within its thead, tbody or tfoot, or the tbody a row written straight into the + * table is put in, and a cell among the cells of its row, whatever grid columns a colspan or a rowspan takes up. + * Where several rules match, a later rule overrides an earlier one, so they are returned in the order the node + * holds them. * * @param array $node CssManager::$CSS, or a level of the descendant rules * @param string $tag TR, TD or TH @@ -910,18 +913,19 @@ protected function mergeNthChildCss($sourceSelectors, &$targetProperties, $tag) */ private function matchingNthChildRules($node, $tag) { - $rules = []; - $index = null; - foreach ($this->cssManager->getNthChildFormulas($tag) as $key => $parts) { - if (!isset($node[$key])) { - continue; - } + $formulas = array_intersect_key($this->cssManager->getNthChildFormulas($tag), $node); + if (!$formulas) { + return []; + } - if ($index === null) { - $index = $this->nthChildIndex($tag); - } + $nthChild = $this->mpdf->getStyledElementNthChild(); + if ($nthChild === null) { + return []; + } - if ($this->selectorParser->matchesNthChild($parts, $index)) { + $rules = []; + foreach ($formulas as $key => $parts) { + if ($this->selectorParser->matchesNthChild($parts, $nthChild - 1)) { $rules[$key] = $node[$key]; } } @@ -930,33 +934,6 @@ private function matchingNthChildRules($node, $tag) return count($rules) > 1 ? array_intersect_key($node, $rules) : $rules; } - /** - * The index, from 0, that nth-child matches the row or cell being opened against. - * - * A row is counted among the rows of its row group: the thead, a tbody, the tfoot, or the rows written straight into - * the table. A cell is counted among the cells opened in its row, so the grid columns a colspan or a rowspan takes - * up before it do not count. - * - * @param string $tag TR, TD or TH - * @return int - */ - private function nthChildIndex($tag) - { - if ($tag !== 'TR') { - // The cell being opened is not in the grid yet, so this counts the cells before it. A grid column that a - // colspan or a rowspan takes up holds 0, not a cell. - $cells = isset($this->mpdf->cell[$this->mpdf->row]) ? $this->mpdf->cell[$this->mpdf->row] : []; - - return count(array_filter($cells, 'is_array')); - } - - // A table starts with the rows written straight into it, until a row group opens - $level = $this->mpdf->tableLevel; - $start = isset($this->mpdf->tbctr[$level], $this->mpdf->table[$level][$this->mpdf->tbctr[$level]]['rowgroupstart']) ? $this->mpdf->table[$level][$this->mpdf->tbctr[$level]]['rowgroupstart'] : 0; - - return $this->mpdf->row - $start; - } - /** * Merge full CSS rules including tag, class, ID, and lang selectors. * diff --git a/src/Tag/TBody.php b/src/Tag/TBody.php index 1ef74aa69..25b4c4531 100644 --- a/src/Tag/TBody.php +++ b/src/Tag/TBody.php @@ -10,7 +10,6 @@ public function open($attr, &$ahtml, &$ihtml) $this->mpdf->tablethead = 0; $this->mpdf->tabletfoot = 0; $this->mpdf->lastoptionaltag = 'TBODY'; // Save current HTML specified optional endtag - $this->startRowGroup(); $this->cssManager->tbCSSlvl++; $this->cssManager->MergeCSS('TABLE', 'TBODY', $attr); } @@ -18,7 +17,6 @@ public function open($attr, &$ahtml, &$ihtml) public function close(&$ahtml, &$ihtml) { $this->mpdf->lastoptionaltag = ''; - $this->startRowGroup(); unset($this->cssManager->tablecascadeCSS[$this->cssManager->tbCSSlvl]); $this->cssManager->tbCSSlvl--; } diff --git a/src/Tag/TFoot.php b/src/Tag/TFoot.php index f36bb2efb..d3bd8e80a 100644 --- a/src/Tag/TFoot.php +++ b/src/Tag/TFoot.php @@ -10,7 +10,6 @@ class TFoot extends Tag public function open($attr, &$ahtml, &$ihtml) { $this->mpdf->lastoptionaltag = 'TFOOT'; // Save current HTML specified optional endtag - $this->startRowGroup(); $this->cssManager->tbCSSlvl++; $this->mpdf->tabletfoot = 1; $this->mpdf->tablethead = 0; @@ -46,7 +45,6 @@ public function open($attr, &$ahtml, &$ihtml) public function close(&$ahtml, &$ihtml) { $this->mpdf->lastoptionaltag = ''; - $this->startRowGroup(); unset($this->cssManager->tablecascadeCSS[$this->cssManager->tbCSSlvl]); $this->cssManager->tbCSSlvl--; $this->mpdf->tabletfoot = 0; diff --git a/src/Tag/THead.php b/src/Tag/THead.php index 88bfba15f..acd8015ae 100644 --- a/src/Tag/THead.php +++ b/src/Tag/THead.php @@ -8,7 +8,6 @@ class THead extends Tag public function open($attr, &$ahtml, &$ihtml) { $this->mpdf->lastoptionaltag = 'THEAD'; // Save current HTML specified optional endtag - $this->startRowGroup(); $this->cssManager->tbCSSlvl++; $this->mpdf->tablethead = 1; $this->mpdf->tabletfoot = 0; @@ -44,7 +43,6 @@ public function open($attr, &$ahtml, &$ihtml) public function close(&$ahtml, &$ihtml) { $this->mpdf->lastoptionaltag = ''; - $this->startRowGroup(); unset($this->cssManager->tablecascadeCSS[$this->cssManager->tbCSSlvl]); $this->cssManager->tbCSSlvl--; $this->mpdf->tablethead = 0; diff --git a/src/Tag/Tag.php b/src/Tag/Tag.php index 7f207db27..5f3040eeb 100644 --- a/src/Tag/Tag.php +++ b/src/Tag/Tag.php @@ -233,19 +233,6 @@ protected function formFieldStyle(array $properties) return $style; } - /** - * Start a row group at the next row of the current table, so tr:nth-child counts from it. A thead, tbody or tfoot - * starts one when it opens, and the rows written straight into the table after it closes make another. - */ - protected function startRowGroup() - { - if (!$this->mpdf->tableLevel) { - return; - } - - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['rowgroupstart'] = $this->mpdf->row + 1; - } - abstract public function open($attr, &$ahtml, &$ihtml); abstract public function close(&$ahtml, &$ihtml); diff --git a/src/TracksOpenElements.php b/src/TracksOpenElements.php index 9e0e0998b..12641fbe6 100644 --- a/src/TracksOpenElements.php +++ b/src/TracksOpenElements.php @@ -43,14 +43,23 @@ trait TracksOpenElements private $styledElement; /** - * @var array[] For each start tag that ends an open element with no end tag of its own: the tags it ends the nearest - * of, and the tags of the elements the search for one stops at + * @var array[] For each start tag that ends an open element with no end tag of its own, when + * allow_html_optional_endtags is on: the tags it ends the nearest of, and the tags of the elements the search for + * one stops at */ private static $impliedEndTags = [ 'LI' => [['LI'], ['UL', 'OL', 'CAPTION', 'TD', 'TH', 'TABLE']], 'DT' => [['DT', 'DD'], ['DL', 'CAPTION', 'TD', 'TH', 'TABLE']], 'DD' => [['DT', 'DD'], ['DL', 'CAPTION', 'TD', 'TH', 'TABLE']], 'OPTION' => [['OPTION'], ['SELECT']], + ]; + + /** + * @var array[] As $impliedEndTags, for the start tags that end an open cell, row or row group whatever + * allow_html_optional_endtags says: mPDF lays each cell, row and row group out after the one before it, never + * inside it + */ + private static $tableImpliedEndTags = [ 'TD' => [['TD', 'TH'], ['TR', 'TABLE']], 'TH' => [['TD', 'TH'], ['TR', 'TABLE']], 'TR' => [['TR'], ['THEAD', 'TBODY', 'TFOOT', 'TABLE']], @@ -59,6 +68,19 @@ trait TracksOpenElements 'TFOOT' => [['THEAD', 'TBODY', 'TFOOT'], ['TABLE']], ]; + /** + * @var array[] The elements a browser keeps in each part of a table, by tag. Any other element written straight + * into one, such as mPDF's or between two cells, is moved out in front of the table, so it + * is not counted among the part's children. It is still opened inside the part, as mPDF reads it there + */ + private static $tableChildren = [ + 'TABLE' => ['CAPTION' => true, 'THEAD' => true, 'TBODY' => true, 'TFOOT' => true], + 'THEAD' => ['TR' => true], + 'TBODY' => ['TR' => true], + 'TFOOT' => ['TR' => true], + 'TR' => ['TD' => true, 'TH' => true], + ]; + /** @var array The tags mPDF wraps substituted characters in, which are not the document's elements */ private static $substitutionTags = ['TTA' => true, 'TTS' => true, 'TTZ' => true]; @@ -136,6 +158,27 @@ public function getStyledElementPath() return $path; } + /** + * The position of the element whose CSS is being merged among its element siblings: the nthChild of the last frame + * getStyledElementPath() gives, found without making that path. The legacy tr, td and th:nth-child rules read it + * + * @return int|null From 1. Null when no element of the document is being styled + */ + public function getStyledElementNthChild() + { + if ($this->styledElement === null) { + return null; + } + + $path = $this->styledElement['path']; + $parent = $path[count($path) - 1]; + if ($this->styledElement['tag'] === null) { + return $parent['nthChild']; + } + + return self::impliesTbody($this->styledElement['tag'], $parent) ? 1 : count($parent['children']) + 1; + } + /** * Notes that the element whose CSS is being merged opens a level of the descendant rules the legacy parser * stores, as a block, a table and a table part do. CssMerger calls it when it lifts those rules at the element. @@ -342,7 +385,8 @@ private function closeElementsDownTo($depth) /** * Records a closed element among its parent's children, which is what sibling selectors and the nth counts of * later siblings read. The parent is the frame now at the top of the stack. A span mPDF wraps a run of another - * script in is left out, as it is not the document's + * script in is left out, as it is not the document's, and so is an element a browser moves out of the table part + * it is written in * * @param array $frame The closed element's frame */ @@ -353,6 +397,11 @@ private function recordClosedElement(array $frame) } $parent = count($this->openElements) - 1; + $parentTag = $this->openElements[$parent]['tag']; + if (isset(self::$tableChildren[$parentTag]) && !isset(self::$tableChildren[$parentTag][$frame['tag']])) { + return; + } + $this->openElements[$parent]['children'][] = [ 'tag' => $frame['tag'], 'id' => $frame['id'], @@ -423,7 +472,8 @@ private function closeElementsEndedBy($tag, $floor) /** * Closes the elements whose end tag HTML lets be left out before this start tag, as Tag::OpenTag() does for the - * blocks it lays out. WriteHTML() calls it for each start tag, before handling it + * blocks it lays out. With allow_html_optional_endtags off, only a cell, row or row group is closed, as mPDF's + * tables never nest them. WriteHTML() calls it for each start tag, before handling it * * @param string $tag The start tag's name, uppercased * @param int $floor How many frames at the foot of the stack are not for the HTML being written to close: the @@ -431,6 +481,10 @@ private function closeElementsEndedBy($tag, $floor) */ private function closeElementsImpliedBy($tag, $floor) { + if (isset(self::$tableImpliedEndTags[$tag])) { + $this->closeNearestElement(self::$tableImpliedEndTags[$tag][0], self::$tableImpliedEndTags[$tag][1], $floor); + } + if (!$this->allow_html_optional_endtags) { return; } diff --git a/tests/Mpdf/Css/CssMergerTest.php b/tests/Mpdf/Css/CssMergerTest.php index 50d0e0c63..9047d32b9 100644 --- a/tests/Mpdf/Css/CssMergerTest.php +++ b/tests/Mpdf/Css/CssMergerTest.php @@ -227,13 +227,30 @@ public function testMergeFullCSS_WithTagAndLangSelector() $this->assertEquals('underline', $t['text-decoration']); } + /** + * Makes the element being styled a row opened after $before rows in its tbody, as WriteHTML() does while the row's + * start tag is read + * + * @param int $before + */ + private function styleRowAfter($before) + { + $tbody = [ + 'tag' => 'TBODY', + 'lang' => '', + 'children' => array_fill(0, $before, ['tag' => 'TR']), + 'childTypes' => $before ? ['TR' => $before] : [], + ]; + + $reflection = new \ReflectionClass($this->mpdf); + $property = $reflection->getProperty('styledElement'); + $property->setAccessible(true); + $property->setValue($this->mpdf, ['path' => [$tbody], 'tag' => 'TR', 'attr' => [], 'level' => false]); + } + public function testMergeFullCSS_WithTRTag_NthChildOdd() { - // Set up for TR tag with nth-child selector using reflection for private properties - $this->mpdf->row = 0; // First row (will be evaluated as row 1 after +1) - $this->mpdf->table = []; - $this->mpdf->tableLevel = 0; - $this->mpdf->tbctr = [0]; + $this->styleRowAfter(0); // The merger looks up the nth-child formulas the stylesheet uses $this->cssManager->readCss(''); @@ -250,12 +267,7 @@ public function testMergeFullCSS_WithTRTag_NthChildOdd() public function testMergeFullCSS_WithTRTag_NthChildEven() { - - // Set up for TR tag with nth-child selector, row 2 (even) - $this->mpdf->row = 1; // Second row (will be evaluated as row 2 after +1) - $this->mpdf->table = []; - $this->mpdf->tableLevel = 0; - $this->mpdf->tbctr = [0]; + $this->styleRowAfter(1); // The merger looks up the nth-child formulas the stylesheet uses $this->cssManager->readCss(''); @@ -272,11 +284,7 @@ public function testMergeFullCSS_WithTRTag_NthChildEven() public function testMergeFullCSS_WithTRTag_NthChild2nPlus1() { - // Set up for TR tag with nth-child selector 2n+1 - $this->mpdf->row = 2; // Third row (will be evaluated as row 3 after +1) - $this->mpdf->table = []; - $this->mpdf->tableLevel = 0; - $this->mpdf->tbctr = [0]; + $this->styleRowAfter(2); // The merger looks up the nth-child formulas the stylesheet uses $this->cssManager->readCss(''); diff --git a/tests/Mpdf/NthChildSelectorTest.php b/tests/Mpdf/NthChildSelectorTest.php index f7c123342..9e66454e8 100644 --- a/tests/Mpdf/NthChildSelectorTest.php +++ b/tests/Mpdf/NthChildSelectorTest.php @@ -11,6 +11,7 @@ class NthChildSelectorTest extends TestCase { + use DrawnStyles; use PageStreams; const FILL = '0.000 1.000 0.000 rg'; @@ -169,6 +170,37 @@ public function cellRules() '
a
ijX
Y
', ['X', 'Y'], ], + 'header cells count among the cells' => [ + 'td:nth-child(2), th:nth-child(3)', + '
hXYd
', + ['X', 'Y'], + ], + 'no td is the first cell of a row that starts with a th' => [ + 'td:nth-child(1)', + '
ha
Xb
', + ['X'], + ], + 'no th is the first cell of a row that starts with a td' => [ + 'th:first-child', + '
ab
Xc
', + ['X'], + ], + 'cells whose end tags are left out' => [ + 'td:nth-child(2)', + '
aXb
cY
', + ['X', 'Y'], + ], + "mPDF's own tags written between the cells" => [ + 'td:nth-child(2)', + '' + . '
aXb
', + ['X'], + ], + "mPDF's own tag written before the first cell" => [ + 'td:first-child', + '
Xa
', + ['X'], + ], ]; } @@ -241,6 +273,26 @@ public function rowRules() . 'H2' . $body . '', ['I2', 'H2', 'B2'], ], + 'rows written straight into the table' => [ + 'tr:nth-child(2)', + '
A1
A2
A3
', + ['A2'], + ], + 'no third row in a table of two' => [ + 'tr:nth-child(3)', + '
A1
A2
', + [], + ], + "mPDF's own tag written between the rows" => [ + 'tr:nth-child(2)', + '
A1
A2
A3
', + ['A2'], + ], + 'each table counts its own rows' => [ + 'tr:nth-child(2)', + '
A1
A2
B1
B2
', + ['A2', 'B2'], + ], ]; } @@ -267,4 +319,109 @@ public function testARepeatedHeaderRowKeepsItsCount() } } + /** + * A row opened without the end tag of the one before is the next row, and is shaded as it is when the end tags are + * written + */ + public function testARowWithNoEndTagBeforeIt() + { + $css = ''; + $closed = $this->pages($this->render($css . '
A1
B1B2
C1C2C3
')); + $open = $this->pages($this->render($css . '
A1
B1B2
C1C2C3
')); + + $this->assertSame(3, substr_count($closed[0], self::FILL), 'The second row is shaded across the three columns'); + $this->assertSame($closed, $open); + } + + /** + * The rows of a table that runs onto further pages are counted as they are written, not as they fall on a page + */ + public function testARowOnALaterPageKeepsItsCount() + { + $rows = ''; + for ($row = 1; $row <= 70; $row++) { + $rows .= 'Row ' . $row . ''; + } + + $red = $this->redText($this->drawDocument('' . $rows . '
')); + + $this->assertSame(['Row 20', 'Row 40', 'Row 60'], $red); + } + + /** + * A table counts its rows and cells the same wherever it is written, and the table after it counts its own + * + * @dataProvider contexts + * + * @param string $before What comes before the table + * @param string $after What comes after the table, closing what $before opens + * @param int $pages How many pages the document takes: a page-break-inside: avoid block that does not fit is put + * back and laid out again on the next page + */ + public function testATableCountsItsRowsWhereverItIsWritten($before, $after, $pages) + { + $table = '
A1A2
B1B2
C1C2
'; + + $mpdf = $this->drawDocument( + '' + . $before . $table . $after + . '
Y1
Z1Z2
' + ); + + $red = $this->redText($mpdf); + sort($red); + $this->assertSame(['B1', 'Z1'], $red); + $this->assertCount($pages, $mpdf->pages); + } + + /** + * Markup around a table, before and after it + * + * @return array[] + */ + public function contexts() + { + return [ + 'the flow' => ['', '', 1], + 'a page header' => ['', '', 1], + 'a page footer' => ['', '', 1], + 'an absolutely positioned block' => ['
', '
', 1], + 'a fixed block' => ['
', '
', 1], + 'a page-break-inside: avoid block put back and laid out again' => [ + $this->filler(26) . '
' . str_repeat('

Kept

', 3), + '
', + 2, + ], + 'a cell of another table' => ['
', '
', 1], + 'a list item' => ['
  • ', '
', 1], + 'columns' => ['', '', 1], + ]; + } + + /** + * mPDF lays out a cell or row opened without the end tag of the one before as the next one, even with + * allow_html_optional_endtags off, and the rules count it so + */ + public function testCellsAndRowsWithNoEndTagWhenOptionalEndTagsAreOff() + { + $red = $this->redText($this->drawDocument( + '
aXb
cY
', + ['allow_html_optional_endtags' => false] + )); + + $this->assertSame(['X', 'Y'], $red); + } + + /** + * The text a document drew in red, in the order it was drawn + * + * @param TextRecordingMpdf $mpdf A document, written + * + * @return string[] + */ + private function redText(TextRecordingMpdf $mpdf) + { + return array_keys($this->keyedByText($mpdf, $mpdf->drawnColours), self::RED, true); + } + } diff --git a/tests/Mpdf/OpenElementStackTest.php b/tests/Mpdf/OpenElementStackTest.php index 2a808acec..c811d00e6 100644 --- a/tests/Mpdf/OpenElementStackTest.php +++ b/tests/Mpdf/OpenElementStackTest.php @@ -66,6 +66,39 @@ public function testTableEndTagsLeftOutAreImplied() $this->assertSame('', $this->path($mpdf->getOpenElements())); } + /** + * mPDF lays out a cell, row or row group opened without the end tag of the one before as the next one with + * allow_html_optional_endtags off too, and the stack closes the one before as it does with the option on. A + * paragraph is still opened inside the one before + */ + public function testTableEndTagsLeftOutAreImpliedWhenOptionalEndTagsAreOff() + { + $mpdf = $this->mpdfRecording(['allow_html_optional_endtags' => false]); + $mpdf->WriteHTML('
head
a

b

c

d
', HTMLParserMode::DEFAULT_MODE, true, false); + + $this->assertSame('TABLE:1/1 > THEAD:1/1 > TR:1/1 > TH:1/1', $this->pathAt($mpdf, 'head')); + $this->assertSame('TABLE:1/1 > TBODY:2/1 > TR:1/1 > TD:2/2 > P:1/1 > P:1/1', $this->pathAt($mpdf, 'c')); + $this->assertSame('TABLE:1/1 > TBODY:2/1 > TR:2/2 > TD:1/1', $this->pathAt($mpdf, 'd')); + } + + /** + * An element a browser moves out of a table, such as mPDF's own tags written between cells or rows, is not counted + * among the cells of the row or the rows of the row group + */ + public function testElementsWrittenStraightIntoATablePartAreNotItsChildren() + { + $mpdf = $this->write('' + . 'span' + . '
ab
c

after

'); + + $this->assertSame('TABLE:1/1 > TBODY:1/1 > TR:1/1 > TD:2/2', $this->pathAt($mpdf, 'b')); + $this->assertSame('TABLE:1/1 > TBODY:1/1 > TR:2/2 > TD:1/1', $this->pathAt($mpdf, 'c')); + $this->assertSame([], $this->childTags($this->frameAt($mpdf, 'b', 1))); + $this->assertSame(['TD'], $this->childTags($this->frameAt($mpdf, 'b', 3))); + $this->assertSame(['TR'], $this->childTags($this->frameAt($mpdf, 'c', 2))); + $this->assertSame('P:2/1', $this->pathAt($mpdf, 'after')); + } + /** * An end tag with no element of its name open is ignored, and so is one inside a table cell for an element * outside the table diff --git a/tests/Mpdf/StructuralSelectorTest.php b/tests/Mpdf/StructuralSelectorTest.php index bcb71bb35..de717a4eb 100644 --- a/tests/Mpdf/StructuralSelectorTest.php +++ b/tests/Mpdf/StructuralSelectorTest.php @@ -212,6 +212,12 @@ public function selectors() '
widesecond cell
', ['wide' => self::BLACK, 'second cell' => self::RED], ], + "mPDF's own tags between cells and rows are not their siblings" => [ + 'td + td { color: #f00; } tr + tr > td:nth-of-type(1) { color: #00f; }', + '' + . '
firstsecond
next row
', + ['first' => self::BLACK, 'second' => self::RED, 'next row' => self::BLUE], + ], 'a row written straight into a table sits in a tbody' => [ 'table > tbody > tr > td { color: #f00; } table > tr > td { color: #00f; }', '
cell
', diff --git a/tests/Mpdf/StyledElementPathTest.php b/tests/Mpdf/StyledElementPathTest.php index 7b41e2dd0..f9a6e2903 100644 --- a/tests/Mpdf/StyledElementPathTest.php +++ b/tests/Mpdf/StyledElementPathTest.php @@ -28,6 +28,26 @@ public function testGivesThePathToTheElementBeingStyled($html, array $expected) $this->assertSame($expected, $mpdf->styledPaths); } + /** + * The position of the element being styled, which the legacy tr, td and th:nth-child rules read without making the + * path, is the one its frame on the path has + * + * @dataProvider documents + * + * @param string $html + */ + public function testGivesThePositionTheElementHasOnItsPath($html) + { + $mpdf = new StyledPathRecordingMpdf(['mode' => 'c']); + $mpdf->WriteHTML($html . '' + . '
ab
c
d
'); + + $this->assertGreaterThan(5, count($mpdf->nthChildren)); + foreach ($mpdf->nthChildren as $nthChild) { + $this->assertSame($nthChild[0], $nthChild[1]); + } + } + /** * A document with rules the matcher reads, and the paths asked for while it is written * diff --git a/tests/Mpdf/StyledPathRecordingMpdf.php b/tests/Mpdf/StyledPathRecordingMpdf.php index bd22df99d..06a543213 100644 --- a/tests/Mpdf/StyledPathRecordingMpdf.php +++ b/tests/Mpdf/StyledPathRecordingMpdf.php @@ -12,6 +12,12 @@ class StyledPathRecordingMpdf extends Mpdf /** @var array[] Each time the path was asked for: the tag of every frame on it, joined by >, or null for none */ public $styledPaths = []; + /** + * @var array[] Each time the path was asked for while an element was being styled: the nthChild of the path's last + * frame, and what getStyledElementNthChild() gave then + */ + public $nthChildren = []; + /** * Records the path before handing it back * @@ -21,6 +27,9 @@ public function getStyledElementPath() { $path = parent::getStyledElementPath(); $this->styledPaths[] = $path === null ? null : implode('>', array_column($path, 'tag')); + if ($path !== null) { + $this->nthChildren[] = [$path[count($path) - 1]['nthChild'], $this->getStyledElementNthChild()]; + } return $path; } diff --git a/tests/Snapshots/NthChildTableContextsSnapshotTest.php b/tests/Snapshots/NthChildTableContextsSnapshotTest.php new file mode 100644 index 000000000..8542c7372 --- /dev/null +++ b/tests/Snapshots/NthChildTableContextsSnapshotTest.php @@ -0,0 +1,126 @@ + + + + + + + + +
Header row 1
Header row 2, green
Header row 3
+
+ + +

tr, td and th:nth-child wherever the table is written

+ +

The page header's table is written apart from the flow, and counts its own rows: its second row is green on both pages.

+ +

td:nth-child(2) and th:nth-child(2) are green. A th counts among the cells of its row as a td does: the second cell of each row is green, whichever it is.

+ + + +
th 1td 2th 3
td 1th 2td 3
+ +

td:first-child is purple and td:nth-child(3) blue. mPDF's own tags written between the cells, such as a bookmark before the first cell, are not cells: A and D are purple, C and F blue.

+ + + +
ABC
DEF
+ +

tr:nth-child(even) is yellow. The rows are written with no tbody and no end tags: rows 2 and 4 are yellow.

+ +
Row 1Row 1 +
Row 2Row 2 +
Row 3Row 3 +
Row 4Row 4 +
+ +

Inside the outer table td:nth-child(3) is red, and the cells of tr:nth-child(2) are bold. The nested table counts its own rows and cells, and the outer table counts on after it: Outer 1c and Outer 2c are red, and none of the nested table's two columns is. Inner C, Inner D and the outer table's second row are bold.

+ + + + + + + +
Outer 1a
Inner AInner B
Inner CInner D
Outer 1c
Outer 2aOuter 2bOuter 2c
+ +

An absolutely positioned block at the foot of the page holds a table whose td:nth-child(2) is purple: Second is purple.

+
+
FirstSecondThird
+
+ + Filler to bring the kept block to the foot of the page.

', 8); ?> + +

A page-break-inside: avoid block is laid out, found not to fit, and laid out again on the next page. In its table tr:nth-child(3) is blue: only Kept row 3.

+
+

The kept block.

+ + + + + + + +
Kept row 1
Kept row 2
Kept row 3, blue
Kept row 4
Kept row 5
Kept row 6
+
+ mpdf = $this->createMpdf(['margin_top' => 36]); + + $this->mpdf->WriteHTML($html); + } + +} diff --git a/tests/Snapshots/NthChildTableStylesheetSnapshotTest.php b/tests/Snapshots/NthChildTableStylesheetSnapshotTest.php new file mode 100644 index 000000000..229fdc9c5 --- /dev/null +++ b/tests/Snapshots/NthChildTableStylesheetSnapshotTest.php @@ -0,0 +1,141 @@ +' . $row . 'Entry ' . $row . '' . ($row * 7) . '.00'; + } + + ob_start(); + ?> + + +

tr, td and th:nth-child in real stylesheets

+ +

A framework's striped table with row headers

+

The header cells are dark, the even ones a lighter grey. The first, third and fifth body rows are shaded grey, row headers included. The text of the third and sixth rows' cells is blue. The warning cell in row 5 is yellow: its rule weighs as much as the striping and comes after it. td:nth-child(n+3) right-aligns the amounts and the statuses, as the row header counts as the first cell.

+ + + + + + + + + + + + +
#NameAmountStatus
1Alpha10.00Open
2Bravo20.00Open
3Charlie, blue30.00Closed
4Delta40.00Open
5Echo50.00Warning, yellow
6Foxtrot, blue60.00Closed
+ +

An invoice

+

The header is dark with the columns after the first right-aligned. The second and fourth item rows are shaded, and the item names bold. In the totals, each amount is the second cell of its row, after a label spanning three columns, and is bold and green. A heavy rule sits above the first total.

+ + + + + + + + + + + + + + + +
ItemQuantityPriceAmount
Consulting4120.00480.00
Design295.00190.00
Hosting128.50102.00
Support160.0060.00
Subtotal832.00
Tax83.20
Total915.20
+ +

Competing rules

+

td.muted weighs as much as td:nth-child(2) and comes after it, so every muted cell is grey, and only the second cell that is not muted is green. The second row is shaded green, but its first cell is red: the rule naming the table's id outweighs the row's.

+ + + + + + +
GreyGreyBlack
Red backgroundGreyGrey
BlackGreenGrey
+ +

A long striped table with its header repeated

+

The rows run onto the next page, where the header is repeated. The odd rows are shaded and every third row's cells are blue on both pages, counted from the first body row whatever page it falls on.

+ + + + + + + +
#EntryAmount
+ mpdf = $this->createMpdf(); + + $this->mpdf->WriteHTML($html); + } + +} diff --git a/tests/data/snapshots/nth-child-table-contexts.pdf b/tests/data/snapshots/nth-child-table-contexts.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2211644d97c9d1756975a009c4b203040b57b3a5 GIT binary patch literal 44889 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 b_ieU0IvD_+{+erSY%J`o2;}6V@?!rFRs4(m literal 0 HcmV?d00001 diff --git a/tests/data/snapshots/nth-child-table-stylesheet.pdf b/tests/data/snapshots/nth-child-table-stylesheet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..407a4c77ab900c372beebef65905c8a7af198805 GIT binary patch literal 67115 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