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