. */ declare(strict_types=1); namespace Fisharebest\Webtrees\CommonMark; use Fisharebest\Webtrees\Gedcom; use Fisharebest\Webtrees\GedcomRecord; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Tree; use League\CommonMark\Parser\Inline\InlineParserInterface; use League\CommonMark\Parser\Inline\InlineParserMatch; use League\CommonMark\Parser\InlineParserContext; /** * Convert XREFs within markdown text to links */ class XrefParser implements InlineParserInterface { private Tree $tree; /** * @param Tree $tree Match XREFs in this tree */ public function __construct(Tree $tree) { $this->tree = $tree; } /** * We are only interested in text that begins with '@'. * * @return InlineParserMatch */ public function getMatchDefinition(): InlineParserMatch { return InlineParserMatch::regex('@(' . Gedcom::REGEX_XREF . ')@'); } /** * @param InlineParserContext $inlineContext * * @return bool */ public function parse(InlineParserContext $inlineContext): bool { $cursor = $inlineContext->getCursor(); [$xref] = $inlineContext->getSubMatches(); $record = Registry::gedcomRecordFactory()->make($xref, $this->tree); if ($record instanceof GedcomRecord) { $cursor->advanceBy($inlineContext->getFullMatchLength()); $inlineContext->getContainer()->appendChild(new XrefNode($record)); return true; } return false; } }