Skip to content

Commit e2ad74a

Browse files
committed
fix code block
1 parent 84d4e50 commit e2ad74a

File tree

5 files changed

+153
-1
lines changed

5 files changed

+153
-1
lines changed

_build/src/KernelFactory.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public static function createKernel(): Kernel
1717
$configuration = new Configuration();
1818
$configuration->setCustomTemplateDirs([__DIR__.'/Templates']);
1919
$configuration->setCacheDir(__DIR__.'/../var/cache');
20+
$configuration->addFormat(new SymfonyFormat($configuration->getTemplateRenderer()));
2021

2122
return new Kernel(
2223
$configuration,

_build/src/Nodes/CodeNode.php renamed to _build/src/Nodes/SfCodeNode.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use Doctrine\RST\Nodes\CodeNode as Base;
66
use Highlight\Highlighter;
77

8-
class CodeNode extends Base
8+
class SfCodeNode extends Base
99
{
1010
private const LANGUAGES_MAPPING = [
1111
'php' => 'php',
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace SymfonyDocs\Renderers;
6+
7+
use Doctrine\RST\Nodes\CodeNode;
8+
use Doctrine\RST\Renderers\NodeRenderer;
9+
use Doctrine\RST\Templates\TemplateRenderer;
10+
use Highlight\Highlighter;
11+
12+
class CodeNodeRenderer implements NodeRenderer
13+
{
14+
private const LANGUAGES_MAPPING = [
15+
'html+twig' => 'twig',
16+
'jinja' => 'twig',
17+
'html+php' => 'html',
18+
'php-annotations' => 'php',
19+
'terminal' => 'bash',
20+
'rst' => 'markdown',
21+
'php-standalone' => 'php',
22+
'php-symfony' => 'php',
23+
'varnish4' => 'c',
24+
'varnish3' => 'c',
25+
];
26+
27+
/** @var CodeNode */
28+
private $codeNode;
29+
30+
/** @var TemplateRenderer */
31+
private $templateRenderer;
32+
33+
public function __construct(CodeNode $codeNode, TemplateRenderer $templateRenderer)
34+
{
35+
$this->codeNode = $codeNode;
36+
$this->templateRenderer = $templateRenderer;
37+
}
38+
39+
public function render(): string
40+
{
41+
$value = $this->codeNode->getValue();
42+
43+
if ($this->codeNode->isRaw()) {
44+
return $value;
45+
}
46+
47+
$lines = $this->getLines($value);
48+
$code = implode("\n", $lines);
49+
50+
$lineNumbers = "";
51+
for ($i = 1; $i <= \count($lines); $i++) {
52+
$lineNumbers .= str_pad((string) $i, 2, ' ', STR_PAD_LEFT)."\n";
53+
}
54+
55+
$language = $this->codeNode->getLanguage() ?? 'php';
56+
57+
if ('text' !== $language) {
58+
$highLighter = new Highlighter();
59+
$code = $highLighter->highlight(self::LANGUAGES_MAPPING[$language] ?? $language, $code)->value;
60+
}
61+
62+
return $this->templateRenderer->render(
63+
'code.html.twig',
64+
[
65+
'language' => $language,
66+
'languageMapping' => self::LANGUAGES_MAPPING[$language] ?? $language,
67+
'code' => $code,
68+
'lineNumbers' => rtrim($lineNumbers),
69+
]
70+
);
71+
}
72+
73+
private function getLines(string $code): array
74+
{
75+
$lines = preg_split('/\r\n|\r|\n/', $code);
76+
$reversedLines = array_reverse($lines);
77+
78+
// trim empty lines at the end of the code
79+
foreach ($reversedLines as $key => $line) {
80+
if (trim($line) !== '') {
81+
break;
82+
}
83+
84+
unset($reversedLines[$key]);
85+
}
86+
87+
return array_reverse($reversedLines);
88+
}
89+
}

_build/src/SymfonyFormat.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace SymfonyDocs;
4+
5+
use Doctrine\RST\HTML\HTMLFormat;
6+
use Doctrine\RST\Nodes\CodeNode;
7+
use Doctrine\RST\Renderers\CallableNodeRendererFactory;
8+
use Doctrine\RST\Renderers\NodeRendererFactory;
9+
use Doctrine\RST\Templates\TemplateRenderer;
10+
11+
/**
12+
* Class SymfonyFormat
13+
*/
14+
final class SymfonyFormat extends HTMLFormat
15+
{
16+
/** @var TemplateRenderer */
17+
protected $templateRenderer;
18+
19+
public function __construct(TemplateRenderer $templateRenderer)
20+
{
21+
parent::__construct($templateRenderer);
22+
$this->templateRenderer = $templateRenderer;
23+
}
24+
25+
/**
26+
* @return NodeRendererFactory[]
27+
*/
28+
public function getNodeRendererFactories(): array
29+
{
30+
$nodeRendererFactories = parent::getNodeRendererFactories();
31+
32+
$nodeRendererFactories[CodeNode::class] = new CallableNodeRendererFactory(
33+
function (CodeNode $node) {
34+
return new Renderers\CodeNodeRenderer(
35+
$node,
36+
$this->templateRenderer
37+
);
38+
}
39+
);
40+
41+
return $nodeRendererFactories;
42+
}
43+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<div class="literal-block notranslate">
2+
<div class="highlight-{{ language }}">
3+
<table class="highlighttable">
4+
<tr>
5+
<td class="linenos">
6+
<div class="linenodiv">
7+
<pre>{{ lineNumbers }}</pre>
8+
</div>
9+
</td>
10+
<td class="code">
11+
<div class="highlight">
12+
<pre class="hljs {{ languageMapping }}">{{ code|raw }}</pre>
13+
</div>
14+
</td>
15+
</tr>
16+
</table>
17+
</div>
18+
</div>
19+

0 commit comments

Comments
 (0)