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