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