15f891b7eSNickeau<?php 25f891b7eSNickeau/** 35f891b7eSNickeau * DokuWiki Syntax Plugin Combostrap. 45f891b7eSNickeau * 55f891b7eSNickeau */ 65f891b7eSNickeau 75f891b7eSNickeauuse ComboStrap\PluginUtility; 85f891b7eSNickeauuse ComboStrap\Tag; 921913ab3SNickeauuse ComboStrap\TagAttributes; 105f891b7eSNickeau 115f891b7eSNickeauif (!defined('DOKU_INC')) { 125f891b7eSNickeau die(); 135f891b7eSNickeau} 145f891b7eSNickeau 155f891b7eSNickeauif (!defined('DOKU_PLUGIN')) { 165f891b7eSNickeau define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/'); 175f891b7eSNickeau} 185f891b7eSNickeau 195f891b7eSNickeaurequire_once(__DIR__ . '/../class/PluginUtility.php'); 205f891b7eSNickeau 215f891b7eSNickeau/** 225f891b7eSNickeau * All DokuWiki plugins to extend the parser/rendering mechanism 235f891b7eSNickeau * need to inherit from this class 245f891b7eSNickeau * 255f891b7eSNickeau * The name of the class must follow a pattern (don't change it) 265f891b7eSNickeau * ie: 275f891b7eSNickeau * syntax_plugin_PluginName_ComponentName 285f891b7eSNickeau * 295f891b7eSNickeau * https://getbootstrap.com/docs/4.6/components/collapse/#accordion-example 305f891b7eSNickeau * 315f891b7eSNickeau * Ter info: 325f891b7eSNickeau * https://jqueryui.com/accordion/ 33*531e725cSNickeau * 34*531e725cSNickeau * See also: https://getbootstrap.com/docs/5.0/content/reboot/#summary 35*531e725cSNickeau * with a pointer 36*531e725cSNickeau * 375f891b7eSNickeau */ 385f891b7eSNickeauclass syntax_plugin_combo_accordion extends DokuWiki_Syntax_Plugin 395f891b7eSNickeau{ 405f891b7eSNickeau 415f891b7eSNickeau 425f891b7eSNickeau const TAG = 'accordion'; 435f891b7eSNickeau 445f891b7eSNickeau /** 455f891b7eSNickeau * @var int a counter to give an id to the accordion card 465f891b7eSNickeau */ 475f891b7eSNickeau private $accordionCounter = 0; 485f891b7eSNickeau 495f891b7eSNickeau /** 505f891b7eSNickeau * Syntax Type. 515f891b7eSNickeau * 525f891b7eSNickeau * Needs to return one of the mode types defined in $PARSER_MODES in parser.php 535f891b7eSNickeau * @see DokuWiki_Syntax_Plugin::getType() 545f891b7eSNickeau */ 555f891b7eSNickeau function getType() 565f891b7eSNickeau { 575f891b7eSNickeau return 'container'; 585f891b7eSNickeau } 595f891b7eSNickeau 605f891b7eSNickeau /** 615f891b7eSNickeau * @return array 625f891b7eSNickeau * Allow which kind of plugin inside 635f891b7eSNickeau * 645f891b7eSNickeau * One of array('container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs') 655f891b7eSNickeau * 'baseonly' will run only in the base mode 665f891b7eSNickeau * because we manage self the content and we call self the parser 675f891b7eSNickeau * 685f891b7eSNickeau * Return an array of one or more of the mode types {@link $PARSER_MODES} in Parser.php 695f891b7eSNickeau */ 705f891b7eSNickeau public function getAllowedTypes() 715f891b7eSNickeau { 725f891b7eSNickeau return array('container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs'); 735f891b7eSNickeau } 745f891b7eSNickeau 755f891b7eSNickeau public function accepts($mode) 765f891b7eSNickeau { 775f891b7eSNickeau /** 785f891b7eSNickeau * header mode is disable to take over 79*531e725cSNickeau * and replace it with {@link syntax_plugin_combo_heading} 805f891b7eSNickeau */ 815f891b7eSNickeau if ($mode == "header") { 825f891b7eSNickeau return false; 835f891b7eSNickeau } 845f891b7eSNickeau /** 8521913ab3SNickeau * 865f891b7eSNickeau */ 8721913ab3SNickeau return syntax_plugin_combo_preformatted::disablePreformatted($mode); 8821913ab3SNickeau 895f891b7eSNickeau } 905f891b7eSNickeau 915f891b7eSNickeau /** 925f891b7eSNickeau * How Dokuwiki will add P element 935f891b7eSNickeau * 945f891b7eSNickeau * * 'normal' - The plugin can be used inside paragraphs 955f891b7eSNickeau * * 'block' - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs 965f891b7eSNickeau * * 'stack' - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs 975f891b7eSNickeau * 985f891b7eSNickeau * @see DokuWiki_Syntax_Plugin::getPType() 995f891b7eSNickeau */ 1005f891b7eSNickeau function getPType() 1015f891b7eSNickeau { 1025f891b7eSNickeau return 'block'; 1035f891b7eSNickeau } 1045f891b7eSNickeau 1055f891b7eSNickeau /** 1065f891b7eSNickeau * @see Doku_Parser_Mode::getSort() 1075f891b7eSNickeau * Higher number than the teaser-columns 1085f891b7eSNickeau * because the mode with the lowest sort number will win out 1095f891b7eSNickeau */ 1105f891b7eSNickeau function getSort() 1115f891b7eSNickeau { 1125f891b7eSNickeau return 200; 1135f891b7eSNickeau } 1145f891b7eSNickeau 1155f891b7eSNickeau /** 1165f891b7eSNickeau * Create a pattern that will called this plugin 1175f891b7eSNickeau * 1185f891b7eSNickeau * @param string $mode 1195f891b7eSNickeau * @see Doku_Parser_Mode::connectTo() 1205f891b7eSNickeau */ 1215f891b7eSNickeau function connectTo($mode) 1225f891b7eSNickeau { 1235f891b7eSNickeau 1245f891b7eSNickeau 1255f891b7eSNickeau $pattern = PluginUtility::getContainerTagPattern(self::TAG); 1265f891b7eSNickeau $this->Lexer->addEntryPattern($pattern, $mode, PluginUtility::getModeForComponent($this->getPluginComponent())); 1275f891b7eSNickeau 1285f891b7eSNickeau 1295f891b7eSNickeau } 1305f891b7eSNickeau 1315f891b7eSNickeau public function postConnect() 1325f891b7eSNickeau { 1335f891b7eSNickeau 1345f891b7eSNickeau 1355f891b7eSNickeau $this->Lexer->addExitPattern('</' . self::TAG . '>', PluginUtility::getModeForComponent($this->getPluginComponent())); 1365f891b7eSNickeau 1375f891b7eSNickeau 1385f891b7eSNickeau } 1395f891b7eSNickeau 1405f891b7eSNickeau /** 1415f891b7eSNickeau * 1425f891b7eSNickeau * The handle function goal is to parse the matched syntax through the pattern function 1435f891b7eSNickeau * and to return the result for use in the renderer 1445f891b7eSNickeau * This result is always cached until the page is modified. 1455f891b7eSNickeau * @param string $match 1465f891b7eSNickeau * @param int $state 1475f891b7eSNickeau * @param int $pos 1485f891b7eSNickeau * @param Doku_Handler $handler 1495f891b7eSNickeau * @return array|bool 1505f891b7eSNickeau * @see DokuWiki_Syntax_Plugin::handle() 1515f891b7eSNickeau * 1525f891b7eSNickeau */ 1535f891b7eSNickeau function handle($match, $state, $pos, Doku_Handler $handler) 1545f891b7eSNickeau { 1555f891b7eSNickeau 1565f891b7eSNickeau switch ($state) { 1575f891b7eSNickeau 1585f891b7eSNickeau case DOKU_LEXER_ENTER: 1595f891b7eSNickeau 1605f891b7eSNickeau $this->accordionCounter++; 1615f891b7eSNickeau $attributes = PluginUtility::getTagAttributes($match); 1625f891b7eSNickeau 1635f891b7eSNickeau // Attributes has at 1645f891b7eSNickeau // https://getbootstrap.com/docs/4.6/components/collapse/#accordion-example 1655f891b7eSNickeau PluginUtility::addClass2Attributes("accordion", $attributes); 1665f891b7eSNickeau if (!in_array("id", $attributes)) { 1675f891b7eSNickeau $attributes["id"] = self::TAG . $this->accordionCounter; 1685f891b7eSNickeau } 1695f891b7eSNickeau 1705f891b7eSNickeau return array( 1715f891b7eSNickeau PluginUtility::STATE => $state, 1725f891b7eSNickeau PluginUtility::ATTRIBUTES => $attributes 1735f891b7eSNickeau ); 1745f891b7eSNickeau 1755f891b7eSNickeau case DOKU_LEXER_UNMATCHED : 1765f891b7eSNickeau 17732b85071SNickeau return PluginUtility::handleAndReturnUnmatchedData(self::TAG, $match, $handler); 1785f891b7eSNickeau 1795f891b7eSNickeau 1805f891b7eSNickeau case DOKU_LEXER_EXIT : 1815f891b7eSNickeau 1825f891b7eSNickeau return array( 1835f891b7eSNickeau PluginUtility::STATE => $state 1845f891b7eSNickeau ); 1855f891b7eSNickeau 1865f891b7eSNickeau 1875f891b7eSNickeau } 1885f891b7eSNickeau 1895f891b7eSNickeau return array(); 1905f891b7eSNickeau 1915f891b7eSNickeau } 1925f891b7eSNickeau 1935f891b7eSNickeau /** 1945f891b7eSNickeau * Render the output 1955f891b7eSNickeau * @param string $format 1965f891b7eSNickeau * @param Doku_Renderer $renderer 1975f891b7eSNickeau * @param array $data - what the function handle() return'ed 1985f891b7eSNickeau * @return boolean - rendered correctly? (however, returned value is not used at the moment) 1995f891b7eSNickeau * @see DokuWiki_Syntax_Plugin::render() 2005f891b7eSNickeau * 2015f891b7eSNickeau * 2025f891b7eSNickeau */ 2035f891b7eSNickeau function render($format, Doku_Renderer $renderer, $data) 2045f891b7eSNickeau { 2055f891b7eSNickeau 2065f891b7eSNickeau if ($format == 'xhtml') { 2075f891b7eSNickeau 2085f891b7eSNickeau /** @var Doku_Renderer_xhtml $renderer */ 2095f891b7eSNickeau $state = $data[PluginUtility::STATE]; 2105f891b7eSNickeau switch ($state) { 2115f891b7eSNickeau case DOKU_LEXER_ENTER: 21221913ab3SNickeau $attributes = TagAttributes::createFromCallStackArray($data[PluginUtility::ATTRIBUTES]); 21321913ab3SNickeau $renderer->doc .= $attributes->toHtmlEnterTag("div") . DOKU_LF; 2145f891b7eSNickeau break; 2155f891b7eSNickeau case DOKU_LEXER_UNMATCHED: 21632b85071SNickeau $renderer->doc .= PluginUtility::renderUnmatched($data); 2175f891b7eSNickeau break; 2185f891b7eSNickeau case DOKU_LEXER_EXIT: 2195f891b7eSNickeau $renderer->doc .= '</div>' . DOKU_LF; 2205f891b7eSNickeau break; 2215f891b7eSNickeau } 2225f891b7eSNickeau 2235f891b7eSNickeau 2245f891b7eSNickeau return true; 2255f891b7eSNickeau } 2265f891b7eSNickeau return false; 2275f891b7eSNickeau } 2285f891b7eSNickeau 2295f891b7eSNickeau 2305f891b7eSNickeau} 231