16c9fde82SSatoshi Sahara<?php 26c9fde82SSatoshi Sahara 36c9fde82SSatoshi Saharanamespace dokuwiki\Ui; 46c9fde82SSatoshi Sahara 590c7493eSSatoshi Saharause dokuwiki\ChangeLog\ChangeLog; 690c7493eSSatoshi Sahara 76c9fde82SSatoshi Sahara/** 89e316641SSatoshi Sahara * DokuWiki Revisions Interface 9ae5d2354SSatoshi Sahara * parent class of PageRevisions and MediaRevisions 106c9fde82SSatoshi Sahara * 116c9fde82SSatoshi Sahara * @package dokuwiki\Ui 126c9fde82SSatoshi Sahara */ 13ae5d2354SSatoshi Saharaabstract class Revisions extends Ui 146c9fde82SSatoshi Sahara{ 15ae5d2354SSatoshi Sahara /* @var string */ 16e71e09a6SSatoshi Sahara protected $id; // page id or media id 17e71e09a6SSatoshi Sahara 18e71e09a6SSatoshi Sahara /* @var ChangeLog */ 19e71e09a6SSatoshi Sahara protected $changelog; // PageChangeLog or MediaChangeLog object 209e316641SSatoshi Sahara 219e316641SSatoshi Sahara /** 229e316641SSatoshi Sahara * Revisions Ui constructor 239e316641SSatoshi Sahara * 24e71e09a6SSatoshi Sahara * @param string $id page id or media id 259e316641SSatoshi Sahara */ 26ae5d2354SSatoshi Sahara public function __construct($id) 279e316641SSatoshi Sahara { 28ae5d2354SSatoshi Sahara $this->id = $id; 29e71e09a6SSatoshi Sahara $this->setChangeLog(); 30e71e09a6SSatoshi Sahara } 31e71e09a6SSatoshi Sahara 32e71e09a6SSatoshi Sahara /** 33e71e09a6SSatoshi Sahara * set class property changelog 34e71e09a6SSatoshi Sahara */ 35e71e09a6SSatoshi Sahara abstract protected function setChangeLog(); 36e71e09a6SSatoshi Sahara 37e71e09a6SSatoshi Sahara /** 38ad088cbcSSatoshi Sahara * Get revisions, and set correct pagination parameters (first, hasNext) 3967ef3e88SSatoshi Sahara * 4067ef3e88SSatoshi Sahara * @param int $first 4167ef3e88SSatoshi Sahara * @param bool $hasNext 4267ef3e88SSatoshi Sahara * @return array revisions to be shown in a pagenated list 435525369fSSatoshi Sahara * @see also https://www.dokuwiki.org/devel:changelog 4467ef3e88SSatoshi Sahara */ 45e71e09a6SSatoshi Sahara protected function getRevisions(&$first, &$hasNext) 46e71e09a6SSatoshi Sahara { 47e71e09a6SSatoshi Sahara global $conf; 48e71e09a6SSatoshi Sahara 49e71e09a6SSatoshi Sahara $changelog =& $this->changelog; 5090c7493eSSatoshi Sahara $revisions = []; 51e71e09a6SSatoshi Sahara 52ad088cbcSSatoshi Sahara $currentRevInfo = $changelog->getCurrentRevisionInfo(); 53ad088cbcSSatoshi Sahara if (!$currentRevInfo) return $revisions; 54e71e09a6SSatoshi Sahara 5590c7493eSSatoshi Sahara $num = $conf['recent']; 5690c7493eSSatoshi Sahara if ($first == 0) { 57ad088cbcSSatoshi Sahara $revisions[] = $currentRevInfo; 58*5ec96136SSatoshi Sahara $first += (int)($currentRevInfo['date'] == $changelog->lastRevision()); 59ad088cbcSSatoshi Sahara $num = $num - 1; 6090c7493eSSatoshi Sahara } 61ad088cbcSSatoshi Sahara /* we need to get one additional log entry to be able to 62ad088cbcSSatoshi Sahara * decide if this is the last page or is there another one. 63ad088cbcSSatoshi Sahara * see also Ui\Recent::getRecents() 64ad088cbcSSatoshi Sahara */ 65ad088cbcSSatoshi Sahara $revlist = $changelog->getRevisions($first, $num + 1); 66ad088cbcSSatoshi Sahara if (count($revlist) == 0 && $first > 0) { 67ad088cbcSSatoshi Sahara // resets to zero if $first requested a too high number 68e71e09a6SSatoshi Sahara $first = 0; 69ad088cbcSSatoshi Sahara return $this->getRevisions($first, $hasNext); 70e71e09a6SSatoshi Sahara } 71e71e09a6SSatoshi Sahara 72e71e09a6SSatoshi Sahara // decide if this is the last page or is there another one 73e71e09a6SSatoshi Sahara $hasNext = false; 7490c7493eSSatoshi Sahara if (count($revlist) > $num) { 75e71e09a6SSatoshi Sahara $hasNext = true; 76e71e09a6SSatoshi Sahara array_pop($revlist); // remove one additional log entry 77e71e09a6SSatoshi Sahara } 78e71e09a6SSatoshi Sahara 79e71e09a6SSatoshi Sahara // append each revison info array to the revisions 80e71e09a6SSatoshi Sahara foreach ($revlist as $rev) { 81ad088cbcSSatoshi Sahara $revisions[] = $changelog->getRevisionInfo($rev); 82e71e09a6SSatoshi Sahara } 83e71e09a6SSatoshi Sahara return $revisions; 84e71e09a6SSatoshi Sahara } 8567ef3e88SSatoshi Sahara 8667ef3e88SSatoshi Sahara /** 8767ef3e88SSatoshi Sahara * Navigation buttons for Pagenation (prev/next) 8867ef3e88SSatoshi Sahara * 8967ef3e88SSatoshi Sahara * @param int $first 9067ef3e88SSatoshi Sahara * @param bool $hasNext 91ae5d2354SSatoshi Sahara * @param callable $callback returns array of hidden fields for the form button 9290c7493eSSatoshi Sahara * @return string html 9367ef3e88SSatoshi Sahara */ 94ae5d2354SSatoshi Sahara protected function navigation($first, $hasNext, $callback) 9567ef3e88SSatoshi Sahara { 9667ef3e88SSatoshi Sahara global $conf; 9767ef3e88SSatoshi Sahara 9867ef3e88SSatoshi Sahara $html = '<div class="pagenav">'; 996c9fde82SSatoshi Sahara $last = $first + $conf['recent']; 1006c9fde82SSatoshi Sahara if ($first > 0) { 10167ef3e88SSatoshi Sahara $first = max($first - $conf['recent'], 0); 10267ef3e88SSatoshi Sahara $html.= '<div class="pagenav-prev">'; 103ae5d2354SSatoshi Sahara $html.= html_btn('newer', $this->id, "p", $callback($first)); 10467ef3e88SSatoshi Sahara $html.= '</div>'; 1056c9fde82SSatoshi Sahara } 1066c9fde82SSatoshi Sahara if ($hasNext) { 10767ef3e88SSatoshi Sahara $html.= '<div class="pagenav-next">'; 108ae5d2354SSatoshi Sahara $html.= html_btn('older', $this->id, "n", $callback($last)); 10967ef3e88SSatoshi Sahara $html.= '</div>'; 1106c9fde82SSatoshi Sahara } 11167ef3e88SSatoshi Sahara $html.= '</div>'; 11267ef3e88SSatoshi Sahara return $html; 11367ef3e88SSatoshi Sahara } 1146c9fde82SSatoshi Sahara 11567ef3e88SSatoshi Sahara /** 11667ef3e88SSatoshi Sahara * Returns instance of objRevInfo 11767ef3e88SSatoshi Sahara * 11867ef3e88SSatoshi Sahara * @param array $info Revision info structure of a page or media file 11967ef3e88SSatoshi Sahara * @return objRevInfo object (anonymous class) 12067ef3e88SSatoshi Sahara */ 1210bb448f0SSatoshi Sahara public function getObjRevInfo(array $info) 12267ef3e88SSatoshi Sahara { 12367ef3e88SSatoshi Sahara return new class ($info) // anonymous class (objRevInfo) 12467ef3e88SSatoshi Sahara { 12567ef3e88SSatoshi Sahara protected $info; 12667ef3e88SSatoshi Sahara 12767ef3e88SSatoshi Sahara public function __construct(array $info) 12867ef3e88SSatoshi Sahara { 129ad088cbcSSatoshi Sahara $info['item'] = strrpos($info['id'], '.') ? 'media' : 'page'; 130*5ec96136SSatoshi Sahara $info['current'] = $info['current'] ?? false; 13167ef3e88SSatoshi Sahara $this->info = $info; 13267ef3e88SSatoshi Sahara } 13367ef3e88SSatoshi Sahara 13467ef3e88SSatoshi Sahara // current indicator 13567ef3e88SSatoshi Sahara public function currentIndicator() 13667ef3e88SSatoshi Sahara { 13767ef3e88SSatoshi Sahara global $lang; 13867ef3e88SSatoshi Sahara return ($this->info['current']) ? '('.$lang['current'].')' : ''; 13967ef3e88SSatoshi Sahara } 14067ef3e88SSatoshi Sahara 14167ef3e88SSatoshi Sahara // edit date and time of the page or media file 14267ef3e88SSatoshi Sahara public function editDate() 14367ef3e88SSatoshi Sahara { 14490c7493eSSatoshi Sahara global $lang; 14590c7493eSSatoshi Sahara $date = dformat($this->info['date']); 146ad088cbcSSatoshi Sahara if (($this->info['timestamp'] ?? '') == 'unknown') { 147*5ec96136SSatoshi Sahara // externally deleted or older file restored 148ad088cbcSSatoshi Sahara $date = preg_replace('/[0-9a-zA-Z]/','_', $date); 14990c7493eSSatoshi Sahara } 15090c7493eSSatoshi Sahara return '<span class="date">'. $date .'</span>'; 15167ef3e88SSatoshi Sahara } 15267ef3e88SSatoshi Sahara 15367ef3e88SSatoshi Sahara // edit summary 15467ef3e88SSatoshi Sahara public function editSummary() 15567ef3e88SSatoshi Sahara { 15667ef3e88SSatoshi Sahara return '<span class="sum">'.' – '. hsc($this->info['sum']).'</span>'; 15767ef3e88SSatoshi Sahara } 15867ef3e88SSatoshi Sahara 15967ef3e88SSatoshi Sahara // editor of the page or media file 16067ef3e88SSatoshi Sahara public function editor() 16167ef3e88SSatoshi Sahara { 16267ef3e88SSatoshi Sahara // slightly different with display of Ui\Recent, i.e. external edit 16367ef3e88SSatoshi Sahara global $lang; 16467ef3e88SSatoshi Sahara $html = '<span class="user">'; 16567ef3e88SSatoshi Sahara if (!$this->info['user'] && !$this->info['ip']) { 16667ef3e88SSatoshi Sahara $html.= '('.$lang['external_edit'].')'; 16767ef3e88SSatoshi Sahara } elseif ($this->info['user']) { 16867ef3e88SSatoshi Sahara $html.= '<bdi>'. editorinfo($this->info['user']) .'</bdi>'; 16967ef3e88SSatoshi Sahara if (auth_ismanager()) $html.= ' <bdo dir="ltr">('. $this->info['ip'] .')</bdo>'; 17067ef3e88SSatoshi Sahara } else { 17167ef3e88SSatoshi Sahara $html.= '<bdo dir="ltr">'. $this->info['ip'] .'</bdo>'; 17267ef3e88SSatoshi Sahara } 17367ef3e88SSatoshi Sahara $html.= '</span>'; 17467ef3e88SSatoshi Sahara return $html; 17567ef3e88SSatoshi Sahara } 17667ef3e88SSatoshi Sahara 17767ef3e88SSatoshi Sahara // name of the page or media file 17867ef3e88SSatoshi Sahara public function itemName() 17967ef3e88SSatoshi Sahara { 18067ef3e88SSatoshi Sahara // slightly different with display of Ui\Recent, i.e. revison may not exists 18167ef3e88SSatoshi Sahara $id = $this->info['id']; 18267ef3e88SSatoshi Sahara $rev = $this->info['date']; 18367ef3e88SSatoshi Sahara 184e71e09a6SSatoshi Sahara switch ($this->info['item']) { 185e71e09a6SSatoshi Sahara case 'media': // media file revision 186*5ec96136SSatoshi Sahara if ($this->info['current']) { 18767ef3e88SSatoshi Sahara $href = media_managerURL(['image'=> $id, 'tab_details'=> 'view'], '&'); 18867ef3e88SSatoshi Sahara $html = '<a href="'.$href.'" class="wikilink1">'.$id.'</a>'; 18967ef3e88SSatoshi Sahara } elseif (file_exists(mediaFN($id, $rev))) { 19067ef3e88SSatoshi Sahara $href = media_managerURL(['image'=> $id, 'tab_details'=> 'view', 'rev'=> $rev], '&'); 19167ef3e88SSatoshi Sahara $html = '<a href="'.$href.'" class="wikilink1">'.$id.'</a>'; 19267ef3e88SSatoshi Sahara } else { 19367ef3e88SSatoshi Sahara $html = $id; 19467ef3e88SSatoshi Sahara } 19567ef3e88SSatoshi Sahara return $html; 196e71e09a6SSatoshi Sahara case 'page': // page revision 19767ef3e88SSatoshi Sahara $display_name = useHeading('navigation') ? hsc(p_get_first_heading($id)) : $id; 19867ef3e88SSatoshi Sahara if (!$display_name) $display_name = $id; 199ad088cbcSSatoshi Sahara if ($this->info['type'] == DOKU_CHANGE_TYPE_DELETE) { 200ad088cbcSSatoshi Sahara // exteranlly deleted or older file restored 2015d9428a0SSatoshi Sahara $href = wl($id, "", false, '&'); 2025d9428a0SSatoshi Sahara $html = '<a href="'.$href.'" class="wikilink2">'.$display_name.'</a>'; 2035d9428a0SSatoshi Sahara } elseif ($this->info['current'] || page_exists($id, $rev)) { 20467ef3e88SSatoshi Sahara $href = wl($id, "rev=$rev", false, '&'); 20567ef3e88SSatoshi Sahara $html = '<a href="'.$href.'" class="wikilink1">'.$display_name.'</a>'; 20667ef3e88SSatoshi Sahara } else { 20767ef3e88SSatoshi Sahara $html = $display_name; 20867ef3e88SSatoshi Sahara } 20967ef3e88SSatoshi Sahara return $html; 21067ef3e88SSatoshi Sahara } 211e71e09a6SSatoshi Sahara return ''; 21267ef3e88SSatoshi Sahara } 21367ef3e88SSatoshi Sahara 21467ef3e88SSatoshi Sahara // icon difflink 21567ef3e88SSatoshi Sahara public function difflink() 21667ef3e88SSatoshi Sahara { 21767ef3e88SSatoshi Sahara global $lang; 21867ef3e88SSatoshi Sahara $id = $this->info['id']; 21967ef3e88SSatoshi Sahara $rev = $this->info['date']; 22067ef3e88SSatoshi Sahara 221e71e09a6SSatoshi Sahara switch ($this->info['item']) { 222e71e09a6SSatoshi Sahara case 'media': // media file revision 223*5ec96136SSatoshi Sahara if ($this->info['current'] || !file_exists(mediaFN($id, $rev))) { 22467ef3e88SSatoshi Sahara $html = '<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />'; 22567ef3e88SSatoshi Sahara } else { 22667ef3e88SSatoshi Sahara $href = media_managerURL(['image'=> $id, 'rev'=> $rev, 'mediado'=>'diff'], '&'); 22767ef3e88SSatoshi Sahara $html = '<a href="'.$href.'" class="diff_link">' 22867ef3e88SSatoshi Sahara . '<img src="'.DOKU_BASE.'lib/images/diff.png" width="15" height="11"' 22967ef3e88SSatoshi Sahara . ' title="'. $lang['diff'] .'" alt="'.$lang['diff'] .'" />' 23067ef3e88SSatoshi Sahara . '</a> '; 23167ef3e88SSatoshi Sahara } 23267ef3e88SSatoshi Sahara return $html; 233e71e09a6SSatoshi Sahara case 'page': // page revision 23467ef3e88SSatoshi Sahara if ($this->info['current'] || !page_exists($id, $rev)) { 23567ef3e88SSatoshi Sahara $html = '<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />'; 23667ef3e88SSatoshi Sahara } else { 23767ef3e88SSatoshi Sahara $href = wl($id, "rev=$rev,do=diff", false, '&'); 23867ef3e88SSatoshi Sahara $html = '<a href="'.$href.'" class="diff_link">' 23967ef3e88SSatoshi Sahara . '<img src="'.DOKU_BASE.'lib/images/diff.png" width="15" height="11"' 24067ef3e88SSatoshi Sahara . ' title="'.$lang['diff'].'" alt="'.$lang['diff'].'" />' 24167ef3e88SSatoshi Sahara . '</a>'; 24267ef3e88SSatoshi Sahara } 24367ef3e88SSatoshi Sahara return $html; 24467ef3e88SSatoshi Sahara } 245e71e09a6SSatoshi Sahara return ''; 24667ef3e88SSatoshi Sahara } 24767ef3e88SSatoshi Sahara 24867ef3e88SSatoshi Sahara // size change 24967ef3e88SSatoshi Sahara public function sizeChange() 25067ef3e88SSatoshi Sahara { 25167ef3e88SSatoshi Sahara $class = 'sizechange'; 25267ef3e88SSatoshi Sahara $value = filesize_h(abs($this->info['sizechange'])); 25367ef3e88SSatoshi Sahara if ($this->info['sizechange'] > 0) { 25467ef3e88SSatoshi Sahara $class .= ' positive'; 25567ef3e88SSatoshi Sahara $value = '+' . $value; 25667ef3e88SSatoshi Sahara } elseif ($this->info['sizechange'] < 0) { 25767ef3e88SSatoshi Sahara $class .= ' negative'; 25867ef3e88SSatoshi Sahara $value = '-' . $value; 25967ef3e88SSatoshi Sahara } else { 26067ef3e88SSatoshi Sahara $value = '±' . $value; 26167ef3e88SSatoshi Sahara } 26267ef3e88SSatoshi Sahara return '<span class="'.$class.'">'.$value.'</span>'; 26367ef3e88SSatoshi Sahara } 26467ef3e88SSatoshi Sahara }; // end of anonymous class (objRevInfo) 2656c9fde82SSatoshi Sahara } 2666c9fde82SSatoshi Sahara 2676c9fde82SSatoshi Sahara} 268