Completed
Push — master ( 7a0a03...73b89e )
by Colin
02:28
created

EmailAutolinkProcessor::processAutolinks()   B

Complexity

Conditions 8
Paths 8

Size

Total Lines 39

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 22
CRAP Score 8

Importance

Changes 0
Metric Value
dl 0
loc 39
ccs 22
cts 22
cp 1
rs 8.0515
c 0
b 0
f 0
cc 8
nc 8
nop 1
crap 8
1
<?php
2
3
/*
4
 * This file is part of the league/commonmark package.
5
 *
6
 * (c) Colin O'Dell <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace League\CommonMark\Extension\Autolink;
13
14
use League\CommonMark\Event\DocumentParsedEvent;
15
use League\CommonMark\Extension\CommonMark\Node\Inline\Link;
16
use League\CommonMark\Node\Inline\Text;
17
18
final class EmailAutolinkProcessor
19
{
20
    const REGEX = '/([A-Za-z0-9.\-_+]+@[A-Za-z0-9\-_]+\.[A-Za-z0-9\-_.]+)/';
21
22 177
    public function __invoke(DocumentParsedEvent $e): void
23
    {
24 177
        $walker = $e->getDocument()->walker();
25
26 177
        while ($event = $walker->next()) {
27 177
            $node = $event->getNode();
28 177
            if ($node instanceof Text && !($node->parent() instanceof Link)) {
29 171
                self::processAutolinks($node);
30
            }
31
        }
32 177
    }
33
34 171
    private static function processAutolinks(Text $node): void
35
    {
36 171
        $contents = \preg_split(self::REGEX, $node->getContent(), -1, PREG_SPLIT_DELIM_CAPTURE);
37
38 171
        if ($contents === false || \count($contents) === 1) {
39 138
            return;
40
        }
41
42 33
        $leftovers = '';
43 33
        foreach ($contents as $i => $content) {
44 33
            if ($i % 2 === 0) {
45 33
                $text = $leftovers . $content;
46 33
                if ($text !== '') {
47 18
                    $node->insertBefore(new Text($leftovers . $content));
48
                }
49
50 33
                $leftovers = '';
51 33
                continue;
52
            }
53
54
            // Does the URL end with punctuation that should be stripped?
55 33
            if (\substr($content, -1) === '.') {
56
                // Add the punctuation later
57 6
                $content = \substr($content, 0, -1);
58 6
                $leftovers = '.';
59
            }
60
61
            // The last character cannot be - or _
62 33
            if (\in_array(\substr($content, -1), ['-', '_'])) {
63 9
                $node->insertBefore(new Text($content . $leftovers));
64 9
                $leftovers = '';
65 9
                continue;
66
            }
67
68 27
            $node->insertBefore(new Link('mailto:' . $content, $content));
69
        }
70
71 33
        $node->detach();
72 33
    }
73
}
74