xref: /plugin/combo/syntax/accordion.php (revision 32b85071e019dd3646a67c17fac4051338e495eb)
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