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