Skip to content
Closed
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion lib/cli/Table.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
use cli\Shell;
use cli\Streams;
use cli\table\Ascii;
use cli\table\Column;
use cli\table\Renderer;
use cli\table\Tabular;

Expand All @@ -27,6 +28,7 @@ class Table {
protected $_footers = array();
protected $_width = array();
protected $_rows = array();
protected $_alignments = array();

/**
* Initializes the `Table` class.
Expand All @@ -44,7 +46,7 @@ class Table {
* @param array $rows The rows of data for this table. Optional.
* @param array $footers Footers used in this table. Optional.
*/
public function __construct(array $headers = null, array $rows = null, array $footers = null) {
public function __construct(array $headers = null, array $rows = null, array $footers = null, $alignments = []) {
if (!empty($headers)) {
// If all the rows is given in $headers we use the keys from the
// first row for the header values
Expand All @@ -62,6 +64,8 @@ public function __construct(array $headers = null, array $rows = null, array $fo
$this->setRows($rows);
}

$this->setAlignments($alignments);

if (!empty($footers)) {
$this->setFooters($footers);
}
Expand All @@ -79,6 +83,7 @@ public function resetTable()
$this->_width = array();
$this->_rows = array();
$this->_footers = array();
$this->_alignments = array();
return $this;
}

Expand Down Expand Up @@ -137,6 +142,7 @@ public function display() {
*/
public function getDisplayLines() {
$this->_renderer->setWidths($this->_width, $fallback = true);
$this->_renderer->setAlignments($this->_alignments);
$border = $this->_renderer->border();

$out = array();
Expand Down Expand Up @@ -201,6 +207,15 @@ public function setFooters(array $footers) {
$this->_footers = $this->checkRow($footers);
}

/**
* Set the alignments of the table.
*
* @param array $alignments An array of strings containing column alignments.
*/
public function setAlignments(array $alignments) {
$this->_alignments = $alignments;
//TODO: Implement error if alignment is not valid and field is not valid
Comment thread
swissspidy marked this conversation as resolved.
Outdated
}
Comment on lines +216 to +227
Copy link

Copilot AI Nov 2, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The validation on line 222 checks if headers exist before alignments are set, but setAlignments() can be called in the constructor at line 68 before setHeaders() is called at line 64 when the constructor is invoked with an empty headers array and a non-empty alignments array. This will cause the validation to always fail in that case because $this->_headers will be empty. Consider either validating alignments lazily when they're used, or reordering the constructor calls, or skipping validation when headers are empty.

Copilot uses AI. Check for mistakes.

/**
* Add a row to the table.
Expand Down
10 changes: 9 additions & 1 deletion lib/cli/table/Ascii.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class Ascii extends Renderer {
protected $_border = null;
protected $_constraintWidth = null;
protected $_pre_colorized = false;
protected $_headers = null;

/**
* Set the widths of each column in the table.
Expand Down Expand Up @@ -131,6 +132,10 @@ public function border() {
*/
public function row( array $row ) {

if($this->_headers === null) {
Comment thread
swissspidy marked this conversation as resolved.
Outdated
$this->_headers = array_values($row);
}
Comment on lines +135 to +137
Copy link

Copilot AI Nov 2, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The header tracking logic assumes the first row rendered is always the headers, but this may not be reliable if the renderer is reused or if rows are rendered in an unexpected order. Consider passing headers explicitly to the renderer via a dedicated method (e.g., setHeaders()) rather than inferring them from the first row call to row().

Copilot uses AI. Check for mistakes.

$extra_row_count = 0;

if ( count( $row ) > 0 ) {
Expand Down Expand Up @@ -197,7 +202,10 @@ public function row( array $row ) {
}

private function padColumn($content, $column) {
return $this->_characters['padding'] . Colors::pad( $content, $this->_widths[ $column ], $this->isPreColorized( $column ) ) . $this->_characters['padding'];
$column_name = $this->_headers[$column];
Comment thread
swissspidy marked this conversation as resolved.
Outdated
$alignment = array_key_exists($column_name, $this->_alignments) ? $this->_alignments[$column_name] : Column::ALIGN_LEFT;
Comment thread
swissspidy marked this conversation as resolved.
Outdated

return $this->_characters['padding'] . Colors::pad( $content, $this->_widths[ $column ], $this->isPreColorized( $column ), false, $alignment) . $this->_characters['padding'];
}

/**
Expand Down
10 changes: 10 additions & 0 deletions lib/cli/table/Column.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace cli\table;

interface Column {

const ALIGN_RIGHT = STR_PAD_LEFT;
const ALIGN_LEFT = STR_PAD_RIGHT;
const ALIGN_CENTER = STR_PAD_BOTH;
}
13 changes: 12 additions & 1 deletion lib/cli/table/Renderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,20 @@
*/
abstract class Renderer {
protected $_widths = array();
protected $_alignments = array();

public function __construct(array $widths = array()) {
public function __construct(array $widths = array(), array $alignments = array()) {
$this->setWidths($widths);
$this->setAlignments($alignments);
}

/**
* Set the alignments of each column in the table.
*
* @param array $alignments The alignments of the columns.
*/
public function setAlignments(array $alignments) {
$this->_alignments = $alignments;
}

/**
Expand Down