Skip to content

Commit e74e0c6

Browse files
committed
bug #152 Avoid link with same ID's (alamirault)
This PR was squashed before being merged into the main branch. Discussion ---------- Avoid link with same ID's Hello, This PR try to generate unique link id. Relative issues in symfony docs: symfony/symfony-docs#16417 symfony/symfony-docs#16721 rst-parser instantiate NodeRenderer for each node so the only way I found is to use static property and save when id is already rendered on same page. Examples of changes on symfony-docs: alamirault/sf-doc-output@45a5281 Commits ------- 048f43e Avoid link with same ID's
2 parents 6486fd7 + 048f43e commit e74e0c6

File tree

7 files changed

+84
-3
lines changed

7 files changed

+84
-3
lines changed

src/Renderers/TitleNodeRenderer.php

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/*
6+
* This file is part of the Docs Builder package.
7+
* (c) Ryan Weaver <ryan@symfonycasts.com>
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace SymfonyDocsBuilder\Renderers;
13+
14+
use Doctrine\RST\Environment;
15+
use Doctrine\RST\Nodes\TitleNode;
16+
use Doctrine\RST\Renderers\NodeRenderer;
17+
use Doctrine\RST\Templates\TemplateRenderer;
18+
19+
class TitleNodeRenderer implements NodeRenderer
20+
{
21+
/** @var TitleNode */
22+
private $titleNode;
23+
24+
/** @var TemplateRenderer */
25+
private $templateRenderer;
26+
27+
private static $idUsagesCountByFilename = [];
28+
29+
public function __construct(TitleNode $titleNode, TemplateRenderer $templateRenderer)
30+
{
31+
$this->titleNode = $titleNode;
32+
$this->templateRenderer = $templateRenderer;
33+
}
34+
35+
public function render(): string
36+
{
37+
$filename = $this->titleNode->getEnvironment()->getCurrentFileName();
38+
$id = $this->titleNode->getId();
39+
40+
$idUsagesCount = self::$idUsagesCountByFilename[$filename][$id] ?? 0;
41+
42+
if (0 === $idUsagesCount) {
43+
$computedId = $this->titleNode->getId();
44+
} else {
45+
$computedId = Environment::slugify($this->titleNode->getValue()->getText().'-'.$idUsagesCount);
46+
}
47+
48+
self::$idUsagesCountByFilename[$filename][$id] = $idUsagesCount + 1;
49+
50+
return $this->templateRenderer->render('header-title.html.twig', [
51+
'titleNode' => $this->titleNode,
52+
'id' => $computedId,
53+
]);
54+
}
55+
}

src/SymfonyHTMLFormat.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Doctrine\RST\Formats\Format;
1515
use Doctrine\RST\Nodes\CodeNode;
1616
use Doctrine\RST\Nodes\SpanNode;
17+
use Doctrine\RST\Nodes\TitleNode;
1718
use Doctrine\RST\Renderers\CallableNodeRendererFactory;
1819
use Doctrine\RST\Renderers\NodeRendererFactory;
1920
use Doctrine\RST\Templates\TemplateRenderer;
@@ -77,6 +78,15 @@ function (SpanNode $node) {
7778
}
7879
);
7980

81+
$nodeRendererFactories[TitleNode::class] = new CallableNodeRendererFactory(
82+
function (TitleNode $node) {
83+
return new Renderers\TitleNodeRenderer(
84+
$node,
85+
$this->templateRenderer
86+
);
87+
}
88+
);
89+
8090
return $nodeRendererFactories;
8191
}
8292
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<h{{ titleNode.level }} id="{{ titleNode.id }}"><a class="headerlink" href="#{{ titleNode.id }}" title="Permalink to this headline">{{ titleNode.value.render()|raw }}</a></h{{ titleNode.level }}>
1+
<h{{ titleNode.level }} id="{{ id }}"><a class="headerlink" href="#{{ id }}" title="Permalink to this headline">{{ titleNode.value.render()|raw }}</a></h{{ titleNode.level }}>
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<h{{ titleNode.level }} id="{{ titleNode.id }}">
1+
<h{{ titleNode.level }} id="{{ id }}">
22
{{ titleNode.value.render()|raw }}
3-
<a class="headerlink" href="#{{ titleNode.id }}" title="Permalink to this headline">¶</a>
3+
<a class="headerlink" href="#{{ id }}" title="Permalink to this headline">¶</a>
44
</h{{ titleNode.level }}>

tests/IntegrationTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,19 @@
1717
use Symfony\Component\Finder\Finder;
1818
use SymfonyDocsBuilder\DocBuilder;
1919
use SymfonyDocsBuilder\KernelFactory;
20+
use SymfonyDocsBuilder\Renderers\TitleNodeRenderer;
2021

2122
class IntegrationTest extends AbstractIntegrationTest
2223
{
24+
public static function setUpBeforeClass(): void
25+
{
26+
$reflection = new \ReflectionClass(TitleNodeRenderer::class);
27+
$property = $reflection->getProperty('idUsagesCountByFilename');
28+
$property->setAccessible(true);
29+
30+
$property->setValue([]);
31+
}
32+
2333
/**
2434
* @dataProvider integrationProvider
2535
*/

tests/fixtures/expected/blocks/nodes/title.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,8 @@ <h2 id="zuo-ye-huan-jingwo-que-rensuru"><a class="headerlink" href="#zuo-ye-huan
1010
<div class="section">
1111
<h2 id="perevirka-robocogo-seredovisa"><a class="headerlink" href="#perevirka-robocogo-seredovisa" title="Permalink to this headline">Перевірка робочого середовища</a></h2>
1212
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
13+
<div class="section">
14+
<h3 id="checking-your-work-environment-1"><a class="headerlink" href="#checking-your-work-environment-1" title="Permalink to this headline"><code translate="no" class="notranslate">Checking your Work Environment</code></a></h3>
15+
</div>
1316
</div>
1417
</div>

tests/fixtures/source/blocks/nodes/title.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,6 @@ Lorem ipsum dolor sit amet, consectetur adipisicing elit.
1212
-----------------------------
1313

1414
Lorem ipsum dolor sit amet, consectetur adipisicing elit.
15+
16+
``Checking your Work Environment``
17+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

0 commit comments

Comments
 (0)