xref: /dokuwiki/inc/Ui/Diff.php (revision ec019cbf81e6034e46c005324b3e24bc494cad77)
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{
16edb50e6aSSatoshi Sahara    /* @var string */
17edb50e6aSSatoshi Sahara    protected $id;  // page id or media id
18edb50e6aSSatoshi Sahara
19b4b4c5c6SSatoshi Sahara    /* @var int */
20b4b4c5c6SSatoshi Sahara    protected $old_rev; // older revision, timestamp of left side
21b4b4c5c6SSatoshi Sahara    protected $new_rev; // newer revision, timestamp of right side
22b4b4c5c6SSatoshi Sahara
23edb50e6aSSatoshi Sahara    /* @var array */
24edb50e6aSSatoshi Sahara    protected $preference = [];
25edb50e6aSSatoshi Sahara
26edb50e6aSSatoshi Sahara    /**
27edb50e6aSSatoshi Sahara     * Diff Ui constructor
28edb50e6aSSatoshi Sahara     *
29edb50e6aSSatoshi Sahara     * @param string $id  page id or media id
30edb50e6aSSatoshi Sahara     */
31edb50e6aSSatoshi Sahara    public function __construct($id)
32edb50e6aSSatoshi Sahara    {
33edb50e6aSSatoshi Sahara        $this->id = $id;
34edb50e6aSSatoshi Sahara    }
35edb50e6aSSatoshi Sahara
36edb50e6aSSatoshi Sahara    /**
37b4b4c5c6SSatoshi Sahara     * Set a pair of revisions to be compared
38b4b4c5c6SSatoshi Sahara     *
39b4b4c5c6SSatoshi Sahara     * @param int $old_rev
40b4b4c5c6SSatoshi Sahara     * @param int $new_rev
41b4b4c5c6SSatoshi Sahara     * @return $this
42b4b4c5c6SSatoshi Sahara     */
43b4b4c5c6SSatoshi Sahara    public function compare($old_rev, $new_rev)
44b4b4c5c6SSatoshi Sahara    {
45b4b4c5c6SSatoshi Sahara        $this->old_rev = $old_rev;
46b4b4c5c6SSatoshi Sahara        $this->new_rev = $new_rev;
47b4b4c5c6SSatoshi Sahara        return $this;
48b4b4c5c6SSatoshi Sahara    }
49b4b4c5c6SSatoshi Sahara
50b4b4c5c6SSatoshi Sahara    /**
51edb50e6aSSatoshi Sahara     * Gets or Sets preference of the Ui\Diff object
52edb50e6aSSatoshi Sahara     *
53edb50e6aSSatoshi Sahara     * @param string|array $prefs  a key name or key-value pair(s)
54edb50e6aSSatoshi Sahara     * @param mixed $value         value used when the first args is string
55edb50e6aSSatoshi Sahara     * @return array|$this
56edb50e6aSSatoshi Sahara     */
57edb50e6aSSatoshi Sahara    public function preference($prefs = null, $value = null)
58edb50e6aSSatoshi Sahara    {
59edb50e6aSSatoshi Sahara        // set
60edb50e6aSSatoshi Sahara        if (is_array($prefs)) {
61edb50e6aSSatoshi Sahara            foreach ($prefs as $name => $value) {
62edb50e6aSSatoshi Sahara                $this->preference[$name] = $value;
63edb50e6aSSatoshi Sahara            }
64edb50e6aSSatoshi Sahara            return $this;
65edb50e6aSSatoshi Sahara        } elseif (is_string($prefs) && isset($value)) {
66edb50e6aSSatoshi Sahara            $this->preference[$prefs] = $value;
67edb50e6aSSatoshi Sahara            return $this;
68edb50e6aSSatoshi Sahara        }
69edb50e6aSSatoshi Sahara        // get
70edb50e6aSSatoshi Sahara        return $this->preference;
71edb50e6aSSatoshi Sahara    }
72edb50e6aSSatoshi Sahara
73b4b4c5c6SSatoshi Sahara    /**
74b4b4c5c6SSatoshi Sahara     * Retrieve requested revision(s) and difftype from Ui\Revisions
75b4b4c5c6SSatoshi Sahara     *
76b4b4c5c6SSatoshi Sahara     * @return void
77b4b4c5c6SSatoshi Sahara     */
78b4b4c5c6SSatoshi Sahara    protected function preProcess()
79b4b4c5c6SSatoshi Sahara    {
80b4b4c5c6SSatoshi Sahara        global $INPUT;
81b4b4c5c6SSatoshi Sahara
82b4b4c5c6SSatoshi Sahara        // difflink icon click, eg. ?rev=123456789&do=diff
83b4b4c5c6SSatoshi Sahara        if ($INPUT->has('rev')) {
84b4b4c5c6SSatoshi Sahara            $this->old_rev = $INPUT->int('rev');
85b4b4c5c6SSatoshi Sahara            $this->new_rev = ''; // current revision
86b4b4c5c6SSatoshi Sahara        }
87b4b4c5c6SSatoshi Sahara
88b4b4c5c6SSatoshi Sahara        // submit button with two checked boxes
89b4b4c5c6SSatoshi Sahara        $rev2 = $INPUT->arr('rev2', []);
90b4b4c5c6SSatoshi Sahara        if (count($rev2) > 1) {
91b4b4c5c6SSatoshi Sahara            if ($rev2[0] == 'current') {
92b4b4c5c6SSatoshi Sahara                [$this->old_rev, $this->new_rev] = [$rev2[1], ''];
93b4b4c5c6SSatoshi Sahara            } elseif ($rev2[1] == 'current') {
94b4b4c5c6SSatoshi Sahara                [$this->old_rev, $this->new_rev] = [$rev2[0], ''];
95b4b4c5c6SSatoshi Sahara            } elseif ($rev2[0] < $rev2[1]) {
96b4b4c5c6SSatoshi Sahara                [$this->old_rev, $this->new_rev] = [$rev2[0], $rev2[1]];
97b4b4c5c6SSatoshi Sahara            } else {
98b4b4c5c6SSatoshi Sahara                [$this->old_rev, $this->new_rev] = [$rev2[1], $rev2[0]];
99b4b4c5c6SSatoshi Sahara            }
100b4b4c5c6SSatoshi Sahara        }
101b4b4c5c6SSatoshi Sahara
102b4b4c5c6SSatoshi Sahara        // diff view type
103b4b4c5c6SSatoshi Sahara        if ($INPUT->has('difftype')) {
104b4b4c5c6SSatoshi Sahara            // retrieve requested $difftype
105b4b4c5c6SSatoshi Sahara            $this->preference['difftype'] = $INPUT->str('difftype');
106b4b4c5c6SSatoshi Sahara        } else {
107b4b4c5c6SSatoshi Sahara            // read preference from DokuWiki cookie. PageDiff only
108b4b4c5c6SSatoshi Sahara            $this->preference['difftype'] = get_doku_pref('difftype', $mode);
109b4b4c5c6SSatoshi Sahara        }
110b4b4c5c6SSatoshi Sahara    }
111b4b4c5c6SSatoshi Sahara
112b4b4c5c6SSatoshi Sahara
113edb50e6aSSatoshi Sahara
11463ab9afeSSatoshi Sahara    /**
115*ec019cbfSSatoshi Sahara     * Build header of diff HTML
11663ab9afeSSatoshi Sahara     *
117edb50e6aSSatoshi Sahara     * @param ChangeLog $changelog  PageChangeLog or MediaChangeLog object
11863ab9afeSSatoshi Sahara     * @param string $l_rev   Left revisions
11963ab9afeSSatoshi Sahara     * @param string $r_rev   Right revision
120edb50e6aSSatoshi Sahara     * @param string $id      Page id, if null $ID is used   // クラスプロパティを使用するべき
121edb50e6aSSatoshi Sahara     * @param bool   $media   If it is for media files       // changelog object を渡せばよいのは?
122edb50e6aSSatoshi Sahara     * @param bool   $inline  Return the header on a single line  // クラスプロパティを使用するべき
12363ab9afeSSatoshi Sahara     * @return string[] HTML snippets for diff header
12463ab9afeSSatoshi Sahara     */
125*ec019cbfSSatoshi Sahara    public function buildDiffHead($changelog, $l_rev, $r_rev)
12663ab9afeSSatoshi Sahara    {
12763ab9afeSSatoshi Sahara        global $lang;
128edb50e6aSSatoshi Sahara
129edb50e6aSSatoshi Sahara        // detect PageDiff or MediaDiff
130edb50e6aSSatoshi Sahara        switch (get_class($changelog)) {
131edb50e6aSSatoshi Sahara            case PageChangeLog::class :
132edb50e6aSSatoshi Sahara                $media_or_wikiFN = 'wikiFN';
133edb50e6aSSatoshi Sahara                $ml_or_wl = 'wl';
134edb50e6aSSatoshi Sahara                $media = false;
135edb50e6aSSatoshi Sahara                break;
136edb50e6aSSatoshi Sahara            case MediaChangeLog::class :
137edb50e6aSSatoshi Sahara                $media_or_wikiFN = 'mediaFN';
138edb50e6aSSatoshi Sahara                $ml_or_wl = 'ml';
139edb50e6aSSatoshi Sahara                $media = true;
140edb50e6aSSatoshi Sahara                break;
14163ab9afeSSatoshi Sahara        }
142edb50e6aSSatoshi Sahara
143edb50e6aSSatoshi Sahara        $head_separator = ($this->preference['difftype'] === 'inline') ? ' ' : '<br />';
14463ab9afeSSatoshi Sahara        $l_minor = $r_minor = '';
14563ab9afeSSatoshi Sahara
146edb50e6aSSatoshi Sahara        // left side
14763ab9afeSSatoshi Sahara        if (!$l_rev) {
14863ab9afeSSatoshi Sahara            $l_head = '&mdash;';
14963ab9afeSSatoshi Sahara        } else {
15063ab9afeSSatoshi Sahara            $l_info   = $changelog->getRevisionInfo($l_rev);
15163ab9afeSSatoshi Sahara            if ($l_info['user']) {
15263ab9afeSSatoshi Sahara                $l_user = '<bdi>'.editorinfo($l_info['user']).'</bdi>';
15363ab9afeSSatoshi Sahara                if (auth_ismanager()) $l_user .= ' <bdo dir="ltr">('.$l_info['ip'].')</bdo>';
15463ab9afeSSatoshi Sahara            } else {
15563ab9afeSSatoshi Sahara                $l_user = '<bdo dir="ltr">'.$l_info['ip'].'</bdo>';
15663ab9afeSSatoshi Sahara            }
15763ab9afeSSatoshi Sahara            $l_user  = '<span class="user">'.$l_user.'</span>';
15863ab9afeSSatoshi Sahara            $l_sum   = ($l_info['sum']) ? '<span class="sum"><bdi>'.hsc($l_info['sum']).'</bdi></span>' : '';
15963ab9afeSSatoshi Sahara            if ($l_info['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) $l_minor = 'class="minor"';
16063ab9afeSSatoshi Sahara
161edb50e6aSSatoshi Sahara            $l_head_title = ($media) ? dformat($l_rev) : $this->id.' ['.dformat($l_rev).']';
162edb50e6aSSatoshi Sahara            $l_head = '<bdi><a class="wikilink1" href="'.$ml_or_wl($this->id,"rev=$l_rev").'">'
16363ab9afeSSatoshi Sahara                . $l_head_title.'</a></bdi>'.$head_separator.$l_user.' '.$l_sum;
16463ab9afeSSatoshi Sahara        }
16563ab9afeSSatoshi Sahara
166edb50e6aSSatoshi Sahara        // right side
16763ab9afeSSatoshi Sahara        if ($r_rev) {
16863ab9afeSSatoshi Sahara            $r_info   = $changelog->getRevisionInfo($r_rev);
16963ab9afeSSatoshi Sahara            if ($r_info['user']) {
17063ab9afeSSatoshi Sahara                $r_user = '<bdi>'.editorinfo($r_info['user']).'</bdi>';
17163ab9afeSSatoshi Sahara                if (auth_ismanager()) $r_user .= ' <bdo dir="ltr">('.$r_info['ip'].')</bdo>';
17263ab9afeSSatoshi Sahara            } else {
17363ab9afeSSatoshi Sahara                $r_user = '<bdo dir="ltr">'.$r_info['ip'].'</bdo>';
17463ab9afeSSatoshi Sahara            }
17563ab9afeSSatoshi Sahara            $r_user = '<span class="user">'.$r_user.'</span>';
17663ab9afeSSatoshi Sahara            $r_sum  = ($r_info['sum']) ? '<span class="sum"><bdi>'.hsc($r_info['sum']).'</bdi></span>' : '';
17763ab9afeSSatoshi Sahara            if ($r_info['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) $r_minor = 'class="minor"';
17863ab9afeSSatoshi Sahara
179edb50e6aSSatoshi Sahara            $r_head_title = ($media) ? dformat($r_rev) : $this->id.' ['.dformat($r_rev).']';
180edb50e6aSSatoshi Sahara            $r_head = '<bdi><a class="wikilink1" href="'.$ml_or_wl($this->id,"rev=$r_rev").'">'
18163ab9afeSSatoshi Sahara                . $r_head_title.'</a></bdi>'.$head_separator.$r_user.' '.$r_sum;
182edb50e6aSSatoshi Sahara        } elseif ($_rev = @filemtime($media_or_wikiFN($this->id))) {
18363ab9afeSSatoshi Sahara            $_info   = $changelog->getRevisionInfo($_rev);
18463ab9afeSSatoshi Sahara            if ($_info['user']) {
18563ab9afeSSatoshi Sahara                $_user = '<bdi>'.editorinfo($_info['user']).'</bdi>';
18663ab9afeSSatoshi Sahara                if (auth_ismanager()) $_user .= ' <bdo dir="ltr">('.$_info['ip'].')</bdo>';
18763ab9afeSSatoshi Sahara            } else {
18863ab9afeSSatoshi Sahara                $_user = '<bdo dir="ltr">'.$_info['ip'].'</bdo>';
18963ab9afeSSatoshi Sahara            }
19063ab9afeSSatoshi Sahara            $_user = '<span class="user">'.$_user.'</span>';
19163ab9afeSSatoshi Sahara            $_sum  = ($_info['sum']) ? '<span class="sum"><bdi>'.hsc($_info['sum']).'</span></bdi>' : '';
19263ab9afeSSatoshi Sahara            if ($_info['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) $r_minor = 'class="minor"';
19363ab9afeSSatoshi Sahara
194edb50e6aSSatoshi Sahara            $r_head_title = ($media) ? dformat($_rev) : $this->id.' ['.dformat($_rev).']';
195edb50e6aSSatoshi Sahara            $r_head  = '<bdi><a class="wikilink1" href="'.$ml_or_wl($this->id).'">'
19663ab9afeSSatoshi Sahara                . $r_head_title.'</a></bdi> '.'('.$lang['current'].')'.$head_separator.$_user.' '.$_sum;
19763ab9afeSSatoshi Sahara        }else{
19863ab9afeSSatoshi Sahara            $r_head = '&mdash; ('.$lang['current'].')';
19963ab9afeSSatoshi Sahara        }
20063ab9afeSSatoshi Sahara
20163ab9afeSSatoshi Sahara        return array($l_head, $r_head, $l_minor, $r_minor);
20263ab9afeSSatoshi Sahara    }
20363ab9afeSSatoshi Sahara
20463ab9afeSSatoshi Sahara}
205