Skip to content

Commit c784542

Browse files
linawolfjaapio
authored andcommitted
[TASK] Ignore domains in directives and textroles
1 parent 4d9f353 commit c784542

File tree

12 files changed

+140
-14
lines changed

12 files changed

+140
-14
lines changed

guides.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
log-path="php://stder"
1212
>
1313
<project title="Guides"/>
14+
<ignored_domain>phpdoc</ignored_domain>
15+
<ignored_domain>php</ignored_domain>
1416
<extension class="phpDocumentor\Guides\Bootstrap"/>
1517
<extension class="phpDocumentor\Guides\Code"/>
1618
</guides>

packages/guides-cli/resources/schema/guides.xsd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
<xsd:element name="base-template-path" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
1515
<xsd:element name="extension" type="extension" minOccurs="0" maxOccurs="unbounded"/>
1616
<xsd:element name="output-format" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
17+
<xsd:element name="ignored_domain" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
1718
<xsd:element name="inventory" type="inventory" minOccurs="0" maxOccurs="unbounded"/>
1819
<xsd:element name="template" type="template" minOccurs="0" maxOccurs="unbounded"/>
1920
</xsd:choice>

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@
116116
use phpDocumentor\Guides\RestructuredText\TextRoles\TextRoleFactory;
117117
use phpDocumentor\Guides\RestructuredText\Toc\GlobSearcher;
118118
use phpDocumentor\Guides\RestructuredText\Toc\ToctreeBuilder;
119+
use phpDocumentor\Guides\Settings\SettingsManager;
119120
use Psr\Log\LoggerInterface;
120121
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
121122

@@ -234,9 +235,11 @@
234235
->set(WarningDirective::class)
235236
->set(YoutubeDirective::class)
236237

237-
238+
->set(GenericTextRole::class, GenericTextRole::class)
239+
->arg('$settingsManager', inline_service(SettingsManager::class))
238240
->set(DefaultTextRoleFactory::class, DefaultTextRoleFactory::class)
239-
->arg('$genericTextRole', inline_service(GenericTextRole::class))
241+
->arg('$genericTextRole', service(GenericTextRole::class))
242+
240243
->arg('$defaultTextRole', inline_service(LiteralTextRole::class))
241244
->arg('$textRoles', tagged_iterator('phpdoc.guides.parser.rst.text_role'))
242245
->alias(TextRoleFactory::class, DefaultTextRoleFactory::class)

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,26 @@
1919
use phpDocumentor\Guides\RestructuredText\Nodes\GeneralDirectiveNode;
2020
use phpDocumentor\Guides\RestructuredText\Parser\BlockContext;
2121
use phpDocumentor\Guides\RestructuredText\Parser\Directive;
22+
use phpDocumentor\Guides\RestructuredText\Parser\Productions\Rule;
23+
use phpDocumentor\Guides\Settings\SettingsManager;
24+
25+
use function explode;
26+
use function in_array;
27+
use function str_contains;
2228

2329
/**
2430
* A catch-all directive, the content is treated as content, the options passed on
2531
*/
2632
final class GeneralDirective extends SubDirective
2733
{
34+
/** @param Rule<CollectionNode> $startingRule */
35+
public function __construct(
36+
Rule $startingRule,
37+
private readonly SettingsManager $settingsManager,
38+
) {
39+
parent::__construct($startingRule);
40+
}
41+
2842
public function getName(): string
2943
{
3044
return '';
@@ -39,6 +53,13 @@ protected function processSub(
3953
CollectionNode $collectionNode,
4054
Directive $directive,
4155
): Node|null {
56+
if (str_contains($directive->getName(), ':')) {
57+
[$domainName, $directiveName] = explode(':', $directive->getName());
58+
if (in_array($domainName, $this->settingsManager->getProjectSettings()->getIgnoredDomains(), true)) {
59+
return $collectionNode;
60+
}
61+
}
62+
4263
return new GeneralDirectiveNode(
4364
$directive->getName(),
4465
$directive->getData(),

packages/guides-restructured-text/src/RestructuredText/TextRoles/GenericTextRole.php

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,38 @@
1414
namespace phpDocumentor\Guides\RestructuredText\TextRoles;
1515

1616
use phpDocumentor\Guides\Nodes\Inline\GenericTextRoleInlineNode;
17+
use phpDocumentor\Guides\Nodes\Inline\InlineNode;
18+
use phpDocumentor\Guides\Nodes\Inline\PlainTextInlineNode;
1719
use phpDocumentor\Guides\RestructuredText\Parser\DocumentParserContext;
20+
use phpDocumentor\Guides\Settings\SettingsManager;
21+
22+
use function explode;
23+
use function in_array;
24+
use function str_contains;
1825

1926
final class GenericTextRole extends BaseTextRole
2027
{
2128
protected string $name = 'default';
2229
protected string|null $baseRole = null;
2330

31+
public function __construct(
32+
private readonly SettingsManager $settingsManager,
33+
) {
34+
}
35+
2436
public function processNode(
2537
DocumentParserContext $documentParserContext,
2638
string $role,
2739
string $content,
2840
string $rawContent,
29-
): GenericTextRoleInlineNode {
41+
): InlineNode {
42+
if (str_contains($role, ':')) {
43+
[$domainName, $directiveName] = explode(':', $role);
44+
if (in_array($domainName, $this->settingsManager->getProjectSettings()->getIgnoredDomains(), true)) {
45+
return new PlainTextInlineNode($content);
46+
}
47+
}
48+
3049
return new GenericTextRoleInlineNode($this->baseRole ?? $role, $content, $this->getClass());
3150
}
3251

packages/guides-restructured-text/tests/unit/NodeRenderers/Html/GeneralDirectiveNodeRendererTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use phpDocumentor\Guides\RestructuredText\TextRoles\DefaultTextRoleFactory;
2121
use phpDocumentor\Guides\RestructuredText\TextRoles\GenericTextRole;
2222
use phpDocumentor\Guides\RestructuredText\TextRoles\LiteralTextRole;
23+
use phpDocumentor\Guides\Settings\SettingsManager;
2324
use phpDocumentor\Guides\TemplateRenderer;
2425
use PHPUnit\Framework\Attributes\DataProvider;
2526
use PHPUnit\Framework\MockObject\MockObject;
@@ -40,7 +41,7 @@ public function setUp(): void
4041
new Logger('test'),
4142
);
4243
$textRoleFactory = new DefaultTextRoleFactory(
43-
new GenericTextRole(),
44+
new GenericTextRole(self::createMock(SettingsManager::class)),
4445
new LiteralTextRole(),
4546
[],
4647
);

packages/guides-restructured-text/tests/unit/Parser/InlineTokenParserTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
use phpDocumentor\Guides\RestructuredText\TextRoles\GenericTextRole;
4848
use phpDocumentor\Guides\RestructuredText\TextRoles\LiteralTextRole;
4949
use phpDocumentor\Guides\RestructuredText\TextRoles\ReferenceTextRole;
50+
use phpDocumentor\Guides\Settings\SettingsManager;
5051
use PHPUnit\Framework\Attributes\DataProvider;
5152
use PHPUnit\Framework\TestCase;
5253

@@ -59,7 +60,7 @@ final class InlineTokenParserTest extends TestCase
5960
public function setUp(): void
6061
{
6162
$this->textRoleFactory = new DefaultTextRoleFactory(
62-
new GenericTextRole(),
63+
new GenericTextRole(self::createMock(SettingsManager::class)),
6364
new LiteralTextRole(),
6465
[
6566
new ReferenceTextRole(),

packages/guides-restructured-text/tests/unit/Parser/Productions/DirectiveRuleTest.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use phpDocumentor\Guides\RestructuredText\Directives\OptionMapper\CodeNodeOptionMapper;
2222
use phpDocumentor\Guides\RestructuredText\Parser\DummyBaseDirective;
2323
use phpDocumentor\Guides\RestructuredText\Parser\DummyNode;
24+
use phpDocumentor\Guides\Settings\SettingsManager;
2425
use PHPUnit\Framework\Attributes\DataProvider;
2526

2627
use function array_values;
@@ -36,7 +37,7 @@ public function setUp(): void
3637
$this->rule = new DirectiveRule(
3738
$this->givenInlineMarkupRule(),
3839
new Logger('test'),
39-
new GeneralDirective(new DirectiveContentRule(new RuleContainer())),
40+
new GeneralDirective(new DirectiveContentRule(new RuleContainer()), self::createMock(SettingsManager::class)),
4041
[$this->directiveHandler],
4142
);
4243
}
@@ -112,7 +113,7 @@ public function testCodeBlockValue(string $input, string $expectedValue): void
112113
$this->rule = new DirectiveRule(
113114
$this->givenInlineMarkupRule(),
114115
new Logger('test'),
115-
new GeneralDirective(new DirectiveContentRule(new RuleContainer())),
116+
new GeneralDirective(new DirectiveContentRule(new RuleContainer()), self::createMock(SettingsManager::class)),
116117
[$this->directiveHandler, new CodeBlockDirective($logger, $this->createMock(CodeNodeOptionMapper::class))],
117118
);
118119
$context = $this->createContext($input);

packages/guides-restructured-text/tests/unit/TextRoles/DefaultTextRoleFactoryTest.php

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
namespace phpDocumentor\Guides\RestructuredText\TextRoles;
1515

1616
use Monolog\Logger;
17+
use phpDocumentor\Guides\Settings\SettingsManager;
1718
use PHPUnit\Framework\TestCase;
1819

1920
final class DefaultTextRoleFactoryTest extends TestCase
@@ -25,7 +26,7 @@ public function setUp(): void
2526
{
2627
$this->logger = new Logger('test');
2728
$this->defaultTextRoleFactory = new DefaultTextRoleFactory(
28-
new GenericTextRole(),
29+
new GenericTextRole(self::createMock(SettingsManager::class)),
2930
new LiteralTextRole(),
3031
[],
3132
[],
@@ -38,12 +39,6 @@ public function testUnknownTextRoleReturnsGenericTextRole(): void
3839
self::assertInstanceOf(GenericTextRole::class, $textRole);
3940
}
4041

41-
public function testUnknownDomainReturnsGenericTextRole(): void
42-
{
43-
$textRole = $this->defaultTextRoleFactory->getTextRole('unknown', 'unknown');
44-
self::assertInstanceOf(GenericTextRole::class, $textRole);
45-
}
46-
4742
public function testRegisteredTextRoleIsReturned(): void
4843
{
4944
$this->defaultTextRoleFactory->registerTextRole(new AbbreviationTextRole($this->logger));
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* This file is part of phpDocumentor.
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*
11+
* @link https://phpdoc.org
12+
*/
13+
14+
namespace phpDocumentor\Guides\RestructuredText\TextRoles;
15+
16+
use phpDocumentor\Guides\Nodes\Inline\GenericTextRoleInlineNode;
17+
use phpDocumentor\Guides\Nodes\Inline\PlainTextInlineNode;
18+
use phpDocumentor\Guides\RestructuredText\Parser\DocumentParserContext;
19+
use phpDocumentor\Guides\Settings\ProjectSettings;
20+
use phpDocumentor\Guides\Settings\SettingsManager;
21+
use PHPUnit\Framework\TestCase;
22+
23+
final class GenericTextRoleTest extends TestCase
24+
{
25+
private SettingsManager $settingsManager;
26+
private ProjectSettings $projectSettings;
27+
private GenericTextRole $subject;
28+
private DocumentParserContext $documentParserContext;
29+
30+
public function setUp(): void
31+
{
32+
$this->projectSettings = new ProjectSettings();
33+
$this->settingsManager = new SettingsManager($this->projectSettings);
34+
$this->documentParserContext = self::createMock(DocumentParserContext::class);
35+
$this->subject = new GenericTextRole(
36+
$this->settingsManager,
37+
);
38+
}
39+
40+
public function testIgnoredDomainReturnsPlainTextInlineNode(): void
41+
{
42+
$this->projectSettings->setIgnoredDomains(['ignored', 'alsoignored']);
43+
$inline = $this->subject->processNode($this->documentParserContext, 'ignored:role', '', '');
44+
self::assertInstanceOf(PlainTextInlineNode::class, $inline);
45+
}
46+
47+
public function testUnknownDomainReturnsGenericTextRoleInlineNode(): void
48+
{
49+
$this->projectSettings->setIgnoredDomains(['ignored', 'alsoignored']);
50+
$inline = $this->subject->processNode($this->documentParserContext, 'notignored:role', '', '');
51+
self::assertInstanceOf(GenericTextRoleInlineNode::class, $inline);
52+
}
53+
}

packages/guides/src/DependencyInjection/GuidesExtension.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,16 @@ static function ($value) {
104104
->end()
105105
->scalarPrototype()->end()
106106
->end()
107+
->arrayNode('ignored_domain')
108+
->defaultValue([])
109+
->beforeNormalization()
110+
->ifString()
111+
->then(static function ($value) {
112+
return [$value];
113+
})
114+
->end()
115+
->scalarPrototype()->end()
116+
->end()
107117
->scalarNode('log_path')->end()
108118
->scalarNode('fail_on_log')->end()
109119
->scalarNode('fail_on_error')->end()
@@ -217,6 +227,10 @@ public function load(array $configs, ContainerBuilder $container): void
217227
$projectSettings->setOutputFormats($config['output_format']);
218228
}
219229

230+
if (isset($config['ignored_domain']) && is_array($config['ignored_domain'])) {
231+
$projectSettings->setIgnoredDomains($config['ignored_domain']);
232+
}
233+
220234
if (isset($config['links_are_relative'])) {
221235
$projectSettings->setLinksRelative((bool) $config['links_are_relative']);
222236
}

packages/guides/src/Settings/ProjectSettings.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ final class ProjectSettings
3535
private string $defaultCodeLanguage = '';
3636
private int $maxMenuDepth = 0;
3737

38+
/** @var string[] */
39+
private array $ignoredDomains = [];
40+
3841
public function getTitle(): string
3942
{
4043
return $this->title;
@@ -215,4 +218,16 @@ public function setMaxMenuDepth(int $maxMenuDepth): ProjectSettings
215218

216219
return $this;
217220
}
221+
222+
/** @return string[] */
223+
public function getIgnoredDomains(): array
224+
{
225+
return $this->ignoredDomains;
226+
}
227+
228+
/** @param string[] $ignoredDomains */
229+
public function setIgnoredDomains(array $ignoredDomains): void
230+
{
231+
$this->ignoredDomains = $ignoredDomains;
232+
}
218233
}

0 commit comments

Comments
 (0)