-
-
Notifications
You must be signed in to change notification settings - Fork 108
Expand file tree
/
Copy pathCommonMark.php
More file actions
77 lines (62 loc) · 2.88 KB
/
CommonMark.php
File metadata and controls
77 lines (62 loc) · 2.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?php
namespace App\Support\CommonMark;
use App\Extensions\TorchlightWithCopyExtension;
use League\CommonMark\Environment\Environment;
use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension;
use League\CommonMark\Extension\CommonMark\Node\Block\BlockQuote;
use League\CommonMark\Extension\CommonMark\Node\Block\Heading;
use League\CommonMark\Extension\Embed\Bridge\OscaroteroEmbedAdapter;
use League\CommonMark\Extension\Embed\Embed as EmbedNode;
use League\CommonMark\Extension\Embed\EmbedExtension;
use League\CommonMark\Extension\Embed\EmbedRenderer;
use League\CommonMark\Extension\GithubFlavoredMarkdownExtension;
use League\CommonMark\Extension\Table\TableExtension;
use League\CommonMark\MarkdownConverter;
use League\CommonMark\Renderer\HtmlDecorator;
use Torchlight\Commonmark\V2\TorchlightExtension;
class CommonMark
{
protected static ?MarkdownConverter $converter = null;
protected static ?HeadingRenderer $headingRenderer = null;
public static function convertToHtml(string $markdown, array $data = []): string
{
// Pre-process to render any Blade components in the markdown
$markdown = BladeMarkdownPreprocessor::process($markdown, $data);
// Reset heading ID tracking to ensure unique IDs per conversion
static::getConverter();
static::$headingRenderer->resetIds();
return static::$converter->convert($markdown)->getContent();
}
protected static function getConverter(): MarkdownConverter
{
if (static::$converter === null) {
$config = [
'html_input' => 'allow',
'allow_unsafe_links' => false,
'max_nesting_level' => 10,
'embed' => [
'adapter' => new OscaroteroEmbedAdapter,
'fallback' => 'link',
],
];
$environment = new Environment($config);
$environment->addExtension(new CommonMarkCoreExtension);
$environment->addExtension(new GithubFlavoredMarkdownExtension);
static::$headingRenderer = new HeadingRenderer;
$environment->addRenderer(Heading::class, static::$headingRenderer);
$environment->addRenderer(BlockQuote::class, new AlertBlockQuoteRenderer, 10);
$environment->addExtension(new TableExtension);
$environment->addExtension(new EmbedExtension);
$environment->addRenderer(
EmbedNode::class,
new HtmlDecorator(new EmbedRenderer, 'div', ['class' => 'relative aspect-video w-full'])
);
// Add Torchlight extension if available
if (class_exists(TorchlightExtension::class)) {
$environment->addExtension(new TorchlightWithCopyExtension);
}
static::$converter = new MarkdownConverter($environment);
}
return static::$converter;
}
}