diff options
Diffstat (limited to 'app')
| -rw-r--r-- | app/CommonMark/CensusTableExtension.php | 66 | ||||
| -rw-r--r-- | app/CommonMark/CensusTableParser.php | 74 | ||||
| -rw-r--r-- | app/CommonMark/XrefExtension.php | 22 | ||||
| -rw-r--r-- | app/CommonMark/XrefParser.php | 4 | ||||
| -rw-r--r-- | app/Filter.php | 32 |
5 files changed, 82 insertions, 116 deletions
diff --git a/app/CommonMark/CensusTableExtension.php b/app/CommonMark/CensusTableExtension.php index 62e63a9e0e..03775aa258 100644 --- a/app/CommonMark/CensusTableExtension.php +++ b/app/CommonMark/CensusTableExtension.php @@ -17,60 +17,32 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\CommonMark; -use League\CommonMark\Block\Parser\BlockParserInterface; -use League\CommonMark\Block\Renderer\BlockRendererInterface; -use League\CommonMark\Extension\Extension; -use Webuni\CommonMark\TableExtension\Table; -use Webuni\CommonMark\TableExtension\TableCell; -use Webuni\CommonMark\TableExtension\TableCellRenderer; -use Webuni\CommonMark\TableExtension\TableRenderer; -use Webuni\CommonMark\TableExtension\TableRow; -use Webuni\CommonMark\TableExtension\TableRowRenderer; -use Webuni\CommonMark\TableExtension\TableRows; -use Webuni\CommonMark\TableExtension\TableRowsRenderer; +use League\CommonMark\ConfigurableEnvironmentInterface; +use League\CommonMark\Ext\Table\Table; +use League\CommonMark\Ext\Table\TableCell; +use League\CommonMark\Ext\Table\TableCellRenderer; +use League\CommonMark\Ext\Table\TableRenderer; +use League\CommonMark\Ext\Table\TableRow; +use League\CommonMark\Ext\Table\TableRowRenderer; +use League\CommonMark\Ext\Table\TableSection; +use League\CommonMark\Ext\Table\TableSectionRenderer; +use League\CommonMark\Extension\ExtensionInterface; /** * Convert webtrees 1.x census-assistant markup into tables. * Note that webtrees 2.0 generates markdown tables directly. * - * Based on the table parser from webuni/commonmark-table-extension. + * Based on the table parser from league/commonmark-ext-table. */ -class CensusTableExtension extends Extension +class CensusTableExtension implements ExtensionInterface { - /** - * Returns a list of block parsers to add to the existing list - * - * @return BlockParserInterface[] - */ - public function getBlockParsers(): array + public function register(ConfigurableEnvironmentInterface $environment): void { - return [ - new CensusTableParser(), - ]; - } - - /** - * Returns a list of block renderers to add to the existing list - * - * The list keys are the block class names which the corresponding value (renderer) will handle. - * - * @return BlockRendererInterface[] - */ - public function getBlockRenderers(): array - { - return [ - Table::class => new TableRenderer(), - TableRows::class => new TableRowsRenderer(), - TableRow::class => new TableRowRenderer(), - TableCell::class => new TableCellRenderer(), - ]; - } - - /** - * @return string - */ - public function getName(): string - { - return 'censustabletable'; + $environment + ->addBlockParser(new CensusTableParser()) + ->addBlockRenderer(Table::class, new TableRenderer()) + ->addBlockRenderer(TableSection::class, new TableSectionRenderer()) + ->addBlockRenderer(TableRow::class, new TableRowRenderer()) + ->addBlockRenderer(TableCell::class, new TableCellRenderer()); } } diff --git a/app/CommonMark/CensusTableParser.php b/app/CommonMark/CensusTableParser.php index 205b46b18c..6fa453998b 100644 --- a/app/CommonMark/CensusTableParser.php +++ b/app/CommonMark/CensusTableParser.php @@ -18,12 +18,16 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\CommonMark; use League\CommonMark\Block\Element\Paragraph; -use League\CommonMark\Block\Parser\AbstractBlockParser; +use League\CommonMark\Block\Parser\BlockParserInterface; use League\CommonMark\ContextInterface; use League\CommonMark\Cursor; -use Webuni\CommonMark\TableExtension\Table; -use Webuni\CommonMark\TableExtension\TableCell; -use Webuni\CommonMark\TableExtension\TableRow; +use League\CommonMark\Ext\Table\Table; +use League\CommonMark\Ext\Table\TableCell; +use League\CommonMark\Ext\Table\TableRow; +use function array_shift; +use function explode; +use function strpos; +use function substr; /** * Convert webtrees 1.x census-assistant markup into tables. @@ -31,16 +35,21 @@ use Webuni\CommonMark\TableExtension\TableRow; * * Based on the table parser from webuni/commonmark-table-extension. */ -class CensusTableParser extends AbstractBlockParser +class CensusTableParser implements BlockParserInterface { - private const REGEX_CENSUS_TABLE_HEADER = '/^\.b\.[^.|]+(?:\|\.b\.[^.|]+)*$/'; + // Keywords used to create the webtrees 1.x census-assistant notes. + private const CA_PREFIX = '.start_formatted_area.'; + private const CA_SUFFIX = '.end_formatted_area.'; + private const TH_PREFIX = '.b.'; /** - * Parse a paragraph of text with the following stucture: + * Parse a paragraph of text with the following structure: * + * .start_formatted_area. * .b.HEADING1|.b.HEADING2|.b.HEADING3 * COL1|COL2|COL3 * COL1|COL2|COL3 + * .end_formatted_area. * * @param ContextInterface $context * @param Cursor $cursor @@ -51,32 +60,38 @@ class CensusTableParser extends AbstractBlockParser { $container = $context->getContainer(); - // Replace paragraphs with tables if (!$container instanceof Paragraph) { return false; } $lines = $container->getStrings(); + $first = array_shift($lines); - $first_line = array_pop($lines); + if ($first !== self::CA_PREFIX) { + return false; + } - if (!preg_match(self::REGEX_CENSUS_TABLE_HEADER, $first_line)) { + if ($cursor->getLine() !== self::CA_SUFFIX) { return false; } - $head = $this->parseRow($first_line, TableCell::TYPE_HEAD); + // We don't need to parse/markup any of the table's contents. + $table = new Table(static function (): bool { + return false; + }); - $table = new Table(function (Cursor $cursor) use (&$table): bool { - $row = $this->parseRow($cursor->getLine(), TableCell::TYPE_BODY); - if ($row === null) { - return false; - } - $table->getBody()->appendChild($row); + // First line is the table header. + $line = array_shift($lines); + $row = $this->parseRow($line, TableCell::TYPE_HEAD); + $table->getHead()->appendChild($row); - return true; - }); + // Subsequent lines are the table body. + while (!empty($lines)) { + $line = array_shift($lines); + $row = $this->parseRow($line, TableCell::TYPE_BODY); + $table->getHead()->appendChild($row); + } - $table->getHead()->appendChild($head); $context->replaceContainerBlock($table); return true; @@ -86,20 +101,19 @@ class CensusTableParser extends AbstractBlockParser * @param string $line * @param string $type * - * @return TableRow|null + * @return TableRow */ - private function parseRow($line, $type): ?TableRow + private function parseRow(string $line, string $type): TableRow { - if (strpos($line, '|') === false) { - return null; - } + $cells = explode('|', $line); + $row = new TableRow(); - $row = new TableRow(); - foreach (explode('|', $line) as $cell) { - // Strip leading ".b." from <th> cells - if ($type === TableCell::TYPE_HEAD && substr_compare($cell, '.b.', 0)) { - $cell = substr($cell, 3); + foreach ($cells as $cell) { + if (strpos($cell, self::TH_PREFIX) === 0) { + $cell = substr($cell, strlen(self::TH_PREFIX)); + $type = TableCell::TYPE_HEAD; } + $row->appendChild(new TableCell($cell, $type, null)); } diff --git a/app/CommonMark/XrefExtension.php b/app/CommonMark/XrefExtension.php index 2fe79f3e53..1e7ced6803 100644 --- a/app/CommonMark/XrefExtension.php +++ b/app/CommonMark/XrefExtension.php @@ -18,13 +18,15 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\CommonMark; use Fisharebest\Webtrees\Tree; +use League\CommonMark\ConfigurableEnvironmentInterface; use League\CommonMark\Extension\Extension; +use League\CommonMark\Extension\ExtensionInterface; use League\CommonMark\Inline\Parser\InlineParserInterface; /** * Convert XREFs within markdown text to links */ -class XrefExtension extends Extension +class XrefExtension implements ExtensionInterface { /** @var Tree - match XREFs in this tree */ private $tree; @@ -39,21 +41,9 @@ class XrefExtension extends Extension $this->tree = $tree; } - /** - * @return InlineParserInterface[] - */ - public function getInlineParsers(): array - { - return [ - new XrefParser($this->tree), - ]; - } - - /** - * @return string - */ - public function getName(): string + public function register(ConfigurableEnvironmentInterface $environment): void { - return 'xref'; + $environment + ->addInlineParser(new XrefParser($this->tree)); } } diff --git a/app/CommonMark/XrefParser.php b/app/CommonMark/XrefParser.php index e0c22ecc15..e3b8967c81 100644 --- a/app/CommonMark/XrefParser.php +++ b/app/CommonMark/XrefParser.php @@ -21,13 +21,13 @@ use Fisharebest\Webtrees\Gedcom; use Fisharebest\Webtrees\GedcomRecord; use Fisharebest\Webtrees\Tree; use League\CommonMark\Inline\Element\Link; -use League\CommonMark\Inline\Parser\AbstractInlineParser; +use League\CommonMark\Inline\Parser\InlineParserInterface; use League\CommonMark\InlineParserContext; /** * Convert XREFs within markdown text to links */ -class XrefParser extends AbstractInlineParser +class XrefParser implements InlineParserInterface { /** @var Tree - match XREFs in this tree */ private $tree; diff --git a/app/Filter.php b/app/Filter.php index 38862d3279..d84403ecd0 100644 --- a/app/Filter.php +++ b/app/Filter.php @@ -26,6 +26,7 @@ use League\CommonMark\Block\Renderer\ParagraphRenderer; use League\CommonMark\Converter; use League\CommonMark\DocParser; use League\CommonMark\Environment; +use League\CommonMark\Ext\Table\TableExtension; use League\CommonMark\HtmlRenderer; use League\CommonMark\Inline\Element\Link; use League\CommonMark\Inline\Element\Text; @@ -33,7 +34,6 @@ use League\CommonMark\Inline\Parser\AutolinkParser; use League\CommonMark\Inline\Renderer\LinkRenderer; use League\CommonMark\Inline\Renderer\TextRenderer; use Throwable; -use Webuni\CommonMark\TableExtension\TableExtension; /** * Filter input and escape output. @@ -95,19 +95,13 @@ class Filter ->addBlockRenderer(Paragraph::class, new ParagraphRenderer()) ->addInlineRenderer(Text::class, new TextRenderer()) ->addInlineRenderer(Link::class, new LinkRenderer()) - ->addInlineParser(new AutolinkParser()); - - $environment->addExtension(new CensusTableExtension()); - $environment->addExtension(new XrefExtension($tree)); + ->addInlineParser(new AutolinkParser()) + ->addExtension(new CensusTableExtension()) + ->addExtension(new XrefExtension($tree)); $converter = new Converter(new DocParser($environment), new HtmlRenderer($environment)); - try { - return $converter->convertToHtml($text); - } catch (Throwable $ex) { - // See issue #1824 - return $text; - } + return $converter->convertToHtml($text); } /** @@ -121,18 +115,14 @@ class Filter public static function markdown(string $text, Tree $tree): string { $environment = Environment::createCommonMarkEnvironment(); - $environment->mergeConfig(['html_input' => 'escape']); - $environment->addExtension(new TableExtension()); - $environment->addExtension(new CensusTableExtension()); - $environment->addExtension(new XrefExtension($tree)); + $environment->mergeConfig(['html_input' => Environment::HTML_INPUT_ESCAPE]); + $environment + ->addExtension(new TableExtension()) + ->addExtension(new CensusTableExtension()) + ->addExtension(new XrefExtension($tree)); $converter = new Converter(new DocParser($environment), new HtmlRenderer($environment)); - try { - return $converter->convertToHtml($text); - } catch (Throwable $ex) { - // See issue #1824 - return $text; - } + return $converter->convertToHtml($text); } } |
