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 /** 38*ad088cbcSSatoshi 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 52*ad088cbcSSatoshi Sahara $currentRevInfo = $changelog->getCurrentRevisionInfo(); 53*ad088cbcSSatoshi Sahara if (!$currentRevInfo) return $revisions; 54e71e09a6SSatoshi Sahara 5590c7493eSSatoshi Sahara $num = $conf['recent']; 5690c7493eSSatoshi Sahara if ($first == 0) { 57*ad088cbcSSatoshi Sahara $revisions[] = $currentRevInfo; 58*ad088cbcSSatoshi Sahara $num = $num - 1; 5990c7493eSSatoshi Sahara } 60*ad088cbcSSatoshi Sahara /* we need to get one additional log entry to be able to 61*ad088cbcSSatoshi Sahara * decide if this is the last page or is there another one. 62*ad088cbcSSatoshi Sahara * see also Ui\Recent::getRecents() 63*ad088cbcSSatoshi Sahara */ 64*ad088cbcSSatoshi Sahara $revlist = $changelog->getRevisions($first, $num + 1); 65*ad088cbcSSatoshi Sahara if (count($revlist) == 0 && $first > 0) { 66*ad088cbcSSatoshi Sahara // resets to zero if $first requested a too high number 67e71e09a6SSatoshi Sahara $first = 0; 68*ad088cbcSSatoshi Sahara return $this->getRevisions($first, $hasNext); 69e71e09a6SSatoshi Sahara } 70e71e09a6SSatoshi Sahara 71e71e09a6SSatoshi Sahara // decide if this is the last page or is there another one 72e71e09a6SSatoshi Sahara $hasNext = false; 7390c7493eSSatoshi Sahara if (count($revlist) > $num) { 74e71e09a6SSatoshi Sahara $hasNext = true; 75e71e09a6SSatoshi Sahara array_pop($revlist); // remove one additional log entry 76e71e09a6SSatoshi Sahara } 77e71e09a6SSatoshi Sahara 78e71e09a6SSatoshi Sahara // append each revison info array to the revisions 79e71e09a6SSatoshi Sahara foreach ($revlist as $rev) { 80*ad088cbcSSatoshi Sahara $revisions[] = $changelog->getRevisionInfo($rev); 81e71e09a6SSatoshi Sahara } 82e71e09a6SSatoshi Sahara return $revisions; 83e71e09a6SSatoshi Sahara } 8467ef3e88SSatoshi Sahara 8567ef3e88SSatoshi Sahara /** 8667ef3e88SSatoshi Sahara * Navigation buttons for Pagenation (prev/next) 8767ef3e88SSatoshi Sahara * 8867ef3e88SSatoshi Sahara * @param int $first 8967ef3e88SSatoshi Sahara * @param bool $hasNext 90ae5d2354SSatoshi Sahara * @param callable $callback returns array of hidden fields for the form button 9190c7493eSSatoshi Sahara * @return string html 9267ef3e88SSatoshi Sahara */ 93ae5d2354SSatoshi Sahara protected function navigation($first, $hasNext, $callback) 9467ef3e88SSatoshi Sahara { 9567ef3e88SSatoshi Sahara global $conf; 9667ef3e88SSatoshi Sahara 9767ef3e88SSatoshi Sahara $html = '<div class="pagenav">'; 986c9fde82SSatoshi Sahara $last = $first + $conf['recent']; 996c9fde82SSatoshi Sahara if ($first > 0) { 10067ef3e88SSatoshi Sahara $first = max($first - $conf['recent'], 0); 10167ef3e88SSatoshi Sahara $html.= '<div class="pagenav-prev">'; 102ae5d2354SSatoshi Sahara $html.= html_btn('newer', $this->id, "p", $callback($first)); 10367ef3e88SSatoshi Sahara $html.= '</div>'; 1046c9fde82SSatoshi Sahara } 1056c9fde82SSatoshi Sahara if ($hasNext) { 10667ef3e88SSatoshi Sahara $html.= '<div class="pagenav-next">'; 107ae5d2354SSatoshi Sahara $html.= html_btn('older', $this->id, "n", $callback($last)); 10867ef3e88SSatoshi Sahara $html.= '</div>'; 1096c9fde82SSatoshi Sahara } 11067ef3e88SSatoshi Sahara $html.= '</div>'; 11167ef3e88SSatoshi Sahara return $html; 11267ef3e88SSatoshi Sahara } 1136c9fde82SSatoshi Sahara 11467ef3e88SSatoshi Sahara /** 11567ef3e88SSatoshi Sahara * Returns instance of objRevInfo 11667ef3e88SSatoshi Sahara * 11767ef3e88SSatoshi Sahara * @param array $info Revision info structure of a page or media file 11867ef3e88SSatoshi Sahara * @return objRevInfo object (anonymous class) 11967ef3e88SSatoshi Sahara */ 1200bb448f0SSatoshi Sahara public function getObjRevInfo(array $info) 12167ef3e88SSatoshi Sahara { 12267ef3e88SSatoshi Sahara return new class ($info) // anonymous class (objRevInfo) 12367ef3e88SSatoshi Sahara { 12467ef3e88SSatoshi Sahara protected $info; 12567ef3e88SSatoshi Sahara 12667ef3e88SSatoshi Sahara public function __construct(array $info) 12767ef3e88SSatoshi Sahara { 128*ad088cbcSSatoshi Sahara $info['item'] = strrpos($info['id'], '.') ? 'media' : 'page'; 129c63f6084SDamien Regad if (!isset($info['current'])) { 130c63f6084SDamien Regad $info['current'] = false; 131c63f6084SDamien Regad } 13267ef3e88SSatoshi Sahara $this->info = $info; 13367ef3e88SSatoshi Sahara } 13467ef3e88SSatoshi Sahara 13567ef3e88SSatoshi Sahara // current indicator 13667ef3e88SSatoshi Sahara public function currentIndicator() 13767ef3e88SSatoshi Sahara { 13867ef3e88SSatoshi Sahara global $lang; 13967ef3e88SSatoshi Sahara return ($this->info['current']) ? '('.$lang['current'].')' : ''; 14067ef3e88SSatoshi Sahara } 14167ef3e88SSatoshi Sahara 14267ef3e88SSatoshi Sahara // edit date and time of the page or media file 14367ef3e88SSatoshi Sahara public function editDate() 14467ef3e88SSatoshi Sahara { 14590c7493eSSatoshi Sahara global $lang; 14690c7493eSSatoshi Sahara $date = dformat($this->info['date']); 147*ad088cbcSSatoshi Sahara if (($this->info['timestamp'] ?? '') == 'unknown') { 148*ad088cbcSSatoshi Sahara // exteranlly deleted or older file restored 149*ad088cbcSSatoshi Sahara $date = preg_replace('/[0-9a-zA-Z]/','_', $date); 15090c7493eSSatoshi Sahara } 15190c7493eSSatoshi Sahara return '<span class="date">'. $date .'</span>'; 15267ef3e88SSatoshi Sahara } 15367ef3e88SSatoshi Sahara 15467ef3e88SSatoshi Sahara // edit summary 15567ef3e88SSatoshi Sahara public function editSummary() 15667ef3e88SSatoshi Sahara { 15767ef3e88SSatoshi Sahara return '<span class="sum">'.' – '. hsc($this->info['sum']).'</span>'; 15867ef3e88SSatoshi Sahara } 15967ef3e88SSatoshi Sahara 16067ef3e88SSatoshi Sahara // editor of the page or media file 16167ef3e88SSatoshi Sahara public function editor() 16267ef3e88SSatoshi Sahara { 16367ef3e88SSatoshi Sahara // slightly different with display of Ui\Recent, i.e. external edit 16467ef3e88SSatoshi Sahara global $lang; 16567ef3e88SSatoshi Sahara $html = '<span class="user">'; 16667ef3e88SSatoshi Sahara if (!$this->info['user'] && !$this->info['ip']) { 16767ef3e88SSatoshi Sahara $html.= '('.$lang['external_edit'].')'; 16867ef3e88SSatoshi Sahara } elseif ($this->info['user']) { 16967ef3e88SSatoshi Sahara $html.= '<bdi>'. editorinfo($this->info['user']) .'</bdi>'; 17067ef3e88SSatoshi Sahara if (auth_ismanager()) $html.= ' <bdo dir="ltr">('. $this->info['ip'] .')</bdo>'; 17167ef3e88SSatoshi Sahara } else { 17267ef3e88SSatoshi Sahara $html.= '<bdo dir="ltr">'. $this->info['ip'] .'</bdo>'; 17367ef3e88SSatoshi Sahara } 17467ef3e88SSatoshi Sahara $html.= '</span>'; 17567ef3e88SSatoshi Sahara return $html; 17667ef3e88SSatoshi Sahara } 17767ef3e88SSatoshi Sahara 17867ef3e88SSatoshi Sahara // name of the page or media file 17967ef3e88SSatoshi Sahara public function itemName() 18067ef3e88SSatoshi Sahara { 18167ef3e88SSatoshi Sahara // slightly different with display of Ui\Recent, i.e. revison may not exists 18267ef3e88SSatoshi Sahara $id = $this->info['id']; 18367ef3e88SSatoshi Sahara $rev = $this->info['date']; 18467ef3e88SSatoshi Sahara 185e71e09a6SSatoshi Sahara switch ($this->info['item']) { 186e71e09a6SSatoshi Sahara case 'media': // media file revision 18767ef3e88SSatoshi Sahara if (isset($this->info['current'])) { 18867ef3e88SSatoshi Sahara $href = media_managerURL(['image'=> $id, 'tab_details'=> 'view'], '&'); 18967ef3e88SSatoshi Sahara $html = '<a href="'.$href.'" class="wikilink1">'.$id.'</a>'; 19067ef3e88SSatoshi Sahara } elseif (file_exists(mediaFN($id, $rev))) { 19167ef3e88SSatoshi Sahara $href = media_managerURL(['image'=> $id, 'tab_details'=> 'view', 'rev'=> $rev], '&'); 19267ef3e88SSatoshi Sahara $html = '<a href="'.$href.'" class="wikilink1">'.$id.'</a>'; 19367ef3e88SSatoshi Sahara } else { 19467ef3e88SSatoshi Sahara $html = $id; 19567ef3e88SSatoshi Sahara } 19667ef3e88SSatoshi Sahara return $html; 197e71e09a6SSatoshi Sahara case 'page': // page revision 19867ef3e88SSatoshi Sahara $display_name = useHeading('navigation') ? hsc(p_get_first_heading($id)) : $id; 19967ef3e88SSatoshi Sahara if (!$display_name) $display_name = $id; 200*ad088cbcSSatoshi Sahara if ($this->info['type'] == DOKU_CHANGE_TYPE_DELETE) { 201*ad088cbcSSatoshi Sahara // exteranlly deleted or older file restored 2025d9428a0SSatoshi Sahara $href = wl($id, "", false, '&'); 2035d9428a0SSatoshi Sahara $html = '<a href="'.$href.'" class="wikilink2">'.$display_name.'</a>'; 2045d9428a0SSatoshi Sahara } elseif ($this->info['current'] || page_exists($id, $rev)) { 20567ef3e88SSatoshi Sahara $href = wl($id, "rev=$rev", false, '&'); 20667ef3e88SSatoshi Sahara $html = '<a href="'.$href.'" class="wikilink1">'.$display_name.'</a>'; 20767ef3e88SSatoshi Sahara } else { 20867ef3e88SSatoshi Sahara $html = $display_name; 20967ef3e88SSatoshi Sahara } 21067ef3e88SSatoshi Sahara return $html; 21167ef3e88SSatoshi Sahara } 212e71e09a6SSatoshi Sahara return ''; 21367ef3e88SSatoshi Sahara } 21467ef3e88SSatoshi Sahara 21567ef3e88SSatoshi Sahara // icon difflink 21667ef3e88SSatoshi Sahara public function difflink() 21767ef3e88SSatoshi Sahara { 21867ef3e88SSatoshi Sahara global $lang; 21967ef3e88SSatoshi Sahara $id = $this->info['id']; 22067ef3e88SSatoshi Sahara $rev = $this->info['date']; 22167ef3e88SSatoshi Sahara 222e71e09a6SSatoshi Sahara switch ($this->info['item']) { 223e71e09a6SSatoshi Sahara case 'media': // media file revision 22467ef3e88SSatoshi Sahara if (isset($this->info['current']) || !file_exists(mediaFN($id, $rev))) { 22567ef3e88SSatoshi Sahara $html = '<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />'; 22667ef3e88SSatoshi Sahara } else { 22767ef3e88SSatoshi Sahara $href = media_managerURL(['image'=> $id, 'rev'=> $rev, 'mediado'=>'diff'], '&'); 22867ef3e88SSatoshi Sahara $html = '<a href="'.$href.'" class="diff_link">' 22967ef3e88SSatoshi Sahara . '<img src="'.DOKU_BASE.'lib/images/diff.png" width="15" height="11"' 23067ef3e88SSatoshi Sahara . ' title="'. $lang['diff'] .'" alt="'.$lang['diff'] .'" />' 23167ef3e88SSatoshi Sahara . '</a> '; 23267ef3e88SSatoshi Sahara } 23367ef3e88SSatoshi Sahara return $html; 234e71e09a6SSatoshi Sahara case 'page': // page revision 23567ef3e88SSatoshi Sahara if ($this->info['current'] || !page_exists($id, $rev)) { 23667ef3e88SSatoshi Sahara $html = '<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />'; 23767ef3e88SSatoshi Sahara } else { 23867ef3e88SSatoshi Sahara $href = wl($id, "rev=$rev,do=diff", false, '&'); 23967ef3e88SSatoshi Sahara $html = '<a href="'.$href.'" class="diff_link">' 24067ef3e88SSatoshi Sahara . '<img src="'.DOKU_BASE.'lib/images/diff.png" width="15" height="11"' 24167ef3e88SSatoshi Sahara . ' title="'.$lang['diff'].'" alt="'.$lang['diff'].'" />' 24267ef3e88SSatoshi Sahara . '</a>'; 24367ef3e88SSatoshi Sahara } 24467ef3e88SSatoshi Sahara return $html; 24567ef3e88SSatoshi Sahara } 246e71e09a6SSatoshi Sahara return ''; 24767ef3e88SSatoshi Sahara } 24867ef3e88SSatoshi Sahara 24967ef3e88SSatoshi Sahara // size change 25067ef3e88SSatoshi Sahara public function sizeChange() 25167ef3e88SSatoshi Sahara { 25267ef3e88SSatoshi Sahara $class = 'sizechange'; 25367ef3e88SSatoshi Sahara $value = filesize_h(abs($this->info['sizechange'])); 25467ef3e88SSatoshi Sahara if ($this->info['sizechange'] > 0) { 25567ef3e88SSatoshi Sahara $class .= ' positive'; 25667ef3e88SSatoshi Sahara $value = '+' . $value; 25767ef3e88SSatoshi Sahara } elseif ($this->info['sizechange'] < 0) { 25867ef3e88SSatoshi Sahara $class .= ' negative'; 25967ef3e88SSatoshi Sahara $value = '-' . $value; 26067ef3e88SSatoshi Sahara } else { 26167ef3e88SSatoshi Sahara $value = '±' . $value; 26267ef3e88SSatoshi Sahara } 26367ef3e88SSatoshi Sahara return '<span class="'.$class.'">'.$value.'</span>'; 26467ef3e88SSatoshi Sahara } 26567ef3e88SSatoshi Sahara }; // end of anonymous class (objRevInfo) 2666c9fde82SSatoshi Sahara } 2676c9fde82SSatoshi Sahara 2686c9fde82SSatoshi Sahara} 269