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