Skip to content

Commit 7f508d7

Browse files
committed
[BUGFIX] Allow Emails in anonymous links
depends on #573
1 parent ed20587 commit 7f508d7

File tree

6 files changed

+107
-0
lines changed

6 files changed

+107
-0
lines changed

packages/guides/resources/config/guides.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@
2424
use phpDocumentor\Guides\NodeRenderers\NodeRendererFactoryAware;
2525
use phpDocumentor\Guides\NodeRenderers\PreRenderers\PreNodeRendererFactory;
2626
use phpDocumentor\Guides\Parser;
27+
use phpDocumentor\Guides\ReferenceResolvers\AnchorReferenceResolver;
2728
use phpDocumentor\Guides\ReferenceResolvers\DelegatingReferenceResolver;
2829
use phpDocumentor\Guides\ReferenceResolvers\DocReferenceResolver;
30+
use phpDocumentor\Guides\ReferenceResolvers\EmailReferenceResolver;
2931
use phpDocumentor\Guides\ReferenceResolvers\ExternalReferenceResolver;
3032
use phpDocumentor\Guides\ReferenceResolvers\InternalReferenceResolver;
3133
use phpDocumentor\Guides\ReferenceResolvers\IntersphinxReferenceResolver;
@@ -120,6 +122,10 @@
120122

121123
->set(ExternalReferenceResolver::class)
122124

125+
->set(EmailReferenceResolver::class)
126+
127+
->set(AnchorReferenceResolver::class)
128+
123129
->set(InternalReferenceResolver::class)
124130

125131
->set(DocReferenceResolver::class)
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace phpDocumentor\Guides\ReferenceResolvers;
6+
7+
use phpDocumentor\Guides\Nodes\Inline\LinkInlineNode;
8+
use phpDocumentor\Guides\RenderContext;
9+
10+
use function filter_var;
11+
12+
use const FILTER_VALIDATE_EMAIL;
13+
14+
/**
15+
* Resolves references with an anchor URL.
16+
*
17+
* A link is an anchor if it starts with a hashtag
18+
*/
19+
class AnchorReferenceResolver implements ReferenceResolver
20+
{
21+
public final const PRIORITY = -100;
22+
23+
public function resolve(LinkInlineNode $node, RenderContext $renderContext): bool
24+
{
25+
if (filter_var($node->getTargetReference(), FILTER_VALIDATE_EMAIL)) {
26+
$node->setUrl('mailto:' . $node->getTargetReference());
27+
28+
return true;
29+
}
30+
31+
return false;
32+
}
33+
34+
public static function getPriority(): int
35+
{
36+
return self::PRIORITY;
37+
}
38+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace phpDocumentor\Guides\ReferenceResolvers;
6+
7+
use phpDocumentor\Guides\Nodes\Inline\LinkInlineNode;
8+
use phpDocumentor\Guides\RenderContext;
9+
10+
use function filter_var;
11+
12+
use const FILTER_VALIDATE_EMAIL;
13+
14+
/**
15+
* Resolves references with an embedded email address
16+
*/
17+
class EmailReferenceResolver implements ReferenceResolver
18+
{
19+
public final const PRIORITY = -100;
20+
21+
public function resolve(LinkInlineNode $node, RenderContext $renderContext): bool
22+
{
23+
if (filter_var($node->getTargetReference(), FILTER_VALIDATE_EMAIL)) {
24+
$node->setUrl('mailto:' . $node->getTargetReference());
25+
26+
return true;
27+
}
28+
29+
return false;
30+
}
31+
32+
public static function getPriority(): int
33+
{
34+
return self::PRIORITY;
35+
}
36+
}

packages/guides/src/ReferenceResolvers/ExternalReferenceResolver.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
use phpDocumentor\Guides\Nodes\Inline\LinkInlineNode;
88
use phpDocumentor\Guides\RenderContext;
99

10+
use function filter_var;
1011
use function parse_url;
1112
use function preg_match;
1213
use function str_starts_with;
1314

15+
use const FILTER_VALIDATE_EMAIL;
1416
use const PHP_URL_SCHEME;
1517

1618
/**
@@ -34,6 +36,12 @@ public function resolve(LinkInlineNode $node, RenderContext $renderContext): boo
3436
return true;
3537
}
3638

39+
if (filter_var($node->getTargetReference(), FILTER_VALIDATE_EMAIL)) {
40+
$node->setUrl('mailto:' . $node->getTargetReference());
41+
42+
return true;
43+
}
44+
3745
$url = parse_url($node->getTargetReference(), PHP_URL_SCHEME);
3846
if ($url !== null && $url !== false && preg_match('/^' . self::SUPPORTED_SCHEMAS . '$/', $url)) {
3947
$node->setUrl($node->getTargetReference());
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<title>Some file</title>
5+
6+
</head>
7+
<body>
8+
<div class="section" id="some-file">
9+
<h1>Some file</h1>
10+
11+
<p><a href="mailto:git@github.com">link to email</a></p>
12+
</div>
13+
14+
</body>
15+
</html>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Some file
2+
=========
3+
4+
`link to email <git@github.com>`__

0 commit comments

Comments
 (0)