summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/CommonMark/CensusTableExtension.php66
-rw-r--r--app/CommonMark/CensusTableParser.php74
-rw-r--r--app/CommonMark/XrefExtension.php22
-rw-r--r--app/CommonMark/XrefParser.php4
-rw-r--r--app/Filter.php32
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);
}
}