xref: /plugin/struct/action/diff.php (revision d6d97f6064c3b0f90310be8341edc9585520ee54)
110caaf49SAndreas Gohr<?php
2*d6d97f60SAnna 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
1010caaf49SAndreas Gohr// must be run within Dokuwiki
11f411d872SAndreas Gohruse dokuwiki\plugin\struct\meta\AccessTable;
12ba766201SAndreas Gohruse dokuwiki\plugin\struct\meta\Assignments;
1394c9aa4cSAndreas Gohruse dokuwiki\plugin\struct\meta\AccessTableData;
14a28d6152SAndreas Gohruse dokuwiki\plugin\struct\meta\StructException;
1510caaf49SAndreas Gohr
1610caaf49SAndreas Gohrif (!defined('DOKU_INC')) die();
1710caaf49SAndreas Gohr
18*d6d97f60SAnna Dabrowskaclass action_plugin_struct_diff extends DokuWiki_Action_Plugin
19*d6d97f60SAnna Dabrowska{
2010caaf49SAndreas Gohr
2110caaf49SAndreas Gohr    /**
2210caaf49SAndreas Gohr     * Registers a callback function for a given event
2310caaf49SAndreas Gohr     *
2410caaf49SAndreas Gohr     * @param Doku_Event_Handler $controller DokuWiki's event controller object
2510caaf49SAndreas Gohr     * @return void
2610caaf49SAndreas Gohr     */
27*d6d97f60SAnna Dabrowska    public function register(Doku_Event_Handler $controller)
28*d6d97f60SAnna Dabrowska    {
2910caaf49SAndreas Gohr        $controller->register_hook('IO_WIKIPAGE_READ', 'AFTER', $this, 'handle_diffload');
3010caaf49SAndreas Gohr    }
3110caaf49SAndreas Gohr
3210caaf49SAndreas Gohr    /**
3310caaf49SAndreas Gohr     * Add structured data to the diff
3410caaf49SAndreas Gohr     *
3510caaf49SAndreas Gohr     * This is done by adding pseudo syntax to the page source when it is loaded in diff context
3610caaf49SAndreas Gohr     *
3710caaf49SAndreas Gohr     * @param Doku_Event $event event object by reference
3810caaf49SAndreas Gohr     * @param mixed $param [the parameters passed as fifth argument to register_hook() when this
3910caaf49SAndreas Gohr     *                           handler was registered]
4010caaf49SAndreas Gohr     * @return bool
4110caaf49SAndreas Gohr     */
42*d6d97f60SAnna Dabrowska    public function handle_diffload(Doku_Event $event, $param)
43*d6d97f60SAnna Dabrowska    {
4410caaf49SAndreas Gohr        global $ACT;
4510caaf49SAndreas Gohr        global $INFO;
4610caaf49SAndreas Gohr        if ($ACT != 'diff') return;
4710caaf49SAndreas Gohr        $id = $event->data[2];
480c555ad4SMichael Grosse        if (!blank($event->data[1])) {
490c555ad4SMichael Grosse            $id = $event->data[1] . ':' . $id;
500c555ad4SMichael Grosse        }
517f803aa8SAnna Dabrowska        $rev = $event->data[3] ?: time();
5210caaf49SAndreas Gohr        if ($INFO['id'] != $id) return;
5310caaf49SAndreas Gohr
54025cb9daSAndreas Gohr        $assignments = Assignments::getInstance();
5510caaf49SAndreas Gohr        $tables = $assignments->getPageAssignments($id);
5610caaf49SAndreas Gohr        if (!$tables) return;
5710caaf49SAndreas Gohr
5808e7b568SAndreas Gohr        $event->result .= "\n---- struct data ----\n";
5910caaf49SAndreas Gohr        foreach ($tables as $table) {
60a28d6152SAndreas Gohr            try {
61f411d872SAndreas Gohr                $schemadata = AccessTable::byTableName($table, $id, $rev);
62a28d6152SAndreas Gohr            } catch (StructException $ignored) {
63a28d6152SAndreas Gohr                continue; // no such schema at this revision
64a28d6152SAndreas Gohr            }
6508e7b568SAndreas Gohr            $event->result .= $schemadata->getDataPseudoSyntax();
6610caaf49SAndreas Gohr        }
6708e7b568SAndreas Gohr        $event->result .= "----\n";
6810caaf49SAndreas Gohr    }
6910caaf49SAndreas Gohr}
7010caaf49SAndreas Gohr
7110caaf49SAndreas Gohr// vim:ts=4:sw=4:et:
72