xref: /dokuwiki/inc/Ui/Diff.php (revision e2d055f5c6617b7cc57c19fa727b968f3689e13c)
163ab9afeSSatoshi Sahara<?php
263ab9afeSSatoshi Sahara
363ab9afeSSatoshi Saharanamespace dokuwiki\Ui;
463ab9afeSSatoshi Sahara
5cc5508feSSatoshi Saharause dokuwiki\ChangeLog\ChangeLog;
6cc5508feSSatoshi Sahara
763ab9afeSSatoshi Sahara/**
863ab9afeSSatoshi Sahara * DokuWiki Diff Interface
963ab9afeSSatoshi Sahara * parent class of PageDiff and MediaDiff
1063ab9afeSSatoshi Sahara *
1163ab9afeSSatoshi Sahara * @package dokuwiki\Ui
1263ab9afeSSatoshi Sahara */
1363ab9afeSSatoshi Saharaabstract class Diff extends Ui
1463ab9afeSSatoshi Sahara{
15edb50e6aSSatoshi Sahara    /* @var string */
16edb50e6aSSatoshi Sahara    protected $id;   // page id or media id
17edb50e6aSSatoshi Sahara
18eeda7adaSGerrit Uitslag    /* @var int|false */
196714d8ceSSatoshi Sahara    protected $rev1;  // timestamp of older revision
20eeda7adaSGerrit Uitslag    /* @var int|false */
216714d8ceSSatoshi Sahara    protected $rev2;  // timestamp of newer revision
22b4b4c5c6SSatoshi Sahara
23edb50e6aSSatoshi Sahara    /* @var array */
24edb50e6aSSatoshi Sahara    protected $preference = [];
25edb50e6aSSatoshi Sahara
268068440fSSatoshi Sahara    /* @var ChangeLog */
278068440fSSatoshi Sahara    protected $changelog; // PageChangeLog or MediaChangeLog object
288068440fSSatoshi Sahara
29edb50e6aSSatoshi Sahara    /**
30edb50e6aSSatoshi Sahara     * Diff Ui constructor
31edb50e6aSSatoshi Sahara     *
32edb50e6aSSatoshi Sahara     * @param string $id page id or media id
33edb50e6aSSatoshi Sahara     */
34edb50e6aSSatoshi Sahara    public function __construct($id)
35edb50e6aSSatoshi Sahara    {
36edb50e6aSSatoshi Sahara        $this->id = $id;
378068440fSSatoshi Sahara        $this->setChangeLog();
38edb50e6aSSatoshi Sahara    }
39edb50e6aSSatoshi Sahara
40edb50e6aSSatoshi Sahara    /**
418068440fSSatoshi Sahara     * set class property changelog
428068440fSSatoshi Sahara     */
438068440fSSatoshi Sahara    abstract protected function setChangeLog();
448068440fSSatoshi Sahara
458068440fSSatoshi Sahara    /**
460ea1f71bSSatoshi Sahara     * Prepare revision info of comparison pair
470ea1f71bSSatoshi Sahara     */
480ea1f71bSSatoshi Sahara    abstract protected function preProcess();
490ea1f71bSSatoshi Sahara
500ea1f71bSSatoshi Sahara    /**
51b4b4c5c6SSatoshi Sahara     * Set a pair of revisions to be compared
52b4b4c5c6SSatoshi Sahara     *
53e59e4a07SSatoshi Sahara     * @param int $rev1 older revision
54e59e4a07SSatoshi Sahara     * @param int $rev2 newer revision
55b4b4c5c6SSatoshi Sahara     * @return $this
56b4b4c5c6SSatoshi Sahara     */
57e59e4a07SSatoshi Sahara    public function compare($rev1, $rev2)
58b4b4c5c6SSatoshi Sahara    {
59e59e4a07SSatoshi Sahara        if ($rev2 < $rev1) [$rev1, $rev2] = [$rev2, $rev1];
606714d8ceSSatoshi Sahara        $this->rev1 = (int)$rev1;
616714d8ceSSatoshi Sahara        $this->rev2 = (int)$this->changelog->traceCurrentRevision($rev2);
62b4b4c5c6SSatoshi Sahara        return $this;
63b4b4c5c6SSatoshi Sahara    }
64b4b4c5c6SSatoshi Sahara
65b4b4c5c6SSatoshi Sahara    /**
66edb50e6aSSatoshi Sahara     * Gets or Sets preference of the Ui\Diff object
67edb50e6aSSatoshi Sahara     *
68edb50e6aSSatoshi Sahara     * @param string|array $prefs a key name or key-value pair(s)
69edb50e6aSSatoshi Sahara     * @param mixed $value value used when the first args is string
70edb50e6aSSatoshi Sahara     * @return array|$this
71edb50e6aSSatoshi Sahara     */
72edb50e6aSSatoshi Sahara    public function preference($prefs = null, $value = null)
73edb50e6aSSatoshi Sahara    {
74edb50e6aSSatoshi Sahara        // set
75295564cdSSatoshi Sahara        if (is_string($prefs) && isset($value)) {
76295564cdSSatoshi Sahara            $this->preference[$prefs] = $value;
77295564cdSSatoshi Sahara            return $this;
78295564cdSSatoshi Sahara        } elseif (is_array($prefs)) {
79edb50e6aSSatoshi Sahara            foreach ($prefs as $name => $value) {
80edb50e6aSSatoshi Sahara                $this->preference[$name] = $value;
81edb50e6aSSatoshi Sahara            }
82edb50e6aSSatoshi Sahara            return $this;
83edb50e6aSSatoshi Sahara        }
84edb50e6aSSatoshi Sahara        // get
85edb50e6aSSatoshi Sahara        return $this->preference;
86edb50e6aSSatoshi Sahara    }
87edb50e6aSSatoshi Sahara
88b4b4c5c6SSatoshi Sahara    /**
890ea1f71bSSatoshi Sahara     * Handle requested revision(s)
90b4b4c5c6SSatoshi Sahara     *
91b4b4c5c6SSatoshi Sahara     * @return void
92b4b4c5c6SSatoshi Sahara     */
930ea1f71bSSatoshi Sahara    protected function handle()
94b4b4c5c6SSatoshi Sahara    {
95b4b4c5c6SSatoshi Sahara        global $INPUT;
96b4b4c5c6SSatoshi Sahara
97312e7095SSatoshi Sahara        // diff link icon click, eg. &do=diff&rev=#
98b4b4c5c6SSatoshi Sahara        if ($INPUT->has('rev')) {
996714d8ceSSatoshi Sahara            $this->rev1 = $INPUT->int('rev');
1006714d8ceSSatoshi Sahara            $this->rev2 = $this->changelog->currentRevision();
1014cf9cfacSSatoshi Sahara            if ($this->rev2 <= $this->rev1) {
1024cf9cfacSSatoshi Sahara                // fallback to compare previous with current
1034cf9cfacSSatoshi Sahara                unset($this->rev1, $this->rev2);
1044cf9cfacSSatoshi Sahara            }
105b4b4c5c6SSatoshi Sahara        }
106b4b4c5c6SSatoshi Sahara
107312e7095SSatoshi Sahara        // submit button with two checked boxes, eg. &do=diff&rev2[0]=#&rev2[1]=#
108312e7095SSatoshi Sahara        $revs = $INPUT->arr('rev2', []);
109312e7095SSatoshi Sahara        if (count($revs) > 1) {
110*e2d055f5SAndreas Gohr            [$rev1, $rev2] = $revs;
111312e7095SSatoshi Sahara            if ($rev2 < $rev1) [$rev1, $rev2] = [$rev2, $rev1];
1126714d8ceSSatoshi Sahara            $this->rev1 = (int)$rev1;
1136714d8ceSSatoshi Sahara            $this->rev2 = (int)$this->changelog->traceCurrentRevision($rev2);
114b4b4c5c6SSatoshi Sahara        }
115312e7095SSatoshi Sahara
1165cb97057SSatoshi Sahara        // no revision was given, compare previous to current
1174cf9cfacSSatoshi Sahara        if (!isset($this->rev1, $this->rev2)) {
118312e7095SSatoshi Sahara            $rev2 = $this->changelog->currentRevision();
119312e7095SSatoshi Sahara            if ($rev2 > $this->changelog->lastRevision()) {
120312e7095SSatoshi Sahara                $rev1 = $this->changelog->lastRevision();
121312e7095SSatoshi Sahara            } else {
1226714d8ceSSatoshi Sahara                $revs = $this->changelog->getRevisions(0, 1);
123312e7095SSatoshi Sahara                $rev1 = count($revs) ? $revs[0] : false;
124312e7095SSatoshi Sahara            }
1256714d8ceSSatoshi Sahara            $this->rev1 = $rev1;
1266714d8ceSSatoshi Sahara            $this->rev2 = $rev2;
1275cb97057SSatoshi Sahara        }
128b4b4c5c6SSatoshi Sahara    }
12963ab9afeSSatoshi Sahara}
130