Skip to content

Commit bf440be

Browse files
committed
[FEATURE] Introduce Action Directive
An Action Directive does not return a node but does an action on the context
1 parent a2599db commit bf440be

File tree

6 files changed

+45
-34
lines changed

6 files changed

+45
-34
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace phpDocumentor\Guides\RestructuredText\Directives;
6+
7+
use phpDocumentor\Guides\Nodes\Node;
8+
use phpDocumentor\Guides\RestructuredText\Parser\Directive;
9+
use phpDocumentor\Guides\RestructuredText\Parser\DocumentParserContext;
10+
11+
/**
12+
* Extend this class to create a directive that does some actions, for example on the parser context, without
13+
* creating a node.
14+
*/
15+
abstract class ActionDirective extends BaseDirective
16+
{
17+
public function process(
18+
DocumentParserContext $documentParserContext,
19+
Directive $directive,
20+
): Node|null {
21+
$this->processAction($documentParserContext, $directive);
22+
23+
return null;
24+
}
25+
26+
/**
27+
* @param DocumentParserContext $documentParserContext the current document context with the content
28+
* of the directive
29+
* @param Directive $directive parsed directive containing options and variable
30+
*/
31+
abstract public function processAction(
32+
DocumentParserContext $documentParserContext,
33+
Directive $directive,
34+
): void;
35+
}

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

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -76,22 +76,6 @@ public function processNode(
7676
return new GenericNode($directive->getVariable(), $directive->getData());
7777
}
7878

79-
/**
80-
* This can be overloaded to write a directive that just do an action without changing
81-
* the nodes of the document
82-
*
83-
* The arguments are the same that process
84-
*
85-
* @param mixed[] $options
86-
*/
87-
public function processAction(
88-
DocumentParserContext $documentParserContext,
89-
string $variable,
90-
string $data,
91-
array $options,
92-
): void {
93-
}
94-
9579
/**
9680
* @param DirectiveOption[] $options
9781
*

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
namespace phpDocumentor\Guides\RestructuredText\Directives;
1515

16-
use phpDocumentor\Guides\Nodes\Node;
1716
use phpDocumentor\Guides\RestructuredText\Parser\Directive;
1817
use phpDocumentor\Guides\RestructuredText\Parser\DocumentParserContext;
1918
use phpDocumentor\Guides\RestructuredText\TextRoles\TextRoleFactory;
@@ -23,7 +22,7 @@
2322
*
2423
* https://docutils.sourceforge.io/docs/ref/rst/directives.html#default-role
2524
*/
26-
class DefaultRoleDirective extends BaseDirective
25+
class DefaultRoleDirective extends ActionDirective
2726
{
2827
public function __construct(
2928
private readonly TextRoleFactory $textRoleFactory,
@@ -35,13 +34,11 @@ public function getName(): string
3534
return 'default-role';
3635
}
3736

38-
public function process(
37+
public function processAction(
3938
DocumentParserContext $documentParserContext,
4039
Directive $directive,
41-
): Node|null {
40+
): void {
4241
$name = $directive->getData();
4342
$this->textRoleFactory->setDefaultTextRole($name);
44-
45-
return null;
4643
}
4744
}

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

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
namespace phpDocumentor\Guides\RestructuredText\Directives;
1515

16-
use phpDocumentor\Guides\Nodes\Node;
1716
use phpDocumentor\Guides\RestructuredText\Parser\Directive;
1817
use phpDocumentor\Guides\RestructuredText\Parser\DocumentParserContext;
1918
use phpDocumentor\Guides\RestructuredText\TextRoles\BaseTextRole;
@@ -30,7 +29,7 @@
3029
*
3130
* https://docutils.sourceforge.io/docs/ref/rst/directives.html#role
3231
*/
33-
class RoleDirective extends BaseDirective
32+
class RoleDirective extends ActionDirective
3433
{
3534
public function __construct(
3635
private readonly LoggerInterface $logger,
@@ -43,10 +42,10 @@ public function getName(): string
4342
return 'role';
4443
}
4544

46-
public function process(
45+
public function processAction(
4746
DocumentParserContext $documentParserContext,
4847
Directive $directive,
49-
): Node|null {
48+
): void {
5049
$name = $directive->getData();
5150
$role = 'span';
5251
if (preg_match('/^([A-Za-z-]*)\(([A-Za-z-]*)\)$/', trim($name), $match) > 0) {
@@ -58,7 +57,7 @@ public function process(
5857
if (!$baseRole instanceof BaseTextRole) {
5958
$this->logger->error('Text role "' . $role . '", class ' . $baseRole::class . ' cannot be extended. ');
6059

61-
return null;
60+
return;
6261
}
6362

6463
$customRole = $baseRole->withName($name);
@@ -73,7 +72,5 @@ public function process(
7372
}
7473

7574
$this->textRoleFactory->replaceTextRole($customRole);
76-
77-
return null;
7875
}
7976
}

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
namespace phpDocumentor\Guides\RestructuredText\Parser\Productions\InlineRules;
66

77
use phpDocumentor\Guides\Nodes\Inline\InlineNode;
8-
use phpDocumentor\Guides\ParserContext;
9-
use phpDocumentor\Guides\Nodes\Inline\LiteralInlineNode;
108
use phpDocumentor\Guides\RestructuredText\Parser\DocumentParserContext;
119
use phpDocumentor\Guides\RestructuredText\Parser\InlineLexer;
1210
use phpDocumentor\Guides\RestructuredText\TextRoles\TextRoleFactory;
@@ -42,7 +40,7 @@ public function apply(DocumentParserContext $documentParserContext, InlineLexer
4240

4341
$lexer->moveNext();
4442

45-
return $this->textRoleFactory->getDefaultTextRole()->processNode($parserContext, '', $text, $text);
43+
return $this->textRoleFactory->getDefaultTextRole()->processNode($documentParserContext, '', $text, $text);
4644

4745
default:
4846
$text .= $token->value;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
namespace phpDocumentor\Guides\RestructuredText\TextRoles;
66

77
use phpDocumentor\Guides\Nodes\Inline\GenericTextRoleInlineNode;
8-
use phpDocumentor\Guides\ParserContext;
8+
use phpDocumentor\Guides\RestructuredText\Parser\DocumentParserContext;
99

1010
/**
1111
* This text role is extended by custom text roles that do not feature a base text role:
@@ -23,7 +23,7 @@ class SpanTextRole extends BaseTextRole
2323
protected string $name = 'span';
2424

2525
public function processNode(
26-
ParserContext $parserContext,
26+
DocumentParserContext $documentParserContext,
2727
string $role,
2828
string $content,
2929
string $rawContent,

0 commit comments

Comments
 (0)