1*9337a630SNickeau<?php 2*9337a630SNickeau 3*9337a630SNickeau 4*9337a630SNickeauuse ComboStrap\PluginUtility; 5*9337a630SNickeauuse ComboStrap\TagAttributes; 6*9337a630SNickeau 7*9337a630SNickeau 8*9337a630SNickeau/** 9*9337a630SNickeau * Class syntax_plugin_combo_list 10*9337a630SNickeau * Implementation of a list 11*9337a630SNickeau * 12*9337a630SNickeau * This component is not not public 13*9337a630SNickeau * 14*9337a630SNickeau */ 15*9337a630SNickeauclass syntax_plugin_combo_contentlistitem extends DokuWiki_Syntax_Plugin 16*9337a630SNickeau{ 17*9337a630SNickeau 18*9337a630SNickeau const DOKU_TAG = "contentlistitem"; 19*9337a630SNickeau const MARKI_TAG = "content-list-item"; 20*9337a630SNickeau const ALL_TAGS = array(self::MARKI_TAG, "list-item", "li"); 21*9337a630SNickeau 22*9337a630SNickeau 23*9337a630SNickeau 24*9337a630SNickeau /** 25*9337a630SNickeau * Syntax Type. 26*9337a630SNickeau * 27*9337a630SNickeau * Needs to return one of the mode types defined in $PARSER_MODES in parser.php 28*9337a630SNickeau * @see https://www.dokuwiki.org/devel:syntax_plugins#syntax_types 29*9337a630SNickeau * @see DokuWiki_Syntax_Plugin::getType() 30*9337a630SNickeau */ 31*9337a630SNickeau function getType() 32*9337a630SNickeau { 33*9337a630SNickeau return 'container'; 34*9337a630SNickeau } 35*9337a630SNickeau 36*9337a630SNickeau /** 37*9337a630SNickeau * How Dokuwiki will add P element 38*9337a630SNickeau * 39*9337a630SNickeau * * 'normal' - The plugin can be used inside paragraphs (inline or inside) 40*9337a630SNickeau * * 'block' - Open paragraphs need to be closed before plugin output (box) - block should not be inside paragraphs 41*9337a630SNickeau * * 'stack' - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs 42*9337a630SNickeau * 43*9337a630SNickeau * @see DokuWiki_Syntax_Plugin::getPType() 44*9337a630SNickeau * @see https://www.dokuwiki.org/devel:syntax_plugins#ptype 45*9337a630SNickeau */ 46*9337a630SNickeau function getPType() 47*9337a630SNickeau { 48*9337a630SNickeau /** 49*9337a630SNickeau * No paragraph inside, this is a layout 50*9337a630SNickeau */ 51*9337a630SNickeau return 'block'; 52*9337a630SNickeau } 53*9337a630SNickeau 54*9337a630SNickeau public function accepts($mode) 55*9337a630SNickeau { 56*9337a630SNickeau return syntax_plugin_combo_preformatted::disablePreformatted($mode); 57*9337a630SNickeau } 58*9337a630SNickeau 59*9337a630SNickeau 60*9337a630SNickeau /** 61*9337a630SNickeau * @return array 62*9337a630SNickeau * Allow which kind of plugin inside 63*9337a630SNickeau * 64*9337a630SNickeau * No one of array('baseonly','container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs') 65*9337a630SNickeau * because we manage self the content and we call self the parser 66*9337a630SNickeau * 67*9337a630SNickeau * Return an array of one or more of the mode types {@link $PARSER_MODES} in Parser.php 68*9337a630SNickeau */ 69*9337a630SNickeau function getAllowedTypes() 70*9337a630SNickeau { 71*9337a630SNickeau return array('container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs'); 72*9337a630SNickeau } 73*9337a630SNickeau 74*9337a630SNickeau /** 75*9337a630SNickeau * @see Doku_Parser_Mode::getSort() 76*9337a630SNickeau * the mode with the lowest sort number will win out 77*9337a630SNickeau * Higher than {@link syntax_plugin_combo_contentlist} 78*9337a630SNickeau * but less than {@link syntax_plugin_combo_preformatted} 79*9337a630SNickeau */ 80*9337a630SNickeau function getSort() 81*9337a630SNickeau { 82*9337a630SNickeau return 18; 83*9337a630SNickeau } 84*9337a630SNickeau 85*9337a630SNickeau 86*9337a630SNickeau function connectTo($mode) 87*9337a630SNickeau { 88*9337a630SNickeau 89*9337a630SNickeau /** 90*9337a630SNickeau * This is now know as `row` 91*9337a630SNickeau * This is the old tags 92*9337a630SNickeau */ 93*9337a630SNickeau foreach (self::ALL_TAGS as $tag) { 94*9337a630SNickeau $pattern = PluginUtility::getContainerTagPattern($tag); 95*9337a630SNickeau $this->Lexer->addEntryPattern($pattern, $mode, PluginUtility::getModeFromTag($this->getPluginComponent())); 96*9337a630SNickeau } 97*9337a630SNickeau 98*9337a630SNickeau 99*9337a630SNickeau } 100*9337a630SNickeau 101*9337a630SNickeau public function postConnect() 102*9337a630SNickeau { 103*9337a630SNickeau foreach (self::ALL_TAGS as $tag) { 104*9337a630SNickeau $this->Lexer->addExitPattern('</' . $tag . '>', PluginUtility::getModeFromTag($this->getPluginComponent())); 105*9337a630SNickeau } 106*9337a630SNickeau 107*9337a630SNickeau } 108*9337a630SNickeau 109*9337a630SNickeau 110*9337a630SNickeau /** 111*9337a630SNickeau * 112*9337a630SNickeau * The handle function goal is to parse the matched syntax through the pattern function 113*9337a630SNickeau * and to return the result for use in the renderer 114*9337a630SNickeau * This result is always cached until the page is modified. 115*9337a630SNickeau * @param string $match 116*9337a630SNickeau * @param int $state 117*9337a630SNickeau * @param int $pos - byte position in the original source file 118*9337a630SNickeau * @param Doku_Handler $handler 119*9337a630SNickeau * @return array|bool 120*9337a630SNickeau * @see DokuWiki_Syntax_Plugin::handle() 121*9337a630SNickeau * 122*9337a630SNickeau */ 123*9337a630SNickeau function handle($match, $state, $pos, Doku_Handler $handler) 124*9337a630SNickeau { 125*9337a630SNickeau 126*9337a630SNickeau switch ($state) { 127*9337a630SNickeau 128*9337a630SNickeau case DOKU_LEXER_ENTER : 129*9337a630SNickeau 130*9337a630SNickeau $attributes = TagAttributes::createFromTagMatch($match); 131*9337a630SNickeau $tag = PluginUtility::getTag($match); 132*9337a630SNickeau return array( 133*9337a630SNickeau PluginUtility::STATE => $state, 134*9337a630SNickeau PluginUtility::ATTRIBUTES => $attributes->toCallStackArray(), 135*9337a630SNickeau PluginUtility::PAYLOAD=>$tag 136*9337a630SNickeau ); 137*9337a630SNickeau 138*9337a630SNickeau case DOKU_LEXER_UNMATCHED : 139*9337a630SNickeau return PluginUtility::handleAndReturnUnmatchedData(self::DOKU_TAG, $match, $handler); 140*9337a630SNickeau 141*9337a630SNickeau case DOKU_LEXER_EXIT : 142*9337a630SNickeau 143*9337a630SNickeau return array( 144*9337a630SNickeau PluginUtility::STATE => $state 145*9337a630SNickeau ); 146*9337a630SNickeau 147*9337a630SNickeau 148*9337a630SNickeau } 149*9337a630SNickeau return array(); 150*9337a630SNickeau 151*9337a630SNickeau } 152*9337a630SNickeau 153*9337a630SNickeau /** 154*9337a630SNickeau * Render the output 155*9337a630SNickeau * @param string $format 156*9337a630SNickeau * @param Doku_Renderer $renderer 157*9337a630SNickeau * @param array $data - what the function handle() return'ed 158*9337a630SNickeau * @return boolean - rendered correctly? (however, returned value is not used at the moment) 159*9337a630SNickeau * @see DokuWiki_Syntax_Plugin::render() 160*9337a630SNickeau * 161*9337a630SNickeau * 162*9337a630SNickeau */ 163*9337a630SNickeau function render($format, Doku_Renderer $renderer, $data) 164*9337a630SNickeau { 165*9337a630SNickeau 166*9337a630SNickeau /** 167*9337a630SNickeau * The normal flow is that the `row` in a content 168*9337a630SNickeau * list are transformed to `content-list-item` in the {@link DOKU_LEXER_EXIT} state 169*9337a630SNickeau * of {@link syntax_plugin_combo_contentlist::handle()} 170*9337a630SNickeau * 171*9337a630SNickeau */ 172*9337a630SNickeau if ($format == 'xhtml') { 173*9337a630SNickeau 174*9337a630SNickeau /** @var Doku_Renderer_xhtml $renderer */ 175*9337a630SNickeau $state = $data[PluginUtility::STATE]; 176*9337a630SNickeau switch ($state) { 177*9337a630SNickeau case DOKU_LEXER_ENTER : 178*9337a630SNickeau $tagAttributes = TagAttributes::createFromCallStackArray($data[PluginUtility::ATTRIBUTES], self::MARKI_TAG); 179*9337a630SNickeau $tagAttributes->addClassName("list-group-item"); 180*9337a630SNickeau $renderer->doc .= $tagAttributes->toHtmlEnterTag("li"); 181*9337a630SNickeau break; 182*9337a630SNickeau case DOKU_LEXER_EXIT : 183*9337a630SNickeau $renderer->doc .= "</li>" . DOKU_LF; 184*9337a630SNickeau break; 185*9337a630SNickeau case DOKU_LEXER_UNMATCHED : 186*9337a630SNickeau $render = PluginUtility::renderUnmatched($data); 187*9337a630SNickeau if (!empty($render)) { 188*9337a630SNickeau $renderer->doc .= "<span>" . $render . '</span>'; 189*9337a630SNickeau } 190*9337a630SNickeau break; 191*9337a630SNickeau } 192*9337a630SNickeau return true; 193*9337a630SNickeau } 194*9337a630SNickeau 195*9337a630SNickeau // unsupported $mode 196*9337a630SNickeau return false; 197*9337a630SNickeau } 198*9337a630SNickeau 199*9337a630SNickeau 200*9337a630SNickeau} 201*9337a630SNickeau 202