xref: /dokuwiki/inc/Parsing/ParserMode/Externallink.php (revision 5c99934fa496e741110e47e8fd4d9ef528851259)
1be906b56SAndreas Gohr<?php
2be906b56SAndreas Gohr
3be906b56SAndreas Gohrnamespace dokuwiki\Parsing\ParserMode;
4be906b56SAndreas Gohr
5be906b56SAndreas Gohrclass Externallink extends AbstractMode
6be906b56SAndreas Gohr{
7be906b56SAndreas Gohr    protected $schemes = array();
8be906b56SAndreas Gohr    protected $patterns = array();
9be906b56SAndreas Gohr
10be906b56SAndreas Gohr    /** @inheritdoc */
11be906b56SAndreas Gohr    public function preConnect()
12be906b56SAndreas Gohr    {
13be906b56SAndreas Gohr        if (count($this->patterns)) return;
14be906b56SAndreas Gohr
15be906b56SAndreas Gohr        $ltrs = '\w';
16be906b56SAndreas Gohr        $gunk = '/\#~:.?+=&%@!\-\[\]';
17be906b56SAndreas Gohr        $punc = '.:?\-;,';
18be906b56SAndreas Gohr        $host = $ltrs.$punc;
19be906b56SAndreas Gohr        $any  = $ltrs.$gunk.$punc;
20be906b56SAndreas Gohr
21be906b56SAndreas Gohr        $this->schemes = getSchemes();
22be906b56SAndreas Gohr        foreach ($this->schemes as $scheme) {
23be906b56SAndreas Gohr            $this->patterns[] = '\b(?i)'.$scheme.'(?-i)://['.$any.']+?(?=['.$punc.']*[^'.$any.'])';
24be906b56SAndreas Gohr        }
25be906b56SAndreas Gohr
26be906b56SAndreas Gohr        $this->patterns[] = '(?<=\s)(?i)www?(?-i)\.['.$host.']+?\.['.$host.']+?['.$any.']+?(?=['.$punc.']*[^'.$any.'])';
27be906b56SAndreas Gohr        $this->patterns[] = '(?<=\s)(?i)ftp?(?-i)\.['.$host.']+?\.['.$host.']+?['.$any.']+?(?=['.$punc.']*[^'.$any.'])';
28be906b56SAndreas Gohr    }
29be906b56SAndreas Gohr
30be906b56SAndreas Gohr    /** @inheritdoc */
31be906b56SAndreas Gohr    public function connectTo($mode)
32be906b56SAndreas Gohr    {
33be906b56SAndreas Gohr
34be906b56SAndreas Gohr        foreach ($this->patterns as $pattern) {
35be906b56SAndreas Gohr            $this->Lexer->addSpecialPattern($pattern, $mode, 'externallink');
36be906b56SAndreas Gohr        }
37be906b56SAndreas Gohr    }
38be906b56SAndreas Gohr
39be906b56SAndreas Gohr    /** @inheritdoc */
40be906b56SAndreas Gohr    public function getSort()
41be906b56SAndreas Gohr    {
42be906b56SAndreas Gohr        return 330;
43be906b56SAndreas Gohr    }
44*5c99934fSAnna Dabrowska
45*5c99934fSAnna Dabrowska    /**
46*5c99934fSAnna Dabrowska     * @return array
47*5c99934fSAnna Dabrowska     */
48*5c99934fSAnna Dabrowska    public function getPatterns()
49*5c99934fSAnna Dabrowska    {
50*5c99934fSAnna Dabrowska        return $this->patterns;
51*5c99934fSAnna Dabrowska    }
52be906b56SAndreas Gohr}
53