Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. Table.php

function Table::fillNextRows

fill rows that contains rowspan > 1.

Throws

InvalidArgumentException

1 call to Table::fillNextRows()
Table::buildTableRows in vendor/symfony/console/Helper/Table.php

File

vendor/symfony/console/Helper/Table.php, line 689

Class

Table
Provides helpers to display a table.

Namespace

Symfony\Component\Console\Helper

Code

private function fillNextRows(array $rows, int $line) : array {
    $unmergedRows = [];
    foreach ($rows[$line] as $column => $cell) {
        if (null !== $cell && !$cell instanceof TableCell && !\is_scalar($cell) && !$cell instanceof \Stringable) {
            throw new InvalidArgumentException(\sprintf('A cell must be a TableCell, a scalar or an object implementing "__toString()", "%s" given.', get_debug_type($cell)));
        }
        if ($cell instanceof TableCell && $cell->getRowspan() > 1) {
            $nbLines = $cell->getRowspan() - 1;
            $lines = [
                $cell,
            ];
            if (str_contains($cell, "\n")) {
                $eol = str_contains($cell, "\r\n") ? "\r\n" : "\n";
                $lines = explode($eol, str_replace($eol, '<fg=default;bg=default>' . $eol . '</>', $cell));
                $nbLines = \count($lines) > $nbLines ? substr_count($cell, $eol) : $nbLines;
                $rows[$line][$column] = new TableCell($lines[0], [
                    'colspan' => $cell->getColspan(),
                    'style' => $cell->getStyle(),
                ]);
                unset($lines[0]);
            }
            // create a two dimensional array (rowspan x colspan)
            $unmergedRows = array_replace_recursive(array_fill($line + 1, $nbLines, []), $unmergedRows);
            foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) {
                $value = $lines[$unmergedRowKey - $line] ?? '';
                $unmergedRows[$unmergedRowKey][$column] = new TableCell($value, [
                    'colspan' => $cell->getColspan(),
                    'style' => $cell->getStyle(),
                ]);
                if ($nbLines === $unmergedRowKey - $line) {
                    break;
                }
            }
        }
    }
    foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) {
        // we need to know if $unmergedRow will be merged or inserted into $rows
        if (isset($rows[$unmergedRowKey]) && \is_array($rows[$unmergedRowKey]) && $this->getNumberOfColumns($rows[$unmergedRowKey]) + $this->getNumberOfColumns($unmergedRow) <= $this->numberOfColumns) {
            foreach ($unmergedRow as $cellKey => $cell) {
                // insert cell into row at cellKey position
                array_splice($rows[$unmergedRowKey], $cellKey, 0, [
                    $cell,
                ]);
            }
        }
        else {
            $row = $this->copyRow($rows, $unmergedRowKey - 1);
            foreach ($unmergedRow as $column => $cell) {
                if ($cell) {
                    $row[$column] = $cell;
                }
            }
            array_splice($rows, $unmergedRowKey, 0, [
                $row,
            ]);
        }
    }
    return $rows;
}

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal