Skip to content

Commit 9fc8238

Browse files
authored
Merge pull request #798 from phpDocumentor/task/improve-menu-items
!!![TASK] Improve Reference parsing
2 parents 4f66706 + ac1786b commit 9fc8238

File tree

7 files changed

+46
-46
lines changed

7 files changed

+46
-46
lines changed

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

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66

77
use phpDocumentor\Guides\Nodes\Inline\AbstractLinkInlineNode;
88
use phpDocumentor\Guides\RestructuredText\Parser\BlockContext;
9-
use phpDocumentor\Guides\RestructuredText\Parser\EmbeddedUriParser;
109
use phpDocumentor\Guides\RestructuredText\Parser\InlineLexer;
10+
use phpDocumentor\Guides\RestructuredText\Parser\References\EmbeddedReferenceParser;
1111

1212
/**
1313
* Rule to parse for anonymous references
@@ -21,7 +21,7 @@
2121
*/
2222
class AnonymousPhraseRule extends ReferenceRule
2323
{
24-
use EmbeddedUriParser;
24+
use EmbeddedReferenceParser;
2525

2626
public function applies(InlineLexer $lexer): bool
2727
{
@@ -61,16 +61,10 @@ public function apply(BlockContext $blockContext, InlineLexer $lexer): AbstractL
6161

6262
private function createAnonymousReference(BlockContext $blockContext, string $value): AbstractLinkInlineNode
6363
{
64-
$parsed = $this->extractEmbeddedUri($value);
65-
$link = $parsed['text'];
66-
$uri = $parsed['uri'];
67-
if ($link === null) {
68-
$link = $uri;
69-
$uri = null;
70-
}
64+
$referenceData = $this->extractEmbeddedReference($value);
7165

72-
$node = $this->createReference($blockContext, $link, $uri, false);
73-
$blockContext->getDocumentParserContext()->pushAnonymous($link);
66+
$node = $this->createReference($blockContext, $referenceData->reference, $referenceData->text, false);
67+
$blockContext->getDocumentParserContext()->pushAnonymous($referenceData->reference);
7468

7569
return $node;
7670
}

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

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66

77
use phpDocumentor\Guides\Nodes\Inline\InlineNode;
88
use phpDocumentor\Guides\RestructuredText\Parser\BlockContext;
9-
use phpDocumentor\Guides\RestructuredText\Parser\EmbeddedUriParser;
109
use phpDocumentor\Guides\RestructuredText\Parser\InlineLexer;
10+
use phpDocumentor\Guides\RestructuredText\Parser\References\EmbeddedReferenceParser;
1111

1212
/**
1313
* Rule to parse for named references
@@ -21,7 +21,7 @@
2121
*/
2222
class NamedPhraseRule extends ReferenceRule
2323
{
24-
use EmbeddedUriParser;
24+
use EmbeddedReferenceParser;
2525

2626
public function applies(InlineLexer $lexer): bool
2727
{
@@ -45,15 +45,9 @@ public function apply(BlockContext $blockContext, InlineLexer $lexer): InlineNod
4545

4646
$lexer->moveNext();
4747

48-
$parsed = $this->extractEmbeddedUri($value);
49-
$text = $parsed['text'];
50-
$uri = $parsed['uri'];
51-
if ($text === null) {
52-
$text = $uri;
53-
$uri = null;
54-
}
48+
$referenceData = $this->extractEmbeddedReference($value);
5549

56-
return $this->createReference($blockContext, $text, $uri);
50+
return $this->createReference($blockContext, $referenceData->reference, $referenceData->text);
5751

5852
case InlineLexer::WHITESPACE:
5953
$value .= ' ';

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

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,23 @@
2020

2121
abstract class ReferenceRule extends AbstractInlineRule
2222
{
23-
protected function createReference(BlockContext $blockContext, string $link, string|null $embeddedUrl = null, bool $registerLink = true): AbstractLinkInlineNode
23+
protected function createReference(BlockContext $blockContext, string $reference, string|null $text = null, bool $registerLink = true): AbstractLinkInlineNode
2424
{
2525
// the link may have a new line in it, so we need to strip it
2626
// before setting the link and adding a token to be replaced
27-
$link = str_replace("\n", ' ', $link);
28-
$link = trim(preg_replace('/\s+/', ' ', $link) ?? '');
27+
$reference = str_replace("\n", ' ', $reference);
28+
$reference = trim(preg_replace('/\s+/', ' ', $reference) ?? '');
2929

30-
$targetLink = $embeddedUrl ?? $link;
31-
if (str_ends_with($targetLink, '.rst') && filter_var($targetLink, FILTER_VALIDATE_URL) === false) {
32-
$targetLink = substr($targetLink, 0, -4);
30+
if (str_ends_with($reference, '.rst') && filter_var($reference, FILTER_VALIDATE_URL) === false) {
31+
$reference = substr($reference, 0, -4);
3332

34-
return new DocReferenceNode($targetLink, $link);
33+
return new DocReferenceNode($reference, $text ?? $reference);
3534
}
3635

37-
if ($registerLink && $embeddedUrl !== null) {
38-
$blockContext->getDocumentParserContext()->setLink($link, $embeddedUrl);
36+
if ($registerLink && $text !== null) {
37+
$blockContext->getDocumentParserContext()->setLink($text, $reference);
3938
}
4039

41-
return new HyperLinkNode($link, $targetLink);
40+
return new HyperLinkNode($text ?? $reference, $reference);
4241
}
4342
}

packages/guides-restructured-text/src/RestructuredText/Parser/EmbeddedUriParser.php renamed to packages/guides-restructured-text/src/RestructuredText/Parser/References/EmbeddedReferenceParser.php

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,26 @@
22

33
declare(strict_types=1);
44

5-
namespace phpDocumentor\Guides\RestructuredText\Parser;
5+
namespace phpDocumentor\Guides\RestructuredText\Parser\References;
66

77
use function preg_match;
88

9-
trait EmbeddedUriParser
9+
trait EmbeddedReferenceParser
1010
{
11-
/** @return array{text:?string,uri:string} */
12-
private function extractEmbeddedUri(string $text): array
11+
private function extractEmbeddedReference(string $text): ReferenceData
1312
{
1413
preg_match('/^(.*?)(?:(?:\s|^)<([^<]+)>)?$/s', $text, $matches);
1514

1615
$text = $matches[1] === '' ? null : $matches[1];
17-
$uri = $matches[1];
16+
$reference = $matches[1];
1817

1918
if (isset($matches[2])) {
2019
// there is an embedded URI, text and URI are different
21-
$uri = $matches[2];
20+
$reference = $matches[2];
2221
} else {
2322
$text = null;
2423
}
2524

26-
return ['text' => $text, 'uri' => $uri];
25+
return new ReferenceData($reference, $text);
2726
}
2827
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace phpDocumentor\Guides\RestructuredText\Parser\References;
6+
7+
final class ReferenceData
8+
{
9+
public function __construct(
10+
public readonly string $reference,
11+
public readonly string|null $text,
12+
) {
13+
}
14+
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,22 @@
66

77
use phpDocumentor\Guides\Nodes\Inline\AbstractLinkInlineNode;
88
use phpDocumentor\Guides\RestructuredText\Parser\DocumentParserContext;
9-
use phpDocumentor\Guides\RestructuredText\Parser\EmbeddedUriParser;
9+
use phpDocumentor\Guides\RestructuredText\Parser\References\EmbeddedReferenceParser;
1010

1111
/** @see https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#embedded-uris-and-aliases */
1212
abstract class AbstractReferenceTextRole implements TextRole
1313
{
14-
use EmbeddedUriParser;
14+
use EmbeddedReferenceParser;
1515

1616
public function processNode(
1717
DocumentParserContext $documentParserContext,
1818
string $role,
1919
string $content,
2020
string $rawContent,
2121
): AbstractLinkInlineNode {
22-
$parsed = $this->extractEmbeddedUri($content);
22+
$referenceData = $this->extractEmbeddedReference($content);
2323

24-
return $this->createNode($parsed['uri'], $parsed['text'], $role);
24+
return $this->createNode($referenceData->reference, $referenceData->text, $role);
2525
}
2626

2727
abstract protected function createNode(string $referenceTarget, string|null $referenceName, string $role): AbstractLinkInlineNode;

packages/guides-restructured-text/src/RestructuredText/Toc/ToctreeBuilder.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66

77
use phpDocumentor\Guides\Nodes\Menu\MenuDefinitionLineNode;
88
use phpDocumentor\Guides\ParserContext;
9-
use phpDocumentor\Guides\RestructuredText\Parser\EmbeddedUriParser;
109
use phpDocumentor\Guides\RestructuredText\Parser\LinesIterator;
10+
use phpDocumentor\Guides\RestructuredText\Parser\References\EmbeddedReferenceParser;
1111

1212
use function array_filter;
1313
use function array_map;
1414

1515
class ToctreeBuilder
1616
{
17-
use EmbeddedUriParser;
17+
use EmbeddedReferenceParser;
1818

1919
/**
2020
* @param mixed[] $options
@@ -45,8 +45,8 @@ private function parseToctreeEntryLines(LinesIterator $lines): array
4545

4646
$result = [];
4747
foreach ($linesArray as $line) {
48-
$parsed = $this->extractEmbeddedUri($line);
49-
$result[] = new MenuDefinitionLineNode($parsed['uri'], $parsed['text']);
48+
$referenceData = $this->extractEmbeddedReference($line);
49+
$result[] = new MenuDefinitionLineNode($referenceData->reference, $referenceData->text);
5050
}
5151

5252
return $result;

0 commit comments

Comments
 (0)