1*21913ab3SNickeau<?php 2*21913ab3SNickeau 3*21913ab3SNickeau 4*21913ab3SNickeau// must be run within Dokuwiki 5*21913ab3SNickeauuse ComboStrap\Background; 6*21913ab3SNickeauuse ComboStrap\InternalMediaLink; 7*21913ab3SNickeauuse ComboStrap\PluginUtility; 8*21913ab3SNickeauuse ComboStrap\Tag; 9*21913ab3SNickeauuse ComboStrap\TagAttributes; 10*21913ab3SNickeau 11*21913ab3SNickeauif (!defined('DOKU_INC')) die(); 12*21913ab3SNickeau 13*21913ab3SNickeau/** 14*21913ab3SNickeau * 15*21913ab3SNickeau * backgrounds is an element that holds more than one background 16*21913ab3SNickeau * We can set then parallax effect for instance 17*21913ab3SNickeau * 18*21913ab3SNickeau */ 19*21913ab3SNickeauclass syntax_plugin_combo_backgrounds extends DokuWiki_Syntax_Plugin 20*21913ab3SNickeau{ 21*21913ab3SNickeau 22*21913ab3SNickeau const TAG = "backgrounds"; 23*21913ab3SNickeau 24*21913ab3SNickeau 25*21913ab3SNickeau /** 26*21913ab3SNickeau * Syntax Type. 27*21913ab3SNickeau * 28*21913ab3SNickeau * Needs to return one of the mode types defined in $PARSER_MODES in parser.php 29*21913ab3SNickeau * @see DokuWiki_Syntax_Plugin::getType() 30*21913ab3SNickeau */ 31*21913ab3SNickeau function getType() 32*21913ab3SNickeau { 33*21913ab3SNickeau return 'container'; 34*21913ab3SNickeau } 35*21913ab3SNickeau 36*21913ab3SNickeau /** 37*21913ab3SNickeau * How Dokuwiki will add P element 38*21913ab3SNickeau * 39*21913ab3SNickeau * * 'normal' - The plugin can be used inside paragraphs 40*21913ab3SNickeau * * 'block' - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs 41*21913ab3SNickeau * * 'stack' - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs 42*21913ab3SNickeau * 43*21913ab3SNickeau * @see DokuWiki_Syntax_Plugin::getPType() 44*21913ab3SNickeau */ 45*21913ab3SNickeau function getPType() 46*21913ab3SNickeau { 47*21913ab3SNickeau /** 48*21913ab3SNickeau * normal (and not block) is important to not create p_open calls 49*21913ab3SNickeau */ 50*21913ab3SNickeau return 'normal'; 51*21913ab3SNickeau } 52*21913ab3SNickeau 53*21913ab3SNickeau /** 54*21913ab3SNickeau * @return array 55*21913ab3SNickeau * Allow which kind of plugin inside 56*21913ab3SNickeau * 57*21913ab3SNickeau * Array('baseonly','container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs') 58*21913ab3SNickeau * 59*21913ab3SNickeau * Return an array of one or more of the mode types {@link $PARSER_MODES} in Parser.php 60*21913ab3SNickeau */ 61*21913ab3SNickeau function getAllowedTypes() 62*21913ab3SNickeau { 63*21913ab3SNickeau return array('baseonly', 'container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs'); 64*21913ab3SNickeau } 65*21913ab3SNickeau 66*21913ab3SNickeau public function accepts($mode) 67*21913ab3SNickeau { 68*21913ab3SNickeau 69*21913ab3SNickeau return syntax_plugin_combo_preformatted::disablePreformatted($mode); 70*21913ab3SNickeau 71*21913ab3SNickeau } 72*21913ab3SNickeau 73*21913ab3SNickeau function getSort() 74*21913ab3SNickeau { 75*21913ab3SNickeau return 201; 76*21913ab3SNickeau } 77*21913ab3SNickeau 78*21913ab3SNickeau 79*21913ab3SNickeau function connectTo($mode) 80*21913ab3SNickeau { 81*21913ab3SNickeau 82*21913ab3SNickeau $pattern = PluginUtility::getContainerTagPattern(self::TAG); 83*21913ab3SNickeau $this->Lexer->addEntryPattern($pattern, $mode, PluginUtility::getModeForComponent($this->getPluginComponent())); 84*21913ab3SNickeau 85*21913ab3SNickeau } 86*21913ab3SNickeau 87*21913ab3SNickeau 88*21913ab3SNickeau function postConnect() 89*21913ab3SNickeau { 90*21913ab3SNickeau 91*21913ab3SNickeau $this->Lexer->addExitPattern('</' . self::TAG . '>', PluginUtility::getModeForComponent($this->getPluginComponent())); 92*21913ab3SNickeau 93*21913ab3SNickeau 94*21913ab3SNickeau } 95*21913ab3SNickeau 96*21913ab3SNickeau function handle($match, $state, $pos, Doku_Handler $handler) 97*21913ab3SNickeau { 98*21913ab3SNickeau 99*21913ab3SNickeau switch ($state) { 100*21913ab3SNickeau 101*21913ab3SNickeau case DOKU_LEXER_ENTER : 102*21913ab3SNickeau $tagAttributes = TagAttributes::createFromTagMatch($match); 103*21913ab3SNickeau return array( 104*21913ab3SNickeau PluginUtility::STATE => $state, 105*21913ab3SNickeau PluginUtility::ATTRIBUTES => $tagAttributes->toCallStackArray() 106*21913ab3SNickeau ); 107*21913ab3SNickeau 108*21913ab3SNickeau case DOKU_LEXER_UNMATCHED : 109*21913ab3SNickeau /** 110*21913ab3SNickeau * We should not have anything here 111*21913ab3SNickeau * but in any case, we send the data for feedback 112*21913ab3SNickeau */ 113*21913ab3SNickeau return PluginUtility::handleAndReturnUnmatchedData(self::TAG, $match, $handler); 114*21913ab3SNickeau 115*21913ab3SNickeau case DOKU_LEXER_EXIT : 116*21913ab3SNickeau 117*21913ab3SNickeau /** 118*21913ab3SNickeau * Return state to keep the call stack structure 119*21913ab3SNickeau * and print the closing tag 120*21913ab3SNickeau */ 121*21913ab3SNickeau return array( 122*21913ab3SNickeau PluginUtility::STATE => $state 123*21913ab3SNickeau ); 124*21913ab3SNickeau 125*21913ab3SNickeau 126*21913ab3SNickeau } 127*21913ab3SNickeau return array(); 128*21913ab3SNickeau 129*21913ab3SNickeau } 130*21913ab3SNickeau 131*21913ab3SNickeau /** 132*21913ab3SNickeau * Render the output 133*21913ab3SNickeau * @param string $format 134*21913ab3SNickeau * @param Doku_Renderer $renderer 135*21913ab3SNickeau * @param array $data - what the function handle() return'ed 136*21913ab3SNickeau * @return boolean - rendered correctly? (however, returned value is not used at the moment) 137*21913ab3SNickeau * @see DokuWiki_Syntax_Plugin::render() 138*21913ab3SNickeau * 139*21913ab3SNickeau * 140*21913ab3SNickeau */ 141*21913ab3SNickeau function render($format, Doku_Renderer $renderer, $data) 142*21913ab3SNickeau { 143*21913ab3SNickeau if ($format == 'xhtml') { 144*21913ab3SNickeau 145*21913ab3SNickeau /** @var Doku_Renderer_xhtml $renderer */ 146*21913ab3SNickeau $state = $data[PluginUtility::STATE]; 147*21913ab3SNickeau switch ($state) { 148*21913ab3SNickeau 149*21913ab3SNickeau case DOKU_LEXER_ENTER: 150*21913ab3SNickeau $tagAttributes = TagAttributes::createFromCallStackArray($data[PluginUtility::ATTRIBUTES]); 151*21913ab3SNickeau $tagAttributes->addClassName(self::TAG); 152*21913ab3SNickeau $renderer->doc .= $tagAttributes->toHtmlEnterTag("div"); 153*21913ab3SNickeau break; 154*21913ab3SNickeau case DOKU_LEXER_EXIT: 155*21913ab3SNickeau $renderer->doc .= "</div>"; 156*21913ab3SNickeau break; 157*21913ab3SNickeau case DOKU_LEXER_UNMATCHED: 158*21913ab3SNickeau /** 159*21913ab3SNickeau * In case anyone put text where it should not 160*21913ab3SNickeau */ 161*21913ab3SNickeau $renderer->doc .= PluginUtility::renderUnmatched($data); 162*21913ab3SNickeau break; 163*21913ab3SNickeau 164*21913ab3SNickeau } 165*21913ab3SNickeau return true; 166*21913ab3SNickeau } 167*21913ab3SNickeau 168*21913ab3SNickeau // unsupported $mode 169*21913ab3SNickeau return false; 170*21913ab3SNickeau } 171*21913ab3SNickeau 172*21913ab3SNickeau 173*21913ab3SNickeau} 174*21913ab3SNickeau 175