Skip to content

Commit 10da959

Browse files
authored
Merge pull request #651 from phpDocumentor/feature/confval
[FEATURE] Introduce confval directive
2 parents 1c705d8 + d9ac007 commit 10da959

26 files changed

+293
-1
lines changed

packages/guides-restructured-text/resources/config/guides-restructured-text.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use phpDocumentor\Guides\RestructuredText\Directives\CautionDirective;
1313
use phpDocumentor\Guides\RestructuredText\Directives\ClassDirective;
1414
use phpDocumentor\Guides\RestructuredText\Directives\CodeBlockDirective;
15+
use phpDocumentor\Guides\RestructuredText\Directives\ConfvalDirective;
1516
use phpDocumentor\Guides\RestructuredText\Directives\ContainerDirective;
1617
use phpDocumentor\Guides\RestructuredText\Directives\ContentsDirective;
1718
use phpDocumentor\Guides\RestructuredText\Directives\CsvTableDirective;
@@ -169,6 +170,7 @@
169170
CodeNodeOptionMapper::class,
170171
),
171172
])
173+
->set(ConfvalDirective::class)
172174
->set(ContainerDirective::class)
173175
->set(ContentsDirective::class)
174176
->arg('$documentNameResolver', service(DocumentNameResolverInterface::class))
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<dl class="confval">
2+
<dt id="{{ node.id }}">
3+
<code class="sig-name descname"><span class="pre">{{ node.plainContent }}</span></code></dt>
4+
<dd>
5+
<div class="line-block">
6+
{% if node.type != null %} <div class="line"><strong>Type:</strong> {{ renderNode(node.type) }}</div>
7+
{% endif -%}
8+
{%- if node.required %} <div class="line"><strong>Required:</strong> true</div>
9+
{% endif -%}
10+
{% if node.default != null %} <div class="line"><strong>Type:</strong> {{ renderNode(node.default) }}</div>
11+
{% endif -%}
12+
{%- for key, option in node.additionalOptions -%}
13+
<div class="line"><strong>{{ key }}:</strong> {{ renderNode(option) }}</div>
14+
15+
{% endfor -%}
16+
</div>
17+
<div class="confval-description">
18+
{{ renderNode(node.value) }}
19+
</div>
20+
</dd>
21+
</dl>

packages/guides-restructured-text/src/RestructuredText/DependencyInjection/ReStructuredTextExtension.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use phpDocumentor\Guides\NodeRenderers\TemplateNodeRenderer;
88
use phpDocumentor\Guides\RestructuredText\DependencyInjection\Compiler\TextRolePass;
9+
use phpDocumentor\Guides\RestructuredText\Nodes\ConfvalNode;
910
use phpDocumentor\Guides\RestructuredText\Nodes\OptionNode;
1011
use phpDocumentor\Guides\RestructuredText\Nodes\VersionChangeNode;
1112
use phpDocumentor\Guides\TemplateRenderer;
@@ -27,6 +28,7 @@ class ReStructuredTextExtension extends Extension implements PrependExtensionInt
2728
private const HTML = [
2829
VersionChangeNode::class => 'body/version-change.html.twig',
2930
OptionNode::class => 'body/directive/option.html.twig',
31+
ConfvalNode::class => 'body/directive/confval.html.twig',
3032
];
3133

3234
/** @param mixed[] $configs */

packages/guides-restructured-text/src/RestructuredText/Directives/AbstractAdmonitionDirective.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use phpDocumentor\Guides\Nodes\CollectionNode;
1717
use phpDocumentor\Guides\Nodes\Node;
1818
use phpDocumentor\Guides\RestructuredText\Nodes\AdmonitionNode;
19+
use phpDocumentor\Guides\RestructuredText\Parser\BlockContext;
1920
use phpDocumentor\Guides\RestructuredText\Parser\Directive;
2021
use phpDocumentor\Guides\RestructuredText\Parser\Productions\Rule;
2122

@@ -31,6 +32,7 @@ public function __construct(protected Rule $startingRule, private readonly strin
3132
* @param Directive $directive
3233
*/
3334
final protected function processSub(
35+
BlockContext $blockContext,
3436
CollectionNode $collectionNode,
3537
Directive $directive,
3638
): Node|null {

packages/guides-restructured-text/src/RestructuredText/Directives/AbstractVersionChangeDirective.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use phpDocumentor\Guides\Nodes\CollectionNode;
1717
use phpDocumentor\Guides\Nodes\Node;
1818
use phpDocumentor\Guides\RestructuredText\Nodes\VersionChangeNode;
19+
use phpDocumentor\Guides\RestructuredText\Parser\BlockContext;
1920
use phpDocumentor\Guides\RestructuredText\Parser\Directive;
2021
use phpDocumentor\Guides\RestructuredText\Parser\Productions\Rule;
2122

@@ -32,6 +33,7 @@ public function __construct(protected Rule $startingRule, private readonly strin
3233
* @param Directive $directive
3334
*/
3435
final protected function processSub(
36+
BlockContext $blockContext,
3537
CollectionNode $collectionNode,
3638
Directive $directive,
3739
): Node|null {

packages/guides-restructured-text/src/RestructuredText/Directives/AdmonitionDirective.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use phpDocumentor\Guides\Nodes\CollectionNode;
1717
use phpDocumentor\Guides\Nodes\Node;
1818
use phpDocumentor\Guides\RestructuredText\Nodes\AdmonitionNode;
19+
use phpDocumentor\Guides\RestructuredText\Parser\BlockContext;
1920
use phpDocumentor\Guides\RestructuredText\Parser\Directive;
2021

2122
use function preg_replace;
@@ -45,6 +46,7 @@ public function getName(): string
4546
* @param Directive $directive
4647
*/
4748
protected function processSub(
49+
BlockContext $blockContext,
4850
CollectionNode $collectionNode,
4951
Directive $directive,
5052
): Node|null {

packages/guides-restructured-text/src/RestructuredText/Directives/ClassDirective.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use phpDocumentor\Guides\Nodes\CollectionNode;
99
use phpDocumentor\Guides\Nodes\DocumentNode;
1010
use phpDocumentor\Guides\Nodes\Node;
11+
use phpDocumentor\Guides\RestructuredText\Parser\BlockContext;
1112
use phpDocumentor\Guides\RestructuredText\Parser\Directive;
1213
use Symfony\Component\String\Slugger\AsciiSlugger;
1314

@@ -39,6 +40,7 @@ public function getAliases(): array
3940
* @param Directive $directive
4041
*/
4142
protected function processSub(
43+
BlockContext $blockContext,
4244
CollectionNode $collectionNode,
4345
Directive $directive,
4446
): Node|null {
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace phpDocumentor\Guides\RestructuredText\Directives;
6+
7+
use phpDocumentor\Guides\Nodes\CollectionNode;
8+
use phpDocumentor\Guides\Nodes\Node;
9+
use phpDocumentor\Guides\ReferenceResolvers\AnchorReducer;
10+
use phpDocumentor\Guides\RestructuredText\Nodes\ConfvalNode;
11+
use phpDocumentor\Guides\RestructuredText\Parser\BlockContext;
12+
use phpDocumentor\Guides\RestructuredText\Parser\Directive;
13+
use phpDocumentor\Guides\RestructuredText\Parser\InlineParser;
14+
use phpDocumentor\Guides\RestructuredText\Parser\Productions\Rule;
15+
use phpDocumentor\Guides\RestructuredText\TextRoles\GenericLinkProvider;
16+
17+
use function boolval;
18+
use function in_array;
19+
20+
/**
21+
* The confval directive configuration values.
22+
*
23+
* https://sphinx-toolbox.readthedocs.io/en/stable/extensions/confval.html
24+
*/
25+
final class ConfvalDirective extends SubDirective
26+
{
27+
public const NAME = 'confval';
28+
29+
/** @param Rule<CollectionNode> $startingRule */
30+
public function __construct(
31+
protected Rule $startingRule,
32+
GenericLinkProvider $genericLinkProvider,
33+
private readonly AnchorReducer $anchorReducer,
34+
private readonly InlineParser $inlineParser,
35+
) {
36+
parent::__construct($startingRule);
37+
38+
$genericLinkProvider->addGenericLink(self::NAME, ConfvalNode::LINK_TYPE);
39+
}
40+
41+
public function getName(): string
42+
{
43+
return self::NAME;
44+
}
45+
46+
/** {@inheritDoc}
47+
*
48+
* @param Directive $directive
49+
*/
50+
protected function processSub(
51+
BlockContext $blockContext,
52+
CollectionNode $collectionNode,
53+
Directive $directive,
54+
): Node|null {
55+
$id = $this->anchorReducer->reduceAnchor($directive->getData());
56+
$type = null;
57+
$required = false;
58+
$default = null;
59+
$additionalOptions = [];
60+
if ($directive->hasOption('type')) {
61+
$type = $this->inlineParser->parse($directive->getOption('type')->toString(), $blockContext);
62+
}
63+
64+
if ($directive->hasOption('required')) {
65+
$required = boolval($directive->getOption('required'));
66+
}
67+
68+
if ($directive->hasOption('default')) {
69+
$type = $this->inlineParser->parse($directive->getOption('default')->toString(), $blockContext);
70+
}
71+
72+
foreach ($directive->getOptions() as $option) {
73+
if (in_array($option->getName(), ['type', 'required', 'default', 'noindex'], true)) {
74+
continue;
75+
}
76+
77+
$additionalOptions[$option->getName()] = $this->inlineParser->parse($option->toString(), $blockContext);
78+
}
79+
80+
return new ConfvalNode($id, $directive->getData(), $type, $required, $default, $additionalOptions, $collectionNode->getChildren());
81+
}
82+
}

packages/guides-restructured-text/src/RestructuredText/Directives/ContainerDirective.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use phpDocumentor\Guides\Nodes\CollectionNode;
88
use phpDocumentor\Guides\Nodes\Node;
99
use phpDocumentor\Guides\RestructuredText\Nodes\ContainerNode;
10+
use phpDocumentor\Guides\RestructuredText\Parser\BlockContext;
1011
use phpDocumentor\Guides\RestructuredText\Parser\Directive;
1112

1213
/**
@@ -32,6 +33,7 @@ public function getAliases(): array
3233
* @param Directive $directive
3334
*/
3435
protected function processSub(
36+
BlockContext $blockContext,
3537
CollectionNode $collectionNode,
3638
Directive $directive,
3739
): Node|null {

packages/guides-restructured-text/src/RestructuredText/Directives/DocumentBlockDirective.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use phpDocumentor\Guides\Nodes\CollectionNode;
88
use phpDocumentor\Guides\Nodes\DocumentBlockNode;
99
use phpDocumentor\Guides\Nodes\Node;
10+
use phpDocumentor\Guides\RestructuredText\Parser\BlockContext;
1011
use phpDocumentor\Guides\RestructuredText\Parser\Directive;
1112

1213
class DocumentBlockDirective extends SubDirective
@@ -21,6 +22,7 @@ public function getName(): string
2122
* @param Directive $directive
2223
*/
2324
protected function processSub(
25+
BlockContext $blockContext,
2426
CollectionNode $collectionNode,
2527
Directive $directive,
2628
): Node|null {

0 commit comments

Comments
 (0)