xref: /dokuwiki/inc/ChangeLog/RevisionInfo.php (revision a835c93a8c9175f580c05a0aeb56b7664f5e8435)
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
12*a835c93aSGerrit Uitslag *  - Ui\PageDiff
13*a835c93aSGerrit Uitslag *  - Ui\MediaDiff
14bf3fa5e9SSatoshi Sahara */
15bf3fa5e9SSatoshi Saharaclass RevisionInfo
16bf3fa5e9SSatoshi Sahara{
17*a835c93aSGerrit Uitslag    public const MODE_PAGE = 'page';
18*a835c93aSGerrit Uitslag    public const MODE_MEDIA = 'media';
19*a835c93aSGerrit 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    {
42*a835c93aSGerrit Uitslag        if (!is_array($info) || !isset($info['id'])) {
43b428a50aSSatoshi Sahara            $info = [
44*a835c93aSGerrit 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');
111*a835c93aSGerrit Uitslag        if ($this->val('mode') == self::MODE_MEDIA) {
1120603e565SAndreas Gohr            // media file revision
113b428a50aSSatoshi Sahara            return media_printicon($id);
114*a835c93aSGerrit Uitslag        } elseif ($this->val('mode') == self::MODE_PAGE) {
1150603e565SAndreas Gohr            // page revision
116b428a50aSSatoshi Sahara            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>';
159b428a50aSSatoshi Sahara            if (auth_ismanager()) $html .= ' <bdo dir="ltr">(' . $this->val('ip') . ')</bdo>';
160bf3fa5e9SSatoshi Sahara        } else {
161b428a50aSSatoshi Sahara            $html = '<bdo dir="ltr">' . $this->val('ip') . '</bdo>';
162bf3fa5e9SSatoshi Sahara        }
163b428a50aSSatoshi Sahara        return '<span class="user">' . $html . '</span>';
164bf3fa5e9SSatoshi Sahara    }
165bf3fa5e9SSatoshi Sahara
166bf3fa5e9SSatoshi Sahara    /**
167bf3fa5e9SSatoshi Sahara     * name of the page or media file
168bf3fa5e9SSatoshi Sahara     * used in [Ui\recent, Ui\Revisions]
169bf3fa5e9SSatoshi Sahara     *
170bf3fa5e9SSatoshi Sahara     * @return string
171bf3fa5e9SSatoshi Sahara     */
172b428a50aSSatoshi Sahara    public function showFileName()
173bf3fa5e9SSatoshi Sahara    {
174b428a50aSSatoshi Sahara        $id = $this->val('id');
175b428a50aSSatoshi Sahara        $rev = $this->isCurrent() ? '' : $this->val('date');
176bf3fa5e9SSatoshi Sahara
177*a835c93aSGerrit Uitslag        if ($this->val('mode') == self::MODE_MEDIA) {
1780603e565SAndreas Gohr            // media file revision
179bf3fa5e9SSatoshi Sahara            $params = ['tab_details' => 'view', 'ns' => getNS($id), 'image' => $id];
180bf3fa5e9SSatoshi Sahara            if ($rev) $params += ['rev' => $rev];
181bf3fa5e9SSatoshi Sahara            $href = media_managerURL($params, '&');
182b428a50aSSatoshi Sahara            $display_name = $id;
1832aa019d6SGerrit Uitslag            $exists = file_exists(mediaFN($id, $rev));
184*a835c93aSGerrit Uitslag        } elseif ($this->val('mode') == self::MODE_PAGE) {
1850603e565SAndreas Gohr            // page revision
186de8ed963SGerrit Uitslag            $params = $rev ? ['rev' => $rev] : [];
187bf3fa5e9SSatoshi Sahara            $href = wl($id, $params, false, '&');
188bf3fa5e9SSatoshi Sahara            $display_name = useHeading('navigation') ? hsc(p_get_first_heading($id)) : $id;
189bf3fa5e9SSatoshi Sahara            if (!$display_name) $display_name = $id;
1902aa019d6SGerrit Uitslag            $exists = page_exists($id, $rev);
1912aa019d6SGerrit Uitslag        }
1922aa019d6SGerrit Uitslag
1932aa019d6SGerrit Uitslag        if ($exists) {
1942aa019d6SGerrit Uitslag            $class = 'wikilink1';
1950603e565SAndreas Gohr        } elseif ($this->isCurrent()) {
1962aa019d6SGerrit Uitslag            //show only not-existing link for current page, which allows for directly create a new page/upload
1972aa019d6SGerrit Uitslag            $class = 'wikilink2';
1982aa019d6SGerrit Uitslag        } else {
1992aa019d6SGerrit Uitslag            //revision is not in attic
2002aa019d6SGerrit Uitslag            return $display_name;
2012aa019d6SGerrit Uitslag        }
202b428a50aSSatoshi Sahara        if ($this->val('type') == DOKU_CHANGE_TYPE_DELETE) {
203b428a50aSSatoshi Sahara            $class = 'wikilink2';
204bf3fa5e9SSatoshi Sahara        }
205bf3fa5e9SSatoshi Sahara        return '<a href="' . $href . '" class="' . $class . '">' . $display_name . '</a>';
206bf3fa5e9SSatoshi Sahara    }
20775d9280cSGerrit Uitslag
208bf3fa5e9SSatoshi Sahara    /**
209b428a50aSSatoshi Sahara     * Revision Title for PageDiff table headline
210bf3fa5e9SSatoshi Sahara     *
211bf3fa5e9SSatoshi Sahara     * @return string
212bf3fa5e9SSatoshi Sahara     */
213b428a50aSSatoshi Sahara    public function showRevisionTitle()
214bf3fa5e9SSatoshi Sahara    {
215bf3fa5e9SSatoshi Sahara        global $lang;
216b428a50aSSatoshi Sahara
217b428a50aSSatoshi Sahara        if (!$this->val('date')) return '&mdash;';
218b428a50aSSatoshi Sahara
219b428a50aSSatoshi Sahara        $id = $this->val('id');
220b428a50aSSatoshi Sahara        $rev = $this->isCurrent() ? '' : $this->val('date');
221b428a50aSSatoshi Sahara        $params = ($rev) ? ['rev' => $rev] : [];
222b428a50aSSatoshi Sahara
223b428a50aSSatoshi Sahara        // revision info may have timestamp key when external edits occurred
224b428a50aSSatoshi Sahara        $date = ($this->val('timestamp') === false)
225b428a50aSSatoshi Sahara            ? $lang['unknowndate']
226b428a50aSSatoshi Sahara            : dformat($this->val('date'));
227b428a50aSSatoshi Sahara
2282aa019d6SGerrit Uitslag
229*a835c93aSGerrit Uitslag        if ($this->val('mode') == self::MODE_MEDIA) {
2300603e565SAndreas Gohr            // media file revision
2312aa019d6SGerrit Uitslag            $href = ml($id, $params, false, '&');
2322aa019d6SGerrit Uitslag            $exists = file_exists(mediaFN($id, $rev));
233*a835c93aSGerrit Uitslag        } elseif ($this->val('mode') == self::MODE_PAGE) {
2340603e565SAndreas Gohr            // page revision
2352aa019d6SGerrit Uitslag            $href = wl($id, $params, false, '&');
2362aa019d6SGerrit Uitslag            $exists = page_exists($id, $rev);
2372aa019d6SGerrit Uitslag        }
2382aa019d6SGerrit Uitslag        if ($exists) {
2392aa019d6SGerrit Uitslag            $class = 'wikilink1';
2400603e565SAndreas Gohr        } elseif ($this->isCurrent()) {
2412aa019d6SGerrit Uitslag            //show only not-existing link for current page, which allows for directly create a new page/upload
2422aa019d6SGerrit Uitslag            $class = 'wikilink2';
2432aa019d6SGerrit Uitslag        } else {
2442aa019d6SGerrit Uitslag            //revision is not in attic
2452aa019d6SGerrit Uitslag            return $id . ' [' . $date . ']';
2462aa019d6SGerrit Uitslag        }
2472aa019d6SGerrit Uitslag        if ($this->val('type') == DOKU_CHANGE_TYPE_DELETE) {
2482aa019d6SGerrit Uitslag            $class = 'wikilink2';
2492aa019d6SGerrit Uitslag        }
250b428a50aSSatoshi Sahara        return '<bdi><a class="' . $class . '" href="' . $href . '">' . $id . ' [' . $date . ']' . '</a></bdi>';
251b428a50aSSatoshi Sahara    }
252b428a50aSSatoshi Sahara
253b428a50aSSatoshi Sahara    /**
254eeda7adaSGerrit Uitslag     * diff link icon in recent changes list, to compare (this) current revision with previous one
255b428a50aSSatoshi Sahara     * all items in "recent changes" are current revision of the page or media
256b428a50aSSatoshi Sahara     *
257b428a50aSSatoshi Sahara     * @return string
258b428a50aSSatoshi Sahara     */
259b428a50aSSatoshi Sahara    public function showIconCompareWithPrevious()
260b428a50aSSatoshi Sahara    {
261b428a50aSSatoshi Sahara        global $lang;
262b428a50aSSatoshi Sahara        $id = $this->val('id');
263bf3fa5e9SSatoshi Sahara
264bf3fa5e9SSatoshi Sahara        $href = '';
265*a835c93aSGerrit Uitslag        if ($this->val('mode') == self::MODE_MEDIA) {
2660603e565SAndreas Gohr            // media file revision
267eeda7adaSGerrit Uitslag            // unlike page, media file does not copied to media_attic when uploaded.
268b428a50aSSatoshi Sahara            // diff icon will not be shown when external edit occurred
269b428a50aSSatoshi Sahara            // because no attic file to be compared with current.
270bf3fa5e9SSatoshi Sahara            $revs = (new MediaChangeLog($id))->getRevisions(0, 1);
271b428a50aSSatoshi Sahara            $showLink = (count($revs) && file_exists(mediaFN($id, $revs[0])) && file_exists(mediaFN($id)));
272bf3fa5e9SSatoshi Sahara            if ($showLink) {
273b428a50aSSatoshi Sahara                $param = ['tab_details' => 'history', 'mediado' => 'diff', 'ns' => getNS($id), 'image' => $id];
274b428a50aSSatoshi Sahara                $href = media_managerURL($param, '&');
275bf3fa5e9SSatoshi Sahara            }
276*a835c93aSGerrit Uitslag        } elseif ($this->val('mode') == self::MODE_PAGE) {
2770603e565SAndreas Gohr            // page revision
278b428a50aSSatoshi Sahara            // when a page just created anyway, it is natural to expect no older revisions
279b428a50aSSatoshi Sahara            // even if it had once existed but deleted before. Simply ignore to check changelog.
280b428a50aSSatoshi Sahara            if ($this->val('type') !== DOKU_CHANGE_TYPE_CREATE) {
281b428a50aSSatoshi Sahara                $href = wl($id, ['do' => 'diff'], false, '&');
282bf3fa5e9SSatoshi Sahara            }
283bf3fa5e9SSatoshi Sahara        }
284bf3fa5e9SSatoshi Sahara
285bf3fa5e9SSatoshi Sahara        if ($href) {
286b428a50aSSatoshi Sahara            return '<a href="' . $href . '" class="diff_link">'
287bf3fa5e9SSatoshi Sahara                  . '<img src="' . DOKU_BASE . 'lib/images/diff.png" width="15" height="11"'
288bf3fa5e9SSatoshi Sahara                  . ' title="' . $lang['diff'] . '" alt="' . $lang['diff'] . '" />'
289bf3fa5e9SSatoshi Sahara                  . '</a>';
290bf3fa5e9SSatoshi Sahara        } else {
291b428a50aSSatoshi Sahara            return '<img src="' . DOKU_BASE . 'lib/images/blank.gif" width="15" height="11" alt="" />';
292bf3fa5e9SSatoshi Sahara        }
293bf3fa5e9SSatoshi Sahara    }
294bf3fa5e9SSatoshi Sahara
295bf3fa5e9SSatoshi Sahara    /**
296eeda7adaSGerrit Uitslag     * diff link icon in revisions list, compare this revision with current one
297bf3fa5e9SSatoshi Sahara     * the icon does not displayed for the current revision
298bf3fa5e9SSatoshi Sahara     *
299bf3fa5e9SSatoshi Sahara     * @return string
300bf3fa5e9SSatoshi Sahara     */
301b428a50aSSatoshi Sahara    public function showIconCompareWithCurrent()
302bf3fa5e9SSatoshi Sahara    {
303bf3fa5e9SSatoshi Sahara        global $lang;
304b428a50aSSatoshi Sahara        $id = $this->val('id');
305b428a50aSSatoshi Sahara        $rev = $this->isCurrent() ? '' : $this->val('date');
306bf3fa5e9SSatoshi Sahara
307b428a50aSSatoshi Sahara        $href = '';
308*a835c93aSGerrit Uitslag        if ($this->val('mode') == self::MODE_MEDIA) {
3090603e565SAndreas Gohr            // media file revision
310b428a50aSSatoshi Sahara            if (!$this->isCurrent() && file_exists(mediaFN($id, $rev))) {
311b428a50aSSatoshi Sahara                $param = ['mediado' => 'diff', 'image' => $id, 'rev' => $rev];
312b428a50aSSatoshi Sahara                $href = media_managerURL($param, '&');
313bf3fa5e9SSatoshi Sahara            }
314*a835c93aSGerrit Uitslag        } elseif ($this->val('mode') == self::MODE_PAGE) {
3150603e565SAndreas Gohr            // page revision
316b428a50aSSatoshi Sahara            if (!$this->isCurrent()) {
317b428a50aSSatoshi Sahara                $href = wl($id, ['rev' => $rev, 'do' => 'diff'], false, '&');
318b428a50aSSatoshi Sahara            }
319b428a50aSSatoshi Sahara        }
320b428a50aSSatoshi Sahara
321b428a50aSSatoshi Sahara        if ($href) {
322b428a50aSSatoshi Sahara            return '<a href="' . $href . '" class="diff_link">'
323bf3fa5e9SSatoshi Sahara                  . '<img src="' . DOKU_BASE . 'lib/images/diff.png" width="15" height="11"'
324bf3fa5e9SSatoshi Sahara                  . ' title="' . $lang['diff'] . '" alt="' . $lang['diff'] . '" />'
325bf3fa5e9SSatoshi Sahara                  . '</a>';
326b428a50aSSatoshi Sahara        } else {
327b428a50aSSatoshi Sahara            return '<img src="' . DOKU_BASE . 'lib/images/blank.gif" width="15" height="11" alt="" />';
328bf3fa5e9SSatoshi Sahara        }
329bf3fa5e9SSatoshi Sahara    }
330bf3fa5e9SSatoshi Sahara
331bf3fa5e9SSatoshi Sahara    /**
332b428a50aSSatoshi Sahara     * icon for revision action
333bf3fa5e9SSatoshi Sahara     * used in [Ui\recent]
334bf3fa5e9SSatoshi Sahara     *
335bf3fa5e9SSatoshi Sahara     * @return string
336bf3fa5e9SSatoshi Sahara     */
337b428a50aSSatoshi Sahara    public function showIconRevisions()
338bf3fa5e9SSatoshi Sahara    {
33975d9280cSGerrit Uitslag        global $lang;
340bf3fa5e9SSatoshi Sahara
341bf3fa5e9SSatoshi Sahara        if (!actionOK('revisions')) {
342b428a50aSSatoshi Sahara            return '';
343bf3fa5e9SSatoshi Sahara        }
344bf3fa5e9SSatoshi Sahara
345b428a50aSSatoshi Sahara        $id = $this->val('id');
346*a835c93aSGerrit Uitslag        if ($this->val('mode') == self::MODE_MEDIA) {
3470603e565SAndreas Gohr            // media file revision
348b428a50aSSatoshi Sahara            $param  = ['tab_details' => 'history', 'ns' => getNS($id), 'image' => $id];
349b428a50aSSatoshi Sahara            $href = media_managerURL($param, '&');
350*a835c93aSGerrit Uitslag        } elseif ($this->val('mode') == self::MODE_PAGE) {
3510603e565SAndreas Gohr            // page revision
352b428a50aSSatoshi Sahara            $href = wl($id, ['do' => 'revisions'], false, '&');
353bf3fa5e9SSatoshi Sahara        }
354bf3fa5e9SSatoshi Sahara        return '<a href="' . $href . '" class="revisions_link">'
355bf3fa5e9SSatoshi Sahara              . '<img src="' . DOKU_BASE . 'lib/images/history.png" width="12" height="14"'
356bf3fa5e9SSatoshi Sahara              . ' title="' . $lang['btn_revs'] . '" alt="' . $lang['btn_revs'] . '" />'
357bf3fa5e9SSatoshi Sahara              . '</a>';
358bf3fa5e9SSatoshi Sahara    }
359bf3fa5e9SSatoshi Sahara
360bf3fa5e9SSatoshi Sahara    /**
361bf3fa5e9SSatoshi Sahara     * size change
362bf3fa5e9SSatoshi Sahara     * used in [Ui\recent, Ui\Revisions]
363bf3fa5e9SSatoshi Sahara     *
364bf3fa5e9SSatoshi Sahara     * @return string
365bf3fa5e9SSatoshi Sahara     */
366b428a50aSSatoshi Sahara    public function showSizeChange()
367bf3fa5e9SSatoshi Sahara    {
368bf3fa5e9SSatoshi Sahara        $class = 'sizechange';
369b428a50aSSatoshi Sahara        $value = filesize_h(abs($this->val('sizechange')));
370b428a50aSSatoshi Sahara        if ($this->val('sizechange') > 0) {
371bf3fa5e9SSatoshi Sahara            $class .= ' positive';
372bf3fa5e9SSatoshi Sahara            $value = '+' . $value;
373b428a50aSSatoshi Sahara        } elseif ($this->val('sizechange') < 0) {
374bf3fa5e9SSatoshi Sahara            $class .= ' negative';
375bf3fa5e9SSatoshi Sahara            $value = '-' . $value;
376bf3fa5e9SSatoshi Sahara        } else {
377bf3fa5e9SSatoshi Sahara            $value = '±' . $value;
378bf3fa5e9SSatoshi Sahara        }
379bf3fa5e9SSatoshi Sahara        return '<span class="' . $class . '">' . $value . '</span>';
380bf3fa5e9SSatoshi Sahara    }
381bf3fa5e9SSatoshi Sahara
382bf3fa5e9SSatoshi Sahara    /**
383eeda7adaSGerrit Uitslag     * current indicator, used in revision list
384eeda7adaSGerrit Uitslag     * not used in Ui\Recent because recent files are always current one
385bf3fa5e9SSatoshi Sahara     *
386bf3fa5e9SSatoshi Sahara     * @return string
387bf3fa5e9SSatoshi Sahara     */
388b428a50aSSatoshi Sahara    public function showCurrentIndicator()
389bf3fa5e9SSatoshi Sahara    {
390bf3fa5e9SSatoshi Sahara        global $lang;
391b428a50aSSatoshi Sahara        return $this->isCurrent() ? '(' . $lang['current'] . ')' : '';
392bf3fa5e9SSatoshi Sahara    }
393bf3fa5e9SSatoshi Sahara}
394