xref: /plugin/struct/action/diff.php (revision 5d17398f53f42b0d82bee77abf32606b63e8cb61)
1<?php
2/**
3 * DokuWiki Plugin struct (Action Component)
4 *
5 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6 * @author  Andreas Gohr, Michael Große <dokuwiki@cosmocode.de>
7 */
8
9// must be run within Dokuwiki
10use dokuwiki\plugin\struct\meta\AccessTable;
11use dokuwiki\plugin\struct\meta\Assignments;
12use dokuwiki\plugin\struct\meta\AccessTableData;
13use dokuwiki\plugin\struct\meta\StructException;
14
15if(!defined('DOKU_INC')) die();
16
17class action_plugin_struct_diff extends DokuWiki_Action_Plugin {
18
19    /**
20     * Registers a callback function for a given event
21     *
22     * @param Doku_Event_Handler $controller DokuWiki's event controller object
23     * @return void
24     */
25    public function register(Doku_Event_Handler $controller) {
26        $controller->register_hook('IO_WIKIPAGE_READ', 'AFTER', $this, 'handle_diffload');
27    }
28
29    /**
30     * Add structured data to the diff
31     *
32     * This is done by adding pseudo syntax to the page source when it is loaded in diff context
33     *
34     * @param Doku_Event $event event object by reference
35     * @param mixed $param [the parameters passed as fifth argument to register_hook() when this
36     *                           handler was registered]
37     * @return bool
38     */
39    public function handle_diffload(Doku_Event $event, $param) {
40        global $ACT;
41        global $INFO;
42        if($ACT != 'diff') return;
43        $id = $event->data[2];
44        if (!blank($event->data[1])) {
45            $id = $event->data[1] . ':' . $id;
46        }
47        $rev = $event->data[3];
48        if($INFO['id'] != $id) return;
49
50        $assignments = Assignments::getInstance();
51        $tables = $assignments->getPageAssignments($id);
52        if(!$tables) return;
53
54        $event->result .= "\n---- struct data ----\n";
55        foreach($tables as $table) {
56            try {
57                $schemadata = AccessTable::byTableName($table, $id, $rev);
58            } catch(StructException $ignored) {
59                continue; // no such schema at this revision
60            }
61            $event->result .= $schemadata->getDataPseudoSyntax();
62        }
63        $event->result .= "----\n";
64    }
65
66}
67
68// vim:ts=4:sw=4:et:
69