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