xref: /plugin/struct/syntax/output.php (revision 34ea6e1056993bf65c34d15d1eb9730d4dfba9af)
1257dd7f8SAndreas Gohr<?php
2d6d97f60SAnna Dabrowska
3257dd7f8SAndreas Gohr/**
4257dd7f8SAndreas Gohr * DokuWiki Plugin struct (Syntax Component)
5257dd7f8SAndreas Gohr *
6257dd7f8SAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
7257dd7f8SAndreas Gohr * @author  Andreas Gohr, Michael Große <dokuwiki@cosmocode.de>
8257dd7f8SAndreas Gohr */
9257dd7f8SAndreas Gohr
10f411d872SAndreas Gohruse dokuwiki\plugin\struct\meta\AccessTable;
11ba766201SAndreas Gohruse dokuwiki\plugin\struct\meta\Assignments;
127cbcfbdbSAndreas Gohruse dokuwiki\plugin\struct\meta\StructException;
13257dd7f8SAndreas Gohr
14d6d97f60SAnna Dabrowskaclass syntax_plugin_struct_output extends DokuWiki_Syntax_Plugin
15d6d97f60SAnna Dabrowska{
1687050b53SMichael Grosse
1787050b53SMichael Grosse    protected $hasBeenRendered = false;
1887050b53SMichael Grosse
197938ca48SAndreas Gohr    const XHTML_OPEN = '<div id="plugin__struct_output">';
207938ca48SAndreas Gohr    const XHTML_CLOSE = '</div>';
217938ca48SAndreas Gohr
22257dd7f8SAndreas Gohr    /**
23979b16f8SAndreas Gohr     * Regexp to check on which actions the struct data may be rendered
24979b16f8SAndreas Gohr     */
25979b16f8SAndreas Gohr    const WHITELIST_ACTIONS = '/^(show|export_.*)$/';
26979b16f8SAndreas Gohr
27979b16f8SAndreas Gohr    /**
28257dd7f8SAndreas Gohr     * @return string Syntax mode type
29257dd7f8SAndreas Gohr     */
30d6d97f60SAnna Dabrowska    public function getType()
31d6d97f60SAnna Dabrowska    {
32257dd7f8SAndreas Gohr        return 'substition';
33257dd7f8SAndreas Gohr    }
34da30fdd3SAndreas Gohr
35257dd7f8SAndreas Gohr    /**
36257dd7f8SAndreas Gohr     * @return string Paragraph type
37257dd7f8SAndreas Gohr     */
38d6d97f60SAnna Dabrowska    public function getPType()
39d6d97f60SAnna Dabrowska    {
40257dd7f8SAndreas Gohr        return 'block';
41257dd7f8SAndreas Gohr    }
42da30fdd3SAndreas Gohr
43257dd7f8SAndreas Gohr    /**
44257dd7f8SAndreas Gohr     * @return int Sort order - Low numbers go before high numbers
45257dd7f8SAndreas Gohr     */
46d6d97f60SAnna Dabrowska    public function getSort()
47d6d97f60SAnna Dabrowska    {
48257dd7f8SAndreas Gohr        return 155;
49257dd7f8SAndreas Gohr    }
50257dd7f8SAndreas Gohr
51257dd7f8SAndreas Gohr    /**
52257dd7f8SAndreas Gohr     * Connect lookup pattern to lexer.
53257dd7f8SAndreas Gohr     *
5482c064c1SAndreas Gohr     * We do not connect any pattern here, because the call to this plugin is not
5582c064c1SAndreas Gohr     * triggered from syntax but our action component
5682c064c1SAndreas Gohr     *
5782c064c1SAndreas Gohr     * @asee action_plugin_struct_output
58257dd7f8SAndreas Gohr     * @param string $mode Parser mode
59257dd7f8SAndreas Gohr     */
60d6d97f60SAnna Dabrowska    public function connectTo($mode)
61d6d97f60SAnna Dabrowska    {
62257dd7f8SAndreas Gohr    }
63257dd7f8SAndreas Gohr
64257dd7f8SAndreas Gohr    /**
65257dd7f8SAndreas Gohr     * Handle matches of the struct syntax
66257dd7f8SAndreas Gohr     *
67257dd7f8SAndreas Gohr     * @param string $match The match of the syntax
68257dd7f8SAndreas Gohr     * @param int $state The state of the handler
69257dd7f8SAndreas Gohr     * @param int $pos The position in the document
70257dd7f8SAndreas Gohr     * @param Doku_Handler $handler The handler
71257dd7f8SAndreas Gohr     * @return array Data for the renderer
72257dd7f8SAndreas Gohr     */
73d6d97f60SAnna Dabrowska    public function handle($match, $state, $pos, Doku_Handler $handler)
74d6d97f60SAnna Dabrowska    {
7582c064c1SAndreas Gohr        // this is never called
7682c064c1SAndreas Gohr        return array();
77257dd7f8SAndreas Gohr    }
78257dd7f8SAndreas Gohr
79257dd7f8SAndreas Gohr    /**
8082c064c1SAndreas Gohr     * Render schema data
81257dd7f8SAndreas Gohr     *
82564e138bSAnna Dabrowska     * Currently completely renderer agnostic
8382c064c1SAndreas Gohr     *
84*34ea6e10SAnna Dabrowska     * @param string $format Renderer format
85*34ea6e10SAnna Dabrowska     * @param Doku_Renderer $renderer The renderer
86257dd7f8SAndreas Gohr     * @param array $data The data from the handler() function
87257dd7f8SAndreas Gohr     * @return bool If rendering was successful.
88257dd7f8SAndreas Gohr     */
89*34ea6e10SAnna Dabrowska    public function render($format, Doku_Renderer $renderer, $data)
90d6d97f60SAnna Dabrowska    {
910e4a3e7cSMichael Große        global $ACT;
92257dd7f8SAndreas Gohr        global $ID;
9382c064c1SAndreas Gohr        global $INFO;
94257dd7f8SAndreas Gohr        global $REV;
95bdefb930SAnna Dabrowska
96*34ea6e10SAnna Dabrowska        foreach (helper_plugin_struct::BLACKLIST_RENDERER as $blacklisted) {
97*34ea6e10SAnna Dabrowska            if ($renderer instanceof $blacklisted) {
980e4a3e7cSMichael Große                return true;
990e4a3e7cSMichael Große            }
100bdefb930SAnna Dabrowska        }
10182c064c1SAndreas Gohr        if ($ID != $INFO['id']) return true;
1022f1a213bSAndreas Gohr        if (!$INFO['exists']) return true;
10387050b53SMichael Grosse        if ($this->hasBeenRendered) return true;
104979b16f8SAndreas Gohr        if (!preg_match(self::WHITELIST_ACTIONS, act_clean($ACT))) return true;
10587050b53SMichael Grosse
10687050b53SMichael Grosse        // do not render the output twice on the same page, e.g. when another page has been included
10787050b53SMichael Grosse        $this->hasBeenRendered = true;
1087cbcfbdbSAndreas Gohr        try {
109025cb9daSAndreas Gohr            $assignments = Assignments::getInstance();
1107cbcfbdbSAndreas Gohr        } catch (StructException $e) {
1117cbcfbdbSAndreas Gohr            return false;
1127cbcfbdbSAndreas Gohr        }
113257dd7f8SAndreas Gohr        $tables = $assignments->getPageAssignments($ID);
114257dd7f8SAndreas Gohr        if (!$tables) return true;
115257dd7f8SAndreas Gohr
116*34ea6e10SAnna Dabrowska        if ($format == 'xhtml') $renderer->doc .= self::XHTML_OPEN;
1175a1eab78SAndreas Gohr
1187938ca48SAndreas Gohr        $hasdata = false;
119257dd7f8SAndreas Gohr        foreach ($tables as $table) {
120a28d6152SAndreas Gohr            try {
1214cd5cc28SAnna Dabrowska                $schemadata = AccessTable::getPageAccess($table, $ID, (int)$REV);
122a28d6152SAndreas Gohr            } catch (StructException $ignored) {
123a28d6152SAndreas Gohr                continue; // no such schema at this revision
124a28d6152SAndreas Gohr            }
1250dd23cefSAndreas Gohr            $schemadata->optionSkipEmpty(true);
1260dd23cefSAndreas Gohr            $data = $schemadata->getData();
127da30fdd3SAndreas Gohr            if (!count($data)) continue;
1287938ca48SAndreas Gohr            $hasdata = true;
129257dd7f8SAndreas Gohr
130*34ea6e10SAnna Dabrowska            $renderer->table_open();
131da30fdd3SAndreas Gohr
132*34ea6e10SAnna Dabrowska            $renderer->tablethead_open();
133*34ea6e10SAnna Dabrowska            $renderer->tablerow_open();
134*34ea6e10SAnna Dabrowska            $renderer->tableheader_open(2);
135*34ea6e10SAnna Dabrowska            $renderer->cdata($schemadata->getSchema()->getTranslatedLabel());
136*34ea6e10SAnna Dabrowska            $renderer->tableheader_close();
137*34ea6e10SAnna Dabrowska            $renderer->tablerow_close();
138*34ea6e10SAnna Dabrowska            $renderer->tablethead_close();
139da30fdd3SAndreas Gohr
140*34ea6e10SAnna Dabrowska            $renderer->tabletbody_open();
141257dd7f8SAndreas Gohr            foreach ($data as $field) {
142*34ea6e10SAnna Dabrowska                $renderer->tablerow_open();
143*34ea6e10SAnna Dabrowska                $renderer->tableheader_open();
144*34ea6e10SAnna Dabrowska                $renderer->cdata($field->getColumn()->getTranslatedLabel());
145*34ea6e10SAnna Dabrowska                $renderer->tableheader_close();
146*34ea6e10SAnna Dabrowska                $renderer->tablecell_open();
147*34ea6e10SAnna Dabrowska                if ($format == 'xhtml') {
148*34ea6e10SAnna Dabrowska                    $renderer->doc = substr($renderer->doc, 0, -1) .
149748e747fSAnna Dabrowska                        ' data-struct="' . hsc($field->getColumn()->getFullQualifiedLabel()) .
150748e747fSAnna Dabrowska                        '">';
15125852712SAndreas Gohr                }
152*34ea6e10SAnna Dabrowska                $field->render($renderer, $format);
153*34ea6e10SAnna Dabrowska                $renderer->tablecell_close();
154*34ea6e10SAnna Dabrowska                $renderer->tablerow_close();
155257dd7f8SAndreas Gohr            }
156*34ea6e10SAnna Dabrowska            $renderer->tabletbody_close();
157*34ea6e10SAnna Dabrowska            $renderer->table_close();
158da30fdd3SAndreas Gohr        }
159257dd7f8SAndreas Gohr
160*34ea6e10SAnna Dabrowska        if ($format == 'xhtml') $renderer->doc .= self::XHTML_CLOSE;
1617938ca48SAndreas Gohr
1627938ca48SAndreas Gohr        // if no data has been output, remove empty wrapper again
163*34ea6e10SAnna Dabrowska        if ($format == 'xhtml' && !$hasdata) {
164*34ea6e10SAnna Dabrowska            $renderer->doc = substr($renderer->doc, 0, -1 * strlen(self::XHTML_OPEN . self::XHTML_CLOSE));
1657938ca48SAndreas Gohr        }
1665a1eab78SAndreas Gohr
167257dd7f8SAndreas Gohr        return true;
168257dd7f8SAndreas Gohr    }
169257dd7f8SAndreas Gohr}
170257dd7f8SAndreas Gohr
171257dd7f8SAndreas Gohr// vim:ts=4:sw=4:et:
172