1<?php
2
3namespace dokuwiki\plugin\struct\types;
4
5use dokuwiki\plugin\struct\meta\ValidationException;
6
7class Url extends Text
8{
9    protected $config = [
10        'autoscheme' => 'https',
11        'prefix' => '',
12        'postfix' => '',
13        'fixedtitle' => '',
14        'autoshorten' => true
15    ];
16
17    /**
18     * The final string should be an URL
19     *
20     * @param string $rawvalue
21     * @return int|string|void
22     */
23    public function validate($rawvalue)
24    {
25        $rawvalue = parent::validate($rawvalue);
26
27        $url = $this->buildURL($rawvalue);
28
29        $schemes = getSchemes();
30        $regex = '^(' . implode('|', $schemes) . '):\/\/.+';
31        if (!preg_match("/$regex/i", $url)) {
32            throw new ValidationException('Url invalid', $url);
33        }
34
35        return $rawvalue;
36    }
37
38    /**
39     * @param string $value
40     * @param \Doku_Renderer $R
41     * @param string $mode
42     * @return bool
43     */
44    public function renderValue($value, \Doku_Renderer $R, $mode)
45    {
46        $url = $this->buildURL($value);
47        $title = $this->generateTitle($url);
48        $R->externallink($url, $title);
49        return true;
50    }
51
52    /**
53     * Make a label for the link
54     *
55     * @param $url
56     * @return string
57     */
58    protected function generateTitle($url)
59    {
60        if ($this->config['fixedtitle']) return $this->config['fixedtitle'];
61        if (!$this->config['autoshorten']) return $url;
62
63        $parsed = parse_url($url);
64
65        $title = $parsed['host'];
66        $title = preg_replace('/^www\./i', '', $title);
67        if (isset($parsed['path']) && $parsed['path'] === '/') {
68            unset($parsed['path']);
69        }
70        if (
71            isset($parsed['path']) ||
72            isset($parsed['query']) ||
73            isset($parsed['fragment'])
74        ) {
75            $title .= '/…';
76        }
77        return $title;
78    }
79
80    /**
81     * Creates the full URL and applies the autoscheme if needed
82     *
83     * @param string $value
84     * @return string
85     */
86    protected function buildURL($value)
87    {
88        $url = $this->config['prefix'] . trim($value) . $this->config['postfix'];
89
90        if (!preg_match('/\w+:\/\//', $url)) {
91            $url = $this->config['autoscheme'] . '://' . $url;
92        }
93
94        return $url;
95    }
96}
97