xref: /plugin/struct/action/output.php (revision 3851b2fb5c369d7513a0911ca5431959fd44efc9)
182c064c1SAndreas Gohr<?php
282c064c1SAndreas Gohr/**
382c064c1SAndreas Gohr * DokuWiki Plugin struct (Action Component)
482c064c1SAndreas Gohr *
582c064c1SAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
682c064c1SAndreas Gohr * @author  Andreas Gohr, Michael Große <dokuwiki@cosmocode.de>
782c064c1SAndreas Gohr */
882c064c1SAndreas Gohr
982c064c1SAndreas Gohr// must be run within Dokuwiki
1082c064c1SAndreas Gohrif(!defined('DOKU_INC')) die();
1182c064c1SAndreas Gohr
1282c064c1SAndreas Gohr/**
1382c064c1SAndreas Gohr * Class action_plugin_struct_output
1482c064c1SAndreas Gohr *
1582c064c1SAndreas Gohr * This action component handles the automatic output of all schema data that has been assigned
1682c064c1SAndreas Gohr * to the current page by appending the appropriate instruction to the handler calls.
1782c064c1SAndreas Gohr *
1882c064c1SAndreas Gohr * The real output creation is done within the syntax component
1982c064c1SAndreas Gohr * @see syntax_plugin_struct_output
2082c064c1SAndreas Gohr */
2182c064c1SAndreas Gohrclass action_plugin_struct_output extends DokuWiki_Action_Plugin {
2282c064c1SAndreas Gohr
23*3851b2fbSAnna Dabrowska    const DW2PDF_PLACEHOLDER_PREFIX = 'PLUGIN_STRUCT';
24*3851b2fbSAnna Dabrowska
2582c064c1SAndreas Gohr    /**
2682c064c1SAndreas Gohr     * Registers a callback function for a given event
2782c064c1SAndreas Gohr     *
2882c064c1SAndreas Gohr     * @param Doku_Event_Handler $controller DokuWiki's event controller object
2982c064c1SAndreas Gohr     * @return void
3082c064c1SAndreas Gohr     */
3182c064c1SAndreas Gohr    public function register(Doku_Event_Handler $controller) {
3282c064c1SAndreas Gohr        $controller->register_hook('PARSER_HANDLER_DONE', 'AFTER', $this, 'handle_output');
33*3851b2fbSAnna Dabrowska        $controller->register_hook('PLUGIN_DW2PDF_REPLACE', 'BEFORE', $this, 'replace_dw2pdf');
34*3851b2fbSAnna Dabrowska        $controller->register_hook('PLUGIN_DW2PDF_REPLACE', 'AFTER', $this, 'cleanup_dw2pdf');
3582c064c1SAndreas Gohr    }
3682c064c1SAndreas Gohr
3782c064c1SAndreas Gohr    /**
3882c064c1SAndreas Gohr     * Appends the instruction to render our syntax output component to each page
3928b818ceSAndreas Gohr     * after the first found headline or the very begining if no headline was found
4082c064c1SAndreas Gohr     *
4182c064c1SAndreas Gohr     * @param Doku_Event $event
4282c064c1SAndreas Gohr     * @param $param
4382c064c1SAndreas Gohr     */
44881e940cSAndreas Gohr    public function handle_output(Doku_Event $event, $param) {
450e4a3e7cSMichael Große        global $ID;
4602481400SAndreas Gohr        if(!page_exists($ID)) return;
4728b818ceSAndreas Gohr        $ins = -1;
4828b818ceSAndreas Gohr        $pos = 0;
4928b818ceSAndreas Gohr        foreach($event->data->calls as $num => $call) {
5028b818ceSAndreas Gohr            // try to find the first header
5128b818ceSAndreas Gohr            if($call[0] == 'header') {
5228b818ceSAndreas Gohr                $pos = $call[2];
5328b818ceSAndreas Gohr                $ins = $num;
5428b818ceSAndreas Gohr                break;
5528b818ceSAndreas Gohr            }
5682c064c1SAndreas Gohr
5728b818ceSAndreas Gohr            // abort when after we looked at the first 150 bytes
589007da58SMichael Große            if(isset($call[3]) && $call[3] > 150) {
5928b818ceSAndreas Gohr                break;
6028b818ceSAndreas Gohr            }
6128b818ceSAndreas Gohr        }
6228b818ceSAndreas Gohr
6328b818ceSAndreas Gohr        // insert our own call after the found position
6428b818ceSAndreas Gohr        array_splice(
6528b818ceSAndreas Gohr            $event->data->calls,
6628b818ceSAndreas Gohr            $ins+1,
6728b818ceSAndreas Gohr            0,
6828b818ceSAndreas Gohr            array(
6928b818ceSAndreas Gohr                array(
7082c064c1SAndreas Gohr                    'plugin',
7182c064c1SAndreas Gohr                    array(
725a1eab78SAndreas Gohr                        'struct_output', array('pos' => $pos), DOKU_LEXER_SPECIAL, ''
7382c064c1SAndreas Gohr                    ),
7482c064c1SAndreas Gohr                    $pos
7528b818ceSAndreas Gohr                )
7628b818ceSAndreas Gohr            )
7782c064c1SAndreas Gohr        );
7882c064c1SAndreas Gohr    }
7982c064c1SAndreas Gohr
80*3851b2fbSAnna Dabrowska    /**
81*3851b2fbSAnna Dabrowska     * If the page has a schema assigned, add its struct data
82*3851b2fbSAnna Dabrowska     * to dw2pdf's template replacements
83*3851b2fbSAnna Dabrowska     *
84*3851b2fbSAnna Dabrowska     * @param Doku_Event $event
85*3851b2fbSAnna Dabrowska     * @param $param
86*3851b2fbSAnna Dabrowska     */
87*3851b2fbSAnna Dabrowska    public function replace_dw2pdf(Doku_Event $event, $param)
88*3851b2fbSAnna Dabrowska    {
89*3851b2fbSAnna Dabrowska        if (!$event->data['id'] || !page_exists($event->data['id'])) return;
90*3851b2fbSAnna Dabrowska
91*3851b2fbSAnna Dabrowska        /** @var helper_plugin_struct $helper */
92*3851b2fbSAnna Dabrowska        $helper = plugin_load('helper', 'struct');
93*3851b2fbSAnna Dabrowska        $data = $helper->getData($event->data['id']);
94*3851b2fbSAnna Dabrowska
95*3851b2fbSAnna Dabrowska        if(!$data) return;
96*3851b2fbSAnna Dabrowska
97*3851b2fbSAnna Dabrowska        foreach ($data as $schema => $fields) {
98*3851b2fbSAnna Dabrowska            foreach ($fields as $field => $value) {
99*3851b2fbSAnna Dabrowska                $placeholder = sprintf('@%s_%s_%s@', self::DW2PDF_PLACEHOLDER_PREFIX, $schema, $field);
100*3851b2fbSAnna Dabrowska                $event->data['replace'][$placeholder] = is_array($value) ? implode(', ', $value) : $value;
101*3851b2fbSAnna Dabrowska            }
102*3851b2fbSAnna Dabrowska        }
103*3851b2fbSAnna Dabrowska    }
104*3851b2fbSAnna Dabrowska
105*3851b2fbSAnna Dabrowska    /**
106*3851b2fbSAnna Dabrowska     * Remove struct placeholders still present after replacement.
107*3851b2fbSAnna Dabrowska     * Requested data was not found.
108*3851b2fbSAnna Dabrowska     *
109*3851b2fbSAnna Dabrowska     * @param Doku_Event $event
110*3851b2fbSAnna Dabrowska     * @param $param
111*3851b2fbSAnna Dabrowska     */
112*3851b2fbSAnna Dabrowska    public function cleanup_dw2pdf(Doku_Event $event, $param)
113*3851b2fbSAnna Dabrowska    {
114*3851b2fbSAnna Dabrowska        $pattern = '~@' . self::DW2PDF_PLACEHOLDER_PREFIX . '_[^@]+?@~';
115*3851b2fbSAnna Dabrowska        $event->data['content'] = preg_replace($pattern, '', $event->data['content']);
116*3851b2fbSAnna Dabrowska    }
117*3851b2fbSAnna Dabrowska
11882c064c1SAndreas Gohr}
11982c064c1SAndreas Gohr
12082c064c1SAndreas Gohr// vim:ts=4:sw=4:et:
121