xref: /template/strap/syntax/contentlistitem.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
19337a630SNickeau<?php
29337a630SNickeau
39337a630SNickeau
49337a630SNickeauuse ComboStrap\PluginUtility;
59337a630SNickeauuse ComboStrap\TagAttributes;
6*04fd306cSNickeauuse ComboStrap\XmlTagProcessing;
79337a630SNickeau
89337a630SNickeau
99337a630SNickeau/**
109337a630SNickeau * Class syntax_plugin_combo_list
119337a630SNickeau * Implementation of a list
129337a630SNickeau *
139337a630SNickeau * This component is not not public
149337a630SNickeau *
159337a630SNickeau */
169337a630SNickeauclass syntax_plugin_combo_contentlistitem extends DokuWiki_Syntax_Plugin
179337a630SNickeau{
189337a630SNickeau
199337a630SNickeau    const DOKU_TAG = "contentlistitem";
209337a630SNickeau    const MARKI_TAG = "content-list-item";
219337a630SNickeau    const ALL_TAGS = array(self::MARKI_TAG, "list-item", "li");
22*04fd306cSNickeau    const LIST_GROUP_ITEM_CLASS = "list-group-item";
239337a630SNickeau
249337a630SNickeau
259337a630SNickeau    /**
269337a630SNickeau     * Syntax Type.
279337a630SNickeau     *
289337a630SNickeau     * Needs to return one of the mode types defined in $PARSER_MODES in parser.php
299337a630SNickeau     * @see https://www.dokuwiki.org/devel:syntax_plugins#syntax_types
309337a630SNickeau     * @see DokuWiki_Syntax_Plugin::getType()
319337a630SNickeau     */
329337a630SNickeau    function getType()
339337a630SNickeau    {
349337a630SNickeau        return 'container';
359337a630SNickeau    }
369337a630SNickeau
379337a630SNickeau    /**
389337a630SNickeau     * How Dokuwiki will add P element
399337a630SNickeau     *
40*04fd306cSNickeau     * * 'normal' - Inline
41*04fd306cSNickeau     *  * 'block' - Block (p are not created inside)
42*04fd306cSNickeau     *  * 'stack' - Block (p can be created inside)
439337a630SNickeau     *
449337a630SNickeau     * @see DokuWiki_Syntax_Plugin::getPType()
459337a630SNickeau     * @see https://www.dokuwiki.org/devel:syntax_plugins#ptype
469337a630SNickeau     */
479337a630SNickeau    function getPType()
489337a630SNickeau    {
499337a630SNickeau        /**
509337a630SNickeau         * No paragraph inside, this is a layout
519337a630SNickeau         */
529337a630SNickeau        return 'block';
539337a630SNickeau    }
549337a630SNickeau
559337a630SNickeau    public function accepts($mode)
569337a630SNickeau    {
579337a630SNickeau        return syntax_plugin_combo_preformatted::disablePreformatted($mode);
589337a630SNickeau    }
599337a630SNickeau
609337a630SNickeau
619337a630SNickeau    /**
629337a630SNickeau     * @return array
639337a630SNickeau     * Allow which kind of plugin inside
649337a630SNickeau     *
659337a630SNickeau     * No one of array('baseonly','container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs')
669337a630SNickeau     * because we manage self the content and we call self the parser
679337a630SNickeau     *
689337a630SNickeau     * Return an array of one or more of the mode types {@link $PARSER_MODES} in Parser.php
699337a630SNickeau     */
709337a630SNickeau    function getAllowedTypes()
719337a630SNickeau    {
729337a630SNickeau        return array('container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs');
739337a630SNickeau    }
749337a630SNickeau
759337a630SNickeau    /**
769337a630SNickeau     * @see Doku_Parser_Mode::getSort()
779337a630SNickeau     * the mode with the lowest sort number will win out
789337a630SNickeau     * Higher than {@link syntax_plugin_combo_contentlist}
799337a630SNickeau     * but less than {@link syntax_plugin_combo_preformatted}
809337a630SNickeau     */
819337a630SNickeau    function getSort()
829337a630SNickeau    {
839337a630SNickeau        return 18;
849337a630SNickeau    }
859337a630SNickeau
869337a630SNickeau
879337a630SNickeau    function connectTo($mode)
889337a630SNickeau    {
899337a630SNickeau
909337a630SNickeau        /**
919337a630SNickeau         * This is now know as `row`
929337a630SNickeau         * This is the old tags
939337a630SNickeau         */
949337a630SNickeau        foreach (self::ALL_TAGS as $tag) {
95*04fd306cSNickeau            $pattern = XmlTagProcessing::getContainerTagPattern($tag);
969337a630SNickeau            $this->Lexer->addEntryPattern($pattern, $mode, PluginUtility::getModeFromTag($this->getPluginComponent()));
979337a630SNickeau        }
989337a630SNickeau
999337a630SNickeau
1009337a630SNickeau    }
1019337a630SNickeau
1029337a630SNickeau    public function postConnect()
1039337a630SNickeau    {
1049337a630SNickeau        foreach (self::ALL_TAGS as $tag) {
1059337a630SNickeau            $this->Lexer->addExitPattern('</' . $tag . '>', PluginUtility::getModeFromTag($this->getPluginComponent()));
1069337a630SNickeau        }
1079337a630SNickeau
1089337a630SNickeau    }
1099337a630SNickeau
1109337a630SNickeau
1119337a630SNickeau    /**
1129337a630SNickeau     *
1139337a630SNickeau     * The handle function goal is to parse the matched syntax through the pattern function
1149337a630SNickeau     * and to return the result for use in the renderer
1159337a630SNickeau     * This result is always cached until the page is modified.
1169337a630SNickeau     * @param string $match
1179337a630SNickeau     * @param int $state
1189337a630SNickeau     * @param int $pos - byte position in the original source file
1199337a630SNickeau     * @param Doku_Handler $handler
1209337a630SNickeau     * @return array|bool
1219337a630SNickeau     * @see DokuWiki_Syntax_Plugin::handle()
1229337a630SNickeau     *
1239337a630SNickeau     */
1249337a630SNickeau    function handle($match, $state, $pos, Doku_Handler $handler)
1259337a630SNickeau    {
1269337a630SNickeau
1279337a630SNickeau        switch ($state) {
1289337a630SNickeau
1299337a630SNickeau            case DOKU_LEXER_ENTER :
1309337a630SNickeau
1319337a630SNickeau                $attributes = TagAttributes::createFromTagMatch($match);
132*04fd306cSNickeau                $tag = PluginUtility::getMarkupTag($match);
1339337a630SNickeau                return array(
1349337a630SNickeau                    PluginUtility::STATE => $state,
1359337a630SNickeau                    PluginUtility::ATTRIBUTES => $attributes->toCallStackArray(),
1369337a630SNickeau                    PluginUtility::PAYLOAD=>$tag
1379337a630SNickeau                );
1389337a630SNickeau
1399337a630SNickeau            case DOKU_LEXER_UNMATCHED :
1409337a630SNickeau                return PluginUtility::handleAndReturnUnmatchedData(self::DOKU_TAG, $match, $handler);
1419337a630SNickeau
1429337a630SNickeau            case DOKU_LEXER_EXIT :
1439337a630SNickeau
1449337a630SNickeau                return array(
1459337a630SNickeau                    PluginUtility::STATE => $state
1469337a630SNickeau                );
1479337a630SNickeau
1489337a630SNickeau
1499337a630SNickeau        }
1509337a630SNickeau        return array();
1519337a630SNickeau
1529337a630SNickeau    }
1539337a630SNickeau
1549337a630SNickeau    /**
1559337a630SNickeau     * Render the output
1569337a630SNickeau     * @param string $format
1579337a630SNickeau     * @param Doku_Renderer $renderer
1589337a630SNickeau     * @param array $data - what the function handle() return'ed
1599337a630SNickeau     * @return boolean - rendered correctly? (however, returned value is not used at the moment)
1609337a630SNickeau     * @see DokuWiki_Syntax_Plugin::render()
1619337a630SNickeau     *
1629337a630SNickeau     *
1639337a630SNickeau     */
1649337a630SNickeau    function render($format, Doku_Renderer $renderer, $data)
1659337a630SNickeau    {
1669337a630SNickeau
1679337a630SNickeau        /**
1689337a630SNickeau         * The normal flow is that the `row` in a content
1699337a630SNickeau         * list are transformed to `content-list-item` in the {@link DOKU_LEXER_EXIT} state
1709337a630SNickeau         * of {@link syntax_plugin_combo_contentlist::handle()}
1719337a630SNickeau         *
1729337a630SNickeau         */
1739337a630SNickeau        if ($format == 'xhtml') {
1749337a630SNickeau
1759337a630SNickeau            /** @var Doku_Renderer_xhtml $renderer */
1769337a630SNickeau            $state = $data[PluginUtility::STATE];
1779337a630SNickeau            switch ($state) {
1789337a630SNickeau                case DOKU_LEXER_ENTER :
1799337a630SNickeau                    $tagAttributes = TagAttributes::createFromCallStackArray($data[PluginUtility::ATTRIBUTES], self::MARKI_TAG);
180*04fd306cSNickeau                    $tagAttributes->addClassName(self::LIST_GROUP_ITEM_CLASS);
1819337a630SNickeau                    $renderer->doc .= $tagAttributes->toHtmlEnterTag("li");
1829337a630SNickeau                    break;
1839337a630SNickeau                case DOKU_LEXER_EXIT :
1849337a630SNickeau                    $renderer->doc .= "</li>" . DOKU_LF;
1859337a630SNickeau                    break;
1869337a630SNickeau                case DOKU_LEXER_UNMATCHED :
1879337a630SNickeau                    $render = PluginUtility::renderUnmatched($data);
1889337a630SNickeau                    if (!empty($render)) {
1899337a630SNickeau                        $renderer->doc .= "<span>" . $render . '</span>';
1909337a630SNickeau                    }
1919337a630SNickeau                    break;
1929337a630SNickeau            }
1939337a630SNickeau            return true;
1949337a630SNickeau        }
1959337a630SNickeau
1969337a630SNickeau        // unsupported $mode
1979337a630SNickeau        return false;
1989337a630SNickeau    }
1999337a630SNickeau
2009337a630SNickeau
2019337a630SNickeau}
2029337a630SNickeau
203