-
Notifications
You must be signed in to change notification settings - Fork 23
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #100 from weaverryan/failing-test-case-table-struc…
…ture Adding support for colspan to tables
- Loading branch information
Showing
37 changed files
with
997 additions
and
214 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace Doctrine\RST\Exception; | ||
|
||
use Exception; | ||
|
||
final class InvalidTableStructure extends Exception | ||
{ | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace Doctrine\RST\Nodes\Table; | ||
|
||
use Doctrine\RST\Nodes\Node; | ||
use LogicException; | ||
use function strlen; | ||
use function trim; | ||
use function utf8_encode; | ||
|
||
final class TableColumn | ||
{ | ||
/** @var string */ | ||
private $content; | ||
|
||
/** @var int */ | ||
private $colSpan; | ||
|
||
/** @var Node|null */ | ||
private $node; | ||
|
||
public function __construct(string $content, int $colSpan) | ||
{ | ||
$this->content = utf8_encode(trim($content)); | ||
$this->colSpan = $colSpan; | ||
} | ||
|
||
public function getContent() : string | ||
{ | ||
// "\" is a special way to make a column "empty", but | ||
// still indicate that you *want* that column | ||
if ($this->content === '\\') { | ||
return ''; | ||
} | ||
|
||
return $this->content; | ||
} | ||
|
||
public function getColSpan() : int | ||
{ | ||
return $this->colSpan; | ||
} | ||
|
||
public function addContent(string $content) : void | ||
{ | ||
$this->content = trim($this->content . utf8_encode($content)); | ||
} | ||
|
||
public function getNode() : Node | ||
{ | ||
if ($this->node === null) { | ||
throw new LogicException('The node is not yet set.'); | ||
} | ||
|
||
return $this->node; | ||
} | ||
|
||
public function setNode(Node $node) : void | ||
{ | ||
$this->node = $node; | ||
} | ||
|
||
public function render() : string | ||
{ | ||
return $this->getNode()->render(); | ||
} | ||
|
||
public function isEmpty() : bool | ||
{ | ||
return strlen($this->content) === 0; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace Doctrine\RST\Nodes\Table; | ||
|
||
use Doctrine\RST\Exception\InvalidTableStructure; | ||
use LogicException; | ||
use function array_map; | ||
use function implode; | ||
use function sprintf; | ||
|
||
final class TableRow | ||
{ | ||
/** @var TableColumn[] */ | ||
private $columns = []; | ||
|
||
public function addColumn(string $content, int $colSpan) : void | ||
{ | ||
$this->columns[] = new TableColumn($content, $colSpan); | ||
} | ||
|
||
/** | ||
* @return TableColumn[] | ||
*/ | ||
public function getColumns() : array | ||
{ | ||
return $this->columns; | ||
} | ||
|
||
public function getColumn(int $index) : ?TableColumn | ||
{ | ||
return $this->columns[$index] ?? null; | ||
} | ||
|
||
public function getFirstColumn() : TableColumn | ||
{ | ||
$column = $this->getColumn(0); | ||
|
||
if ($column === null) { | ||
throw new LogicException('Row has no columns'); | ||
} | ||
|
||
return $column; | ||
} | ||
|
||
/** | ||
* Push the content from the columns of a row onto this row. | ||
* | ||
* Useful when we discover that a row is actually just a continuation | ||
* of this row, and so we want to copy the content to this row's | ||
* columns before removing the row. | ||
* | ||
* @throws InvalidTableStructure | ||
*/ | ||
public function absorbRowContent(TableRow $targetRow) : void | ||
{ | ||
// iterate over each column and combine the content | ||
foreach ($this->getColumns() as $columnIndex => $column) { | ||
$targetColumn = $targetRow->getColumn($columnIndex); | ||
if ($targetColumn === null) { | ||
throw new InvalidTableStructure(sprintf('Malformed table: lines "%s" and "%s" appear to be in the same row, but don\'t share the same number of columns.', $this->toString(), $targetRow->toString())); | ||
} | ||
|
||
$column->addContent("\n" . $targetColumn->getContent()); | ||
} | ||
} | ||
|
||
public function toString() : string | ||
{ | ||
return implode(' | ', array_map(static function (TableColumn $column) { | ||
return $column->getContent(); | ||
}, $this->columns)); | ||
} | ||
} |
Oops, something went wrong.