xref: /dokuwiki/inc/Ui/Diff.php (revision 3d0f231e4abd347e744aa934ceca430fda578036)
163ab9afeSSatoshi Sahara<?php
263ab9afeSSatoshi Sahara
363ab9afeSSatoshi Saharanamespace dokuwiki\Ui;
463ab9afeSSatoshi Sahara
563ab9afeSSatoshi Sahara/**
663ab9afeSSatoshi Sahara * DokuWiki Diff Interface
763ab9afeSSatoshi Sahara * parent class of PageDiff and MediaDiff
863ab9afeSSatoshi Sahara *
963ab9afeSSatoshi Sahara * @package dokuwiki\Ui
1063ab9afeSSatoshi Sahara */
1163ab9afeSSatoshi Saharaabstract class Diff extends Ui
1263ab9afeSSatoshi Sahara{
13edb50e6aSSatoshi Sahara    /* @var string */
14edb50e6aSSatoshi Sahara    protected $id;   // page id or media id
15e71e09a6SSatoshi Sahara    protected $item; // page or media
16edb50e6aSSatoshi Sahara
17b4b4c5c6SSatoshi Sahara    /* @var int */
18*3d0f231eSSatoshi Sahara    protected $oldRev;  // timestamp of older revision, left side
19*3d0f231eSSatoshi Sahara    protected $newRev;  // timestamp of newer revision, right side
200bb448f0SSatoshi Sahara    protected $last_rev; // current revision, or last revision when it had removed
21b4b4c5c6SSatoshi Sahara
22edb50e6aSSatoshi Sahara    /* @var array */
23edb50e6aSSatoshi Sahara    protected $preference = [];
24edb50e6aSSatoshi Sahara
258068440fSSatoshi Sahara    /* @var ChangeLog */
268068440fSSatoshi Sahara    protected $changelog; // PageChangeLog or MediaChangeLog object
278068440fSSatoshi Sahara
28edb50e6aSSatoshi Sahara    /**
29edb50e6aSSatoshi Sahara     * Diff Ui constructor
30edb50e6aSSatoshi Sahara     *
31edb50e6aSSatoshi Sahara     * @param string $id  page id or media id
32edb50e6aSSatoshi Sahara     */
33edb50e6aSSatoshi Sahara    public function __construct($id)
34edb50e6aSSatoshi Sahara    {
35edb50e6aSSatoshi Sahara        $this->id = $id;
368068440fSSatoshi Sahara        $this->setChangeLog();
37edb50e6aSSatoshi Sahara    }
38edb50e6aSSatoshi Sahara
39edb50e6aSSatoshi Sahara    /**
408068440fSSatoshi Sahara     * set class property changelog
418068440fSSatoshi Sahara     */
428068440fSSatoshi Sahara    abstract protected function setChangeLog();
438068440fSSatoshi Sahara
448068440fSSatoshi Sahara    /**
45b4b4c5c6SSatoshi Sahara     * Set a pair of revisions to be compared
46b4b4c5c6SSatoshi Sahara     *
47*3d0f231eSSatoshi Sahara     * @param int $oldRev
48*3d0f231eSSatoshi Sahara     * @param int $newRev
49b4b4c5c6SSatoshi Sahara     * @return $this
50b4b4c5c6SSatoshi Sahara     */
51*3d0f231eSSatoshi Sahara    public function compare($oldRev, $newRev)
52b4b4c5c6SSatoshi Sahara    {
53*3d0f231eSSatoshi Sahara        $this->oldRev = $oldRev;
54*3d0f231eSSatoshi Sahara        $this->newRev = $newRev;
55b4b4c5c6SSatoshi Sahara        return $this;
56b4b4c5c6SSatoshi Sahara    }
57b4b4c5c6SSatoshi Sahara
58b4b4c5c6SSatoshi Sahara    /**
59edb50e6aSSatoshi Sahara     * Gets or Sets preference of the Ui\Diff object
60edb50e6aSSatoshi Sahara     *
61edb50e6aSSatoshi Sahara     * @param string|array $prefs  a key name or key-value pair(s)
62edb50e6aSSatoshi Sahara     * @param mixed $value         value used when the first args is string
63edb50e6aSSatoshi Sahara     * @return array|$this
64edb50e6aSSatoshi Sahara     */
65edb50e6aSSatoshi Sahara    public function preference($prefs = null, $value = null)
66edb50e6aSSatoshi Sahara    {
67edb50e6aSSatoshi Sahara        // set
68295564cdSSatoshi Sahara        if (is_string($prefs) && isset($value)) {
69295564cdSSatoshi Sahara            $this->preference[$prefs] = $value;
70295564cdSSatoshi Sahara            return $this;
71295564cdSSatoshi Sahara        } elseif (is_array($prefs)) {
72edb50e6aSSatoshi Sahara            foreach ($prefs as $name => $value) {
73edb50e6aSSatoshi Sahara                $this->preference[$name] = $value;
74edb50e6aSSatoshi Sahara            }
75edb50e6aSSatoshi Sahara            return $this;
76edb50e6aSSatoshi Sahara        }
77edb50e6aSSatoshi Sahara        // get
78edb50e6aSSatoshi Sahara        return $this->preference;
79edb50e6aSSatoshi Sahara    }
80edb50e6aSSatoshi Sahara
81b4b4c5c6SSatoshi Sahara    /**
82b4b4c5c6SSatoshi Sahara     * Retrieve requested revision(s) and difftype from Ui\Revisions
83b4b4c5c6SSatoshi Sahara     *
84b4b4c5c6SSatoshi Sahara     * @return void
85b4b4c5c6SSatoshi Sahara     */
86b4b4c5c6SSatoshi Sahara    protected function preProcess()
87b4b4c5c6SSatoshi Sahara    {
88b4b4c5c6SSatoshi Sahara        global $INPUT;
89b4b4c5c6SSatoshi Sahara
90b4b4c5c6SSatoshi Sahara        // difflink icon click, eg. ?rev=123456789&do=diff
91b4b4c5c6SSatoshi Sahara        if ($INPUT->has('rev')) {
92*3d0f231eSSatoshi Sahara            $this->oldRev = $INPUT->int('rev');
93*3d0f231eSSatoshi Sahara            $this->newRev = ''; // current revision
94b4b4c5c6SSatoshi Sahara        }
95b4b4c5c6SSatoshi Sahara
96b4b4c5c6SSatoshi Sahara        // submit button with two checked boxes
97b4b4c5c6SSatoshi Sahara        $rev2 = $INPUT->arr('rev2', []);
98b4b4c5c6SSatoshi Sahara        if (count($rev2) > 1) {
99b4b4c5c6SSatoshi Sahara            if ($rev2[0] == 'current') {
100*3d0f231eSSatoshi Sahara                [$this->oldRev, $this->newRev] = [$rev2[1], ''];
101b4b4c5c6SSatoshi Sahara            } elseif ($rev2[1] == 'current') {
102*3d0f231eSSatoshi Sahara                [$this->oldRev, $this->newRev] = [$rev2[0], ''];
103b4b4c5c6SSatoshi Sahara            } elseif ($rev2[0] < $rev2[1]) {
104*3d0f231eSSatoshi Sahara                [$this->oldRev, $this->newRev] = [$rev2[0], $rev2[1]];
105b4b4c5c6SSatoshi Sahara            } else {
106*3d0f231eSSatoshi Sahara                [$this->oldRev, $this->newRev] = [$rev2[1], $rev2[0]];
107b4b4c5c6SSatoshi Sahara            }
108b4b4c5c6SSatoshi Sahara        }
109b4b4c5c6SSatoshi Sahara
110b4b4c5c6SSatoshi Sahara        // diff view type
111b4b4c5c6SSatoshi Sahara        if ($INPUT->has('difftype')) {
112b4b4c5c6SSatoshi Sahara            // retrieve requested $difftype
113b4b4c5c6SSatoshi Sahara            $this->preference['difftype'] = $INPUT->str('difftype');
114b4b4c5c6SSatoshi Sahara        } else {
115b4b4c5c6SSatoshi Sahara            // read preference from DokuWiki cookie. PageDiff only
11691e70b5fSSatoshi Sahara            get_doku_pref('difftype', $mode);
11791e70b5fSSatoshi Sahara            if (isset($mode)) $this->preference['difftype'] = $mode;
118b4b4c5c6SSatoshi Sahara        }
119b4b4c5c6SSatoshi Sahara    }
120b4b4c5c6SSatoshi Sahara
121179b4660SSatoshi Sahara    /**
122179b4660SSatoshi Sahara     * get extended revision info
123179b4660SSatoshi Sahara     *
124179b4660SSatoshi Sahara     * @param int|string $rev  revision identifier, '' means current one
125179b4660SSatoshi Sahara     * @return array  revision info structure of a page or media file
126179b4660SSatoshi Sahara     */
127179b4660SSatoshi Sahara    protected function getExtendedRevisionInfo($rev)
128179b4660SSatoshi Sahara    {
129179b4660SSatoshi Sahara        $changelog =& $this->changelog;
130179b4660SSatoshi Sahara
131179b4660SSatoshi Sahara        if ($rev) {
132179b4660SSatoshi Sahara            $info = $changelog->getRevisionInfo($rev);
133179b4660SSatoshi Sahara        } elseif (file_exists($filename = $this->itemFN($this->id))) {
134179b4660SSatoshi Sahara            $rev = filemtime(fullpath($filename));
135179b4660SSatoshi Sahara            $info = $changelog->getRevisionInfo($rev) + array(
136179b4660SSatoshi Sahara                'current' => true,
137179b4660SSatoshi Sahara            );
138179b4660SSatoshi Sahara        } else { // once exists, but now removed
139179b4660SSatoshi Sahara            $info = array(
140179b4660SSatoshi Sahara                'current' => true,
141179b4660SSatoshi Sahara            );
142179b4660SSatoshi Sahara        }
143179b4660SSatoshi Sahara        return array('item' => $this->item) + $info;
144179b4660SSatoshi Sahara    }
145179b4660SSatoshi Sahara
146b4b4c5c6SSatoshi Sahara
147edb50e6aSSatoshi Sahara
14863ab9afeSSatoshi Sahara    /**
149ec019cbfSSatoshi Sahara     * Build header of diff HTML
15063ab9afeSSatoshi Sahara     *
15163ab9afeSSatoshi Sahara     * @param string $l_rev   Left revisions
15263ab9afeSSatoshi Sahara     * @param string $r_rev   Right revision
15363ab9afeSSatoshi Sahara     * @return string[] HTML snippets for diff header
154cb5998b4SSatoshi Sahara     * @deprecated 2020-12-31
15563ab9afeSSatoshi Sahara     */
1568068440fSSatoshi Sahara    public function buildDiffHead($l_rev, $r_rev)
15763ab9afeSSatoshi Sahara    {
158cb5998b4SSatoshi Sahara        dbg_deprecated('not used see '. \dokuwiki\Ui\PageDiff::class .'::show()');
15963ab9afeSSatoshi Sahara    }
16063ab9afeSSatoshi Sahara
161e71e09a6SSatoshi Sahara    /**
162e71e09a6SSatoshi Sahara     * item url generator
163e71e09a6SSatoshi Sahara     *
164e71e09a6SSatoshi Sahara     * @param string $id  page id or media id
165e71e09a6SSatoshi Sahara     * @param string|array $urlParameters  URL parameters, associative array recommended
166e71e09a6SSatoshi Sahara     * @return string
167e71e09a6SSatoshi Sahara     */
168e71e09a6SSatoshi Sahara    protected function itemUrl($id, $urlParameters = '')
169e71e09a6SSatoshi Sahara    {
170e71e09a6SSatoshi Sahara        switch ($this->item) {
171e71e09a6SSatoshi Sahara            case 'page':  return wl($id, $urlParameters, $absolute = false, '&');
172e71e09a6SSatoshi Sahara            case 'media': return ml($id, $urlParameters, $direct = true, '&', $absolute = false);
173e71e09a6SSatoshi Sahara        }
174e71e09a6SSatoshi Sahara    }
175e71e09a6SSatoshi Sahara
176179b4660SSatoshi Sahara    /**
177179b4660SSatoshi Sahara     * item filename resolver
178179b4660SSatoshi Sahara     *
179179b4660SSatoshi Sahara     * @param string $id  page id or media id
180179b4660SSatoshi Sahara     * @param string|int $rev empty string or revision timestamp
181179b4660SSatoshi Sahara     * @return string
182179b4660SSatoshi Sahara     */
183179b4660SSatoshi Sahara    protected function itemFN($id, $rev = '')
184179b4660SSatoshi Sahara    {
185179b4660SSatoshi Sahara        switch ($this->item) {
186179b4660SSatoshi Sahara            case 'page':  return wikiFN($id, $rev);
187179b4660SSatoshi Sahara            case 'media': return mediaFN($id, $rev);
188179b4660SSatoshi Sahara        }
189179b4660SSatoshi Sahara    }
190179b4660SSatoshi Sahara
19163ab9afeSSatoshi Sahara}
192