xref: /plugin/combo/action/instructionspostprocessing.php (revision ad54dffd2a785f08006601bf247e440e47fc7b18)
104fd306cSNickeau<?php
204fd306cSNickeau
3*ad54dffdSgerardnicorequire_once(__DIR__ . '/../vendor/autoload.php');
404fd306cSNickeau
504fd306cSNickeauuse ComboStrap\CallStack;
604fd306cSNickeauuse ComboStrap\ExceptionNotFound;
704fd306cSNickeauuse ComboStrap\ExecutionContext;
804fd306cSNickeauuse ComboStrap\HeadingTag;
904fd306cSNickeauuse ComboStrap\MarkupPath;
1004fd306cSNickeauuse ComboStrap\Outline;
1104fd306cSNickeauuse ComboStrap\WikiPath;
1204fd306cSNickeau
1304fd306cSNickeauclass action_plugin_combo_instructionspostprocessing extends DokuWiki_Action_Plugin
1404fd306cSNickeau{
1504fd306cSNickeau
1604fd306cSNickeau
1704fd306cSNickeau    /**
1804fd306cSNickeau     * This section are not HTML
1904fd306cSNickeau     * section, they are edit section
2004fd306cSNickeau     * that delimits the edit area
2104fd306cSNickeau     */
2204fd306cSNickeau    const EDIT_SECTION_OPEN = 'section_open';
2304fd306cSNickeau    const EDIT_SECTION_CLOSE = 'section_close';
2404fd306cSNickeau    const HEADING_TAGS = [
2504fd306cSNickeau        HeadingTag::HEADING_TAG,
2604fd306cSNickeau        syntax_plugin_combo_headingatx::TAG,
2704fd306cSNickeau        syntax_plugin_combo_headingwiki::TAG
2804fd306cSNickeau    ];
2904fd306cSNickeau
3004fd306cSNickeau    const CANONICAL = Outline::CANONICAL;
3104fd306cSNickeau
3204fd306cSNickeau
3304fd306cSNickeau    public
3404fd306cSNickeau    function register(\Doku_Event_Handler $controller)
3504fd306cSNickeau    {
3604fd306cSNickeau        /**
3704fd306cSNickeau         * Found in {@link Doku_Handler::finalize()}
3804fd306cSNickeau         *
3904fd306cSNickeau         * Doc: https://www.dokuwiki.org/devel:event:parser_handler_done
4004fd306cSNickeau         */
4104fd306cSNickeau        $controller->register_hook(
4204fd306cSNickeau            'PARSER_HANDLER_DONE',
4304fd306cSNickeau            'AFTER',
4404fd306cSNickeau            $this,
4504fd306cSNickeau            '_post_processing',
4604fd306cSNickeau            array()
4704fd306cSNickeau        );
4804fd306cSNickeau
4904fd306cSNickeau    }
5004fd306cSNickeau
5104fd306cSNickeau
5204fd306cSNickeau    /**
5304fd306cSNickeau     * Transform the special heading atx call
5404fd306cSNickeau     * in an enter and exit heading atx calls
5504fd306cSNickeau     *
5604fd306cSNickeau     * Add the section close / open
5704fd306cSNickeau     *
5804fd306cSNickeau     * Build the toc
5904fd306cSNickeau     * And create the main are
6004fd306cSNickeau     *
6104fd306cSNickeau     * Code extracted and adapted from the end of {@link Doku_Handler::header()}
6204fd306cSNickeau     *
6304fd306cSNickeau     * @param   $event Doku_Event
6404fd306cSNickeau     */
6504fd306cSNickeau    function _post_processing(&$event, $param)
6604fd306cSNickeau    {
6704fd306cSNickeau
6804fd306cSNickeau        /**
6904fd306cSNickeau         * @var Doku_Handler $handler
7004fd306cSNickeau         */
7104fd306cSNickeau        $handler = $event->data;
7204fd306cSNickeau
7304fd306cSNickeau        $executionContext = ExecutionContext::getActualOrCreateFromEnv();
7404fd306cSNickeau
7504fd306cSNickeau        try {
7604fd306cSNickeau            $fetcherMarkup = $executionContext->getExecutingMarkupHandler();
7704fd306cSNickeau            $isFragment = $fetcherMarkup->isFragment() === true;
7804fd306cSNickeau            try {
7904fd306cSNickeau                $executingPath = $fetcherMarkup->getRequestedExecutingPath();
8004fd306cSNickeau            } catch (ExceptionNotFound $e) {
8104fd306cSNickeau                $executingPath = null;
8204fd306cSNickeau            }
8304fd306cSNickeau        } catch (ExceptionNotFound $e) {
8404fd306cSNickeau
8504fd306cSNickeau            /**
8604fd306cSNickeau             * Not on admin pages
8704fd306cSNickeau             */
8804fd306cSNickeau            $action = $executionContext->getExecutingAction();
8904fd306cSNickeau            if($action===ExecutionContext::ADMIN_ACTION){
9004fd306cSNickeau                return;
9104fd306cSNickeau            }
9204fd306cSNickeau
9304fd306cSNickeau            /**
9404fd306cSNickeau             * What fucked up is fucked up !
9504fd306cSNickeau             * {@link pageinfo()} in common may starts before the {@link action_plugin_combo_docustom handler } is called
9604fd306cSNickeau             * {@link action_plugin_combo_docustom}
9704fd306cSNickeau             */
9804fd306cSNickeau            $requestedPath = $executionContext->getRequestedPath();
9904fd306cSNickeau            $executingPath = null;
10004fd306cSNickeau            $isFragment = true;
10104fd306cSNickeau            try {
10204fd306cSNickeau                $executingId = $executionContext->getExecutingWikiId();
10304fd306cSNickeau
10404fd306cSNickeau                /**
10504fd306cSNickeau                 * In preview mode, this is always a `fragment run`
10604fd306cSNickeau                 * * otherwise we get warning on the outline because the heading should start with heading 1 or 2, not 3
10704fd306cSNickeau                 * * and this is used in {@link \ComboStrap\Parser::parseMarkupToHandler()}
10804fd306cSNickeau                 */
10904fd306cSNickeau                if ($executionContext->getExecutingAction() !== ExecutionContext::PREVIEW_ACTION) {
11004fd306cSNickeau
11104fd306cSNickeau                    $isSlot = MarkupPath::createPageFromPathObject($requestedPath)->isSlot();
11204fd306cSNickeau                    if ($isSlot === false) {
11304fd306cSNickeau                        if ($executingId === $requestedPath->getWikiId()) {
11404fd306cSNickeau                            $isFragment = false;
11504fd306cSNickeau                        }
11604fd306cSNickeau                    }
11704fd306cSNickeau
11804fd306cSNickeau                }
11904fd306cSNickeau                $executingPath = WikiPath::createMarkupPathFromId($executingId);
12004fd306cSNickeau            } catch (ExceptionNotFound $e) {
12104fd306cSNickeau                //
12204fd306cSNickeau            }
12304fd306cSNickeau        }
12404fd306cSNickeau
12504fd306cSNickeau        /**
12604fd306cSNickeau         * Fragment execution
12704fd306cSNickeau         */
12804fd306cSNickeau        if ($isFragment) {
12904fd306cSNickeau            $callStack = CallStack::createFromHandler($handler);
13004fd306cSNickeau            // no outline or edit button for dynamic rendering
13104fd306cSNickeau            // but closing of atx heading
13204fd306cSNickeau            $handler->calls = Outline::createFromCallStack($callStack, null, true)
13304fd306cSNickeau                ->toFragmentInstructionCalls();
13404fd306cSNickeau            return;
13504fd306cSNickeau        }
13604fd306cSNickeau
13704fd306cSNickeau        /**
13804fd306cSNickeau         * Document execution
13904fd306cSNickeau         * (add outline section, ...)
14004fd306cSNickeau         */
14104fd306cSNickeau        $callStack = CallStack::createFromHandler($handler);
14204fd306cSNickeau        if ($executingPath !== null) {
14304fd306cSNickeau            $executingMarkupPath = MarkupPath::createPageFromPathObject($executingPath);
14404fd306cSNickeau        } else {
14504fd306cSNickeau            $executingMarkupPath = null;
14604fd306cSNickeau        }
14704fd306cSNickeau        $outline = Outline::createFromCallStack($callStack, $executingMarkupPath, $isFragment);
14804fd306cSNickeau        $handler->calls = $outline->toHtmlSectionOutlineCalls();
14904fd306cSNickeau        /**
15004fd306cSNickeau         * No more supported
15104fd306cSNickeau         * $handler->calls = $outline->toDokuWikiTemplateInstructionCalls();
15204fd306cSNickeau         */
15304fd306cSNickeau
15404fd306cSNickeau    }
15504fd306cSNickeau
15604fd306cSNickeau}
157