1<?php
2
3namespace dokuwiki\plugin\menuext;
4
5use dokuwiki\Menu\Item\AbstractItem;
6use dokuwiki\Input\Input;
7use dokuwiki\Utf8\PhpString;
8
9/**
10 * Custom Menu Item
11 */
12class MenuExtItem extends AbstractItem
13{
14    protected $link;
15    protected $attributes;
16
17    /**
18     * Intitialize a Menu Item with the given data
19     *
20     * @inheritDoc
21     * @param array $data
22     */
23    public function __construct($data)
24    {
25        global $conf;
26
27        if (isset($data['label'][$conf['lang']])) $this->label = $data['label'][$conf['lang']];
28        if (isset($data['title'][$conf['lang']])) $this->title = $data['title'][$conf['lang']];
29        if (isset($data['link'])) $this->link = $data['link'];
30        if (isset($data['svg'])) $this->svg = $data['svg'];
31        if (isset($data['attr'])) $this->attributes = $data['attr'];
32
33        parent::__construct();
34    }
35
36    /** @inheritDoc */
37    public function getLink()
38    {
39        return $this->linkReplacements($this->link);
40    }
41
42    /**
43     * Auto-Download material design icons
44     * @inheritDoc
45     */
46    public function getSvg()
47    {
48        if (file_exists($this->svg)) return $this->svg;
49        $file = mediaFN($this->svg);
50        if (file_exists($file)) return $file;
51
52        $base = 'https://raw.githubusercontent.com/Templarian/MaterialDesign/master/svg/';
53        $file = getCacheName($this->svg, '.svg');
54        if (!file_exists($file)) {
55            io_download($base . $this->svg, $file);
56            clearstatcache(true, $file);
57        }
58        if (file_exists($file)) return $file;
59
60        return DOKU_INC . 'lib/images/menu/00-default_checkbox-blank-circle-outline.svg';
61    }
62
63    /** @@inheritDoc */
64    public function getLinkAttributes($classprefix = 'menuitem ')
65    {
66        $attr = parent::getLinkAttributes($classprefix);
67        if (is_array($this->attributes)) {
68            $attr = array_merge($attr, $this->attributes);
69        }
70        return $attr;
71    }
72
73    /**
74     * Replace all placeholders in given link
75     *
76     * Basically the same as parsePageTemplate but does URL encoding
77     *
78     * @param string $link the link with placeholders
79     * @return string
80     * @see parsePageTemplate
81     */
82    protected function linkReplacements($link)
83    {
84        global $ID;
85        global $USERINFO;
86        global $conf;
87        /* @var Input $INPUT */
88        global $INPUT;
89
90        // replace placeholders
91        $file = noNS($ID);
92        $page = strtr($file, $conf['sepchar'], ' ');
93        $link = strftime($link); // time first
94        $link = str_replace(
95            [
96                '@ID@',
97                '@NS@',
98                '@CURNS@',
99                '@!CURNS@',
100                '@!!CURNS@',
101                '@!CURNS!@',
102                '@FILE@',
103                '@!FILE@',
104                '@!FILE!@',
105                '@PAGE@',
106                '@!PAGE@',
107                '@!!PAGE@',
108                '@!PAGE!@',
109                '@USER@',
110                '@NAME@',
111                '@MAIL@',
112                '@DATE@',
113            ],
114            array_map('rawurlencode', [
115                $ID,
116                getNS($ID),
117                curNS($ID),
118                PhpString::ucfirst(curNS($ID)),
119                PhpString::ucwords(curNS($ID)),
120                PhpString::strtoupper(curNS($ID)),
121                $file,
122                PhpString::ucfirst($file),
123                PhpString::strtoupper($file),
124                $page,
125                PhpString::ucfirst($page),
126                PhpString::ucwords($page),
127                PhpString::strtoupper($page),
128                $INPUT->server->str('REMOTE_USER'),
129                $USERINFO ? $USERINFO['name'] : '',
130                $USERINFO ? $USERINFO['mail'] : '',
131                $conf['dformat'],
132            ]),
133            $link
134        );
135
136        return $link;
137    }
138}
139