1<?php 2 3namespace dokuwiki\Ui; 4 5use dokuwiki\ChangeLog\PageChangeLog; 6use dokuwiki\ChangeLog\MediaChangeLog; 7 8/** 9 * DokuWiki Diff Interface 10 * parent class of PageDiff and MediaDiff 11 * 12 * @package dokuwiki\Ui 13 */ 14abstract class Diff extends Ui 15{ 16 /* @var string */ 17 protected $id; // page id or media id 18 19 /* @var array */ 20 protected $preference = []; 21 22 /** 23 * Diff Ui constructor 24 * 25 * @param string $id page id or media id 26 */ 27 public function __construct($id) 28 { 29 $this->id = $id; 30 } 31 32 /** 33 * Gets or Sets preference of the Ui\Diff object 34 * 35 * @param string|array $prefs a key name or key-value pair(s) 36 * @param mixed $value value used when the first args is string 37 * @return array|$this 38 */ 39 public function preference($prefs = null, $value = null) 40 { 41 // set 42 if (is_array($prefs)) { 43 foreach ($prefs as $name => $value) { 44 $this->preference[$name] = $value; 45 } 46 return $this; 47 } elseif (is_string($prefs) && isset($value)) { 48 $this->preference[$prefs] = $value; 49 return $this; 50 } 51 // get 52 return $this->preference; 53 } 54 55 56 /** 57 * Get header of diff HTML 58 * 59 * @param ChangeLog $changelog PageChangeLog or MediaChangeLog object 60 * @param string $l_rev Left revisions 61 * @param string $r_rev Right revision 62 * @param string $id Page id, if null $ID is used // クラスプロパティを使用するべき 63 * @param bool $media If it is for media files // changelog object を渡せばよいのは? 64 * @param bool $inline Return the header on a single line // クラスプロパティを使用するべき 65 * @return string[] HTML snippets for diff header 66 */ 67 public function diffHead($changelog, $l_rev, $r_rev) 68 { 69 global $lang; 70 71 // detect PageDiff or MediaDiff 72 switch (get_class($changelog)) { 73 case PageChangeLog::class : 74 $media_or_wikiFN = 'wikiFN'; 75 $ml_or_wl = 'wl'; 76 $media = false; 77 break; 78 case MediaChangeLog::class : 79 $media_or_wikiFN = 'mediaFN'; 80 $ml_or_wl = 'ml'; 81 $media = true; 82 break; 83 } 84 85 $head_separator = ($this->preference['difftype'] === 'inline') ? ' ' : '<br />'; 86 $l_minor = $r_minor = ''; 87 88 // left side 89 if (!$l_rev) { 90 $l_head = '—'; 91 } else { 92 $l_info = $changelog->getRevisionInfo($l_rev); 93 if ($l_info['user']) { 94 $l_user = '<bdi>'.editorinfo($l_info['user']).'</bdi>'; 95 if (auth_ismanager()) $l_user .= ' <bdo dir="ltr">('.$l_info['ip'].')</bdo>'; 96 } else { 97 $l_user = '<bdo dir="ltr">'.$l_info['ip'].'</bdo>'; 98 } 99 $l_user = '<span class="user">'.$l_user.'</span>'; 100 $l_sum = ($l_info['sum']) ? '<span class="sum"><bdi>'.hsc($l_info['sum']).'</bdi></span>' : ''; 101 if ($l_info['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) $l_minor = 'class="minor"'; 102 103 $l_head_title = ($media) ? dformat($l_rev) : $this->id.' ['.dformat($l_rev).']'; 104 $l_head = '<bdi><a class="wikilink1" href="'.$ml_or_wl($this->id,"rev=$l_rev").'">' 105 . $l_head_title.'</a></bdi>'.$head_separator.$l_user.' '.$l_sum; 106 } 107 108 // right side 109 if ($r_rev) { 110 $r_info = $changelog->getRevisionInfo($r_rev); 111 if ($r_info['user']) { 112 $r_user = '<bdi>'.editorinfo($r_info['user']).'</bdi>'; 113 if (auth_ismanager()) $r_user .= ' <bdo dir="ltr">('.$r_info['ip'].')</bdo>'; 114 } else { 115 $r_user = '<bdo dir="ltr">'.$r_info['ip'].'</bdo>'; 116 } 117 $r_user = '<span class="user">'.$r_user.'</span>'; 118 $r_sum = ($r_info['sum']) ? '<span class="sum"><bdi>'.hsc($r_info['sum']).'</bdi></span>' : ''; 119 if ($r_info['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) $r_minor = 'class="minor"'; 120 121 $r_head_title = ($media) ? dformat($r_rev) : $this->id.' ['.dformat($r_rev).']'; 122 $r_head = '<bdi><a class="wikilink1" href="'.$ml_or_wl($this->id,"rev=$r_rev").'">' 123 . $r_head_title.'</a></bdi>'.$head_separator.$r_user.' '.$r_sum; 124 } elseif ($_rev = @filemtime($media_or_wikiFN($this->id))) { 125 $_info = $changelog->getRevisionInfo($_rev); 126 if ($_info['user']) { 127 $_user = '<bdi>'.editorinfo($_info['user']).'</bdi>'; 128 if (auth_ismanager()) $_user .= ' <bdo dir="ltr">('.$_info['ip'].')</bdo>'; 129 } else { 130 $_user = '<bdo dir="ltr">'.$_info['ip'].'</bdo>'; 131 } 132 $_user = '<span class="user">'.$_user.'</span>'; 133 $_sum = ($_info['sum']) ? '<span class="sum"><bdi>'.hsc($_info['sum']).'</span></bdi>' : ''; 134 if ($_info['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) $r_minor = 'class="minor"'; 135 136 $r_head_title = ($media) ? dformat($_rev) : $this->id.' ['.dformat($_rev).']'; 137 $r_head = '<bdi><a class="wikilink1" href="'.$ml_or_wl($this->id).'">' 138 . $r_head_title.'</a></bdi> '.'('.$lang['current'].')'.$head_separator.$_user.' '.$_sum; 139 }else{ 140 $r_head = '— ('.$lang['current'].')'; 141 } 142 143 return array($l_head, $r_head, $l_minor, $r_minor); 144 } 145 146} 147