xref: /plugin/combo/syntax/edit.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeauuse ComboStrap\EditButton;
4*04fd306cSNickeauuse ComboStrap\ExceptionBadArgument;
5*04fd306cSNickeauuse ComboStrap\ExceptionNotEnabled;
6*04fd306cSNickeauuse ComboStrap\LogUtility;
7*04fd306cSNickeauuse ComboStrap\PluginUtility;
8*04fd306cSNickeauuse ComboStrap\Site;
9*04fd306cSNickeauuse ComboStrap\TagAttributes;
10*04fd306cSNickeau
11*04fd306cSNickeau
12*04fd306cSNickeau/**
13*04fd306cSNickeau *
14*04fd306cSNickeau * An edit button
15*04fd306cSNickeau *
16*04fd306cSNickeau * This is created in the parse tree for the following reason
17*04fd306cSNickeau *
18*04fd306cSNickeau *   * We need the start and end position (easier to catch at the parse tree creation because they are given in the handle function)
19*04fd306cSNickeau *   * A component may not allow them (for instance:
20*04fd306cSNickeau *       * an iterator will not allow edit button and delete them
21*04fd306cSNickeau *       * or {@link syntax_plugin_combo_webcode}
22*04fd306cSNickeau *   * The wiki id is mandatory and is given as global id in the handle function. In render, we may compose several parse tree (call stack)
23*04fd306cSNickeau *
24*04fd306cSNickeau */
25*04fd306cSNickeauclass syntax_plugin_combo_edit extends DokuWiki_Syntax_Plugin
26*04fd306cSNickeau{
27*04fd306cSNickeau
28*04fd306cSNickeau    const TAG = "edit";
29*04fd306cSNickeau    const CANONICAL = self::TAG;
30*04fd306cSNickeau    const START_POSITION = "start-position";
31*04fd306cSNickeau    const END_POSITION = "end-position";
32*04fd306cSNickeau    const LABEL = "label";
33*04fd306cSNickeau    const FORMAT = "format";
34*04fd306cSNickeau    const HEADING_ID = "heading-id";
35*04fd306cSNickeau    const SECTION_ID = "section-id"; // to be dokuwiki conform
36*04fd306cSNickeau
37*04fd306cSNickeau
38*04fd306cSNickeau    /**
39*04fd306cSNickeau     * Syntax Type.
40*04fd306cSNickeau     *
41*04fd306cSNickeau     * Needs to return one of the mode types defined in $PARSER_MODES in parser.php
42*04fd306cSNickeau     * @see DokuWiki_Syntax_Plugin::getType()
43*04fd306cSNickeau     */
44*04fd306cSNickeau    function getType(): string
45*04fd306cSNickeau    {
46*04fd306cSNickeau        return 'substition';
47*04fd306cSNickeau    }
48*04fd306cSNickeau
49*04fd306cSNickeau    /**
50*04fd306cSNickeau     * How Dokuwiki will add P element
51*04fd306cSNickeau     *
52*04fd306cSNickeau     * * 'normal' - The plugin can be used inside paragraphs
53*04fd306cSNickeau     *  * 'block'  - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs
54*04fd306cSNickeau     *  * 'stack'  - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs
55*04fd306cSNickeau     *
56*04fd306cSNickeau     * @see DokuWiki_Syntax_Plugin::getPType()
57*04fd306cSNickeau     */
58*04fd306cSNickeau    function getPType(): string
59*04fd306cSNickeau    {
60*04fd306cSNickeau        return 'block';
61*04fd306cSNickeau    }
62*04fd306cSNickeau
63*04fd306cSNickeau    /**
64*04fd306cSNickeau     * @return array
65*04fd306cSNickeau     * Allow which kind of plugin inside
66*04fd306cSNickeau     *
67*04fd306cSNickeau     * Array('baseonly','container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs')
68*04fd306cSNickeau     *
69*04fd306cSNickeau     * Return an array of one or more of the mode types {@link $PARSER_MODES} in Parser.php
70*04fd306cSNickeau     */
71*04fd306cSNickeau    function getAllowedTypes(): array
72*04fd306cSNickeau    {
73*04fd306cSNickeau        return array();
74*04fd306cSNickeau    }
75*04fd306cSNickeau
76*04fd306cSNickeau
77*04fd306cSNickeau    function getSort(): int
78*04fd306cSNickeau    {
79*04fd306cSNickeau        return 201;
80*04fd306cSNickeau    }
81*04fd306cSNickeau
82*04fd306cSNickeau
83*04fd306cSNickeau    function connectTo($mode)
84*04fd306cSNickeau    {
85*04fd306cSNickeau        /**
86*04fd306cSNickeau         * Call is generated via {@link EditButton::toComboCallComboFormat()}
87*04fd306cSNickeau         */
88*04fd306cSNickeau    }
89*04fd306cSNickeau
90*04fd306cSNickeau
91*04fd306cSNickeau    function postConnect()
92*04fd306cSNickeau    {
93*04fd306cSNickeau
94*04fd306cSNickeau        /**
95*04fd306cSNickeau         * Call is generated in {@link action_plugin_combo_instructionspostprocessing}
96*04fd306cSNickeau         */
97*04fd306cSNickeau
98*04fd306cSNickeau    }
99*04fd306cSNickeau
100*04fd306cSNickeau    function handle($match, $state, $pos, Doku_Handler $handler): array
101*04fd306cSNickeau    {
102*04fd306cSNickeau
103*04fd306cSNickeau        return array();
104*04fd306cSNickeau
105*04fd306cSNickeau    }
106*04fd306cSNickeau
107*04fd306cSNickeau    /**
108*04fd306cSNickeau     * Render the output
109*04fd306cSNickeau     * @param string $format
110*04fd306cSNickeau     * @param Doku_Renderer $renderer
111*04fd306cSNickeau     * @param array $data - what the function handle() return'ed
112*04fd306cSNickeau     * @return boolean - rendered correctly? (however, returned value is not used at the moment)
113*04fd306cSNickeau     * @see DokuWiki_Syntax_Plugin::render()
114*04fd306cSNickeau     *
115*04fd306cSNickeau     *
116*04fd306cSNickeau     */
117*04fd306cSNickeau    function render($format, Doku_Renderer $renderer, $data): bool
118*04fd306cSNickeau    {
119*04fd306cSNickeau
120*04fd306cSNickeau        /**
121*04fd306cSNickeau         *
122*04fd306cSNickeau         * The rendering is used only when exporting to another format
123*04fd306cSNickeau         * (XML) to render on another platform such as mobile
124*04fd306cSNickeau         */
125*04fd306cSNickeau        if ($format !== "xhtml") {
126*04fd306cSNickeau            return false;
127*04fd306cSNickeau        }
128*04fd306cSNickeau
129*04fd306cSNickeau        $state = $data[PluginUtility::STATE];
130*04fd306cSNickeau        if ($state !== DOKU_LEXER_SPECIAL) {
131*04fd306cSNickeau            LogUtility::error("The edit button should be a special tag", self::CANONICAL);
132*04fd306cSNickeau            return false;
133*04fd306cSNickeau        }
134*04fd306cSNickeau
135*04fd306cSNickeau        $editButton = EditButton::createFromCallStackArray($data[PluginUtility::ATTRIBUTES]);
136*04fd306cSNickeau        try {
137*04fd306cSNickeau            $renderer->doc .= $editButton->toHtmlComment();
138*04fd306cSNickeau        } catch (ExceptionBadArgument $e) {
139*04fd306cSNickeau            LogUtility::error("Error while rendering the edit button ($editButton). Error: {$e->getMessage()}", self::CANONICAL);
140*04fd306cSNickeau            return false;
141*04fd306cSNickeau        } catch (ExceptionNotEnabled $e) {
142*04fd306cSNickeau            // ok
143*04fd306cSNickeau            return false;
144*04fd306cSNickeau        }
145*04fd306cSNickeau        return true;
146*04fd306cSNickeau
147*04fd306cSNickeau    }
148*04fd306cSNickeau
149*04fd306cSNickeau
150*04fd306cSNickeau}
151*04fd306cSNickeau
152