xref: /dokuwiki/inc/ChangeLog/RevisionInfo.php (revision 0603e565f99519c35708bab370f1c5f3271c1365)
1bf3fa5e9SSatoshi Sahara<?php
2bf3fa5e9SSatoshi Sahara
3bf3fa5e9SSatoshi Saharanamespace dokuwiki\ChangeLog;
4bf3fa5e9SSatoshi Sahara
5bf3fa5e9SSatoshi Sahara/**
6bf3fa5e9SSatoshi Sahara * Class RevisionInfo
7bf3fa5e9SSatoshi Sahara *
8eeda7adaSGerrit Uitslag * Provides methods to show Revision Information in DokuWiki Ui components:
9bf3fa5e9SSatoshi Sahara *  - Ui\Recent
10bf3fa5e9SSatoshi Sahara *  - Ui\PageRevisions
11bf3fa5e9SSatoshi Sahara *  - Ui\MediaRevisions
12bf3fa5e9SSatoshi Sahara */
13bf3fa5e9SSatoshi Saharaclass RevisionInfo
14bf3fa5e9SSatoshi Sahara{
15b428a50aSSatoshi Sahara    /* @var array */
16bf3fa5e9SSatoshi Sahara    protected $info;
17bf3fa5e9SSatoshi Sahara
18bf3fa5e9SSatoshi Sahara    /**
19bf3fa5e9SSatoshi Sahara     * Constructor
20bf3fa5e9SSatoshi Sahara     *
21eeda7adaSGerrit Uitslag     * @param array $info Revision Information structure with entries:
22bf3fa5e9SSatoshi Sahara     *      - date:  unix timestamp
23bf3fa5e9SSatoshi Sahara     *      - ip:    IPv4 or IPv6 address
24bf3fa5e9SSatoshi Sahara     *      - type:  change type (log line type)
25bf3fa5e9SSatoshi Sahara     *      - id:    page id
26bf3fa5e9SSatoshi Sahara     *      - user:  user name
27bf3fa5e9SSatoshi Sahara     *      - sum:   edit summary (or action reason)
28bf3fa5e9SSatoshi Sahara     *      - extra: extra data (varies by line type)
29bf3fa5e9SSatoshi Sahara     *      - sizechange: change of filesize
30bf3fa5e9SSatoshi Sahara     *      additionally,
313d727ea4SGerrit Uitslag     *      - current:   (optional) whether current revision or not
32bf3fa5e9SSatoshi Sahara     *      - timestamp: (optional) set only when external edits occurred
33b428a50aSSatoshi Sahara     *      - mode:  (internal use) ether "media" or "page"
34bf3fa5e9SSatoshi Sahara     */
35b428a50aSSatoshi Sahara    public function __construct($info = null)
36bf3fa5e9SSatoshi Sahara    {
37b428a50aSSatoshi Sahara        if (is_array($info) && isset($info['id'])) {
38b428a50aSSatoshi Sahara            // define strategy context
3929baf676STherealperO            $info['mode'] = $info['media'] ? 'media' : 'page';
40b428a50aSSatoshi Sahara        } else {
41b428a50aSSatoshi Sahara            $info = [
42b428a50aSSatoshi Sahara                'mode' => 'page',
43b428a50aSSatoshi Sahara                'date' => false,
44b428a50aSSatoshi Sahara            ];
45b428a50aSSatoshi Sahara        }
46bf3fa5e9SSatoshi Sahara        $this->info = $info;
47bf3fa5e9SSatoshi Sahara    }
48bf3fa5e9SSatoshi Sahara
49bf3fa5e9SSatoshi Sahara    /**
50eeda7adaSGerrit Uitslag     * Set or return whether this revision is current page or media file
51b428a50aSSatoshi Sahara     *
52b428a50aSSatoshi Sahara     * This method does not check exactly whether the revision is current or not. Instead,
53b428a50aSSatoshi Sahara     * set value of associated "current" key for internal use. Some UI element like diff
54b428a50aSSatoshi Sahara     * link button depend on relation to current page or media file. A changelog line does
55eeda7adaSGerrit Uitslag     * not indicate whether it corresponds to current page or media file.
56b428a50aSSatoshi Sahara     *
57b428a50aSSatoshi Sahara     * @param bool $value true if the revision is current, otherwise false
58b428a50aSSatoshi Sahara     * @return bool
59b428a50aSSatoshi Sahara     */
60b428a50aSSatoshi Sahara    public function isCurrent($value = null)
61b428a50aSSatoshi Sahara    {
62eeda7adaSGerrit Uitslag        return (bool) $this->val('current', $value);
63b428a50aSSatoshi Sahara    }
64b428a50aSSatoshi Sahara
65b428a50aSSatoshi Sahara    /**
66eeda7adaSGerrit Uitslag     * Return or set a value of associated key of revision information
67b428a50aSSatoshi Sahara     * but does not allow to change values of existing keys
68b428a50aSSatoshi Sahara     *
69b428a50aSSatoshi Sahara     * @param string $key
70b428a50aSSatoshi Sahara     * @param mixed $value
71b428a50aSSatoshi Sahara     * @return string|null
72b428a50aSSatoshi Sahara     */
73b428a50aSSatoshi Sahara    public function val($key, $value = null)
74b428a50aSSatoshi Sahara    {
75b428a50aSSatoshi Sahara        if (isset($value) && !array_key_exists($key, $this->info)) {
76b428a50aSSatoshi Sahara            // setter, only for new keys
77b428a50aSSatoshi Sahara            $this->info[$key] = $value;
78b428a50aSSatoshi Sahara        }
79b428a50aSSatoshi Sahara        if (array_key_exists($key, $this->info)) {
80b428a50aSSatoshi Sahara            // getter
81b428a50aSSatoshi Sahara            return $this->info[$key];
82b428a50aSSatoshi Sahara        }
83b428a50aSSatoshi Sahara        return null;
84b428a50aSSatoshi Sahara    }
85b428a50aSSatoshi Sahara
86b428a50aSSatoshi Sahara    /**
87b428a50aSSatoshi Sahara     * Set extra key-value to the revision information
88b428a50aSSatoshi Sahara     * but does not allow to change values of existing keys
89b428a50aSSatoshi Sahara     * @param array $info
90b428a50aSSatoshi Sahara     * @return void
91b428a50aSSatoshi Sahara     */
92b428a50aSSatoshi Sahara    public function append(array $info)
93b428a50aSSatoshi Sahara    {
94b428a50aSSatoshi Sahara        foreach ($info as $key => $value) {
95b428a50aSSatoshi Sahara            $this->val($key, $value);
96b428a50aSSatoshi Sahara        }
97b428a50aSSatoshi Sahara    }
98b428a50aSSatoshi Sahara
99b428a50aSSatoshi Sahara
100b428a50aSSatoshi Sahara    /**
101bf3fa5e9SSatoshi Sahara     * file icon of the page or media file
102bf3fa5e9SSatoshi Sahara     * used in [Ui\recent]
103bf3fa5e9SSatoshi Sahara     *
104bf3fa5e9SSatoshi Sahara     * @return string
105bf3fa5e9SSatoshi Sahara     */
106b428a50aSSatoshi Sahara    public function showFileIcon()
107bf3fa5e9SSatoshi Sahara    {
108b428a50aSSatoshi Sahara        $id = $this->val('id');
109*0603e565SAndreas Gohr        if ($this->val('mode') == 'media') {
110*0603e565SAndreas Gohr            // media file revision
111b428a50aSSatoshi Sahara            return media_printicon($id);
112*0603e565SAndreas Gohr        } elseif ($this->val('mode') == 'page') {
113*0603e565SAndreas Gohr            // page revision
114b428a50aSSatoshi Sahara            return '<img class="icon" src="'.DOKU_BASE.'lib/images/fileicons/file.png" alt="'.$id.'" />';
115bf3fa5e9SSatoshi Sahara        }
116bf3fa5e9SSatoshi Sahara    }
117bf3fa5e9SSatoshi Sahara
118bf3fa5e9SSatoshi Sahara    /**
119bf3fa5e9SSatoshi Sahara     * edit date and time of the page or media file
120bf3fa5e9SSatoshi Sahara     * used in [Ui\recent, Ui\Revisions]
121bf3fa5e9SSatoshi Sahara     *
122bf3fa5e9SSatoshi Sahara     * @param bool $checkTimestamp  enable timestamp check, alter formatted string when timestamp is false
123bf3fa5e9SSatoshi Sahara     * @return string
124bf3fa5e9SSatoshi Sahara     */
125b428a50aSSatoshi Sahara    public function showEditDate($checkTimestamp = false)
126bf3fa5e9SSatoshi Sahara    {
127b428a50aSSatoshi Sahara        $formatted = dformat($this->val('date'));
128b428a50aSSatoshi Sahara        if ($checkTimestamp && $this->val('timestamp') === false) {
129b428a50aSSatoshi Sahara            // exact date is unknown for externally deleted file
130bf3fa5e9SSatoshi Sahara            // when unknown, alter formatted string "YYYY-mm-DD HH:MM" to "____-__-__ __:__"
131bf3fa5e9SSatoshi Sahara            $formatted = preg_replace('/[0-9a-zA-Z]/','_', $formatted);
132bf3fa5e9SSatoshi Sahara        }
133bf3fa5e9SSatoshi Sahara        return '<span class="date">'. $formatted .'</span>';
134bf3fa5e9SSatoshi Sahara    }
135bf3fa5e9SSatoshi Sahara
136bf3fa5e9SSatoshi Sahara    /**
137bf3fa5e9SSatoshi Sahara     * edit summary
138bf3fa5e9SSatoshi Sahara     * used in [Ui\recent, Ui\Revisions]
139bf3fa5e9SSatoshi Sahara     *
140bf3fa5e9SSatoshi Sahara     * @return string
141bf3fa5e9SSatoshi Sahara     */
142b428a50aSSatoshi Sahara    public function showEditSummary()
143bf3fa5e9SSatoshi Sahara    {
144b428a50aSSatoshi Sahara        return '<span class="sum">'.' – '. hsc($this->val('sum')).'</span>';
145bf3fa5e9SSatoshi Sahara    }
146bf3fa5e9SSatoshi Sahara
147bf3fa5e9SSatoshi Sahara    /**
148bf3fa5e9SSatoshi Sahara     * editor of the page or media file
149bf3fa5e9SSatoshi Sahara     * used in [Ui\recent, Ui\Revisions]
150bf3fa5e9SSatoshi Sahara     *
151bf3fa5e9SSatoshi Sahara     * @return string
152bf3fa5e9SSatoshi Sahara     */
153b428a50aSSatoshi Sahara    public function showEditor()
154bf3fa5e9SSatoshi Sahara    {
155b428a50aSSatoshi Sahara        if ($this->val('user')) {
156b428a50aSSatoshi Sahara            $html = '<bdi>'. editorinfo($this->val('user')) .'</bdi>';
157b428a50aSSatoshi Sahara            if (auth_ismanager()) $html .= ' <bdo dir="ltr">('. $this->val('ip') .')</bdo>';
158bf3fa5e9SSatoshi Sahara        } else {
159b428a50aSSatoshi Sahara            $html = '<bdo dir="ltr">'. $this->val('ip') .'</bdo>';
160bf3fa5e9SSatoshi Sahara        }
161b428a50aSSatoshi Sahara        return '<span class="user">'. $html. '</span>';
162bf3fa5e9SSatoshi Sahara    }
163bf3fa5e9SSatoshi Sahara
164bf3fa5e9SSatoshi Sahara    /**
165bf3fa5e9SSatoshi Sahara     * name of the page or media file
166bf3fa5e9SSatoshi Sahara     * used in [Ui\recent, Ui\Revisions]
167bf3fa5e9SSatoshi Sahara     *
168bf3fa5e9SSatoshi Sahara     * @return string
169bf3fa5e9SSatoshi Sahara     */
170b428a50aSSatoshi Sahara    public function showFileName()
171bf3fa5e9SSatoshi Sahara    {
172b428a50aSSatoshi Sahara        $id = $this->val('id');
173b428a50aSSatoshi Sahara        $rev = $this->isCurrent() ? '' : $this->val('date');
174bf3fa5e9SSatoshi Sahara
175*0603e565SAndreas Gohr        if ($this->val('mode') == 'media') {
176*0603e565SAndreas Gohr            // media file revision
177bf3fa5e9SSatoshi Sahara            $params = ['tab_details'=> 'view', 'ns'=> getNS($id), 'image'=> $id];
178bf3fa5e9SSatoshi Sahara            if ($rev) $params += ['rev'=> $rev];
179bf3fa5e9SSatoshi Sahara            $href = media_managerURL($params, '&');
180b428a50aSSatoshi Sahara            $display_name = $id;
1812aa019d6SGerrit Uitslag            $exists = file_exists(mediaFN($id, $rev));
182*0603e565SAndreas Gohr        } elseif ($this->val('mode') == 'page') {
183*0603e565SAndreas Gohr            // page revision
184de8ed963SGerrit Uitslag            $params = $rev ? ['rev'=> $rev] : [];
185bf3fa5e9SSatoshi Sahara            $href = wl($id, $params, false, '&');
186bf3fa5e9SSatoshi Sahara            $display_name = useHeading('navigation') ? hsc(p_get_first_heading($id)) : $id;
187bf3fa5e9SSatoshi Sahara            if (!$display_name) $display_name = $id;
1882aa019d6SGerrit Uitslag            $exists = page_exists($id, $rev);
1892aa019d6SGerrit Uitslag        }
1902aa019d6SGerrit Uitslag
1912aa019d6SGerrit Uitslag        if ($exists) {
1922aa019d6SGerrit Uitslag            $class = 'wikilink1';
193*0603e565SAndreas Gohr        } elseif ($this->isCurrent()) {
1942aa019d6SGerrit Uitslag            //show only not-existing link for current page, which allows for directly create a new page/upload
1952aa019d6SGerrit Uitslag            $class = 'wikilink2';
1962aa019d6SGerrit Uitslag        } else {
1972aa019d6SGerrit Uitslag            //revision is not in attic
1982aa019d6SGerrit Uitslag            return $display_name;
1992aa019d6SGerrit Uitslag        }
200b428a50aSSatoshi Sahara        if ($this->val('type') == DOKU_CHANGE_TYPE_DELETE) {
201b428a50aSSatoshi Sahara            $class = 'wikilink2';
202bf3fa5e9SSatoshi Sahara        }
203bf3fa5e9SSatoshi Sahara        return '<a href="'.$href.'" class="'.$class.'">'.$display_name.'</a>';
204bf3fa5e9SSatoshi Sahara    }
20575d9280cSGerrit Uitslag
206bf3fa5e9SSatoshi Sahara    /**
207b428a50aSSatoshi Sahara     * Revision Title for PageDiff table headline
208bf3fa5e9SSatoshi Sahara     *
209bf3fa5e9SSatoshi Sahara     * @return string
210bf3fa5e9SSatoshi Sahara     */
211b428a50aSSatoshi Sahara    public function showRevisionTitle()
212bf3fa5e9SSatoshi Sahara    {
213bf3fa5e9SSatoshi Sahara        global $lang;
214b428a50aSSatoshi Sahara
215b428a50aSSatoshi Sahara        if (!$this->val('date')) return '&mdash;';
216b428a50aSSatoshi Sahara
217b428a50aSSatoshi Sahara        $id = $this->val('id');
218b428a50aSSatoshi Sahara        $rev = $this->isCurrent() ? '' : $this->val('date');
219b428a50aSSatoshi Sahara        $params = ($rev) ? ['rev'=> $rev] : [];
220b428a50aSSatoshi Sahara
221b428a50aSSatoshi Sahara        // revision info may have timestamp key when external edits occurred
222b428a50aSSatoshi Sahara        $date = ($this->val('timestamp') === false)
223b428a50aSSatoshi Sahara            ? $lang['unknowndate']
224b428a50aSSatoshi Sahara            : dformat($this->val('date'));
225b428a50aSSatoshi Sahara
2262aa019d6SGerrit Uitslag
227*0603e565SAndreas Gohr        if ($this->val('mode') == 'media') {
228*0603e565SAndreas Gohr            // media file revision
2292aa019d6SGerrit Uitslag            $href = ml($id, $params, false, '&');
2302aa019d6SGerrit Uitslag            $exists = file_exists(mediaFN($id, $rev));
231*0603e565SAndreas Gohr        } elseif ($this->val('mode') == 'page') {
232*0603e565SAndreas Gohr            // page revision
2332aa019d6SGerrit Uitslag            $href = wl($id, $params, false, '&');
2342aa019d6SGerrit Uitslag            $exists = page_exists($id, $rev);
2352aa019d6SGerrit Uitslag        }
2362aa019d6SGerrit Uitslag        if ($exists) {
2372aa019d6SGerrit Uitslag            $class = 'wikilink1';
238*0603e565SAndreas Gohr        } elseif ($this->isCurrent()) {
2392aa019d6SGerrit Uitslag            //show only not-existing link for current page, which allows for directly create a new page/upload
2402aa019d6SGerrit Uitslag            $class = 'wikilink2';
2412aa019d6SGerrit Uitslag        } else {
2422aa019d6SGerrit Uitslag            //revision is not in attic
2432aa019d6SGerrit Uitslag            return $id.' ['.$date.']';
2442aa019d6SGerrit Uitslag        }
2452aa019d6SGerrit Uitslag        if ($this->val('type') == DOKU_CHANGE_TYPE_DELETE) {
2462aa019d6SGerrit Uitslag            $class = 'wikilink2';
2472aa019d6SGerrit Uitslag        }
248b428a50aSSatoshi Sahara        return '<bdi><a class="'.$class.'" href="'.$href.'">'.$id.' ['.$date.']'.'</a></bdi>';
249b428a50aSSatoshi Sahara    }
250b428a50aSSatoshi Sahara
251b428a50aSSatoshi Sahara    /**
252eeda7adaSGerrit Uitslag     * diff link icon in recent changes list, to compare (this) current revision with previous one
253b428a50aSSatoshi Sahara     * all items in "recent changes" are current revision of the page or media
254b428a50aSSatoshi Sahara     *
255b428a50aSSatoshi Sahara     * @return string
256b428a50aSSatoshi Sahara     */
257b428a50aSSatoshi Sahara    public function showIconCompareWithPrevious()
258b428a50aSSatoshi Sahara    {
259b428a50aSSatoshi Sahara        global $lang;
260b428a50aSSatoshi Sahara        $id = $this->val('id');
261bf3fa5e9SSatoshi Sahara
262bf3fa5e9SSatoshi Sahara        $href = '';
263*0603e565SAndreas Gohr        if ($this->val('mode') == 'media') {
264*0603e565SAndreas Gohr            // media file revision
265eeda7adaSGerrit Uitslag            // unlike page, media file does not copied to media_attic when uploaded.
266b428a50aSSatoshi Sahara            // diff icon will not be shown when external edit occurred
267b428a50aSSatoshi Sahara            // because no attic file to be compared with current.
268bf3fa5e9SSatoshi Sahara            $revs = (new MediaChangeLog($id))->getRevisions(0, 1);
269b428a50aSSatoshi Sahara            $showLink = (count($revs) && file_exists(mediaFN($id,$revs[0])) && file_exists(mediaFN($id)));
270bf3fa5e9SSatoshi Sahara            if ($showLink) {
271b428a50aSSatoshi Sahara                $param = ['tab_details'=>'history', 'mediado'=>'diff', 'ns'=> getNS($id), 'image'=> $id];
272b428a50aSSatoshi Sahara                $href = media_managerURL($param, '&');
273bf3fa5e9SSatoshi Sahara            }
274*0603e565SAndreas Gohr        } elseif ($this->val('mode') == 'page') {
275*0603e565SAndreas Gohr            // page revision
276b428a50aSSatoshi Sahara            // when a page just created anyway, it is natural to expect no older revisions
277b428a50aSSatoshi Sahara            // even if it had once existed but deleted before. Simply ignore to check changelog.
278b428a50aSSatoshi Sahara            if ($this->val('type') !== DOKU_CHANGE_TYPE_CREATE) {
279b428a50aSSatoshi Sahara                $href = wl($id, ['do'=>'diff'], false, '&');
280bf3fa5e9SSatoshi Sahara            }
281bf3fa5e9SSatoshi Sahara        }
282bf3fa5e9SSatoshi Sahara
283bf3fa5e9SSatoshi Sahara        if ($href) {
284b428a50aSSatoshi Sahara            return '<a href="'.$href.'" class="diff_link">'
285bf3fa5e9SSatoshi Sahara                  .'<img src="'.DOKU_BASE.'lib/images/diff.png" width="15" height="11"'
286bf3fa5e9SSatoshi Sahara                  .' title="'. $lang['diff'] .'" alt="'.$lang['diff'] .'" />'
287bf3fa5e9SSatoshi Sahara                  .'</a>';
288bf3fa5e9SSatoshi Sahara        } else {
289b428a50aSSatoshi Sahara            return '<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />';
290bf3fa5e9SSatoshi Sahara        }
291bf3fa5e9SSatoshi Sahara    }
292bf3fa5e9SSatoshi Sahara
293bf3fa5e9SSatoshi Sahara    /**
294eeda7adaSGerrit Uitslag     * diff link icon in revisions list, compare this revision with current one
295bf3fa5e9SSatoshi Sahara     * the icon does not displayed for the current revision
296bf3fa5e9SSatoshi Sahara     *
297bf3fa5e9SSatoshi Sahara     * @return string
298bf3fa5e9SSatoshi Sahara     */
299b428a50aSSatoshi Sahara    public function showIconCompareWithCurrent()
300bf3fa5e9SSatoshi Sahara    {
301bf3fa5e9SSatoshi Sahara        global $lang;
302b428a50aSSatoshi Sahara        $id = $this->val('id');
303b428a50aSSatoshi Sahara        $rev = $this->isCurrent() ? '' : $this->val('date');
304bf3fa5e9SSatoshi Sahara
305b428a50aSSatoshi Sahara        $href = '';
306*0603e565SAndreas Gohr        if ($this->val('mode') == 'media') {
307*0603e565SAndreas Gohr            // media file revision
308b428a50aSSatoshi Sahara            if (!$this->isCurrent() && file_exists(mediaFN($id, $rev))) {
309b428a50aSSatoshi Sahara                $param = ['mediado'=>'diff', 'image'=> $id, 'rev'=> $rev];
310b428a50aSSatoshi Sahara                $href = media_managerURL($param, '&');
311bf3fa5e9SSatoshi Sahara            }
312*0603e565SAndreas Gohr        } elseif ($this->val('mode') == 'page') {
313*0603e565SAndreas Gohr            // page revision
314b428a50aSSatoshi Sahara            if (!$this->isCurrent()) {
315b428a50aSSatoshi Sahara                $href = wl($id, ['rev'=> $rev, 'do'=>'diff'], false, '&');
316b428a50aSSatoshi Sahara            }
317b428a50aSSatoshi Sahara        }
318b428a50aSSatoshi Sahara
319b428a50aSSatoshi Sahara        if ($href) {
320b428a50aSSatoshi Sahara            return '<a href="'.$href.'" class="diff_link">'
321bf3fa5e9SSatoshi Sahara                  .'<img src="'.DOKU_BASE.'lib/images/diff.png" width="15" height="11"'
322bf3fa5e9SSatoshi Sahara                  .' title="'. $lang['diff'] .'" alt="'.$lang['diff'] .'" />'
323bf3fa5e9SSatoshi Sahara                  .'</a>';
324b428a50aSSatoshi Sahara        } else {
325b428a50aSSatoshi Sahara            return '<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />';
326bf3fa5e9SSatoshi Sahara        }
327bf3fa5e9SSatoshi Sahara    }
328bf3fa5e9SSatoshi Sahara
329bf3fa5e9SSatoshi Sahara    /**
330b428a50aSSatoshi Sahara     * icon for revision action
331bf3fa5e9SSatoshi Sahara     * used in [Ui\recent]
332bf3fa5e9SSatoshi Sahara     *
333bf3fa5e9SSatoshi Sahara     * @return string
334bf3fa5e9SSatoshi Sahara     */
335b428a50aSSatoshi Sahara    public function showIconRevisions()
336bf3fa5e9SSatoshi Sahara    {
33775d9280cSGerrit Uitslag        global $lang;
338bf3fa5e9SSatoshi Sahara
339bf3fa5e9SSatoshi Sahara        if (!actionOK('revisions')) {
340b428a50aSSatoshi Sahara            return '';
341bf3fa5e9SSatoshi Sahara        }
342bf3fa5e9SSatoshi Sahara
343b428a50aSSatoshi Sahara        $id = $this->val('id');
344*0603e565SAndreas Gohr        if ($this->val('mode') == 'media') {
345*0603e565SAndreas Gohr            // media file revision
346b428a50aSSatoshi Sahara            $param  = ['tab_details'=>'history', 'ns'=> getNS($id), 'image'=> $id];
347b428a50aSSatoshi Sahara            $href = media_managerURL($param, '&');
348*0603e565SAndreas Gohr        } elseif ($this->val('mode') == 'page') {
349*0603e565SAndreas Gohr            // page revision
350b428a50aSSatoshi Sahara            $href = wl($id, ['do'=>'revisions'], false, '&');
351bf3fa5e9SSatoshi Sahara        }
352bf3fa5e9SSatoshi Sahara        return '<a href="'.$href.'" class="revisions_link">'
353bf3fa5e9SSatoshi Sahara              . '<img src="'.DOKU_BASE.'lib/images/history.png" width="12" height="14"'
354bf3fa5e9SSatoshi Sahara              . ' title="'.$lang['btn_revs'].'" alt="'.$lang['btn_revs'].'" />'
355bf3fa5e9SSatoshi Sahara              . '</a>';
356bf3fa5e9SSatoshi Sahara    }
357bf3fa5e9SSatoshi Sahara
358bf3fa5e9SSatoshi Sahara    /**
359bf3fa5e9SSatoshi Sahara     * size change
360bf3fa5e9SSatoshi Sahara     * used in [Ui\recent, Ui\Revisions]
361bf3fa5e9SSatoshi Sahara     *
362bf3fa5e9SSatoshi Sahara     * @return string
363bf3fa5e9SSatoshi Sahara     */
364b428a50aSSatoshi Sahara    public function showSizeChange()
365bf3fa5e9SSatoshi Sahara    {
366bf3fa5e9SSatoshi Sahara        $class = 'sizechange';
367b428a50aSSatoshi Sahara        $value = filesize_h(abs($this->val('sizechange')));
368b428a50aSSatoshi Sahara        if ($this->val('sizechange') > 0) {
369bf3fa5e9SSatoshi Sahara            $class .= ' positive';
370bf3fa5e9SSatoshi Sahara            $value = '+' . $value;
371b428a50aSSatoshi Sahara        } elseif ($this->val('sizechange') < 0) {
372bf3fa5e9SSatoshi Sahara            $class .= ' negative';
373bf3fa5e9SSatoshi Sahara            $value = '-' . $value;
374bf3fa5e9SSatoshi Sahara        } else {
375bf3fa5e9SSatoshi Sahara            $value = '±' . $value;
376bf3fa5e9SSatoshi Sahara        }
377bf3fa5e9SSatoshi Sahara        return '<span class="'.$class.'">'.$value.'</span>';
378bf3fa5e9SSatoshi Sahara    }
379bf3fa5e9SSatoshi Sahara
380bf3fa5e9SSatoshi Sahara    /**
381eeda7adaSGerrit Uitslag     * current indicator, used in revision list
382eeda7adaSGerrit Uitslag     * not used in Ui\Recent because recent files are always current one
383bf3fa5e9SSatoshi Sahara     *
384bf3fa5e9SSatoshi Sahara     * @return string
385bf3fa5e9SSatoshi Sahara     */
386b428a50aSSatoshi Sahara    public function showCurrentIndicator()
387bf3fa5e9SSatoshi Sahara    {
388bf3fa5e9SSatoshi Sahara        global $lang;
389b428a50aSSatoshi Sahara        return $this->isCurrent() ? '('.$lang['current'].')' : '';
390bf3fa5e9SSatoshi Sahara    }
391bf3fa5e9SSatoshi Sahara
392bf3fa5e9SSatoshi Sahara
393bf3fa5e9SSatoshi Sahara}
394