xref: /dokuwiki/inc/Ui/Diff.php (revision edb50e6a038ec10ad5f1879b2753ed4f4eaf0b27)
163ab9afeSSatoshi Sahara<?php
263ab9afeSSatoshi Sahara
363ab9afeSSatoshi Saharanamespace dokuwiki\Ui;
463ab9afeSSatoshi Sahara
563ab9afeSSatoshi Saharause dokuwiki\ChangeLog\PageChangeLog;
663ab9afeSSatoshi Saharause dokuwiki\ChangeLog\MediaChangeLog;
763ab9afeSSatoshi Sahara
863ab9afeSSatoshi Sahara/**
963ab9afeSSatoshi Sahara * DokuWiki Diff Interface
1063ab9afeSSatoshi Sahara * parent class of PageDiff and MediaDiff
1163ab9afeSSatoshi Sahara *
1263ab9afeSSatoshi Sahara * @package dokuwiki\Ui
1363ab9afeSSatoshi Sahara */
1463ab9afeSSatoshi Saharaabstract class Diff extends Ui
1563ab9afeSSatoshi Sahara{
16*edb50e6aSSatoshi Sahara    /* @var string */
17*edb50e6aSSatoshi Sahara    protected $id;  // page id or media id
18*edb50e6aSSatoshi Sahara
19*edb50e6aSSatoshi Sahara    /* @var array */
20*edb50e6aSSatoshi Sahara    protected $preference = [];
21*edb50e6aSSatoshi Sahara
22*edb50e6aSSatoshi Sahara    /**
23*edb50e6aSSatoshi Sahara     * Diff Ui constructor
24*edb50e6aSSatoshi Sahara     *
25*edb50e6aSSatoshi Sahara     * @param string $id  page id or media id
26*edb50e6aSSatoshi Sahara     */
27*edb50e6aSSatoshi Sahara    public function __construct($id)
28*edb50e6aSSatoshi Sahara    {
29*edb50e6aSSatoshi Sahara        $this->id = $id;
30*edb50e6aSSatoshi Sahara    }
31*edb50e6aSSatoshi Sahara
32*edb50e6aSSatoshi Sahara    /**
33*edb50e6aSSatoshi Sahara     * Gets or Sets preference of the Ui\Diff object
34*edb50e6aSSatoshi Sahara     *
35*edb50e6aSSatoshi Sahara     * @param string|array $prefs  a key name or key-value pair(s)
36*edb50e6aSSatoshi Sahara     * @param mixed $value         value used when the first args is string
37*edb50e6aSSatoshi Sahara     * @return array|$this
38*edb50e6aSSatoshi Sahara     */
39*edb50e6aSSatoshi Sahara    public function preference($prefs = null, $value = null)
40*edb50e6aSSatoshi Sahara    {
41*edb50e6aSSatoshi Sahara        // set
42*edb50e6aSSatoshi Sahara        if (is_array($prefs)) {
43*edb50e6aSSatoshi Sahara            foreach ($prefs as $name => $value) {
44*edb50e6aSSatoshi Sahara                $this->preference[$name] = $value;
45*edb50e6aSSatoshi Sahara            }
46*edb50e6aSSatoshi Sahara            return $this;
47*edb50e6aSSatoshi Sahara        } elseif (is_string($prefs) && isset($value)) {
48*edb50e6aSSatoshi Sahara            $this->preference[$prefs] = $value;
49*edb50e6aSSatoshi Sahara            return $this;
50*edb50e6aSSatoshi Sahara        }
51*edb50e6aSSatoshi Sahara        // get
52*edb50e6aSSatoshi Sahara        return $this->preference;
53*edb50e6aSSatoshi Sahara    }
54*edb50e6aSSatoshi Sahara
55*edb50e6aSSatoshi Sahara
5663ab9afeSSatoshi Sahara    /**
5763ab9afeSSatoshi Sahara     * Get header of diff HTML
5863ab9afeSSatoshi Sahara     *
59*edb50e6aSSatoshi Sahara     * @param ChangeLog $changelog  PageChangeLog or MediaChangeLog object
6063ab9afeSSatoshi Sahara     * @param string $l_rev   Left revisions
6163ab9afeSSatoshi Sahara     * @param string $r_rev   Right revision
62*edb50e6aSSatoshi Sahara     * @param string $id      Page id, if null $ID is used   // クラスプロパティを使用するべき
63*edb50e6aSSatoshi Sahara     * @param bool   $media   If it is for media files       // changelog object を渡せばよいのは?
64*edb50e6aSSatoshi Sahara     * @param bool   $inline  Return the header on a single line  // クラスプロパティを使用するべき
6563ab9afeSSatoshi Sahara     * @return string[] HTML snippets for diff header
6663ab9afeSSatoshi Sahara     */
67*edb50e6aSSatoshi Sahara    public function diffHead($changelog, $l_rev, $r_rev)
6863ab9afeSSatoshi Sahara    {
6963ab9afeSSatoshi Sahara        global $lang;
70*edb50e6aSSatoshi Sahara
71*edb50e6aSSatoshi Sahara        // detect PageDiff or MediaDiff
72*edb50e6aSSatoshi Sahara        switch (get_class($changelog)) {
73*edb50e6aSSatoshi Sahara            case PageChangeLog::class :
74*edb50e6aSSatoshi Sahara                $media_or_wikiFN = 'wikiFN';
75*edb50e6aSSatoshi Sahara                $ml_or_wl = 'wl';
76*edb50e6aSSatoshi Sahara                $media = false;
77*edb50e6aSSatoshi Sahara                break;
78*edb50e6aSSatoshi Sahara            case MediaChangeLog::class :
79*edb50e6aSSatoshi Sahara                $media_or_wikiFN = 'mediaFN';
80*edb50e6aSSatoshi Sahara                $ml_or_wl = 'ml';
81*edb50e6aSSatoshi Sahara                $media = true;
82*edb50e6aSSatoshi Sahara                break;
8363ab9afeSSatoshi Sahara        }
84*edb50e6aSSatoshi Sahara
85*edb50e6aSSatoshi Sahara        $head_separator = ($this->preference['difftype'] === 'inline') ? ' ' : '<br />';
8663ab9afeSSatoshi Sahara        $l_minor = $r_minor = '';
8763ab9afeSSatoshi Sahara
88*edb50e6aSSatoshi Sahara        // left side
8963ab9afeSSatoshi Sahara        if (!$l_rev) {
9063ab9afeSSatoshi Sahara            $l_head = '&mdash;';
9163ab9afeSSatoshi Sahara        } else {
9263ab9afeSSatoshi Sahara            $l_info   = $changelog->getRevisionInfo($l_rev);
9363ab9afeSSatoshi Sahara            if ($l_info['user']) {
9463ab9afeSSatoshi Sahara                $l_user = '<bdi>'.editorinfo($l_info['user']).'</bdi>';
9563ab9afeSSatoshi Sahara                if (auth_ismanager()) $l_user .= ' <bdo dir="ltr">('.$l_info['ip'].')</bdo>';
9663ab9afeSSatoshi Sahara            } else {
9763ab9afeSSatoshi Sahara                $l_user = '<bdo dir="ltr">'.$l_info['ip'].'</bdo>';
9863ab9afeSSatoshi Sahara            }
9963ab9afeSSatoshi Sahara            $l_user  = '<span class="user">'.$l_user.'</span>';
10063ab9afeSSatoshi Sahara            $l_sum   = ($l_info['sum']) ? '<span class="sum"><bdi>'.hsc($l_info['sum']).'</bdi></span>' : '';
10163ab9afeSSatoshi Sahara            if ($l_info['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) $l_minor = 'class="minor"';
10263ab9afeSSatoshi Sahara
103*edb50e6aSSatoshi Sahara            $l_head_title = ($media) ? dformat($l_rev) : $this->id.' ['.dformat($l_rev).']';
104*edb50e6aSSatoshi Sahara            $l_head = '<bdi><a class="wikilink1" href="'.$ml_or_wl($this->id,"rev=$l_rev").'">'
10563ab9afeSSatoshi Sahara                . $l_head_title.'</a></bdi>'.$head_separator.$l_user.' '.$l_sum;
10663ab9afeSSatoshi Sahara        }
10763ab9afeSSatoshi Sahara
108*edb50e6aSSatoshi Sahara        // right side
10963ab9afeSSatoshi Sahara        if ($r_rev) {
11063ab9afeSSatoshi Sahara            $r_info   = $changelog->getRevisionInfo($r_rev);
11163ab9afeSSatoshi Sahara            if ($r_info['user']) {
11263ab9afeSSatoshi Sahara                $r_user = '<bdi>'.editorinfo($r_info['user']).'</bdi>';
11363ab9afeSSatoshi Sahara                if (auth_ismanager()) $r_user .= ' <bdo dir="ltr">('.$r_info['ip'].')</bdo>';
11463ab9afeSSatoshi Sahara            } else {
11563ab9afeSSatoshi Sahara                $r_user = '<bdo dir="ltr">'.$r_info['ip'].'</bdo>';
11663ab9afeSSatoshi Sahara            }
11763ab9afeSSatoshi Sahara            $r_user = '<span class="user">'.$r_user.'</span>';
11863ab9afeSSatoshi Sahara            $r_sum  = ($r_info['sum']) ? '<span class="sum"><bdi>'.hsc($r_info['sum']).'</bdi></span>' : '';
11963ab9afeSSatoshi Sahara            if ($r_info['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) $r_minor = 'class="minor"';
12063ab9afeSSatoshi Sahara
121*edb50e6aSSatoshi Sahara            $r_head_title = ($media) ? dformat($r_rev) : $this->id.' ['.dformat($r_rev).']';
122*edb50e6aSSatoshi Sahara            $r_head = '<bdi><a class="wikilink1" href="'.$ml_or_wl($this->id,"rev=$r_rev").'">'
12363ab9afeSSatoshi Sahara                . $r_head_title.'</a></bdi>'.$head_separator.$r_user.' '.$r_sum;
124*edb50e6aSSatoshi Sahara        } elseif ($_rev = @filemtime($media_or_wikiFN($this->id))) {
12563ab9afeSSatoshi Sahara            $_info   = $changelog->getRevisionInfo($_rev);
12663ab9afeSSatoshi Sahara            if ($_info['user']) {
12763ab9afeSSatoshi Sahara                $_user = '<bdi>'.editorinfo($_info['user']).'</bdi>';
12863ab9afeSSatoshi Sahara                if (auth_ismanager()) $_user .= ' <bdo dir="ltr">('.$_info['ip'].')</bdo>';
12963ab9afeSSatoshi Sahara            } else {
13063ab9afeSSatoshi Sahara                $_user = '<bdo dir="ltr">'.$_info['ip'].'</bdo>';
13163ab9afeSSatoshi Sahara            }
13263ab9afeSSatoshi Sahara            $_user = '<span class="user">'.$_user.'</span>';
13363ab9afeSSatoshi Sahara            $_sum  = ($_info['sum']) ? '<span class="sum"><bdi>'.hsc($_info['sum']).'</span></bdi>' : '';
13463ab9afeSSatoshi Sahara            if ($_info['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) $r_minor = 'class="minor"';
13563ab9afeSSatoshi Sahara
136*edb50e6aSSatoshi Sahara            $r_head_title = ($media) ? dformat($_rev) : $this->id.' ['.dformat($_rev).']';
137*edb50e6aSSatoshi Sahara            $r_head  = '<bdi><a class="wikilink1" href="'.$ml_or_wl($this->id).'">'
13863ab9afeSSatoshi Sahara                . $r_head_title.'</a></bdi> '.'('.$lang['current'].')'.$head_separator.$_user.' '.$_sum;
13963ab9afeSSatoshi Sahara        }else{
14063ab9afeSSatoshi Sahara            $r_head = '&mdash; ('.$lang['current'].')';
14163ab9afeSSatoshi Sahara        }
14263ab9afeSSatoshi Sahara
14363ab9afeSSatoshi Sahara        return array($l_head, $r_head, $l_minor, $r_minor);
14463ab9afeSSatoshi Sahara    }
14563ab9afeSSatoshi Sahara
14663ab9afeSSatoshi Sahara}
147