Skip to content

Commit b6928bb

Browse files
committed
fix(markdown): support multi-word info words
1 parent 41b1001 commit b6928bb

File tree

3 files changed

+35
-3
lines changed

3 files changed

+35
-3
lines changed

src/Markdown/CodeBlocks/CodeBlockRenderer.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace App\Markdown\CodeBlocks;
66

7+
use App\Markdown\ResolvesInfoWords;
78
use InvalidArgumentException;
89
use League\CommonMark\Extension\CommonMark\Node\Block\FencedCode;
910
use League\CommonMark\Node\Node;
@@ -15,6 +16,8 @@
1516

1617
final class CodeBlockRenderer implements NodeRendererInterface
1718
{
19+
use ResolvesInfoWords;
20+
1821
public function __construct(
1922
private Highlighter $highlighter = new Highlighter(),
2023
) {}
@@ -41,10 +44,10 @@ public function render(Node $node, ChildNodeRendererInterface $childRenderer): s
4144
if ($theme instanceof WebTheme) {
4245
$pre = $theme->preBefore($highlighter) . $parsed . $theme->preAfter($highlighter);
4346

44-
if ($node->getInfoWords()[1] ?? false) {
47+
if ($this->getInfoWords($node)[1] ?? false) {
4548
return <<<HTML
4649
<div class="code-block named-code-block">
47-
<div class="code-block-name">{$node->getInfoWords()[1]}</div>
50+
<div class="code-block-name">{$this->getInfoWords($node)[1]}</div>
4851
{$pre}
4952
</div>
5053
HTML;

src/Markdown/CodeGroups/CodeGroupBlockRenderer.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace App\Markdown\CodeGroups;
66

77
use App\Markdown\CodeBlocks\CodeBlockRenderer;
8+
use App\Markdown\ResolvesInfoWords;
89
use InvalidArgumentException;
910
use League\CommonMark\Extension\CommonMark\Node\Block\FencedCode;
1011
use League\CommonMark\Node\Node;
@@ -15,6 +16,8 @@
1516

1617
final class CodeGroupBlockRenderer implements NodeRendererInterface
1718
{
19+
use ResolvesInfoWords;
20+
1821
public function __construct(
1922
private CodeBlockRenderer $code_block_renderer,
2023
) {}
@@ -35,7 +38,7 @@ public function render(Node $node, ChildNodeRendererInterface $child_renderer):
3538
continue;
3639
}
3740

38-
$info_words = $child->getInfoWords();
41+
$info_words = $this->getInfoWords($child);
3942
$filename = $info_words[1] ?? "Tab {$index}";
4043

4144
$is_active = $index === 0;

src/Markdown/ResolvesInfoWords.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
namespace App\Markdown;
4+
5+
use League\CommonMark\Extension\CommonMark\Node\Block\FencedCode;
6+
7+
trait ResolvesInfoWords
8+
{
9+
private function getInfoWords(FencedCode $code): array
10+
{
11+
if ($code->getInfo() === null || $code->getInfo() === '') {
12+
return [];
13+
}
14+
15+
$words = [];
16+
$pattern = '/"([^"]*)"|(\S+)/';
17+
18+
\preg_match_all($pattern, $code->getInfo(), $matches, PREG_SET_ORDER);
19+
20+
foreach ($matches as $match) {
21+
$words[] = $match[1] !== '' ? $match[1] : $match[2];
22+
}
23+
24+
return $words;
25+
}
26+
}

0 commit comments

Comments
 (0)