xref: /plugin/struct/action/diff.php (revision 7234bfb14e712ff548d9266ef32fdcc8eaf2d04e)
110caaf49SAndreas Gohr<?php
2d6d97f60SAnna Dabrowska
310caaf49SAndreas Gohr/**
410caaf49SAndreas Gohr * DokuWiki Plugin struct (Action Component)
510caaf49SAndreas Gohr *
610caaf49SAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
710caaf49SAndreas Gohr * @author  Andreas Gohr, Michael Große <dokuwiki@cosmocode.de>
810caaf49SAndreas Gohr */
910caaf49SAndreas Gohr
10*7234bfb1Ssplitbrainuse dokuwiki\Extension\ActionPlugin;
11*7234bfb1Ssplitbrainuse dokuwiki\Extension\EventHandler;
12*7234bfb1Ssplitbrainuse dokuwiki\Extension\Event;
13f411d872SAndreas Gohruse dokuwiki\plugin\struct\meta\AccessTable;
14ba766201SAndreas Gohruse dokuwiki\plugin\struct\meta\Assignments;
15a28d6152SAndreas Gohruse dokuwiki\plugin\struct\meta\StructException;
1610caaf49SAndreas Gohr
17*7234bfb1Ssplitbrainclass action_plugin_struct_diff extends ActionPlugin
18d6d97f60SAnna Dabrowska{
1910caaf49SAndreas Gohr    /**
2010caaf49SAndreas Gohr     * Registers a callback function for a given event
2110caaf49SAndreas Gohr     *
2210caaf49SAndreas Gohr     * @param Doku_Event_Handler $controller DokuWiki's event controller object
2310caaf49SAndreas Gohr     * @return void
2410caaf49SAndreas Gohr     */
25*7234bfb1Ssplitbrain    public function register(EventHandler $controller)
26d6d97f60SAnna Dabrowska    {
27748e747fSAnna Dabrowska        $controller->register_hook('IO_WIKIPAGE_READ', 'AFTER', $this, 'handleDiffload');
2810caaf49SAndreas Gohr    }
2910caaf49SAndreas Gohr
3010caaf49SAndreas Gohr    /**
3110caaf49SAndreas Gohr     * Add structured data to the diff
3210caaf49SAndreas Gohr     *
3310caaf49SAndreas Gohr     * This is done by adding pseudo syntax to the page source when it is loaded in diff context
3410caaf49SAndreas Gohr     *
3510caaf49SAndreas Gohr     * @param Doku_Event $event event object by reference
3610caaf49SAndreas Gohr     * @param mixed $param [the parameters passed as fifth argument to register_hook() when this
3710caaf49SAndreas Gohr     *                           handler was registered]
3810caaf49SAndreas Gohr     * @return bool
3910caaf49SAndreas Gohr     */
40*7234bfb1Ssplitbrain    public function handleDiffload(Event $event, $param)
41d6d97f60SAnna Dabrowska    {
4210caaf49SAndreas Gohr        global $ACT;
4310caaf49SAndreas Gohr        global $INFO;
4410caaf49SAndreas Gohr        if ($ACT != 'diff') return;
4510caaf49SAndreas Gohr        $id = $event->data[2];
460c555ad4SMichael Grosse        if (!blank($event->data[1])) {
470c555ad4SMichael Grosse            $id = $event->data[1] . ':' . $id;
480c555ad4SMichael Grosse        }
497f803aa8SAnna Dabrowska        $rev = $event->data[3] ?: time();
5010caaf49SAndreas Gohr        if ($INFO['id'] != $id) return;
5110caaf49SAndreas Gohr
52025cb9daSAndreas Gohr        $assignments = Assignments::getInstance();
5310caaf49SAndreas Gohr        $tables = $assignments->getPageAssignments($id);
5410caaf49SAndreas Gohr        if (!$tables) return;
5510caaf49SAndreas Gohr
5608e7b568SAndreas Gohr        $event->result .= "\n---- struct data ----\n";
5710caaf49SAndreas Gohr        foreach ($tables as $table) {
58a28d6152SAndreas Gohr            try {
594cd5cc28SAnna Dabrowska                $schemadata = AccessTable::getPageAccess($table, $id, $rev);
60a28d6152SAndreas Gohr            } catch (StructException $ignored) {
61a28d6152SAndreas Gohr                continue; // no such schema at this revision
62a28d6152SAndreas Gohr            }
6308e7b568SAndreas Gohr            $event->result .= $schemadata->getDataPseudoSyntax();
6410caaf49SAndreas Gohr        }
6508e7b568SAndreas Gohr        $event->result .= "----\n";
6610caaf49SAndreas Gohr    }
6710caaf49SAndreas Gohr}
6810caaf49SAndreas Gohr
6910caaf49SAndreas Gohr// vim:ts=4:sw=4:et:
70