1*531e725cSNickeau<?php 2*531e725cSNickeau 3*531e725cSNickeau 4*531e725cSNickeau// must be run within Dokuwiki 5*531e725cSNickeauuse ComboStrap\CallStack; 6*531e725cSNickeauuse ComboStrap\PluginUtility; 7*531e725cSNickeauuse ComboStrap\TagAttributes; 8*531e725cSNickeauuse ComboStrap\TextAlign; 9*531e725cSNickeau 10*531e725cSNickeauif (!defined('DOKU_INC')) die(); 11*531e725cSNickeau 12*531e725cSNickeau/** 13*531e725cSNickeau * Class syntax_plugin_combo_text 14*531e725cSNickeau * A text block that permits to style 15*531e725cSNickeau * paragraph at once 16*531e725cSNickeau * 17*531e725cSNickeau * The output will be a series of {@link syntax_plugin_combo_para paragraph} 18*531e725cSNickeau * with the same properties 19*531e725cSNickeau * 20*531e725cSNickeau * It permits to have several paragraph 21*531e725cSNickeau */ 22*531e725cSNickeauclass syntax_plugin_combo_text extends DokuWiki_Syntax_Plugin 23*531e725cSNickeau{ 24*531e725cSNickeau 25*531e725cSNickeau const TAG = "text"; 26*531e725cSNickeau const TAGS = ["typo", self::TAG]; 27*531e725cSNickeau 28*531e725cSNickeau /** 29*531e725cSNickeau * Syntax Type. 30*531e725cSNickeau * 31*531e725cSNickeau * Needs to return one of the mode types defined in {@link $PARSER_MODES} in parser.php 32*531e725cSNickeau * @see DokuWiki_Syntax_Plugin::getType() 33*531e725cSNickeau */ 34*531e725cSNickeau function getType() 35*531e725cSNickeau { 36*531e725cSNickeau return 'paragraphs'; 37*531e725cSNickeau } 38*531e725cSNickeau 39*531e725cSNickeau /** 40*531e725cSNickeau * How Dokuwiki will add P element 41*531e725cSNickeau * 42*531e725cSNickeau * * 'normal' - The plugin can be used inside paragraphs 43*531e725cSNickeau * * 'block' - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs 44*531e725cSNickeau * * 'stack' - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs 45*531e725cSNickeau * 46*531e725cSNickeau * @see DokuWiki_Syntax_Plugin::getPType() 47*531e725cSNickeau */ 48*531e725cSNickeau function getPType() 49*531e725cSNickeau { 50*531e725cSNickeau return 'stack'; 51*531e725cSNickeau } 52*531e725cSNickeau 53*531e725cSNickeau /** 54*531e725cSNickeau * @return array 55*531e725cSNickeau * Allow which kind of plugin inside 56*531e725cSNickeau * 57*531e725cSNickeau * No one of array('baseonly','container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs') 58*531e725cSNickeau * because we manage self the content and we call self the parser 59*531e725cSNickeau * 60*531e725cSNickeau * Return an array of one or more of the mode types {@link $PARSER_MODES} in Parser.php 61*531e725cSNickeau */ 62*531e725cSNickeau function getAllowedTypes() 63*531e725cSNickeau { 64*531e725cSNickeau return array('formatting', 'substition', 'paragraphs'); 65*531e725cSNickeau } 66*531e725cSNickeau 67*531e725cSNickeau public function accepts($mode) 68*531e725cSNickeau { 69*531e725cSNickeau 70*531e725cSNickeau return syntax_plugin_combo_preformatted::disablePreformatted($mode); 71*531e725cSNickeau 72*531e725cSNickeau } 73*531e725cSNickeau 74*531e725cSNickeau 75*531e725cSNickeau function getSort() 76*531e725cSNickeau { 77*531e725cSNickeau return 201; 78*531e725cSNickeau } 79*531e725cSNickeau 80*531e725cSNickeau 81*531e725cSNickeau function connectTo($mode) 82*531e725cSNickeau { 83*531e725cSNickeau 84*531e725cSNickeau foreach (self::TAGS as $tag) { 85*531e725cSNickeau $pattern = PluginUtility::getContainerTagPattern($tag); 86*531e725cSNickeau $this->Lexer->addEntryPattern($pattern, $mode, PluginUtility::getModeForComponent($this->getPluginComponent())); 87*531e725cSNickeau } 88*531e725cSNickeau } 89*531e725cSNickeau 90*531e725cSNickeau 91*531e725cSNickeau function postConnect() 92*531e725cSNickeau { 93*531e725cSNickeau foreach (self::TAGS as $tag) { 94*531e725cSNickeau $this->Lexer->addExitPattern('</' . $tag . '>', PluginUtility::getModeForComponent($this->getPluginComponent())); 95*531e725cSNickeau } 96*531e725cSNickeau 97*531e725cSNickeau } 98*531e725cSNickeau 99*531e725cSNickeau function handle($match, $state, $pos, Doku_Handler $handler) 100*531e725cSNickeau { 101*531e725cSNickeau 102*531e725cSNickeau switch ($state) { 103*531e725cSNickeau 104*531e725cSNickeau case DOKU_LEXER_ENTER : 105*531e725cSNickeau $attributes = TagAttributes::createFromTagMatch($match); 106*531e725cSNickeau $callStackArray = $attributes->toCallStackArray(); 107*531e725cSNickeau 108*531e725cSNickeau return array( 109*531e725cSNickeau PluginUtility::STATE => $state, 110*531e725cSNickeau PluginUtility::ATTRIBUTES => $callStackArray 111*531e725cSNickeau ); 112*531e725cSNickeau 113*531e725cSNickeau case DOKU_LEXER_UNMATCHED : 114*531e725cSNickeau return PluginUtility::handleAndReturnUnmatchedData(self::TAG, $match, $handler); 115*531e725cSNickeau 116*531e725cSNickeau case DOKU_LEXER_EXIT : 117*531e725cSNickeau /** 118*531e725cSNickeau * Transform all paragraphs 119*531e725cSNickeau * with the type as class 120*531e725cSNickeau */ 121*531e725cSNickeau $callStack = CallStack::createFromHandler($handler); 122*531e725cSNickeau $openingCall = $callStack->moveToPreviousCorrespondingOpeningCall(); 123*531e725cSNickeau $attributes = $openingCall->getAttributes(); 124*531e725cSNickeau // if there is no EOL, we add one to create at minimal a paragraph 125*531e725cSNickeau $callStack->insertEolIfNextCallIsNotEolOrBlock(); 126*531e725cSNickeau $callStack->processEolToEndStack($attributes); 127*531e725cSNickeau return array(PluginUtility::STATE => $state); 128*531e725cSNickeau 129*531e725cSNickeau 130*531e725cSNickeau } 131*531e725cSNickeau return array(); 132*531e725cSNickeau 133*531e725cSNickeau } 134*531e725cSNickeau 135*531e725cSNickeau /** 136*531e725cSNickeau * Render the output 137*531e725cSNickeau * @param string $format 138*531e725cSNickeau * @param Doku_Renderer $renderer 139*531e725cSNickeau * @param array $data - what the function handle() return'ed 140*531e725cSNickeau * @return boolean - rendered correctly? (however, returned value is not used at the moment) 141*531e725cSNickeau * @see DokuWiki_Syntax_Plugin::render() 142*531e725cSNickeau * 143*531e725cSNickeau * 144*531e725cSNickeau */ 145*531e725cSNickeau function render($format, Doku_Renderer $renderer, $data) 146*531e725cSNickeau { 147*531e725cSNickeau if ($format == 'xhtml') { 148*531e725cSNickeau 149*531e725cSNickeau /** @var Doku_Renderer_xhtml $renderer */ 150*531e725cSNickeau $state = $data[PluginUtility::STATE]; 151*531e725cSNickeau switch ($state) { 152*531e725cSNickeau case DOKU_LEXER_EXIT : 153*531e725cSNickeau case DOKU_LEXER_ENTER : 154*531e725cSNickeau /** 155*531e725cSNickeau * The {@link DOKU_LEXER_EXIT} of the {@link syntax_plugin_combo_text::handle()} 156*531e725cSNickeau * has already created in the callstack the {@link syntax_plugin_combo_para} call 157*531e725cSNickeau */ 158*531e725cSNickeau $renderer->doc .= ""; 159*531e725cSNickeau break; 160*531e725cSNickeau case DOKU_LEXER_UNMATCHED : 161*531e725cSNickeau $renderer->doc .= PluginUtility::renderUnmatched($data); 162*531e725cSNickeau break; 163*531e725cSNickeau } 164*531e725cSNickeau return true; 165*531e725cSNickeau } 166*531e725cSNickeau 167*531e725cSNickeau // unsupported $mode 168*531e725cSNickeau return false; 169*531e725cSNickeau } 170*531e725cSNickeau 171*531e725cSNickeau 172*531e725cSNickeau} 173*531e725cSNickeau 174