Skip to content

Commit 293d2ce

Browse files
committed
Better error for invalid code-block language
1 parent 574ca6f commit 293d2ce

File tree

3 files changed

+41
-0
lines changed

3 files changed

+41
-0
lines changed

src/Directive/CodeBlockDirective.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Doctrine\RST\Nodes\CodeNode;
77
use Doctrine\RST\Nodes\Node;
88
use Doctrine\RST\Parser;
9+
use SymfonyDocsBuilder\Renderers\CodeNodeRenderer;
910

1011
class CodeBlockDirective extends Directive
1112
{
@@ -20,6 +21,10 @@ public function process(Parser $parser, ?Node $node, string $variable, string $d
2021
return;
2122
}
2223

24+
if (!CodeNodeRenderer::isLanguageSupported($data)) {
25+
throw new \Exception(sprintf('Unsupported code block language "%s"', $data));
26+
}
27+
2328
$node->setLanguage($data);
2429

2530
if ('' !== $variable) {

src/Renderers/CodeNodeRenderer.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class CodeNodeRenderer implements NodeRenderer
1616
'html+twig' => 'twig',
1717
'jinja' => 'twig',
1818
'html+php' => 'html',
19+
'xml+php' => 'xml',
1920
'php-annotations' => 'php',
2021
'terminal' => 'bash',
2122
'rst' => 'markdown',
@@ -71,6 +72,17 @@ public function render(): string
7172
);
7273
}
7374

75+
public static function isLanguageSupported(string $lang): bool
76+
{
77+
$highlighter = new Highlighter();
78+
$supportedLanguages = array_merge(
79+
array_keys(self::LANGUAGES_MAPPING),
80+
$highlighter->listLanguages(true)
81+
);
82+
83+
return in_array($lang, $supportedLanguages);
84+
}
85+
7486
private function getLines(string $code): array
7587
{
7688
$lines = preg_split('/\r\n|\r|\n/', $code);
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace SymfonyDocsBuilder\Tests\Renderers;
4+
5+
use PHPUnit\Framework\TestCase;
6+
use SymfonyDocsBuilder\Renderers\CodeNodeRenderer;
7+
8+
class CodeNodeRendererTest extends TestCase
9+
{
10+
/**
11+
* @dataProvider getSupportedLanguageTests
12+
*/
13+
public function testIsLanguageSupported(string $lang, bool $shouldBeSupported)
14+
{
15+
$this->assertSame($shouldBeSupported, CodeNodeRenderer::isLanguageSupported($lang));
16+
}
17+
18+
public function getSupportedLanguageTests()
19+
{
20+
yield 'normal_lang' => ['xml', true];
21+
yield 'aliased_lang' => ['php-annotations', true];
22+
yield 'unsupported' => ['bhb', false];
23+
}
24+
}

0 commit comments

Comments
 (0)