1531e725cSNickeau<?php 2531e725cSNickeau 3531e725cSNickeau 4531e725cSNickeau// must be run within Dokuwiki 5531e725cSNickeauuse ComboStrap\CallStack; 6*a6bf47aaSNickeauuse ComboStrap\Dimension; 7531e725cSNickeauuse ComboStrap\PluginUtility; 8531e725cSNickeauuse ComboStrap\TagAttributes; 9531e725cSNickeauuse ComboStrap\TextAlign; 10531e725cSNickeau 11531e725cSNickeauif (!defined('DOKU_INC')) die(); 12531e725cSNickeau 13531e725cSNickeau/** 14531e725cSNickeau * Class syntax_plugin_combo_text 15531e725cSNickeau * A text block that permits to style 16531e725cSNickeau * paragraph at once 17531e725cSNickeau * 18531e725cSNickeau * The output will be a series of {@link syntax_plugin_combo_para paragraph} 19531e725cSNickeau * with the same properties 20531e725cSNickeau * 21531e725cSNickeau * It permits to have several paragraph 22531e725cSNickeau */ 23531e725cSNickeauclass syntax_plugin_combo_text extends DokuWiki_Syntax_Plugin 24531e725cSNickeau{ 25531e725cSNickeau 26531e725cSNickeau const TAG = "text"; 27531e725cSNickeau const TAGS = ["typo", self::TAG]; 28531e725cSNickeau 29531e725cSNickeau /** 30531e725cSNickeau * Syntax Type. 31531e725cSNickeau * 32531e725cSNickeau * Needs to return one of the mode types defined in {@link $PARSER_MODES} in parser.php 33531e725cSNickeau * @see DokuWiki_Syntax_Plugin::getType() 34531e725cSNickeau */ 35531e725cSNickeau function getType() 36531e725cSNickeau { 37531e725cSNickeau return 'paragraphs'; 38531e725cSNickeau } 39531e725cSNickeau 40531e725cSNickeau /** 41531e725cSNickeau * How Dokuwiki will add P element 42531e725cSNickeau * 43531e725cSNickeau * * 'normal' - The plugin can be used inside paragraphs 44531e725cSNickeau * * 'block' - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs 45531e725cSNickeau * * 'stack' - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs 46531e725cSNickeau * 47531e725cSNickeau * @see DokuWiki_Syntax_Plugin::getPType() 48531e725cSNickeau */ 49531e725cSNickeau function getPType() 50531e725cSNickeau { 51531e725cSNickeau return 'stack'; 52531e725cSNickeau } 53531e725cSNickeau 54531e725cSNickeau /** 55531e725cSNickeau * @return array 56531e725cSNickeau * Allow which kind of plugin inside 57531e725cSNickeau * 58531e725cSNickeau * No one of array('baseonly','container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs') 59531e725cSNickeau * because we manage self the content and we call self the parser 60531e725cSNickeau * 61531e725cSNickeau * Return an array of one or more of the mode types {@link $PARSER_MODES} in Parser.php 62531e725cSNickeau */ 63531e725cSNickeau function getAllowedTypes() 64531e725cSNickeau { 65531e725cSNickeau return array('formatting', 'substition', 'paragraphs'); 66531e725cSNickeau } 67531e725cSNickeau 68531e725cSNickeau public function accepts($mode) 69531e725cSNickeau { 70531e725cSNickeau 71531e725cSNickeau return syntax_plugin_combo_preformatted::disablePreformatted($mode); 72531e725cSNickeau 73531e725cSNickeau } 74531e725cSNickeau 75531e725cSNickeau 76531e725cSNickeau function getSort() 77531e725cSNickeau { 78531e725cSNickeau return 201; 79531e725cSNickeau } 80531e725cSNickeau 81531e725cSNickeau 82531e725cSNickeau function connectTo($mode) 83531e725cSNickeau { 84531e725cSNickeau 85531e725cSNickeau foreach (self::TAGS as $tag) { 86531e725cSNickeau $pattern = PluginUtility::getContainerTagPattern($tag); 87531e725cSNickeau $this->Lexer->addEntryPattern($pattern, $mode, PluginUtility::getModeForComponent($this->getPluginComponent())); 88531e725cSNickeau } 89531e725cSNickeau } 90531e725cSNickeau 91531e725cSNickeau 92531e725cSNickeau function postConnect() 93531e725cSNickeau { 94531e725cSNickeau foreach (self::TAGS as $tag) { 95531e725cSNickeau $this->Lexer->addExitPattern('</' . $tag . '>', PluginUtility::getModeForComponent($this->getPluginComponent())); 96531e725cSNickeau } 97531e725cSNickeau 98531e725cSNickeau } 99531e725cSNickeau 100531e725cSNickeau function handle($match, $state, $pos, Doku_Handler $handler) 101531e725cSNickeau { 102531e725cSNickeau 103531e725cSNickeau switch ($state) { 104531e725cSNickeau 105531e725cSNickeau case DOKU_LEXER_ENTER : 106531e725cSNickeau $attributes = TagAttributes::createFromTagMatch($match); 107531e725cSNickeau $callStackArray = $attributes->toCallStackArray(); 108531e725cSNickeau 109531e725cSNickeau return array( 110531e725cSNickeau PluginUtility::STATE => $state, 111531e725cSNickeau PluginUtility::ATTRIBUTES => $callStackArray 112531e725cSNickeau ); 113531e725cSNickeau 114531e725cSNickeau case DOKU_LEXER_UNMATCHED : 115531e725cSNickeau return PluginUtility::handleAndReturnUnmatchedData(self::TAG, $match, $handler); 116531e725cSNickeau 117531e725cSNickeau case DOKU_LEXER_EXIT : 118531e725cSNickeau /** 119531e725cSNickeau * Transform all paragraphs 120531e725cSNickeau * with the type as class 121531e725cSNickeau */ 122531e725cSNickeau $callStack = CallStack::createFromHandler($handler); 123531e725cSNickeau $openingCall = $callStack->moveToPreviousCorrespondingOpeningCall(); 124531e725cSNickeau $attributes = $openingCall->getAttributes(); 125531e725cSNickeau // if there is no EOL, we add one to create at minimal a paragraph 126531e725cSNickeau $callStack->insertEolIfNextCallIsNotEolOrBlock(); 127531e725cSNickeau $callStack->processEolToEndStack($attributes); 128*a6bf47aaSNickeau 129*a6bf47aaSNickeau /** 130*a6bf47aaSNickeau * Check and add a scroll toggle if the 131*a6bf47aaSNickeau * text is constrained by height 132*a6bf47aaSNickeau */ 133*a6bf47aaSNickeau Dimension::addScrollToggleOnClickIfNoControl($callStack); 134*a6bf47aaSNickeau 135531e725cSNickeau return array(PluginUtility::STATE => $state); 136531e725cSNickeau 137531e725cSNickeau 138531e725cSNickeau } 139531e725cSNickeau return array(); 140531e725cSNickeau 141531e725cSNickeau } 142531e725cSNickeau 143531e725cSNickeau /** 144531e725cSNickeau * Render the output 145531e725cSNickeau * @param string $format 146531e725cSNickeau * @param Doku_Renderer $renderer 147531e725cSNickeau * @param array $data - what the function handle() return'ed 148531e725cSNickeau * @return boolean - rendered correctly? (however, returned value is not used at the moment) 149531e725cSNickeau * @see DokuWiki_Syntax_Plugin::render() 150531e725cSNickeau * 151531e725cSNickeau * 152531e725cSNickeau */ 153531e725cSNickeau function render($format, Doku_Renderer $renderer, $data) 154531e725cSNickeau { 155531e725cSNickeau if ($format == 'xhtml') { 156531e725cSNickeau 157531e725cSNickeau /** @var Doku_Renderer_xhtml $renderer */ 158531e725cSNickeau $state = $data[PluginUtility::STATE]; 159531e725cSNickeau switch ($state) { 160531e725cSNickeau case DOKU_LEXER_EXIT : 161531e725cSNickeau case DOKU_LEXER_ENTER : 162531e725cSNickeau /** 163531e725cSNickeau * The {@link DOKU_LEXER_EXIT} of the {@link syntax_plugin_combo_text::handle()} 164531e725cSNickeau * has already created in the callstack the {@link syntax_plugin_combo_para} call 165531e725cSNickeau */ 166531e725cSNickeau $renderer->doc .= ""; 167531e725cSNickeau break; 168531e725cSNickeau case DOKU_LEXER_UNMATCHED : 169531e725cSNickeau $renderer->doc .= PluginUtility::renderUnmatched($data); 170531e725cSNickeau break; 171531e725cSNickeau } 172531e725cSNickeau return true; 173531e725cSNickeau } 174531e725cSNickeau 175531e725cSNickeau // unsupported $mode 176531e725cSNickeau return false; 177531e725cSNickeau } 178531e725cSNickeau 179531e725cSNickeau 180531e725cSNickeau} 181531e725cSNickeau 182