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