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