1*6c9fde82SSatoshi Sahara<?php 2*6c9fde82SSatoshi Sahara 3*6c9fde82SSatoshi Saharanamespace dokuwiki\Ui; 4*6c9fde82SSatoshi Sahara 5*6c9fde82SSatoshi Saharause dokuwiki\ChangeLog\PageChangeLog; 6*6c9fde82SSatoshi Saharause dokuwiki\ChangeLog\MediaChangeLog; 7*6c9fde82SSatoshi Saharause dokuwiki\Extension\Event; 8*6c9fde82SSatoshi Saharause dokuwiki\Form\Form; 9*6c9fde82SSatoshi Sahara 10*6c9fde82SSatoshi Sahara/** 11*6c9fde82SSatoshi Sahara * DokuWiki Revisions Insterface 12*6c9fde82SSatoshi Sahara * 13*6c9fde82SSatoshi Sahara * @package dokuwiki\Ui 14*6c9fde82SSatoshi Sahara */ 15*6c9fde82SSatoshi Saharaclass Revisions extends Ui 16*6c9fde82SSatoshi Sahara{ 17*6c9fde82SSatoshi Sahara /** 18*6c9fde82SSatoshi Sahara * Display list of old revisions 19*6c9fde82SSatoshi Sahara * 20*6c9fde82SSatoshi Sahara * @author Andreas Gohr <andi@splitbrain.org> 21*6c9fde82SSatoshi Sahara * @author Ben Coburn <btcoburn@silicodon.net> 22*6c9fde82SSatoshi Sahara * @author Kate Arzamastseva <pshns@ukr.net> 23*6c9fde82SSatoshi Sahara * 24*6c9fde82SSatoshi Sahara * @triggers HTML_REVISIONSFORM_OUTPUT 25*6c9fde82SSatoshi Sahara * @param int $first skip the first n changelog lines 26*6c9fde82SSatoshi Sahara * @param bool|string $media_id id of media, or false for current page 27*6c9fde82SSatoshi Sahara * @return void 28*6c9fde82SSatoshi Sahara */ 29*6c9fde82SSatoshi Sahara public function show($first = 0, $media_id = false) 30*6c9fde82SSatoshi Sahara { 31*6c9fde82SSatoshi Sahara global $ID; 32*6c9fde82SSatoshi Sahara global $INFO; 33*6c9fde82SSatoshi Sahara global $conf; 34*6c9fde82SSatoshi Sahara global $lang; 35*6c9fde82SSatoshi Sahara $id = $ID; 36*6c9fde82SSatoshi Sahara if ($media_id) { 37*6c9fde82SSatoshi Sahara $id = $media_id; 38*6c9fde82SSatoshi Sahara $changelog = new MediaChangeLog($id); 39*6c9fde82SSatoshi Sahara } else { 40*6c9fde82SSatoshi Sahara $changelog = new PageChangeLog($id); 41*6c9fde82SSatoshi Sahara } 42*6c9fde82SSatoshi Sahara 43*6c9fde82SSatoshi Sahara /* we need to get one additional log entry to be able to 44*6c9fde82SSatoshi Sahara * decide if this is the last page or is there another one. 45*6c9fde82SSatoshi Sahara * see html_recent() 46*6c9fde82SSatoshi Sahara */ 47*6c9fde82SSatoshi Sahara 48*6c9fde82SSatoshi Sahara $revisions = $changelog->getRevisions($first, $conf['recent'] +1); 49*6c9fde82SSatoshi Sahara 50*6c9fde82SSatoshi Sahara if (count($revisions) == 0 && $first != 0) { 51*6c9fde82SSatoshi Sahara $first = 0; 52*6c9fde82SSatoshi Sahara $revisions = $changelog->getRevisions($first, $conf['recent'] +1); 53*6c9fde82SSatoshi Sahara } 54*6c9fde82SSatoshi Sahara $hasNext = false; 55*6c9fde82SSatoshi Sahara if (count($revisions) > $conf['recent']) { 56*6c9fde82SSatoshi Sahara $hasNext = true; 57*6c9fde82SSatoshi Sahara array_pop($revisions); // remove extra log entry 58*6c9fde82SSatoshi Sahara } 59*6c9fde82SSatoshi Sahara 60*6c9fde82SSatoshi Sahara // print intro 61*6c9fde82SSatoshi Sahara if (!$media_id) { 62*6c9fde82SSatoshi Sahara print p_locale_xhtml('revisions'); 63*6c9fde82SSatoshi Sahara $exists = $INFO['exists']; 64*6c9fde82SSatoshi Sahara $display_name = useHeading('navigation') ? hsc(p_get_first_heading($id)) : $id; 65*6c9fde82SSatoshi Sahara if (!$display_name) { 66*6c9fde82SSatoshi Sahara $display_name = $id; 67*6c9fde82SSatoshi Sahara } 68*6c9fde82SSatoshi Sahara } else { 69*6c9fde82SSatoshi Sahara $exists = file_exists(mediaFN($id)); 70*6c9fde82SSatoshi Sahara $display_name = $id; 71*6c9fde82SSatoshi Sahara } 72*6c9fde82SSatoshi Sahara 73*6c9fde82SSatoshi Sahara // create the form 74*6c9fde82SSatoshi Sahara $form = new Form(['id' => 'page__revisions']); 75*6c9fde82SSatoshi Sahara $form->addClass('changes'); 76*6c9fde82SSatoshi Sahara if ($media_id) { 77*6c9fde82SSatoshi Sahara $form->attr('action', media_managerURL(array('image' => $media_id), '&')); 78*6c9fde82SSatoshi Sahara } 79*6c9fde82SSatoshi Sahara 80*6c9fde82SSatoshi Sahara // start listing 81*6c9fde82SSatoshi Sahara $form->addTagOpen('ul'); 82*6c9fde82SSatoshi Sahara 83*6c9fde82SSatoshi Sahara if ($exists && $first == 0) { 84*6c9fde82SSatoshi Sahara $minor = false; 85*6c9fde82SSatoshi Sahara if ($media_id) { 86*6c9fde82SSatoshi Sahara $date = dformat(@filemtime(mediaFN($id))); 87*6c9fde82SSatoshi Sahara $href = media_managerURL(array('image' => $id, 'tab_details' => 'view'), '&'); 88*6c9fde82SSatoshi Sahara 89*6c9fde82SSatoshi Sahara $changelog->setChunkSize(1024); 90*6c9fde82SSatoshi Sahara $revinfo = $changelog->getRevisionInfo(@filemtime(fullpath(mediaFN($id)))); 91*6c9fde82SSatoshi Sahara 92*6c9fde82SSatoshi Sahara $summary = $revinfo['sum']; 93*6c9fde82SSatoshi Sahara $editor = $revinfo['user'] ?: $revinfo['ip']; 94*6c9fde82SSatoshi Sahara $sizechange = $revinfo['sizechange']; 95*6c9fde82SSatoshi Sahara } else { 96*6c9fde82SSatoshi Sahara $date = dformat($INFO['lastmod']); 97*6c9fde82SSatoshi Sahara if (isset($INFO['meta']) && isset($INFO['meta']['last_change'])) { 98*6c9fde82SSatoshi Sahara if ($INFO['meta']['last_change']['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) { 99*6c9fde82SSatoshi Sahara $minor = true; 100*6c9fde82SSatoshi Sahara } 101*6c9fde82SSatoshi Sahara if (isset($INFO['meta']['last_change']['sizechange'])) { 102*6c9fde82SSatoshi Sahara $sizechange = $INFO['meta']['last_change']['sizechange']; 103*6c9fde82SSatoshi Sahara } else { 104*6c9fde82SSatoshi Sahara $sizechange = null; 105*6c9fde82SSatoshi Sahara } 106*6c9fde82SSatoshi Sahara } 107*6c9fde82SSatoshi Sahara $pagelog = new PageChangeLog($ID); 108*6c9fde82SSatoshi Sahara $latestrev = $pagelog->getRevisions(-1, 1); 109*6c9fde82SSatoshi Sahara $latestrev = array_pop($latestrev); 110*6c9fde82SSatoshi Sahara $href = wl($id, "rev=$latestrev", false, '&'); 111*6c9fde82SSatoshi Sahara $summary = $INFO['sum']; 112*6c9fde82SSatoshi Sahara $editor = $INFO['editor']; 113*6c9fde82SSatoshi Sahara } 114*6c9fde82SSatoshi Sahara 115*6c9fde82SSatoshi Sahara $form->addTagOpen('li')->addClass($minor ? 'minor' : ''); 116*6c9fde82SSatoshi Sahara $form->addTagOpen('div')->addClass('li'); 117*6c9fde82SSatoshi Sahara $form->addCheckbox('rev2[]')->val('current'); 118*6c9fde82SSatoshi Sahara 119*6c9fde82SSatoshi Sahara $form->addTagOpen('span')->addClass('data'); 120*6c9fde82SSatoshi Sahara $form->addHTML($date); 121*6c9fde82SSatoshi Sahara $form->addTagClose('span'); 122*6c9fde82SSatoshi Sahara 123*6c9fde82SSatoshi Sahara $form->addTag('img')->attrs([ 124*6c9fde82SSatoshi Sahara 'src' => DOKU_BASE.'lib/images/blank.gif', 125*6c9fde82SSatoshi Sahara 'width' => 15, 126*6c9fde82SSatoshi Sahara 'height' => 11, 127*6c9fde82SSatoshi Sahara 'alt' => '', 128*6c9fde82SSatoshi Sahara ]); 129*6c9fde82SSatoshi Sahara 130*6c9fde82SSatoshi Sahara $form->addTagOPen('a')->attr('href', $href)->addClass('wikilink1'); 131*6c9fde82SSatoshi Sahara $form->addHTML($display_name); 132*6c9fde82SSatoshi Sahara $form->addTagClose('a'); 133*6c9fde82SSatoshi Sahara 134*6c9fde82SSatoshi Sahara if ($media_id) $form->addTagOpen('div'); 135*6c9fde82SSatoshi Sahara 136*6c9fde82SSatoshi Sahara if ($summary) { 137*6c9fde82SSatoshi Sahara $form->addTagOpen('span')->addClass('sum'); 138*6c9fde82SSatoshi Sahara if (!$media_id) $form->addHTML(' – '); 139*6c9fde82SSatoshi Sahara $form->addHTML('<bdi>' . hsc($summary) . '</bdi>'); 140*6c9fde82SSatoshi Sahara $form->addTagClose('span'); 141*6c9fde82SSatoshi Sahara } 142*6c9fde82SSatoshi Sahara 143*6c9fde82SSatoshi Sahara $form->addTagOpen('span')->addClass('user'); 144*6c9fde82SSatoshi Sahara $form->addHTML( 145*6c9fde82SSatoshi Sahara (empty($editor)) ? ('('.$lang['external_edit'].')') : '<bdi>'.editorinfo($editor).'</bdi>' 146*6c9fde82SSatoshi Sahara ); 147*6c9fde82SSatoshi Sahara $form->addTagClose('span'); 148*6c9fde82SSatoshi Sahara 149*6c9fde82SSatoshi Sahara 150*6c9fde82SSatoshi Sahara html_sizechange($sizechange, $form); 151*6c9fde82SSatoshi Sahara 152*6c9fde82SSatoshi Sahara $form->addHTML('('.$lang['current'].')'); 153*6c9fde82SSatoshi Sahara 154*6c9fde82SSatoshi Sahara if ($media_id) $form->addTagClose('div'); 155*6c9fde82SSatoshi Sahara 156*6c9fde82SSatoshi Sahara $form->addTagClose('div'); 157*6c9fde82SSatoshi Sahara $form->addTagClose('li'); 158*6c9fde82SSatoshi Sahara } 159*6c9fde82SSatoshi Sahara 160*6c9fde82SSatoshi Sahara foreach ($revisions as $rev) { 161*6c9fde82SSatoshi Sahara $date = dformat($rev); 162*6c9fde82SSatoshi Sahara $info = $changelog->getRevisionInfo($rev); 163*6c9fde82SSatoshi Sahara if ($media_id) { 164*6c9fde82SSatoshi Sahara $exists = file_exists(mediaFN($id, $rev)); 165*6c9fde82SSatoshi Sahara } else { 166*6c9fde82SSatoshi Sahara $exists = page_exists($id, $rev); 167*6c9fde82SSatoshi Sahara } 168*6c9fde82SSatoshi Sahara 169*6c9fde82SSatoshi Sahara $class = ''; 170*6c9fde82SSatoshi Sahara if ($info['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) { 171*6c9fde82SSatoshi Sahara $class = 'minor'; 172*6c9fde82SSatoshi Sahara } 173*6c9fde82SSatoshi Sahara 174*6c9fde82SSatoshi Sahara $form->addTagOpen('li')->addClass($class); 175*6c9fde82SSatoshi Sahara $form->addTagOpen('div')->addClass('li'); 176*6c9fde82SSatoshi Sahara 177*6c9fde82SSatoshi Sahara if ($exists){ 178*6c9fde82SSatoshi Sahara $form->addCheckbox('rev2[]')->val($rev); 179*6c9fde82SSatoshi Sahara } else { 180*6c9fde82SSatoshi Sahara $form->addTag('img')->attrs([ 181*6c9fde82SSatoshi Sahara 'src' => DOKU_BASE.'lib/images/blank.gif', 182*6c9fde82SSatoshi Sahara 'width' => 15, 183*6c9fde82SSatoshi Sahara 'height' => 11, 184*6c9fde82SSatoshi Sahara 'alt' => '', 185*6c9fde82SSatoshi Sahara ]); 186*6c9fde82SSatoshi Sahara } 187*6c9fde82SSatoshi Sahara 188*6c9fde82SSatoshi Sahara $form->addTagOpen('span')->addClass('date'); 189*6c9fde82SSatoshi Sahara $form->addHTML($date); 190*6c9fde82SSatoshi Sahara $form->addTagClose('span'); 191*6c9fde82SSatoshi Sahara 192*6c9fde82SSatoshi Sahara if ($exists) { 193*6c9fde82SSatoshi Sahara if (!$media_id) { 194*6c9fde82SSatoshi Sahara $href = wl($id, "rev=$rev,do=diff", false, '&'); 195*6c9fde82SSatoshi Sahara } else { 196*6c9fde82SSatoshi Sahara $href = media_managerURL(array('image' => $id, 'rev' => $rev, 'mediado' => 'diff'), '&'); 197*6c9fde82SSatoshi Sahara } 198*6c9fde82SSatoshi Sahara $form->addTagOpen('a')->attr('href', $href)->addClass('diff_link'); 199*6c9fde82SSatoshi Sahara $form->addTag('img')->attrs([ 200*6c9fde82SSatoshi Sahara 'src' => DOKU_BASE.'lib/images/diff.png', 201*6c9fde82SSatoshi Sahara 'width' => 15, 202*6c9fde82SSatoshi Sahara 'height' => 11, 203*6c9fde82SSatoshi Sahara 'title' => $lang['diff'], 204*6c9fde82SSatoshi Sahara 'alt' => $lang['diff'], 205*6c9fde82SSatoshi Sahara ]); 206*6c9fde82SSatoshi Sahara $form->addTagClose('a'); 207*6c9fde82SSatoshi Sahara 208*6c9fde82SSatoshi Sahara if (!$media_id) { 209*6c9fde82SSatoshi Sahara $href = wl($id, "rev=$rev", false, '&'); 210*6c9fde82SSatoshi Sahara } else { 211*6c9fde82SSatoshi Sahara $href = media_managerURL(array('image' => $id, 'tab_details' => 'view', 'rev' => $rev), '&'); 212*6c9fde82SSatoshi Sahara } 213*6c9fde82SSatoshi Sahara $form->addTagOpen('a')->attr('href', $href)->addClass('wikilink1'); 214*6c9fde82SSatoshi Sahara $form->addHTML($display_name); 215*6c9fde82SSatoshi Sahara $form->addTagClose('a'); 216*6c9fde82SSatoshi Sahara } else { 217*6c9fde82SSatoshi Sahara $form->addTag('img')->attrs([ 218*6c9fde82SSatoshi Sahara 'src' => DOKU_BASE.'lib/images/blank.gif', 219*6c9fde82SSatoshi Sahara 'width' => 15, 220*6c9fde82SSatoshi Sahara 'height' => 11, 221*6c9fde82SSatoshi Sahara 'alt' => '', 222*6c9fde82SSatoshi Sahara ]); 223*6c9fde82SSatoshi Sahara $form->addHTML($display_name); 224*6c9fde82SSatoshi Sahara } 225*6c9fde82SSatoshi Sahara 226*6c9fde82SSatoshi Sahara if ($media_id) $form->addTagOpen('div'); 227*6c9fde82SSatoshi Sahara 228*6c9fde82SSatoshi Sahara if ($info['sum']) { 229*6c9fde82SSatoshi Sahara $form->addTagOpen('span')->addClass('sum'); 230*6c9fde82SSatoshi Sahara if (!$media_id) $form->addHTML(' – '); 231*6c9fde82SSatoshi Sahara $form->addHTML('<bdi>'. hsc($info['sum']) .'</bdi>'); 232*6c9fde82SSatoshi Sahara $form->addTagClose('span'); 233*6c9fde82SSatoshi Sahara } 234*6c9fde82SSatoshi Sahara 235*6c9fde82SSatoshi Sahara $form->addTagOpen('span')->addClass('user'); 236*6c9fde82SSatoshi Sahara if ($info['user']) { 237*6c9fde82SSatoshi Sahara $form->addHTML('<bdi>'. editorinfo($info['user']) .'</bdi>'); 238*6c9fde82SSatoshi Sahara if (auth_ismanager()) { 239*6c9fde82SSatoshi Sahara $form->addHTML(' <bdo dir="ltr">('. $info['ip'] .')</bdo>'); 240*6c9fde82SSatoshi Sahara } 241*6c9fde82SSatoshi Sahara } else { 242*6c9fde82SSatoshi Sahara $form->addHTML('<bdo dir="ltr">' .$info['ip'] .'</bdo>'); 243*6c9fde82SSatoshi Sahara } 244*6c9fde82SSatoshi Sahara $form->addTagClose('span'); 245*6c9fde82SSatoshi Sahara 246*6c9fde82SSatoshi Sahara html_sizechange($info['sizechange'], $form); 247*6c9fde82SSatoshi Sahara 248*6c9fde82SSatoshi Sahara if ($media_id) $form->addTagClose('div'); 249*6c9fde82SSatoshi Sahara 250*6c9fde82SSatoshi Sahara $form->addTagClose('div'); 251*6c9fde82SSatoshi Sahara $form->addTagClose('li'); 252*6c9fde82SSatoshi Sahara } 253*6c9fde82SSatoshi Sahara 254*6c9fde82SSatoshi Sahara // end of revision list 255*6c9fde82SSatoshi Sahara $form->addTagClose('ul'); 256*6c9fde82SSatoshi Sahara 257*6c9fde82SSatoshi Sahara // show button for diff view 258*6c9fde82SSatoshi Sahara if (!$media_id) { 259*6c9fde82SSatoshi Sahara $form->addButton('do[diff]', $lang['diff2'])->attr('type', 'submit'); 260*6c9fde82SSatoshi Sahara } else { 261*6c9fde82SSatoshi Sahara $form->setHiddenField('mediado', 'diff'); 262*6c9fde82SSatoshi Sahara $form->addButton('', $lang['diff2'])->attr('type', 'submit'); 263*6c9fde82SSatoshi Sahara } 264*6c9fde82SSatoshi Sahara 265*6c9fde82SSatoshi Sahara $form->addTagClose('div'); // close div class=no 266*6c9fde82SSatoshi Sahara 267*6c9fde82SSatoshi Sahara // emit HTML_REVISIONSFORM_OUTPUT event, print the form 268*6c9fde82SSatoshi Sahara Event::createAndTrigger('HTML_REVISIONSFORM_OUTPUT', $form, 'html_form_output', false); 269*6c9fde82SSatoshi Sahara 270*6c9fde82SSatoshi Sahara print DOKU_LF; 271*6c9fde82SSatoshi Sahara 272*6c9fde82SSatoshi Sahara // provide navigation for pagenated revision list (of pages and/or media files) 273*6c9fde82SSatoshi Sahara print '<div class="pagenav">'; 274*6c9fde82SSatoshi Sahara $last = $first + $conf['recent']; 275*6c9fde82SSatoshi Sahara if ($first > 0) { 276*6c9fde82SSatoshi Sahara $first = $first - $conf['recent']; 277*6c9fde82SSatoshi Sahara if ($first < 0) $first = 0; 278*6c9fde82SSatoshi Sahara print '<div class="pagenav-prev">'; 279*6c9fde82SSatoshi Sahara if ($media_id) { 280*6c9fde82SSatoshi Sahara print html_btn('newer',$media_id,"p",media_managerURL(array('first' => $first), '&', false, true)); 281*6c9fde82SSatoshi Sahara } else { 282*6c9fde82SSatoshi Sahara print html_btn('newer',$id,"p",array('do' => 'revisions', 'first' => $first)); 283*6c9fde82SSatoshi Sahara } 284*6c9fde82SSatoshi Sahara print '</div>'; 285*6c9fde82SSatoshi Sahara } 286*6c9fde82SSatoshi Sahara if ($hasNext) { 287*6c9fde82SSatoshi Sahara print '<div class="pagenav-next">'; 288*6c9fde82SSatoshi Sahara if ($media_id) { 289*6c9fde82SSatoshi Sahara print html_btn('older',$media_id,"n",media_managerURL(array('first' => $last), '&', false, true)); 290*6c9fde82SSatoshi Sahara } else { 291*6c9fde82SSatoshi Sahara print html_btn('older',$id,"n",array('do' => 'revisions', 'first' => $last)); 292*6c9fde82SSatoshi Sahara } 293*6c9fde82SSatoshi Sahara print '</div>'; 294*6c9fde82SSatoshi Sahara } 295*6c9fde82SSatoshi Sahara print '</div>'; 296*6c9fde82SSatoshi Sahara 297*6c9fde82SSatoshi Sahara print DOKU_LF; 298*6c9fde82SSatoshi Sahara } 299*6c9fde82SSatoshi Sahara 300*6c9fde82SSatoshi Sahara} 301