xref: /dokuwiki/inc/ChangeLog/RevisionInfo.php (revision 3d727ea43c26288d1999e69448e2651bdc41e32e)
1bf3fa5e9SSatoshi Sahara<?php
2bf3fa5e9SSatoshi Sahara
3bf3fa5e9SSatoshi Saharanamespace dokuwiki\ChangeLog;
4bf3fa5e9SSatoshi Sahara
5bf3fa5e9SSatoshi Sahara/**
6bf3fa5e9SSatoshi Sahara * Class RevisionInfo
7bf3fa5e9SSatoshi Sahara *
8bf3fa5e9SSatoshi Sahara * Provides methods to show Revision Information in DokuWiki Ui compoments:
9bf3fa5e9SSatoshi Sahara *  - Ui\Recent
10bf3fa5e9SSatoshi Sahara *  - Ui\PageRevisions
11bf3fa5e9SSatoshi Sahara *  - Ui\MediaRevisions
12bf3fa5e9SSatoshi Sahara */
13bf3fa5e9SSatoshi Saharaclass RevisionInfo
14bf3fa5e9SSatoshi Sahara{
15bf3fa5e9SSatoshi Sahara    protected $info;
16bf3fa5e9SSatoshi Sahara
17bf3fa5e9SSatoshi Sahara    /**
18bf3fa5e9SSatoshi Sahara     * Constructor
19bf3fa5e9SSatoshi Sahara     *
20bf3fa5e9SSatoshi Sahara     * @param array $info Revision Infomation structure with entries:
21bf3fa5e9SSatoshi Sahara     *      - date:  unix timestamp
22bf3fa5e9SSatoshi Sahara     *      - ip:    IPv4 or IPv6 address
23bf3fa5e9SSatoshi Sahara     *      - type:  change type (log line type)
24bf3fa5e9SSatoshi Sahara     *      - id:    page id
25bf3fa5e9SSatoshi Sahara     *      - user:  user name
26bf3fa5e9SSatoshi Sahara     *      - sum:   edit summary (or action reason)
27bf3fa5e9SSatoshi Sahara     *      - extra: extra data (varies by line type)
28bf3fa5e9SSatoshi Sahara     *      - sizechange: change of filesize
29bf3fa5e9SSatoshi Sahara     *      additionally,
30*3d727ea4SGerrit Uitslag     *      - current:   (optional) whether current revision or not
31bf3fa5e9SSatoshi Sahara     *      - timestamp: (optional) set only when external edits occurred
32bf3fa5e9SSatoshi Sahara     */
33bf3fa5e9SSatoshi Sahara    public function __construct(array $info)
34bf3fa5e9SSatoshi Sahara    {
35bf3fa5e9SSatoshi Sahara        $info['item'] = strrpos($info['id'], '.') ? 'media' : 'page';
36*3d727ea4SGerrit Uitslag        // current is always true for items shown in Ui\Recents
37bf3fa5e9SSatoshi Sahara        $info['current'] = $info['current'] ?? true;
38bf3fa5e9SSatoshi Sahara        // revision info may have timestamp key when external edits occurred
39bf3fa5e9SSatoshi Sahara        $info['timestamp'] = $info['timestamp'] ?? true;
40bf3fa5e9SSatoshi Sahara
41bf3fa5e9SSatoshi Sahara        $this->info = $info;
42bf3fa5e9SSatoshi Sahara    }
43bf3fa5e9SSatoshi Sahara
44bf3fa5e9SSatoshi Sahara    /**
45bf3fa5e9SSatoshi Sahara     * fileicon of the page or media file
46bf3fa5e9SSatoshi Sahara     * used in [Ui\recent]
47bf3fa5e9SSatoshi Sahara     *
48bf3fa5e9SSatoshi Sahara     * @return string
49bf3fa5e9SSatoshi Sahara     */
50bf3fa5e9SSatoshi Sahara    public function itemIcon()
51bf3fa5e9SSatoshi Sahara    {
52bf3fa5e9SSatoshi Sahara        $id = $this->info['id'];
5375d9280cSGerrit Uitslag        $html = '';
54bf3fa5e9SSatoshi Sahara        switch ($this->info['item']) {
55bf3fa5e9SSatoshi Sahara            case 'media': // media file revision
56bf3fa5e9SSatoshi Sahara                $html = media_printicon($id);
57bf3fa5e9SSatoshi Sahara                break;
58bf3fa5e9SSatoshi Sahara            case 'page': // page revision
59bf3fa5e9SSatoshi Sahara                $html = '<img class="icon" src="'.DOKU_BASE.'lib/images/fileicons/file.png" alt="'.$id.'" />';
60bf3fa5e9SSatoshi Sahara        }
61bf3fa5e9SSatoshi Sahara        return $html;
62bf3fa5e9SSatoshi Sahara    }
63bf3fa5e9SSatoshi Sahara
64bf3fa5e9SSatoshi Sahara    /**
65bf3fa5e9SSatoshi Sahara     * edit date and time of the page or media file
66bf3fa5e9SSatoshi Sahara     * used in [Ui\recent, Ui\Revisions]
67bf3fa5e9SSatoshi Sahara     *
68bf3fa5e9SSatoshi Sahara     * @param bool $checkTimestamp  enable timestamp check, alter formatted string when timestamp is false
69bf3fa5e9SSatoshi Sahara     * @return string
70bf3fa5e9SSatoshi Sahara     */
71bf3fa5e9SSatoshi Sahara    public function editDate($checkTimestamp = false)
72bf3fa5e9SSatoshi Sahara    {
73bf3fa5e9SSatoshi Sahara        $formatted = dformat($this->info['date']);
74bf3fa5e9SSatoshi Sahara        if ($checkTimestamp && $this->info['timestamp'] === false) {
75bf3fa5e9SSatoshi Sahara            // exact date is unknown for item has externally deleted or older file restored
76bf3fa5e9SSatoshi Sahara            // when unknown, alter formatted string "YYYY-mm-DD HH:MM" to "____-__-__ __:__"
77bf3fa5e9SSatoshi Sahara            $formatted = preg_replace('/[0-9a-zA-Z]/','_', $formatted);
78bf3fa5e9SSatoshi Sahara        }
79bf3fa5e9SSatoshi Sahara        return '<span class="date">'. $formatted .'</span>';
80bf3fa5e9SSatoshi Sahara    }
81bf3fa5e9SSatoshi Sahara
82bf3fa5e9SSatoshi Sahara    /**
83bf3fa5e9SSatoshi Sahara     * edit summary
84bf3fa5e9SSatoshi Sahara     * used in [Ui\recent, Ui\Revisions]
85bf3fa5e9SSatoshi Sahara     *
86bf3fa5e9SSatoshi Sahara     * @return string
87bf3fa5e9SSatoshi Sahara     */
88bf3fa5e9SSatoshi Sahara    public function editSummary()
89bf3fa5e9SSatoshi Sahara    {
90bf3fa5e9SSatoshi Sahara        return '<span class="sum">'.' – '. hsc($this->info['sum']).'</span>';
91bf3fa5e9SSatoshi Sahara    }
92bf3fa5e9SSatoshi Sahara
93bf3fa5e9SSatoshi Sahara    /**
94bf3fa5e9SSatoshi Sahara     * editor of the page or media file
95bf3fa5e9SSatoshi Sahara     * used in [Ui\recent, Ui\Revisions]
96bf3fa5e9SSatoshi Sahara     *
97bf3fa5e9SSatoshi Sahara     * @return string
98bf3fa5e9SSatoshi Sahara     */
99bf3fa5e9SSatoshi Sahara    public function editor()
100bf3fa5e9SSatoshi Sahara    {
101bf3fa5e9SSatoshi Sahara        $html = '<span class="user">';
102bf3fa5e9SSatoshi Sahara        if ($this->info['user']) {
103bf3fa5e9SSatoshi Sahara            $html.= '<bdi>'. editorinfo($this->info['user']) .'</bdi>';
104bf3fa5e9SSatoshi Sahara            if (auth_ismanager()) $html.= ' <bdo dir="ltr">('. $this->info['ip'] .')</bdo>';
105bf3fa5e9SSatoshi Sahara        } else {
106bf3fa5e9SSatoshi Sahara            $html.= '<bdo dir="ltr">'. $this->info['ip'] .'</bdo>';
107bf3fa5e9SSatoshi Sahara        }
108bf3fa5e9SSatoshi Sahara        $html.= '</span>';
109bf3fa5e9SSatoshi Sahara        return $html;
110bf3fa5e9SSatoshi Sahara    }
111bf3fa5e9SSatoshi Sahara
112bf3fa5e9SSatoshi Sahara    /**
113bf3fa5e9SSatoshi Sahara     * name of the page or media file
114bf3fa5e9SSatoshi Sahara     * used in [Ui\recent, Ui\Revisions]
115bf3fa5e9SSatoshi Sahara     *
116bf3fa5e9SSatoshi Sahara     * @return string
117bf3fa5e9SSatoshi Sahara     */
118bf3fa5e9SSatoshi Sahara    public function itemName()
119bf3fa5e9SSatoshi Sahara    {
120bf3fa5e9SSatoshi Sahara        $id = $this->info['id'];
121bf3fa5e9SSatoshi Sahara        $rev = ($this->info['current']) ? '' : $this->info['date'];
122bf3fa5e9SSatoshi Sahara
123bf3fa5e9SSatoshi Sahara        switch ($this->info['item']) {
124bf3fa5e9SSatoshi Sahara            case 'media': // media file revision
125bf3fa5e9SSatoshi Sahara                $params = ['tab_details'=> 'view', 'ns'=> getNS($id), 'image'=> $id];
126bf3fa5e9SSatoshi Sahara                if ($rev) $params += ['rev'=> $rev];
127bf3fa5e9SSatoshi Sahara                $href = media_managerURL($params, '&');
128*3d727ea4SGerrit Uitslag                if(file_exists(mediaFN($id, $rev))) {
129*3d727ea4SGerrit Uitslag                    $class = 'wikilink1';
130*3d727ea4SGerrit Uitslag                } else {
131*3d727ea4SGerrit Uitslag                    $class = 'wikilink2';
132*3d727ea4SGerrit Uitslag                    if(!$this->info['current']) {
133*3d727ea4SGerrit Uitslag                        //revision is not in attic
134*3d727ea4SGerrit Uitslag                        return $id;
135*3d727ea4SGerrit Uitslag                    }
136*3d727ea4SGerrit Uitslag                }
137bf3fa5e9SSatoshi Sahara                return '<a href="'.$href.'" class="'.$class.'">'.$id.'</a>';
138bf3fa5e9SSatoshi Sahara            case 'page': // page revision
139de8ed963SGerrit Uitslag                $params = $rev ? ['rev'=> $rev] : [];
140bf3fa5e9SSatoshi Sahara                $href = wl($id, $params, false, '&');
141bf3fa5e9SSatoshi Sahara                $display_name = useHeading('navigation') ? hsc(p_get_first_heading($id)) : $id;
142bf3fa5e9SSatoshi Sahara                if (!$display_name) $display_name = $id;
143*3d727ea4SGerrit Uitslag                if(page_exists($id, $rev)) {
144*3d727ea4SGerrit Uitslag                    $class = 'wikilink1';
145*3d727ea4SGerrit Uitslag                } else {
146bf3fa5e9SSatoshi Sahara                    $class = 'wikilink2';
147*3d727ea4SGerrit Uitslag                    if(!$this->info['current']) {
148*3d727ea4SGerrit Uitslag                        //revision is not in attic
149*3d727ea4SGerrit Uitslag                        return $display_name;
150*3d727ea4SGerrit Uitslag                    }
151bf3fa5e9SSatoshi Sahara                }
152bf3fa5e9SSatoshi Sahara                return '<a href="'.$href.'" class="'.$class.'">'.$display_name.'</a>';
153bf3fa5e9SSatoshi Sahara        }
15475d9280cSGerrit Uitslag
15575d9280cSGerrit Uitslag        return '';
156bf3fa5e9SSatoshi Sahara    }
157bf3fa5e9SSatoshi Sahara
158bf3fa5e9SSatoshi Sahara    /**
159bf3fa5e9SSatoshi Sahara     * difflink icon in recents list
160bf3fa5e9SSatoshi Sahara     * all items in the recents are "current" revision of the page or media
161bf3fa5e9SSatoshi Sahara     *
162bf3fa5e9SSatoshi Sahara     * @return string
163bf3fa5e9SSatoshi Sahara     */
164bf3fa5e9SSatoshi Sahara    public function difflinkRecent()
165bf3fa5e9SSatoshi Sahara    {
166bf3fa5e9SSatoshi Sahara        global $lang;
167bf3fa5e9SSatoshi Sahara        $id = $this->info['id'];
168bf3fa5e9SSatoshi Sahara
169bf3fa5e9SSatoshi Sahara        $href = '';
170bf3fa5e9SSatoshi Sahara        switch ($this->info['item']) {
171bf3fa5e9SSatoshi Sahara            case 'media': // media file revision
172bf3fa5e9SSatoshi Sahara                $revs = (new MediaChangeLog($id))->getRevisions(0, 1);
173bf3fa5e9SSatoshi Sahara                $showLink = (count($revs) && file_exists(mediaFN($id)));
174bf3fa5e9SSatoshi Sahara                if ($showLink) {
175bf3fa5e9SSatoshi Sahara                    $href = media_managerURL(
176bf3fa5e9SSatoshi Sahara                        ['tab_details'=>'history', 'mediado'=>'diff', 'image'=> $id, 'ns'=> getNS($id)], '&'
177bf3fa5e9SSatoshi Sahara                    );
178bf3fa5e9SSatoshi Sahara                }
179bf3fa5e9SSatoshi Sahara                break;
180bf3fa5e9SSatoshi Sahara            case 'page': // page revision
181bf3fa5e9SSatoshi Sahara                if($this->info['type'] !== DOKU_CHANGE_TYPE_CREATE) {
182bf3fa5e9SSatoshi Sahara                    $href = wl($id, "do=diff", false, '&');
183bf3fa5e9SSatoshi Sahara                }
184bf3fa5e9SSatoshi Sahara        }
185bf3fa5e9SSatoshi Sahara
186bf3fa5e9SSatoshi Sahara        if ($href) {
187bf3fa5e9SSatoshi Sahara            $html = '<a href="'.$href.'" class="diff_link">'
188bf3fa5e9SSatoshi Sahara                  . '<img src="'.DOKU_BASE.'lib/images/diff.png" width="15" height="11"'
189bf3fa5e9SSatoshi Sahara                  . ' title="'.$lang['diff'].'" alt="'.$lang['diff'].'" />'
190bf3fa5e9SSatoshi Sahara                  . '</a>';
191bf3fa5e9SSatoshi Sahara        } else {
192bf3fa5e9SSatoshi Sahara            $html = '<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />';
193bf3fa5e9SSatoshi Sahara        }
194bf3fa5e9SSatoshi Sahara        return $html;
195bf3fa5e9SSatoshi Sahara    }
196bf3fa5e9SSatoshi Sahara
197bf3fa5e9SSatoshi Sahara    /**
198bf3fa5e9SSatoshi Sahara     * difflink icon in revsions list
199bf3fa5e9SSatoshi Sahara     * the icon does not displayed for the current revision
200bf3fa5e9SSatoshi Sahara     *
201bf3fa5e9SSatoshi Sahara     * @return string
202bf3fa5e9SSatoshi Sahara     */
203bf3fa5e9SSatoshi Sahara    public function difflinkRevision()
204bf3fa5e9SSatoshi Sahara    {
205bf3fa5e9SSatoshi Sahara        global $lang;
206bf3fa5e9SSatoshi Sahara        $id = $this->info['id'];
207bf3fa5e9SSatoshi Sahara        $rev = $this->info['date'];
208bf3fa5e9SSatoshi Sahara
209bf3fa5e9SSatoshi Sahara        switch ($this->info['item']) {
210bf3fa5e9SSatoshi Sahara            case 'media': // media file revision
211bf3fa5e9SSatoshi Sahara                if ($this->info['current'] || !file_exists(mediaFN($id, $rev))) {
212bf3fa5e9SSatoshi Sahara                    $html = '<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />';
213bf3fa5e9SSatoshi Sahara                } else {
214bf3fa5e9SSatoshi Sahara                    $href = media_managerURL(['image'=> $id, 'rev'=> $rev, 'mediado'=>'diff'], '&');
215bf3fa5e9SSatoshi Sahara                    $html = '<a href="'.$href.'" class="diff_link">'
216bf3fa5e9SSatoshi Sahara                          . '<img src="'.DOKU_BASE.'lib/images/diff.png" width="15" height="11"'
217bf3fa5e9SSatoshi Sahara                          . ' title="'. $lang['diff'] .'" alt="'.$lang['diff'] .'" />'
218bf3fa5e9SSatoshi Sahara                          . '</a> ';
219bf3fa5e9SSatoshi Sahara                }
220bf3fa5e9SSatoshi Sahara                return $html;
221bf3fa5e9SSatoshi Sahara            case 'page': // page revision
222bf3fa5e9SSatoshi Sahara                if ($this->info['current'] || !page_exists($id, $rev)) {
223bf3fa5e9SSatoshi Sahara                    $html = '<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />';
224bf3fa5e9SSatoshi Sahara                } else {
225bf3fa5e9SSatoshi Sahara                    $href = wl($id, "rev=$rev,do=diff", false, '&');
226bf3fa5e9SSatoshi Sahara                    $html = '<a href="'.$href.'" class="diff_link">'
227bf3fa5e9SSatoshi Sahara                          . '<img src="'.DOKU_BASE.'lib/images/diff.png" width="15" height="11"'
228bf3fa5e9SSatoshi Sahara                          . ' title="'.$lang['diff'].'" alt="'.$lang['diff'].'" />'
229bf3fa5e9SSatoshi Sahara                          . '</a>';
230bf3fa5e9SSatoshi Sahara                }
231bf3fa5e9SSatoshi Sahara                return $html;
232bf3fa5e9SSatoshi Sahara        }
233bf3fa5e9SSatoshi Sahara        return '';
234bf3fa5e9SSatoshi Sahara    }
235bf3fa5e9SSatoshi Sahara
236bf3fa5e9SSatoshi Sahara    /**
237bf3fa5e9SSatoshi Sahara     * icon revision link
238bf3fa5e9SSatoshi Sahara     * used in [Ui\recent]
239bf3fa5e9SSatoshi Sahara     *
240bf3fa5e9SSatoshi Sahara     * @return string
241bf3fa5e9SSatoshi Sahara     */
242bf3fa5e9SSatoshi Sahara    public function revisionlink()
243bf3fa5e9SSatoshi Sahara    {
24475d9280cSGerrit Uitslag        global $lang;
245bf3fa5e9SSatoshi Sahara
246bf3fa5e9SSatoshi Sahara        if (!actionOK('revisions')) {
247bf3fa5e9SSatoshi Sahara            return '';  //FIXME check page, media
248bf3fa5e9SSatoshi Sahara        }
249bf3fa5e9SSatoshi Sahara
250bf3fa5e9SSatoshi Sahara        $id = $this->info['id'];
25175d9280cSGerrit Uitslag        $href = '';
252bf3fa5e9SSatoshi Sahara        switch ($this->info['item']) {
253bf3fa5e9SSatoshi Sahara            case 'media': // media file revision
254bf3fa5e9SSatoshi Sahara                $href = media_managerURL(['tab_details'=>'history', 'image'=> $id, 'ns'=> getNS($id)], '&');
255bf3fa5e9SSatoshi Sahara                break;
256bf3fa5e9SSatoshi Sahara            case 'page': // page revision
257bf3fa5e9SSatoshi Sahara                $href = wl($id, "do=revisions", false, '&');
258bf3fa5e9SSatoshi Sahara        }
259bf3fa5e9SSatoshi Sahara        return '<a href="'.$href.'" class="revisions_link">'
260bf3fa5e9SSatoshi Sahara              . '<img src="'.DOKU_BASE.'lib/images/history.png" width="12" height="14"'
261bf3fa5e9SSatoshi Sahara              . ' title="'.$lang['btn_revs'].'" alt="'.$lang['btn_revs'].'" />'
262bf3fa5e9SSatoshi Sahara              . '</a>';
263bf3fa5e9SSatoshi Sahara    }
264bf3fa5e9SSatoshi Sahara
265bf3fa5e9SSatoshi Sahara    /**
266bf3fa5e9SSatoshi Sahara     * size change
267bf3fa5e9SSatoshi Sahara     * used in [Ui\recent, Ui\Revisions]
268bf3fa5e9SSatoshi Sahara     *
269bf3fa5e9SSatoshi Sahara     * @return string
270bf3fa5e9SSatoshi Sahara     */
271bf3fa5e9SSatoshi Sahara    public function sizeChange()
272bf3fa5e9SSatoshi Sahara    {
273bf3fa5e9SSatoshi Sahara        $class = 'sizechange';
274bf3fa5e9SSatoshi Sahara        $value = filesize_h(abs($this->info['sizechange']));
275bf3fa5e9SSatoshi Sahara        if ($this->info['sizechange'] > 0) {
276bf3fa5e9SSatoshi Sahara            $class .= ' positive';
277bf3fa5e9SSatoshi Sahara            $value = '+' . $value;
278bf3fa5e9SSatoshi Sahara        } elseif ($this->info['sizechange'] < 0) {
279bf3fa5e9SSatoshi Sahara            $class .= ' negative';
280bf3fa5e9SSatoshi Sahara            $value = '-' . $value;
281bf3fa5e9SSatoshi Sahara        } else {
282bf3fa5e9SSatoshi Sahara            $value = '±' . $value;
283bf3fa5e9SSatoshi Sahara        }
284bf3fa5e9SSatoshi Sahara        return '<span class="'.$class.'">'.$value.'</span>';
285bf3fa5e9SSatoshi Sahara    }
286bf3fa5e9SSatoshi Sahara
287bf3fa5e9SSatoshi Sahara    /**
288bf3fa5e9SSatoshi Sahara     * current indicator, used in revison list
289bf3fa5e9SSatoshi Sahara     * not used in Ui\Recents because recent items are always current one
290bf3fa5e9SSatoshi Sahara     *
291bf3fa5e9SSatoshi Sahara     * @return string
292bf3fa5e9SSatoshi Sahara     */
293bf3fa5e9SSatoshi Sahara    public function currentIndicator()
294bf3fa5e9SSatoshi Sahara    {
295bf3fa5e9SSatoshi Sahara        global $lang;
296bf3fa5e9SSatoshi Sahara        return ($this->info['current']) ? '('.$lang['current'].')' : '';
297bf3fa5e9SSatoshi Sahara    }
298bf3fa5e9SSatoshi Sahara
299bf3fa5e9SSatoshi Sahara
300bf3fa5e9SSatoshi Sahara}
301