Skip to content

Commit 51976c3

Browse files
committed
1 parent 3d8482e commit 51976c3

File tree

8 files changed

+65
-4
lines changed

8 files changed

+65
-4
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@
193193

194194
->set(DefaultTextRoleFactory::class, DefaultTextRoleFactory::class)
195195
->arg('$genericTextRole', inline_service(GenericTextRole::class))
196+
->arg('$defaultTextRole', inline_service(LiteralTextRole::class))
196197
->arg('$textRoles', tagged_iterator('phpdoc.guides.parser.rst.text_role'))
197198
->alias(TextRoleFactory::class, DefaultTextRoleFactory::class)
198199

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

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,35 @@
1313

1414
namespace phpDocumentor\Guides\RestructuredText\Directives;
1515

16+
use phpDocumentor\Guides\Nodes\Node;
17+
use phpDocumentor\Guides\RestructuredText\Parser\Directive;
18+
use phpDocumentor\Guides\RestructuredText\Parser\DocumentParserContext;
19+
use phpDocumentor\Guides\RestructuredText\TextRoles\DefaultTextRoleFactory;
20+
1621
/**
1722
* sets the default interpreted text role, the role that is used for interpreted text without an explicit role.
1823
*
1924
* https://docutils.sourceforge.io/docs/ref/rst/directives.html#default-role
2025
*/
21-
class DefaultRoleDirective extends SubDirective
26+
class DefaultRoleDirective extends BaseDirective
2227
{
28+
public function __construct(
29+
private readonly DefaultTextRoleFactory $textRoleFactory,
30+
) {
31+
}
32+
2333
public function getName(): string
2434
{
2535
return 'default-role';
2636
}
37+
38+
public function process(
39+
DocumentParserContext $documentParserContext,
40+
Directive $directive,
41+
): Node|null {
42+
$name = $directive->getData();
43+
$this->textRoleFactory->setDefaultTextRole($name);
44+
45+
return null;
46+
}
2747
}

packages/guides-restructured-text/src/RestructuredText/Parser/Productions/InlineRules/DefaultTextRoleRule.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,21 @@
55
namespace phpDocumentor\Guides\RestructuredText\Parser\Productions\InlineRules;
66

77
use phpDocumentor\Guides\Nodes\Inline\InlineNode;
8+
use phpDocumentor\Guides\ParserContext;
89
use phpDocumentor\Guides\Nodes\Inline\LiteralInlineNode;
910
use phpDocumentor\Guides\RestructuredText\Parser\DocumentParserContext;
1011
use phpDocumentor\Guides\RestructuredText\Parser\InlineLexer;
12+
use phpDocumentor\Guides\RestructuredText\TextRoles\DefaultTextRoleFactory;
1113

1214
/**
1315
* Rule to parse for default text roles such as `something`
1416
*/
1517
class DefaultTextRoleRule extends AbstractInlineRule
1618
{
19+
public function __construct(private readonly DefaultTextRoleFactory $textRoleFactory)
20+
{
21+
}
22+
1723
public function applies(InlineLexer $lexer): bool
1824
{
1925
return $lexer->token?->type === InlineLexer::BACKTICK;
@@ -36,7 +42,7 @@ public function apply(DocumentParserContext $documentParserContext, InlineLexer
3642

3743
$lexer->moveNext();
3844

39-
return new LiteralInlineNode($text);
45+
return $this->textRoleFactory->getDefaultTextRole()->processNode($parserContext, '', $text, $text);
4046

4147
default:
4248
$text .= $token->value;

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class DefaultTextRoleFactory implements TextRoleFactory
1717
*/
1818
public function __construct(
1919
private readonly TextRole $genericTextRole,
20+
private TextRole $defaultTextRole,
2021
iterable $textRoles = [],
2122
private array $domains = [],
2223
) {
@@ -43,6 +44,10 @@ public function replaceTextRole(TextRole $newTextRole): void
4344

4445
public function getTextRole(string $name, string|null $domain = null): TextRole
4546
{
47+
if ($name === 'default') {
48+
return $this->defaultTextRole;
49+
}
50+
4651
if ($domain === null) {
4752
return $this->findTextRole($this->textRoles, $name);
4853
}
@@ -73,4 +78,19 @@ private function findTextRole(array $textRoles, string $name): TextRole
7378

7479
return $this->genericTextRole;
7580
}
81+
82+
public function setDefaultTextRole(string $roleName): void
83+
{
84+
$newDefault = $this->getTextRole($roleName);
85+
if ($newDefault instanceof GenericTextRole) {
86+
$newDefault->setBaseRole($roleName);
87+
}
88+
89+
$this->defaultTextRole = $this->getTextRole($roleName);
90+
}
91+
92+
public function getDefaultTextRole(): TextRole
93+
{
94+
return $this->defaultTextRole;
95+
}
7696
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use phpDocumentor\Guides\Nodes\Inline\DocReferenceNode;
1010
use phpDocumentor\Guides\Nodes\Inline\EmphasisInlineNode;
1111
use phpDocumentor\Guides\Nodes\Inline\FootnoteInlineNode;
12+
use phpDocumentor\Guides\Nodes\Inline\GenericTextRoleInlineNode;
1213
use phpDocumentor\Guides\Nodes\Inline\HyperLinkNode;
1314
use phpDocumentor\Guides\Nodes\Inline\LiteralInlineNode;
1415
use phpDocumentor\Guides\Nodes\Inline\PlainTextInlineNode;
@@ -33,6 +34,7 @@
3334
use phpDocumentor\Guides\RestructuredText\TextRoles\DefaultTextRoleFactory;
3435
use phpDocumentor\Guides\RestructuredText\TextRoles\DocReferenceTextRole;
3536
use phpDocumentor\Guides\RestructuredText\TextRoles\GenericTextRole;
37+
use phpDocumentor\Guides\RestructuredText\TextRoles\LiteralTextRole;
3638
use phpDocumentor\Guides\RestructuredText\TextRoles\ReferenceTextRole;
3739
use PHPUnit\Framework\Attributes\DataProvider;
3840
use PHPUnit\Framework\MockObject\MockObject;
@@ -50,6 +52,7 @@ public function setUp(): void
5052
$this->documentParserContext = $this->createMock(DocumentParserContext::class);
5153
$defaultTextRoleFactory = new DefaultTextRoleFactory(
5254
new GenericTextRole(),
55+
new LiteralTextRole(),
5356
[
5457
new ReferenceTextRole($this->logger),
5558
new DocReferenceTextRole($this->logger),
@@ -65,7 +68,7 @@ public function setUp(): void
6568
new AnonymousPhraseRule(),
6669
new AnnotationRoleRule(),
6770
new LiteralRule(),
68-
new DefaultTextRoleRule(),
71+
new DefaultTextRoleRule($defaultTextRoleFactory),
6972
new StandaloneHyperlinkRule(),
7073
new EmphasisRule(),
7174
new StrongRule(),
@@ -219,7 +222,7 @@ public static function inlineNodeProvider(): array
219222
],
220223
'Default Textrole' => [
221224
'`simple`',
222-
new InlineCompoundNode([new LiteralInlineNode('simple')]),
225+
new InlineCompoundNode([new GenericTextRoleInlineNode('literal', 'simple')]),
223226
],
224227
'Hyperlink' => [
225228
'https://example.com',

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public function setUp(): void
1717
$this->logger = new Logger('test');
1818
$this->defaultTextRoleFactory = new DefaultTextRoleFactory(
1919
new GenericTextRole(),
20+
new LiteralTextRole(),
2021
[],
2122
[],
2223
);

tests/Integration/tests/role-directive/expected/index.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ <h1>Some Title</h1>
1212
<p><em class="custom">text</em></p>
1313
<p><code class="raw raw-role">raw text</code></p>
1414
<p><span class="special">interpreted text</span></p>
15+
<p>An example of a <sub>default</sub> role.</p>
16+
<p>An example of a <span class="special">custom default</span> role.</p>
1517
</div>
1618

1719
</body>

tests/Integration/tests/role-directive/input/index.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,11 @@ An example of using :custom:`interpreted text`
1818
:class: special
1919

2020
:custom:`interpreted text`
21+
22+
.. default-role:: subscript
23+
24+
An example of a `default` role.
25+
26+
.. default-role:: custom
27+
28+
An example of a `custom default` role.

0 commit comments

Comments
 (0)