xref: /webtrees/app/Factories/MarkdownFactory.php (revision 3340ecd27b8901a894bff51b7c40bfa2896a552b)
1<?php
2
3/**
4 * webtrees: online genealogy
5 * Copyright (C) 2021 webtrees development team
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17
18declare(strict_types=1);
19
20namespace Fisharebest\Webtrees\Factories;
21
22use Fisharebest\Webtrees\CommonMark\CensusTableExtension;
23use Fisharebest\Webtrees\CommonMark\ResponsiveTableExtension;
24use Fisharebest\Webtrees\CommonMark\XrefExtension;
25use Fisharebest\Webtrees\Contracts\MarkdownFactoryInterface;
26use Fisharebest\Webtrees\Tree;
27use League\CommonMark\Block\Element\Document;
28use League\CommonMark\Block\Element\Paragraph;
29use League\CommonMark\Block\Renderer\DocumentRenderer;
30use League\CommonMark\Block\Renderer\ParagraphRenderer;
31use League\CommonMark\CommonMarkConverter;
32use League\CommonMark\Environment;
33use League\CommonMark\EnvironmentInterface;
34use League\CommonMark\Extension\Autolink\AutolinkExtension;
35use League\CommonMark\Inline\Element\Link;
36use League\CommonMark\Inline\Element\Text;
37use League\CommonMark\Inline\Renderer\LinkRenderer;
38use League\CommonMark\Inline\Renderer\TextRenderer;
39
40/**
41 * Create a markdown converter.
42 */
43class MarkdownFactory implements MarkdownFactoryInterface
44{
45    protected const CONFIG = [
46        'allow_unsafe_links' => false,
47        'html_input'         => EnvironmentInterface::HTML_INPUT_ESCAPE,
48    ];
49
50    /**
51     * @param Tree|null $tree
52     *
53     * @return CommonMarkConverter
54     */
55    public function autolink(Tree $tree = null): CommonMarkConverter
56    {
57        // Create a minimal commonmark processor - just add support for auto-links.
58        $environment = new Environment();
59        $environment->addBlockRenderer(Document::class, new DocumentRenderer());
60        $environment->addBlockRenderer(Paragraph::class, new ParagraphRenderer());
61        $environment->addInlineRenderer(Text::class, new TextRenderer());
62        $environment->addInlineRenderer(Link::class, new LinkRenderer());
63        $environment->addExtension(new AutolinkExtension());
64
65        // Optionally create links to other records.
66        if ($tree instanceof Tree) {
67            $environment->addExtension(new XrefExtension($tree));
68        }
69
70        return new CommonMarkConverter(static::CONFIG, $environment);
71    }
72
73    /**
74     * @param Tree|null $tree
75     *
76     * @return CommonMarkConverter
77     */
78    public function markdown(Tree $tree = null): CommonMarkConverter
79    {
80        $environment = Environment::createCommonMarkEnvironment();
81
82        // Wrap tables so support horizontal scrolling with bootstrap.
83        $environment->addExtension(new ResponsiveTableExtension());
84
85        // Convert webtrees 1.x style census tables to commonmark format.
86        $environment->addExtension(new CensusTableExtension());
87
88        // Optionally create links to other records.
89        if ($tree instanceof Tree) {
90            $environment->addExtension(new XrefExtension($tree));
91        }
92
93        return new CommonMarkConverter(static::CONFIG, $environment);
94    }
95}
96