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