. */ declare(strict_types=1); namespace Fisharebest\Webtrees\CommonMark; use League\CommonMark\Extension\Table\Table; use League\CommonMark\Extension\Table\TableCell; use League\CommonMark\Extension\Table\TableRow; use League\CommonMark\Extension\Table\TableSection; use League\CommonMark\Node\Block\AbstractBlock; use League\CommonMark\Node\Inline\Text; use League\CommonMark\Parser\Block\AbstractBlockContinueParser; use League\CommonMark\Parser\Block\BlockContinue; use League\CommonMark\Parser\Block\BlockContinueParserInterface; use League\CommonMark\Parser\Cursor; use function array_map; use function explode; use function str_starts_with; use function strlen; use function substr; /** * Convert webtrees 1.x census-assistant markup into tables. * Note that webtrees 2.0 generates markdown tables directly. */ class CensusTableContinueParser extends AbstractBlockContinueParser { private Table $table; private TableSection $thead; private TableSection $tbody; /** * Constructor */ public function __construct() { $this->table = new Table(); $this->thead = new TableSection(TableSection::TYPE_HEAD); $this->tbody = new TableSection(TableSection::TYPE_BODY); $this->table->appendChild($this->thead); $this->table->appendChild($this->tbody); } /** * @param Cursor $cursor * @param BlockContinueParserInterface $activeBlockParser * * @return BlockContinue|null */ public function tryContinue(Cursor $cursor, BlockContinueParserInterface $activeBlockParser): ?BlockContinue { $line = $cursor->getLine(); if ($line === CensusTableExtension::CA_SUFFIX) { return BlockContinue::finished(); } // Blank line before the suffix is an error. if ($line === '') { return /** @scrutinizer ignore-call (always returns null) */ BlockContinue::none(); } $cells = explode('|', $line); $callback = static function (string $text): string { if (str_starts_with($text, CensusTableExtension::TH_PREFIX)) { return substr($text, strlen(CensusTableExtension::TH_PREFIX)); } return $text; }; $tr = new TableRow(); if (empty($this->thead->children())) { $cells = array_map($callback, $cells); foreach ($cells as $cell) { $table_cell = new TableCell(TableCell::TYPE_HEADER); $table_cell->appendChild(new Text($cell)); $tr->appendChild($table_cell); } $this->thead->appendChild($tr); } else { foreach ($cells as $cell) { $table_cell = new TableCell(TableCell::TYPE_DATA); $table_cell->appendChild(new Text($cell)); $tr->appendChild($table_cell); } $this->tbody->appendChild($tr); } return BlockContinue::at($cursor); } /** * @return Table */ public function getBlock(): AbstractBlock { return $this->table; } }