15f891b7eSNickeau<?php 25f891b7eSNickeau/** 35f891b7eSNickeau * DokuWiki Syntax Plugin Combostrap. 45f891b7eSNickeau * 55f891b7eSNickeau */ 65f891b7eSNickeau 7*04fd306cSNickeauuse ComboStrap\ExecutionContext; 85f891b7eSNickeauuse ComboStrap\PluginUtility; 921913ab3SNickeauuse ComboStrap\TagAttributes; 10*04fd306cSNickeauuse ComboStrap\XmlTagProcessing; 115f891b7eSNickeau 12*04fd306cSNickeaurequire_once(__DIR__ . '/../vendor/autoload.php'); 135f891b7eSNickeau 145f891b7eSNickeau/** 155f891b7eSNickeau * All DokuWiki plugins to extend the parser/rendering mechanism 165f891b7eSNickeau * need to inherit from this class 175f891b7eSNickeau * 185f891b7eSNickeau * The name of the class must follow a pattern (don't change it) 195f891b7eSNickeau * ie: 205f891b7eSNickeau * syntax_plugin_PluginName_ComponentName 215f891b7eSNickeau * 225f891b7eSNickeau * https://getbootstrap.com/docs/4.6/components/collapse/#accordion-example 235f891b7eSNickeau * 245f891b7eSNickeau * Ter info: 255f891b7eSNickeau * https://jqueryui.com/accordion/ 26531e725cSNickeau * 27531e725cSNickeau * See also: https://getbootstrap.com/docs/5.0/content/reboot/#summary 28531e725cSNickeau * with a pointer 29531e725cSNickeau * 305f891b7eSNickeau */ 315f891b7eSNickeauclass syntax_plugin_combo_accordion extends DokuWiki_Syntax_Plugin 325f891b7eSNickeau{ 335f891b7eSNickeau 345f891b7eSNickeau 355f891b7eSNickeau const TAG = 'accordion'; 365f891b7eSNickeau 375f891b7eSNickeau 385f891b7eSNickeau /** 395f891b7eSNickeau * Syntax Type. 405f891b7eSNickeau * 415f891b7eSNickeau * Needs to return one of the mode types defined in $PARSER_MODES in parser.php 425f891b7eSNickeau * @see DokuWiki_Syntax_Plugin::getType() 435f891b7eSNickeau */ 445f891b7eSNickeau function getType() 455f891b7eSNickeau { 465f891b7eSNickeau return 'container'; 475f891b7eSNickeau } 485f891b7eSNickeau 495f891b7eSNickeau /** 505f891b7eSNickeau * @return array 515f891b7eSNickeau * Allow which kind of plugin inside 525f891b7eSNickeau * 535f891b7eSNickeau * One of array('container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs') 545f891b7eSNickeau * 'baseonly' will run only in the base mode 555f891b7eSNickeau * because we manage self the content and we call self the parser 565f891b7eSNickeau * 575f891b7eSNickeau * Return an array of one or more of the mode types {@link $PARSER_MODES} in Parser.php 585f891b7eSNickeau */ 59*04fd306cSNickeau public function getAllowedTypes(): array 605f891b7eSNickeau { 615f891b7eSNickeau return array('container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs'); 625f891b7eSNickeau } 635f891b7eSNickeau 64*04fd306cSNickeau public function accepts($mode): bool 655f891b7eSNickeau { 665f891b7eSNickeau /** 675f891b7eSNickeau * header mode is disable to take over 68531e725cSNickeau * and replace it with {@link syntax_plugin_combo_heading} 695f891b7eSNickeau */ 705f891b7eSNickeau if ($mode == "header") { 715f891b7eSNickeau return false; 725f891b7eSNickeau } 735f891b7eSNickeau /** 7421913ab3SNickeau * 755f891b7eSNickeau */ 7621913ab3SNickeau return syntax_plugin_combo_preformatted::disablePreformatted($mode); 7721913ab3SNickeau 785f891b7eSNickeau } 795f891b7eSNickeau 805f891b7eSNickeau /** 815f891b7eSNickeau * How Dokuwiki will add P element 825f891b7eSNickeau * 83*04fd306cSNickeau * * 'normal' - Inline 84*04fd306cSNickeau * * 'block' - Block (p are not created inside) 85*04fd306cSNickeau * * 'stack' - Block (p can be created inside) 865f891b7eSNickeau * 875f891b7eSNickeau * @see DokuWiki_Syntax_Plugin::getPType() 885f891b7eSNickeau */ 895f891b7eSNickeau function getPType() 905f891b7eSNickeau { 915f891b7eSNickeau return 'block'; 925f891b7eSNickeau } 935f891b7eSNickeau 945f891b7eSNickeau /** 955f891b7eSNickeau * @see Doku_Parser_Mode::getSort() 965f891b7eSNickeau * Higher number than the teaser-columns 975f891b7eSNickeau * because the mode with the lowest sort number will win out 985f891b7eSNickeau */ 995f891b7eSNickeau function getSort() 1005f891b7eSNickeau { 1015f891b7eSNickeau return 200; 1025f891b7eSNickeau } 1035f891b7eSNickeau 1045f891b7eSNickeau /** 1055f891b7eSNickeau * Create a pattern that will called this plugin 1065f891b7eSNickeau * 1075f891b7eSNickeau * @param string $mode 1085f891b7eSNickeau * @see Doku_Parser_Mode::connectTo() 1095f891b7eSNickeau */ 1105f891b7eSNickeau function connectTo($mode) 1115f891b7eSNickeau { 1125f891b7eSNickeau 1135f891b7eSNickeau 114*04fd306cSNickeau $pattern = XmlTagProcessing::getContainerTagPattern(self::TAG); 1159337a630SNickeau $this->Lexer->addEntryPattern($pattern, $mode, PluginUtility::getModeFromTag($this->getPluginComponent())); 1165f891b7eSNickeau 1175f891b7eSNickeau 1185f891b7eSNickeau } 1195f891b7eSNickeau 1205f891b7eSNickeau public function postConnect() 1215f891b7eSNickeau { 1225f891b7eSNickeau 1235f891b7eSNickeau 1249337a630SNickeau $this->Lexer->addExitPattern('</' . self::TAG . '>', PluginUtility::getModeFromTag($this->getPluginComponent())); 1255f891b7eSNickeau 1265f891b7eSNickeau 1275f891b7eSNickeau } 1285f891b7eSNickeau 1295f891b7eSNickeau /** 1305f891b7eSNickeau * 1315f891b7eSNickeau * The handle function goal is to parse the matched syntax through the pattern function 1325f891b7eSNickeau * and to return the result for use in the renderer 1335f891b7eSNickeau * This result is always cached until the page is modified. 1345f891b7eSNickeau * @param string $match 1355f891b7eSNickeau * @param int $state 1365f891b7eSNickeau * @param int $pos 1375f891b7eSNickeau * @param Doku_Handler $handler 1385f891b7eSNickeau * @return array|bool 1395f891b7eSNickeau * @see DokuWiki_Syntax_Plugin::handle() 1405f891b7eSNickeau * 1415f891b7eSNickeau */ 1425f891b7eSNickeau function handle($match, $state, $pos, Doku_Handler $handler) 1435f891b7eSNickeau { 1445f891b7eSNickeau 1455f891b7eSNickeau switch ($state) { 1465f891b7eSNickeau 1475f891b7eSNickeau case DOKU_LEXER_ENTER: 1485f891b7eSNickeau 149*04fd306cSNickeau $attributes = TagAttributes::createFromTagMatch($match) 150*04fd306cSNickeau ->setLogicalTag(self::TAG); 1515f891b7eSNickeau 1525f891b7eSNickeau // Attributes has at 1535f891b7eSNickeau // https://getbootstrap.com/docs/4.6/components/collapse/#accordion-example 154*04fd306cSNickeau $attributes->addClassName("accordion"); 155*04fd306cSNickeau 156*04fd306cSNickeau if (!$attributes->hasComponentAttribute(TagAttributes::ID_KEY)) { 157*04fd306cSNickeau $idKey = ExecutionContext::getActualOrCreateFromEnv()->getIdManager()->generateNewHtmlIdForComponent(self::TAG); 158*04fd306cSNickeau $attributes->addComponentAttributeValue(TagAttributes::ID_KEY, $idKey); 1595f891b7eSNickeau } 1605f891b7eSNickeau 1615f891b7eSNickeau return array( 1625f891b7eSNickeau PluginUtility::STATE => $state, 163*04fd306cSNickeau PluginUtility::ATTRIBUTES => $attributes->toCallStackArray() 1645f891b7eSNickeau ); 1655f891b7eSNickeau 1665f891b7eSNickeau case DOKU_LEXER_UNMATCHED : 1675f891b7eSNickeau 16832b85071SNickeau return PluginUtility::handleAndReturnUnmatchedData(self::TAG, $match, $handler); 1695f891b7eSNickeau 1705f891b7eSNickeau 1715f891b7eSNickeau case DOKU_LEXER_EXIT : 1725f891b7eSNickeau 1735f891b7eSNickeau return array( 1745f891b7eSNickeau PluginUtility::STATE => $state 1755f891b7eSNickeau ); 1765f891b7eSNickeau 1775f891b7eSNickeau 1785f891b7eSNickeau } 1795f891b7eSNickeau 1805f891b7eSNickeau return array(); 1815f891b7eSNickeau 1825f891b7eSNickeau } 1835f891b7eSNickeau 1845f891b7eSNickeau /** 1855f891b7eSNickeau * Render the output 1865f891b7eSNickeau * @param string $format 1875f891b7eSNickeau * @param Doku_Renderer $renderer 1885f891b7eSNickeau * @param array $data - what the function handle() return'ed 1895f891b7eSNickeau * @return boolean - rendered correctly? (however, returned value is not used at the moment) 1905f891b7eSNickeau * @see DokuWiki_Syntax_Plugin::render() 1915f891b7eSNickeau * 1925f891b7eSNickeau * 1935f891b7eSNickeau */ 194*04fd306cSNickeau function render($format, Doku_Renderer $renderer, $data): bool 1955f891b7eSNickeau { 1965f891b7eSNickeau 1975f891b7eSNickeau if ($format == 'xhtml') { 1985f891b7eSNickeau 1995f891b7eSNickeau /** @var Doku_Renderer_xhtml $renderer */ 2005f891b7eSNickeau $state = $data[PluginUtility::STATE]; 2015f891b7eSNickeau switch ($state) { 2025f891b7eSNickeau case DOKU_LEXER_ENTER: 203*04fd306cSNickeau $attributes = TagAttributes::createFromCallStackArray($data[PluginUtility::ATTRIBUTES]) 204*04fd306cSNickeau ->setLogicalTag(self::TAG); 205*04fd306cSNickeau $renderer->doc .= $attributes->toHtmlEnterTag("div"); 2065f891b7eSNickeau break; 2075f891b7eSNickeau case DOKU_LEXER_UNMATCHED: 20832b85071SNickeau $renderer->doc .= PluginUtility::renderUnmatched($data); 2095f891b7eSNickeau break; 2105f891b7eSNickeau case DOKU_LEXER_EXIT: 211*04fd306cSNickeau $renderer->doc .= '</div>'; 2125f891b7eSNickeau break; 2135f891b7eSNickeau } 2145f891b7eSNickeau 2155f891b7eSNickeau 2165f891b7eSNickeau return true; 2175f891b7eSNickeau } 2185f891b7eSNickeau return false; 2195f891b7eSNickeau } 2205f891b7eSNickeau 2215f891b7eSNickeau 2225f891b7eSNickeau} 223