diff options
| author | Greg Roach <fisharebest@gmail.com> | 2017-10-21 12:17:11 +0100 |
|---|---|---|
| committer | Greg Roach <fisharebest@gmail.com> | 2017-10-21 12:17:33 +0100 |
| commit | 0a016d046f63b3b1ece7ec913216782c17f0cbad (patch) | |
| tree | 761e6b026702068ce1aee6e7485f0dc6c10632b5 /app/CommonMark/XrefParser.php | |
| parent | 5ead1459215235270a603c7845bd4872644206ed (diff) | |
| download | webtrees-0a016d046f63b3b1ece7ec913216782c17f0cbad.tar.gz webtrees-0a016d046f63b3b1ece7ec913216782c17f0cbad.tar.bz2 webtrees-0a016d046f63b3b1ece7ec913216782c17f0cbad.zip | |
Create Markdown plugin to support census-assistant markup
Diffstat (limited to 'app/CommonMark/XrefParser.php')
| -rw-r--r-- | app/CommonMark/XrefParser.php | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/app/CommonMark/XrefParser.php b/app/CommonMark/XrefParser.php new file mode 100644 index 0000000000..85f10bfe6e --- /dev/null +++ b/app/CommonMark/XrefParser.php @@ -0,0 +1,87 @@ +<?php +/** + * webtrees: online genealogy + * Copyright (C) 2017 webtrees development team + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +namespace Fisharebest\Webtrees\CommonMark; + +use Fisharebest\Webtrees\GedcomRecord; +use Fisharebest\Webtrees\Tree; +use League\CommonMark\Inline\Element\Link; +use League\CommonMark\Inline\Parser\AbstractInlineParser; +use League\CommonMark\InlineParserContext; + +/** + * Convert XREFs within markdown text to links + */ +class XrefParser extends AbstractInlineParser { + /** @var Tree - match XREFs in this tree */ + private $tree; + + /** + * MarkdownXrefParser constructor. + * + * @param Tree $tree + */ + public function __construct(Tree $tree) { + $this->tree = $tree; + } + + /** + * We are only interested in text that begins with '@'. + * + * @return array + */ + public function getCharacters() { + return ['@']; + } + + /** + * @param InlineParserContext $context + * + * @return bool + */ + public function parse(InlineParserContext $context) { + // The cursor should be positioned on the opening '@'. + $cursor = $context->getcursor(); + + // If this isn't the start of an XREF, we'll need to rewind. + $previous_state = $cursor->saveState(); + + $handle = $cursor->match('/@' . WT_REGEX_XREF . '@/'); + if (empty($handle)) { + // Not an XREF? + $cursor->restoreState($previous_state); + + return false; + } + + $xref = trim($handle, '@'); + + $record = GedcomRecord::getInstance($xref, $this->tree); + + if ($record === null) { + // Linked record does not exist? + $cursor->restoreState($previous_state); + + return false; + } + + $url = $record->getRawUrl(); + $label = $handle; + $title = strip_tags($record->getFullName()); + $context->getContainer()->appendChild(new Link($url, $label, $title)); + + return true; + } +} |
