1*37748cd8SNickeau<?php 2*37748cd8SNickeau 3*37748cd8SNickeau 4*37748cd8SNickeauuse ComboStrap\PluginUtility; 5*37748cd8SNickeauuse ComboStrap\TagAttributes; 6*37748cd8SNickeau 7*37748cd8SNickeau 8*37748cd8SNickeau/** 9*37748cd8SNickeau * This syntax is not a classic syntax plugin 10*37748cd8SNickeau * 11*37748cd8SNickeau * The instructions are captured at the {@link DOKU_LEXER_END} 12*37748cd8SNickeau * state of {@link syntax_plugin_combo_iterator::handle()} 13*37748cd8SNickeau * to create the data 14*37748cd8SNickeau * 15*37748cd8SNickeau * 16*37748cd8SNickeau */ 17*37748cd8SNickeauclass syntax_plugin_combo_iteratordata extends DokuWiki_Syntax_Plugin 18*37748cd8SNickeau{ 19*37748cd8SNickeau 20*37748cd8SNickeau /** 21*37748cd8SNickeau * Tag in Dokuwiki cannot have a `-` 22*37748cd8SNickeau * This is the last part of the class 23*37748cd8SNickeau */ 24*37748cd8SNickeau const TAG = "iteratordata"; 25*37748cd8SNickeau 26*37748cd8SNickeau /** 27*37748cd8SNickeau * The pattern 28*37748cd8SNickeau */ 29*37748cd8SNickeau const MARKI_PAGE_TAG = "data"; 30*37748cd8SNickeau 31*37748cd8SNickeau 32*37748cd8SNickeau /** 33*37748cd8SNickeau * Syntax Type. 34*37748cd8SNickeau * 35*37748cd8SNickeau * Needs to return one of the mode types defined in $PARSER_MODES in parser.php 36*37748cd8SNickeau * @see https://www.dokuwiki.org/devel:syntax_plugins#syntax_types 37*37748cd8SNickeau * @see DokuWiki_Syntax_Plugin::getType() 38*37748cd8SNickeau */ 39*37748cd8SNickeau function getType() 40*37748cd8SNickeau { 41*37748cd8SNickeau return 'protected'; 42*37748cd8SNickeau } 43*37748cd8SNickeau 44*37748cd8SNickeau /** 45*37748cd8SNickeau * How Dokuwiki will add P element 46*37748cd8SNickeau * 47*37748cd8SNickeau * * 'normal' - The plugin can be used inside paragraphs (inline or inside) 48*37748cd8SNickeau * * 'block' - Open paragraphs need to be closed before plugin output (box) - block should not be inside paragraphs 49*37748cd8SNickeau * * 'stack' - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs 50*37748cd8SNickeau * 51*37748cd8SNickeau * @see DokuWiki_Syntax_Plugin::getPType() 52*37748cd8SNickeau * @see https://www.dokuwiki.org/devel:syntax_plugins#ptype 53*37748cd8SNickeau */ 54*37748cd8SNickeau function getPType() 55*37748cd8SNickeau { 56*37748cd8SNickeau return 'normal'; 57*37748cd8SNickeau } 58*37748cd8SNickeau 59*37748cd8SNickeau /** 60*37748cd8SNickeau * @return array 61*37748cd8SNickeau * Allow which kind of plugin inside 62*37748cd8SNickeau * 63*37748cd8SNickeau * No one of array('baseonly','container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs') 64*37748cd8SNickeau * because we manage self the content and we call self the parser 65*37748cd8SNickeau * 66*37748cd8SNickeau * Return an array of one or more of the mode types {@link $PARSER_MODES} in Parser.php 67*37748cd8SNickeau */ 68*37748cd8SNickeau function getAllowedTypes() 69*37748cd8SNickeau { 70*37748cd8SNickeau return array(); 71*37748cd8SNickeau } 72*37748cd8SNickeau 73*37748cd8SNickeau function getSort() 74*37748cd8SNickeau { 75*37748cd8SNickeau return 201; 76*37748cd8SNickeau } 77*37748cd8SNickeau 78*37748cd8SNickeau public function accepts($mode) 79*37748cd8SNickeau { 80*37748cd8SNickeau return syntax_plugin_combo_preformatted::disablePreformatted($mode); 81*37748cd8SNickeau } 82*37748cd8SNickeau 83*37748cd8SNickeau 84*37748cd8SNickeau function connectTo($mode) 85*37748cd8SNickeau { 86*37748cd8SNickeau /** 87*37748cd8SNickeau * Only in iterator 88*37748cd8SNickeau */ 89*37748cd8SNickeau if ($mode == PluginUtility::getModeFromTag(syntax_plugin_combo_iterator::TAG)) { 90*37748cd8SNickeau 91*37748cd8SNickeau $pattern = PluginUtility::getContainerTagPattern(self::MARKI_PAGE_TAG); 92*37748cd8SNickeau $this->Lexer->addEntryPattern($pattern, $mode, PluginUtility::getModeFromTag($this->getPluginComponent())); 93*37748cd8SNickeau 94*37748cd8SNickeau } 95*37748cd8SNickeau 96*37748cd8SNickeau } 97*37748cd8SNickeau 98*37748cd8SNickeau 99*37748cd8SNickeau public function postConnect() 100*37748cd8SNickeau { 101*37748cd8SNickeau 102*37748cd8SNickeau $this->Lexer->addExitPattern('</' . self::MARKI_PAGE_TAG . '>', PluginUtility::getModeFromTag($this->getPluginComponent())); 103*37748cd8SNickeau 104*37748cd8SNickeau 105*37748cd8SNickeau } 106*37748cd8SNickeau 107*37748cd8SNickeau 108*37748cd8SNickeau /** 109*37748cd8SNickeau * 110*37748cd8SNickeau * The handle function goal is to parse the matched syntax through the pattern function 111*37748cd8SNickeau * and to return the result for use in the renderer 112*37748cd8SNickeau * This result is always cached until the page is modified. 113*37748cd8SNickeau * @param string $match 114*37748cd8SNickeau * @param int $state 115*37748cd8SNickeau * @param int $pos - byte position in the original source file 116*37748cd8SNickeau * @param Doku_Handler $handler 117*37748cd8SNickeau * @return array|bool 118*37748cd8SNickeau * @throws Exception 119*37748cd8SNickeau * @see DokuWiki_Syntax_Plugin::handle() 120*37748cd8SNickeau * 121*37748cd8SNickeau */ 122*37748cd8SNickeau function handle($match, $state, $pos, Doku_Handler $handler) 123*37748cd8SNickeau { 124*37748cd8SNickeau 125*37748cd8SNickeau switch ($state) { 126*37748cd8SNickeau 127*37748cd8SNickeau case DOKU_LEXER_ENTER : 128*37748cd8SNickeau $attributes = PluginUtility::getTagAttributes($match); 129*37748cd8SNickeau return array( 130*37748cd8SNickeau PluginUtility::STATE => $state, 131*37748cd8SNickeau PluginUtility::ATTRIBUTES => $attributes 132*37748cd8SNickeau ); 133*37748cd8SNickeau 134*37748cd8SNickeau case DOKU_LEXER_UNMATCHED : 135*37748cd8SNickeau 136*37748cd8SNickeau return PluginUtility::handleAndReturnUnmatchedData(self::TAG, $match, $handler); 137*37748cd8SNickeau 138*37748cd8SNickeau 139*37748cd8SNickeau case DOKU_LEXER_EXIT : 140*37748cd8SNickeau 141*37748cd8SNickeau 142*37748cd8SNickeau return array( 143*37748cd8SNickeau PluginUtility::STATE => $state, 144*37748cd8SNickeau ); 145*37748cd8SNickeau 146*37748cd8SNickeau 147*37748cd8SNickeau } 148*37748cd8SNickeau return array(); 149*37748cd8SNickeau 150*37748cd8SNickeau } 151*37748cd8SNickeau 152*37748cd8SNickeau /** 153*37748cd8SNickeau * Render the output 154*37748cd8SNickeau * @param string $format 155*37748cd8SNickeau * @param Doku_Renderer $renderer 156*37748cd8SNickeau * @param array $data - what the function handle() return'ed 157*37748cd8SNickeau * @return boolean - rendered correctly? (however, returned value is not used at the moment) 158*37748cd8SNickeau * @see DokuWiki_Syntax_Plugin::render() 159*37748cd8SNickeau * 160*37748cd8SNickeau * 161*37748cd8SNickeau */ 162*37748cd8SNickeau function render($format, Doku_Renderer $renderer, $data) 163*37748cd8SNickeau { 164*37748cd8SNickeau 165*37748cd8SNickeau /** 166*37748cd8SNickeau * No render, the data is used by {@link syntax_plugin_combo_iterator::handle()} 167*37748cd8SNickeau * at the {@link DOKU_LEXER_EXIT} 168*37748cd8SNickeau */ 169*37748cd8SNickeau return true; 170*37748cd8SNickeau 171*37748cd8SNickeau } 172*37748cd8SNickeau 173*37748cd8SNickeau 174*37748cd8SNickeau} 175*37748cd8SNickeau 176