xref: /dokuwiki/inc/Ui/Diff.php (revision 2fe2fb534406cb09faab9f57850d6ef1b9cb8bba)
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
1792440599SSatoshi Sahara    /* @var int|string */
1892440599SSatoshi Sahara    protected $oldRev;  // timestamp of older revision, '' means current one
1992440599SSatoshi Sahara    protected $newRev;  // timestamp of newer revision, '' means current one
20b4b4c5c6SSatoshi Sahara
21edb50e6aSSatoshi Sahara    /* @var array */
22edb50e6aSSatoshi Sahara    protected $preference = [];
23edb50e6aSSatoshi Sahara
248068440fSSatoshi Sahara    /* @var ChangeLog */
258068440fSSatoshi Sahara    protected $changelog; // PageChangeLog or MediaChangeLog object
268068440fSSatoshi Sahara
27edb50e6aSSatoshi Sahara    /**
28edb50e6aSSatoshi Sahara     * Diff Ui constructor
29edb50e6aSSatoshi Sahara     *
30edb50e6aSSatoshi Sahara     * @param string $id  page id or media id
31edb50e6aSSatoshi Sahara     */
32edb50e6aSSatoshi Sahara    public function __construct($id)
33edb50e6aSSatoshi Sahara    {
34edb50e6aSSatoshi Sahara        $this->id = $id;
358068440fSSatoshi Sahara        $this->setChangeLog();
36edb50e6aSSatoshi Sahara    }
37edb50e6aSSatoshi Sahara
38edb50e6aSSatoshi Sahara    /**
398068440fSSatoshi Sahara     * set class property changelog
408068440fSSatoshi Sahara     */
418068440fSSatoshi Sahara    abstract protected function setChangeLog();
428068440fSSatoshi Sahara
438068440fSSatoshi Sahara    /**
44d9c75b22SSatoshi Sahara     * item filename resolver
45d9c75b22SSatoshi Sahara     *
46d9c75b22SSatoshi Sahara     * @param string $id  page id or media id
47d9c75b22SSatoshi Sahara     * @param int|string $rev revision timestamp, or empty string for current one
48d9c75b22SSatoshi Sahara     * @return string full path
49d9c75b22SSatoshi Sahara     */
50d9c75b22SSatoshi Sahara    abstract protected function itemFN($id, $rev = '');
51d9c75b22SSatoshi Sahara
52d9c75b22SSatoshi Sahara    /**
53b4b4c5c6SSatoshi Sahara     * Set a pair of revisions to be compared
54b4b4c5c6SSatoshi Sahara     *
553d0f231eSSatoshi Sahara     * @param int $oldRev
563d0f231eSSatoshi Sahara     * @param int $newRev
57b4b4c5c6SSatoshi Sahara     * @return $this
58b4b4c5c6SSatoshi Sahara     */
593d0f231eSSatoshi Sahara    public function compare($oldRev, $newRev)
60b4b4c5c6SSatoshi Sahara    {
613d0f231eSSatoshi Sahara        $this->oldRev = $oldRev;
623d0f231eSSatoshi Sahara        $this->newRev = $newRev;
63b4b4c5c6SSatoshi Sahara        return $this;
64b4b4c5c6SSatoshi Sahara    }
65b4b4c5c6SSatoshi Sahara
66b4b4c5c6SSatoshi Sahara    /**
67edb50e6aSSatoshi Sahara     * Gets or Sets preference of the Ui\Diff object
68edb50e6aSSatoshi Sahara     *
69edb50e6aSSatoshi Sahara     * @param string|array $prefs  a key name or key-value pair(s)
70edb50e6aSSatoshi Sahara     * @param mixed $value         value used when the first args is string
71edb50e6aSSatoshi Sahara     * @return array|$this
72edb50e6aSSatoshi Sahara     */
73edb50e6aSSatoshi Sahara    public function preference($prefs = null, $value = null)
74edb50e6aSSatoshi Sahara    {
75edb50e6aSSatoshi Sahara        // set
76295564cdSSatoshi Sahara        if (is_string($prefs) && isset($value)) {
77295564cdSSatoshi Sahara            $this->preference[$prefs] = $value;
78295564cdSSatoshi Sahara            return $this;
79295564cdSSatoshi Sahara        } elseif (is_array($prefs)) {
80edb50e6aSSatoshi Sahara            foreach ($prefs as $name => $value) {
81edb50e6aSSatoshi Sahara                $this->preference[$name] = $value;
82edb50e6aSSatoshi Sahara            }
83edb50e6aSSatoshi Sahara            return $this;
84edb50e6aSSatoshi Sahara        }
85edb50e6aSSatoshi Sahara        // get
86edb50e6aSSatoshi Sahara        return $this->preference;
87edb50e6aSSatoshi Sahara    }
88edb50e6aSSatoshi Sahara
89b4b4c5c6SSatoshi Sahara    /**
90b4b4c5c6SSatoshi Sahara     * Retrieve requested revision(s) and difftype from Ui\Revisions
91b4b4c5c6SSatoshi Sahara     *
92b4b4c5c6SSatoshi Sahara     * @return void
93b4b4c5c6SSatoshi Sahara     */
94b4b4c5c6SSatoshi Sahara    protected function preProcess()
95b4b4c5c6SSatoshi Sahara    {
96b4b4c5c6SSatoshi Sahara        global $INPUT;
97b4b4c5c6SSatoshi Sahara
98b4b4c5c6SSatoshi Sahara        // difflink icon click, eg. ?rev=123456789&do=diff
99b4b4c5c6SSatoshi Sahara        if ($INPUT->has('rev')) {
1003d0f231eSSatoshi Sahara            $this->oldRev = $INPUT->int('rev');
1013d0f231eSSatoshi Sahara            $this->newRev = ''; // current revision
102b4b4c5c6SSatoshi Sahara        }
103b4b4c5c6SSatoshi Sahara
104b4b4c5c6SSatoshi Sahara        // submit button with two checked boxes
105b4b4c5c6SSatoshi Sahara        $rev2 = $INPUT->arr('rev2', []);
106b4b4c5c6SSatoshi Sahara        if (count($rev2) > 1) {
107b4b4c5c6SSatoshi Sahara            if ($rev2[0] == 'current') {
1083d0f231eSSatoshi Sahara                [$this->oldRev, $this->newRev] = [$rev2[1], ''];
109b4b4c5c6SSatoshi Sahara            } elseif ($rev2[1] == 'current') {
1103d0f231eSSatoshi Sahara                [$this->oldRev, $this->newRev] = [$rev2[0], ''];
111b4b4c5c6SSatoshi Sahara            } elseif ($rev2[0] < $rev2[1]) {
1123d0f231eSSatoshi Sahara                [$this->oldRev, $this->newRev] = [$rev2[0], $rev2[1]];
113b4b4c5c6SSatoshi Sahara            } else {
1143d0f231eSSatoshi Sahara                [$this->oldRev, $this->newRev] = [$rev2[1], $rev2[0]];
115b4b4c5c6SSatoshi Sahara            }
116b4b4c5c6SSatoshi Sahara        }
117b4b4c5c6SSatoshi Sahara
118b4b4c5c6SSatoshi Sahara        // diff view type
119b4b4c5c6SSatoshi Sahara        if ($INPUT->has('difftype')) {
120b4b4c5c6SSatoshi Sahara            // retrieve requested $difftype
121b4b4c5c6SSatoshi Sahara            $this->preference['difftype'] = $INPUT->str('difftype');
122b4b4c5c6SSatoshi Sahara        } else {
123b4b4c5c6SSatoshi Sahara            // read preference from DokuWiki cookie. PageDiff only
124*2fe2fb53SSatoshi Sahara            $mode = get_doku_pref('difftype', $mode = null);
12591e70b5fSSatoshi Sahara            if (isset($mode)) $this->preference['difftype'] = $mode;
126b4b4c5c6SSatoshi Sahara        }
127b4b4c5c6SSatoshi Sahara    }
128b4b4c5c6SSatoshi Sahara
129179b4660SSatoshi Sahara    /**
130179b4660SSatoshi Sahara     * get extended revision info
131179b4660SSatoshi Sahara     *
132179b4660SSatoshi Sahara     * @param int|string $rev  revision identifier, '' means current one
133179b4660SSatoshi Sahara     * @return array  revision info structure of a page or media file
134179b4660SSatoshi Sahara     */
135179b4660SSatoshi Sahara    protected function getExtendedRevisionInfo($rev)
136179b4660SSatoshi Sahara    {
137179b4660SSatoshi Sahara        $changelog =& $this->changelog;
138179b4660SSatoshi Sahara
139179b4660SSatoshi Sahara        if ($rev) {
140179b4660SSatoshi Sahara            $info = $changelog->getRevisionInfo($rev);
141179b4660SSatoshi Sahara        } elseif (file_exists($filename = $this->itemFN($this->id))) {
142179b4660SSatoshi Sahara            $rev = filemtime(fullpath($filename));
143179b4660SSatoshi Sahara            $info = $changelog->getRevisionInfo($rev) + array(
144179b4660SSatoshi Sahara                'current' => true,
145179b4660SSatoshi Sahara            );
146179b4660SSatoshi Sahara        } else { // once exists, but now removed
147179b4660SSatoshi Sahara            $info = array(
148179b4660SSatoshi Sahara                'current' => true,
149179b4660SSatoshi Sahara            );
150179b4660SSatoshi Sahara        }
151179b4660SSatoshi Sahara        return array('item' => $this->item) + $info;
152179b4660SSatoshi Sahara    }
153179b4660SSatoshi Sahara
154b4b4c5c6SSatoshi Sahara
155edb50e6aSSatoshi Sahara
15663ab9afeSSatoshi Sahara    /**
157ec019cbfSSatoshi Sahara     * Build header of diff HTML
15863ab9afeSSatoshi Sahara     *
15963ab9afeSSatoshi Sahara     * @param string $l_rev   Left revisions
16063ab9afeSSatoshi Sahara     * @param string $r_rev   Right revision
16163ab9afeSSatoshi Sahara     * @return string[] HTML snippets for diff header
162cb5998b4SSatoshi Sahara     * @deprecated 2020-12-31
16363ab9afeSSatoshi Sahara     */
1648068440fSSatoshi Sahara    public function buildDiffHead($l_rev, $r_rev)
16563ab9afeSSatoshi Sahara    {
166cb5998b4SSatoshi Sahara        dbg_deprecated('not used see '. \dokuwiki\Ui\PageDiff::class .'::show()');
16763ab9afeSSatoshi Sahara    }
16863ab9afeSSatoshi Sahara
16963ab9afeSSatoshi Sahara}
170