1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeau 4*04fd306cSNickeauuse ComboStrap\PluginUtility; 5*04fd306cSNickeauuse ComboStrap\TagAttributes; 6*04fd306cSNickeauuse ComboStrap\TagAttribute\Toggle; 7*04fd306cSNickeauuse ComboStrap\XmlTagProcessing; 8*04fd306cSNickeau 9*04fd306cSNickeauclass syntax_plugin_combo_togglecollapse extends DokuWiki_Syntax_Plugin 10*04fd306cSNickeau{ 11*04fd306cSNickeau 12*04fd306cSNickeau const TAG = "collapse"; 13*04fd306cSNickeau const CANONICAL = syntax_plugin_combo_toggle::CANONICAL; 14*04fd306cSNickeau 15*04fd306cSNickeau 16*04fd306cSNickeau /** 17*04fd306cSNickeau * Syntax Type. 18*04fd306cSNickeau * 19*04fd306cSNickeau * Needs to return one of the mode types defined in $PARSER_MODES in parser.php 20*04fd306cSNickeau * @see DokuWiki_Syntax_Plugin::getType() 21*04fd306cSNickeau */ 22*04fd306cSNickeau function getType(): string 23*04fd306cSNickeau { 24*04fd306cSNickeau return 'substition'; 25*04fd306cSNickeau } 26*04fd306cSNickeau 27*04fd306cSNickeau /** 28*04fd306cSNickeau * How Dokuwiki will add P element 29*04fd306cSNickeau * 30*04fd306cSNickeau * * 'normal' - The plugin can be used inside paragraphs 31*04fd306cSNickeau * * 'block' - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs 32*04fd306cSNickeau * * 'stack' - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs 33*04fd306cSNickeau * 34*04fd306cSNickeau * @see DokuWiki_Syntax_Plugin::getPType() 35*04fd306cSNickeau */ 36*04fd306cSNickeau function getPType(): string 37*04fd306cSNickeau { 38*04fd306cSNickeau // button or link 39*04fd306cSNickeau return 'normal'; 40*04fd306cSNickeau } 41*04fd306cSNickeau 42*04fd306cSNickeau /** 43*04fd306cSNickeau * @return array 44*04fd306cSNickeau * Allow which kind of plugin inside 45*04fd306cSNickeau * 46*04fd306cSNickeau * array('container', 'baseonly', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs') 47*04fd306cSNickeau * 48*04fd306cSNickeau */ 49*04fd306cSNickeau function getAllowedTypes(): array 50*04fd306cSNickeau { 51*04fd306cSNickeau return array('baseonly', 'formatting', 'substition', 'protected', 'disabled'); 52*04fd306cSNickeau } 53*04fd306cSNickeau 54*04fd306cSNickeau function getSort(): int 55*04fd306cSNickeau { 56*04fd306cSNickeau return 201; 57*04fd306cSNickeau } 58*04fd306cSNickeau 59*04fd306cSNickeau public 60*04fd306cSNickeau function accepts($mode): bool 61*04fd306cSNickeau { 62*04fd306cSNickeau return syntax_plugin_combo_preformatted::disablePreformatted($mode) 63*04fd306cSNickeau && Toggle::disableEntity($mode); 64*04fd306cSNickeau } 65*04fd306cSNickeau 66*04fd306cSNickeau 67*04fd306cSNickeau /** 68*04fd306cSNickeau * Create a pattern that will called this plugin 69*04fd306cSNickeau * 70*04fd306cSNickeau * @param string $mode 71*04fd306cSNickeau * @see Doku_Parser_Mode::connectTo() 72*04fd306cSNickeau */ 73*04fd306cSNickeau function connectTo($mode) 74*04fd306cSNickeau { 75*04fd306cSNickeau 76*04fd306cSNickeau /** 77*04fd306cSNickeau * Tag only valid in a toggle tag 78*04fd306cSNickeau */ 79*04fd306cSNickeau if ($mode == PluginUtility::getModeFromTag(syntax_plugin_combo_toggle::TAG)) { 80*04fd306cSNickeau $pattern = XmlTagProcessing::getContainerTagPattern(self::getTag()); 81*04fd306cSNickeau $this->Lexer->addEntryPattern($pattern, $mode, 'plugin_' . PluginUtility::PLUGIN_BASE_NAME . '_' . $this->getPluginComponent()); 82*04fd306cSNickeau } 83*04fd306cSNickeau 84*04fd306cSNickeau 85*04fd306cSNickeau } 86*04fd306cSNickeau 87*04fd306cSNickeau function postConnect() 88*04fd306cSNickeau { 89*04fd306cSNickeau 90*04fd306cSNickeau $this->Lexer->addExitPattern('</' . self::getTag() . '>', 'plugin_' . PluginUtility::PLUGIN_BASE_NAME . '_' . $this->getPluginComponent()); 91*04fd306cSNickeau 92*04fd306cSNickeau } 93*04fd306cSNickeau 94*04fd306cSNickeau function handle($match, $state, $pos, Doku_Handler $handler) 95*04fd306cSNickeau { 96*04fd306cSNickeau 97*04fd306cSNickeau 98*04fd306cSNickeau switch ($state) { 99*04fd306cSNickeau 100*04fd306cSNickeau case DOKU_LEXER_ENTER : 101*04fd306cSNickeau 102*04fd306cSNickeau /** 103*04fd306cSNickeau * Default parameters, type definition and parsing 104*04fd306cSNickeau */ 105*04fd306cSNickeau $defaultParameters = []; 106*04fd306cSNickeau $knownTypes = []; 107*04fd306cSNickeau $tagAttributes = TagAttributes::createFromTagMatch($match, $defaultParameters, $knownTypes) 108*04fd306cSNickeau ->setLogicalTag(self::TAG); 109*04fd306cSNickeau 110*04fd306cSNickeau return array( 111*04fd306cSNickeau PluginUtility::STATE => $state, 112*04fd306cSNickeau PluginUtility::ATTRIBUTES => $tagAttributes->toCallStackArray() 113*04fd306cSNickeau ); 114*04fd306cSNickeau case DOKU_LEXER_UNMATCHED : 115*04fd306cSNickeau return PluginUtility::handleAndReturnUnmatchedData(self::TAG, $match, $handler); 116*04fd306cSNickeau 117*04fd306cSNickeau case DOKU_LEXER_EXIT : 118*04fd306cSNickeau return array( 119*04fd306cSNickeau PluginUtility::STATE => $state 120*04fd306cSNickeau ); 121*04fd306cSNickeau 122*04fd306cSNickeau 123*04fd306cSNickeau } 124*04fd306cSNickeau return array(); 125*04fd306cSNickeau 126*04fd306cSNickeau } 127*04fd306cSNickeau 128*04fd306cSNickeau /** 129*04fd306cSNickeau * Render the output 130*04fd306cSNickeau * @param string $format 131*04fd306cSNickeau * @param Doku_Renderer $renderer 132*04fd306cSNickeau * @param array $data - what the function handle() return 133*04fd306cSNickeau * @return boolean - rendered correctly? (however, returned value is not used at the moment) 134*04fd306cSNickeau * @see DokuWiki_Syntax_Plugin::render() 135*04fd306cSNickeau * 136*04fd306cSNickeau * 137*04fd306cSNickeau */ 138*04fd306cSNickeau function render($format, Doku_Renderer $renderer, $data): bool 139*04fd306cSNickeau { 140*04fd306cSNickeau 141*04fd306cSNickeau if ($format === "xhtml") { 142*04fd306cSNickeau $state = $data[PluginUtility::STATE]; 143*04fd306cSNickeau switch ($state) { 144*04fd306cSNickeau case DOKU_LEXER_ENTER: 145*04fd306cSNickeau $tagAttributes = TagAttributes::createFromCallStackArray($data[PluginUtility::ATTRIBUTES]) 146*04fd306cSNickeau ->setLogicalTag(self::TAG); 147*04fd306cSNickeau $renderer->doc .= $tagAttributes->toHtmlEnterTag("span"); 148*04fd306cSNickeau break; 149*04fd306cSNickeau case DOKU_LEXER_UNMATCHED: 150*04fd306cSNickeau $renderer->doc .= PluginUtility::renderUnmatched($data); 151*04fd306cSNickeau break; 152*04fd306cSNickeau case DOKU_LEXER_EXIT: 153*04fd306cSNickeau $renderer->doc .= "</span>"; 154*04fd306cSNickeau break; 155*04fd306cSNickeau 156*04fd306cSNickeau } 157*04fd306cSNickeau return true; 158*04fd306cSNickeau } 159*04fd306cSNickeau 160*04fd306cSNickeau // unsupported $mode 161*04fd306cSNickeau return false; 162*04fd306cSNickeau } 163*04fd306cSNickeau 164*04fd306cSNickeau public 165*04fd306cSNickeau static function getTag(): string 166*04fd306cSNickeau { 167*04fd306cSNickeau return self::TAG; 168*04fd306cSNickeau } 169*04fd306cSNickeau 170*04fd306cSNickeau 171*04fd306cSNickeau} 172*04fd306cSNickeau 173