Skip to content

Commit b180068

Browse files
committed
feat: linkify attributes
1 parent 0e2ca7e commit b180068

File tree

3 files changed

+59
-5
lines changed

3 files changed

+59
-5
lines changed

src/Markdown/MarkdownInitializer.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@
66

77
use App\Markdown\Alerts\AlertExtension;
88
use App\Markdown\CodeBlockRenderer;
9+
use App\Markdown\Symbols\AttributeParser;
10+
use App\Markdown\Symbols\FqcnParser;
911
use League\CommonMark\Environment\Environment;
1012
use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension;
1113
use League\CommonMark\Extension\CommonMark\Node\Block\FencedCode;
1214
use League\CommonMark\Extension\CommonMark\Node\Block\Heading;
1315
use League\CommonMark\Extension\CommonMark\Node\Inline\Code;
1416
use League\CommonMark\Extension\FrontMatter\FrontMatterExtension;
15-
use League\CommonMark\Extension\HeadingPermalink\HeadingPermalinkExtension;
1617
use League\CommonMark\MarkdownConverter;
1718
use Tempest\Container\Container;
1819
use Tempest\Container\Initializer;
@@ -34,6 +35,7 @@ public function initialize(Container $container): MarkdownConverter
3435
->addExtension(new AlertExtension())
3536
->addInlineParser(new TempestPackageParser())
3637
->addInlineParser(new FqcnParser())
38+
->addInlineParser(new AttributeParser())
3739
->addInlineParser(new HandleParser())
3840
->addRenderer(FencedCode::class, new CodeBlockRenderer($highlighter))
3941
->addRenderer(Code::class, new InlineCodeBlockRenderer($highlighter))
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
namespace App\Markdown\Symbols;
4+
5+
use League\CommonMark\Extension\CommonMark\Node\Inline\Code;
6+
use League\CommonMark\Extension\CommonMark\Node\Inline\Link;
7+
use League\CommonMark\Parser\Inline\InlineParserInterface;
8+
use League\CommonMark\Parser\Inline\InlineParserMatch;
9+
use League\CommonMark\Parser\InlineParserContext;
10+
11+
use function Tempest\Support\str;
12+
use function Tempest\Support\Str\class_basename;
13+
use function Tempest\Support\Str\strip_start;
14+
15+
final readonly class AttributeParser implements InlineParserInterface
16+
{
17+
#[\Override]
18+
public function getMatchDefinition(): InlineParserMatch
19+
{
20+
return InlineParserMatch::regex("{(b)?`#\[((?:\\\{1,2}\w+|\w+\\\{1,2})(?:\w+\\\{0,2})+)\]`}");
21+
}
22+
23+
#[\Override]
24+
public function parse(InlineParserContext $inlineContext): bool
25+
{
26+
$cursor = $inlineContext->getCursor();
27+
$previousChar = $cursor->peek(-1);
28+
29+
if ($previousChar !== null && $previousChar !== ' ') {
30+
return false;
31+
}
32+
33+
$cursor->advanceBy($inlineContext->getFullMatchLength());
34+
35+
[$flag, $fqcn] = $inlineContext->getSubMatches();
36+
$url = str($fqcn)
37+
->stripStart(['\\Tempest\\', 'Tempest\\'])
38+
->replaceRegex("/^(\w+)/", 'src/Tempest/$0/src')
39+
->replace('\\', '/')
40+
->prepend('https://github.com/tempestphp/tempest-framework/blob/main/')
41+
->append('.php');
42+
43+
$attribute = str($fqcn)
44+
->stripStart('\\')
45+
->when($flag === 'b', fn ($s) => $s->classBasename())
46+
->wrap(before: '#[', after: ']')
47+
->toString();
48+
49+
$link = new Link($url);
50+
$link->appendChild(new Code($attribute));
51+
$inlineContext->getContainer()->appendChild($link);
52+
53+
return true;
54+
}
55+
}
Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
11
<?php
22

3-
namespace App\Markdown;
3+
namespace App\Markdown\Symbols;
44

55
use League\CommonMark\Extension\CommonMark\Node\Inline\Code;
66
use League\CommonMark\Extension\CommonMark\Node\Inline\Link;
77
use League\CommonMark\Parser\Inline\InlineParserInterface;
88
use League\CommonMark\Parser\Inline\InlineParserMatch;
99
use League\CommonMark\Parser\InlineParserContext;
1010

11-
use function Tempest\Support\Namespace\to_base_class_name;
12-
use function Tempest\Support\Namespace\to_namespace;
1311
use function Tempest\Support\str;
14-
use function Tempest\Support\Str\after_last;
1512
use function Tempest\Support\Str\class_basename;
1613
use function Tempest\Support\Str\strip_start;
1714

0 commit comments

Comments
 (0)