xref: /plugin/combo/action/instructionspostprocessing.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeau
4*04fd306cSNickeauuse ComboStrap\CallStack;
5*04fd306cSNickeauuse ComboStrap\ExceptionNotFound;
6*04fd306cSNickeauuse ComboStrap\ExecutionContext;
7*04fd306cSNickeauuse ComboStrap\HeadingTag;
8*04fd306cSNickeauuse ComboStrap\MarkupPath;
9*04fd306cSNickeauuse ComboStrap\Outline;
10*04fd306cSNickeauuse ComboStrap\WikiPath;
11*04fd306cSNickeau
12*04fd306cSNickeauclass action_plugin_combo_instructionspostprocessing extends DokuWiki_Action_Plugin
13*04fd306cSNickeau{
14*04fd306cSNickeau
15*04fd306cSNickeau
16*04fd306cSNickeau    /**
17*04fd306cSNickeau     * This section are not HTML
18*04fd306cSNickeau     * section, they are edit section
19*04fd306cSNickeau     * that delimits the edit area
20*04fd306cSNickeau     */
21*04fd306cSNickeau    const EDIT_SECTION_OPEN = 'section_open';
22*04fd306cSNickeau    const EDIT_SECTION_CLOSE = 'section_close';
23*04fd306cSNickeau    const HEADING_TAGS = [
24*04fd306cSNickeau        HeadingTag::HEADING_TAG,
25*04fd306cSNickeau        syntax_plugin_combo_headingatx::TAG,
26*04fd306cSNickeau        syntax_plugin_combo_headingwiki::TAG
27*04fd306cSNickeau    ];
28*04fd306cSNickeau
29*04fd306cSNickeau    const CANONICAL = Outline::CANONICAL;
30*04fd306cSNickeau
31*04fd306cSNickeau
32*04fd306cSNickeau    public
33*04fd306cSNickeau    function register(\Doku_Event_Handler $controller)
34*04fd306cSNickeau    {
35*04fd306cSNickeau        /**
36*04fd306cSNickeau         * Found in {@link Doku_Handler::finalize()}
37*04fd306cSNickeau         *
38*04fd306cSNickeau         * Doc: https://www.dokuwiki.org/devel:event:parser_handler_done
39*04fd306cSNickeau         */
40*04fd306cSNickeau        $controller->register_hook(
41*04fd306cSNickeau            'PARSER_HANDLER_DONE',
42*04fd306cSNickeau            'AFTER',
43*04fd306cSNickeau            $this,
44*04fd306cSNickeau            '_post_processing',
45*04fd306cSNickeau            array()
46*04fd306cSNickeau        );
47*04fd306cSNickeau
48*04fd306cSNickeau    }
49*04fd306cSNickeau
50*04fd306cSNickeau
51*04fd306cSNickeau    /**
52*04fd306cSNickeau     * Transform the special heading atx call
53*04fd306cSNickeau     * in an enter and exit heading atx calls
54*04fd306cSNickeau     *
55*04fd306cSNickeau     * Add the section close / open
56*04fd306cSNickeau     *
57*04fd306cSNickeau     * Build the toc
58*04fd306cSNickeau     * And create the main are
59*04fd306cSNickeau     *
60*04fd306cSNickeau     * Code extracted and adapted from the end of {@link Doku_Handler::header()}
61*04fd306cSNickeau     *
62*04fd306cSNickeau     * @param   $event Doku_Event
63*04fd306cSNickeau     */
64*04fd306cSNickeau    function _post_processing(&$event, $param)
65*04fd306cSNickeau    {
66*04fd306cSNickeau
67*04fd306cSNickeau        /**
68*04fd306cSNickeau         * @var Doku_Handler $handler
69*04fd306cSNickeau         */
70*04fd306cSNickeau        $handler = $event->data;
71*04fd306cSNickeau
72*04fd306cSNickeau        $executionContext = ExecutionContext::getActualOrCreateFromEnv();
73*04fd306cSNickeau
74*04fd306cSNickeau        try {
75*04fd306cSNickeau            $fetcherMarkup = $executionContext->getExecutingMarkupHandler();
76*04fd306cSNickeau            $isFragment = $fetcherMarkup->isFragment() === true;
77*04fd306cSNickeau            try {
78*04fd306cSNickeau                $executingPath = $fetcherMarkup->getRequestedExecutingPath();
79*04fd306cSNickeau            } catch (ExceptionNotFound $e) {
80*04fd306cSNickeau                $executingPath = null;
81*04fd306cSNickeau            }
82*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
83*04fd306cSNickeau
84*04fd306cSNickeau            /**
85*04fd306cSNickeau             * Not on admin pages
86*04fd306cSNickeau             */
87*04fd306cSNickeau            $action = $executionContext->getExecutingAction();
88*04fd306cSNickeau            if($action===ExecutionContext::ADMIN_ACTION){
89*04fd306cSNickeau                return;
90*04fd306cSNickeau            }
91*04fd306cSNickeau
92*04fd306cSNickeau            /**
93*04fd306cSNickeau             * What fucked up is fucked up !
94*04fd306cSNickeau             * {@link pageinfo()} in common may starts before the {@link action_plugin_combo_docustom handler } is called
95*04fd306cSNickeau             * {@link action_plugin_combo_docustom}
96*04fd306cSNickeau             */
97*04fd306cSNickeau            $requestedPath = $executionContext->getRequestedPath();
98*04fd306cSNickeau            $executingPath = null;
99*04fd306cSNickeau            $isFragment = true;
100*04fd306cSNickeau            try {
101*04fd306cSNickeau                $executingId = $executionContext->getExecutingWikiId();
102*04fd306cSNickeau
103*04fd306cSNickeau                /**
104*04fd306cSNickeau                 * In preview mode, this is always a `fragment run`
105*04fd306cSNickeau                 * * otherwise we get warning on the outline because the heading should start with heading 1 or 2, not 3
106*04fd306cSNickeau                 * * and this is used in {@link \ComboStrap\Parser::parseMarkupToHandler()}
107*04fd306cSNickeau                 */
108*04fd306cSNickeau                if ($executionContext->getExecutingAction() !== ExecutionContext::PREVIEW_ACTION) {
109*04fd306cSNickeau
110*04fd306cSNickeau                    $isSlot = MarkupPath::createPageFromPathObject($requestedPath)->isSlot();
111*04fd306cSNickeau                    if ($isSlot === false) {
112*04fd306cSNickeau                        if ($executingId === $requestedPath->getWikiId()) {
113*04fd306cSNickeau                            $isFragment = false;
114*04fd306cSNickeau                        }
115*04fd306cSNickeau                    }
116*04fd306cSNickeau
117*04fd306cSNickeau                }
118*04fd306cSNickeau                $executingPath = WikiPath::createMarkupPathFromId($executingId);
119*04fd306cSNickeau            } catch (ExceptionNotFound $e) {
120*04fd306cSNickeau                //
121*04fd306cSNickeau            }
122*04fd306cSNickeau        }
123*04fd306cSNickeau
124*04fd306cSNickeau        /**
125*04fd306cSNickeau         * Fragment execution
126*04fd306cSNickeau         */
127*04fd306cSNickeau        if ($isFragment) {
128*04fd306cSNickeau            $callStack = CallStack::createFromHandler($handler);
129*04fd306cSNickeau            // no outline or edit button for dynamic rendering
130*04fd306cSNickeau            // but closing of atx heading
131*04fd306cSNickeau            $handler->calls = Outline::createFromCallStack($callStack, null, true)
132*04fd306cSNickeau                ->toFragmentInstructionCalls();
133*04fd306cSNickeau            return;
134*04fd306cSNickeau        }
135*04fd306cSNickeau
136*04fd306cSNickeau        /**
137*04fd306cSNickeau         * Document execution
138*04fd306cSNickeau         * (add outline section, ...)
139*04fd306cSNickeau         */
140*04fd306cSNickeau        $callStack = CallStack::createFromHandler($handler);
141*04fd306cSNickeau        if ($executingPath !== null) {
142*04fd306cSNickeau            $executingMarkupPath = MarkupPath::createPageFromPathObject($executingPath);
143*04fd306cSNickeau        } else {
144*04fd306cSNickeau            $executingMarkupPath = null;
145*04fd306cSNickeau        }
146*04fd306cSNickeau        $outline = Outline::createFromCallStack($callStack, $executingMarkupPath, $isFragment);
147*04fd306cSNickeau        $handler->calls = $outline->toHtmlSectionOutlineCalls();
148*04fd306cSNickeau        /**
149*04fd306cSNickeau         * No more supported
150*04fd306cSNickeau         * $handler->calls = $outline->toDokuWikiTemplateInstructionCalls();
151*04fd306cSNickeau         */
152*04fd306cSNickeau
153*04fd306cSNickeau    }
154*04fd306cSNickeau
155*04fd306cSNickeau}
156