1531e725cSNickeau<?php 2531e725cSNickeau 3531e725cSNickeau 4531e725cSNickeau// must be run within Dokuwiki 5531e725cSNickeauuse ComboStrap\CallStack; 6a6bf47aaSNickeauuse ComboStrap\Dimension; 7531e725cSNickeauuse ComboStrap\PluginUtility; 8531e725cSNickeauuse ComboStrap\TagAttributes; 9*04fd306cSNickeauuse ComboStrap\XmlTagProcessing; 10531e725cSNickeau 11*04fd306cSNickeaurequire_once(__DIR__ . '/../vendor/autoload.php'); 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 */ 354cadd4f8SNickeau function getType(): string 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 */ 494cadd4f8SNickeau function getPType(): string 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 */ 634cadd4f8SNickeau function getAllowedTypes(): array 64531e725cSNickeau { 65531e725cSNickeau return array('formatting', 'substition', 'paragraphs'); 66531e725cSNickeau } 67531e725cSNickeau 684cadd4f8SNickeau public function accepts($mode): bool 69531e725cSNickeau { 70531e725cSNickeau 71531e725cSNickeau return syntax_plugin_combo_preformatted::disablePreformatted($mode); 72531e725cSNickeau 73531e725cSNickeau } 74531e725cSNickeau 75531e725cSNickeau 764cadd4f8SNickeau function getSort(): int 77531e725cSNickeau { 784cadd4f8SNickeau /** 794cadd4f8SNickeau * Less than {@link syntax_plugin_typography_base} 804cadd4f8SNickeau */ 814cadd4f8SNickeau return 65; 82531e725cSNickeau } 83531e725cSNickeau 84531e725cSNickeau 85531e725cSNickeau function connectTo($mode) 86531e725cSNickeau { 87531e725cSNickeau 88531e725cSNickeau foreach (self::TAGS as $tag) { 89*04fd306cSNickeau $pattern = XmlTagProcessing::getContainerTagPattern($tag); 909337a630SNickeau $this->Lexer->addEntryPattern($pattern, $mode, PluginUtility::getModeFromTag($this->getPluginComponent())); 91531e725cSNickeau } 92531e725cSNickeau } 93531e725cSNickeau 94531e725cSNickeau 95531e725cSNickeau function postConnect() 96531e725cSNickeau { 97531e725cSNickeau foreach (self::TAGS as $tag) { 989337a630SNickeau $this->Lexer->addExitPattern('</' . $tag . '>', PluginUtility::getModeFromTag($this->getPluginComponent())); 99531e725cSNickeau } 100531e725cSNickeau 101531e725cSNickeau } 102531e725cSNickeau 103531e725cSNickeau function handle($match, $state, $pos, Doku_Handler $handler) 104531e725cSNickeau { 105531e725cSNickeau 106531e725cSNickeau switch ($state) { 107531e725cSNickeau 108531e725cSNickeau case DOKU_LEXER_ENTER : 1094cadd4f8SNickeau 110*04fd306cSNickeau $attributes = TagAttributes::createFromTagMatch($match,[],[],true); 111531e725cSNickeau $callStackArray = $attributes->toCallStackArray(); 112531e725cSNickeau 113531e725cSNickeau return array( 114531e725cSNickeau PluginUtility::STATE => $state, 115531e725cSNickeau PluginUtility::ATTRIBUTES => $callStackArray 116531e725cSNickeau ); 117531e725cSNickeau 118531e725cSNickeau case DOKU_LEXER_UNMATCHED : 119531e725cSNickeau return PluginUtility::handleAndReturnUnmatchedData(self::TAG, $match, $handler); 120531e725cSNickeau 121531e725cSNickeau case DOKU_LEXER_EXIT : 122531e725cSNickeau /** 123531e725cSNickeau * Transform all paragraphs 124531e725cSNickeau * with the type as class 125531e725cSNickeau */ 126531e725cSNickeau $callStack = CallStack::createFromHandler($handler); 127531e725cSNickeau $openingCall = $callStack->moveToPreviousCorrespondingOpeningCall(); 128531e725cSNickeau $attributes = $openingCall->getAttributes(); 129531e725cSNickeau // if there is no EOL, we add one to create at minimal a paragraph 130531e725cSNickeau $callStack->insertEolIfNextCallIsNotEolOrBlock(); 131531e725cSNickeau $callStack->processEolToEndStack($attributes); 132a6bf47aaSNickeau 133a6bf47aaSNickeau /** 134a6bf47aaSNickeau * Check and add a scroll toggle if the 135a6bf47aaSNickeau * text is constrained by height 136a6bf47aaSNickeau */ 137a6bf47aaSNickeau Dimension::addScrollToggleOnClickIfNoControl($callStack); 138a6bf47aaSNickeau 139531e725cSNickeau return array(PluginUtility::STATE => $state); 140531e725cSNickeau 141531e725cSNickeau 142531e725cSNickeau } 143531e725cSNickeau return array(); 144531e725cSNickeau 145531e725cSNickeau } 146531e725cSNickeau 147531e725cSNickeau /** 148531e725cSNickeau * Render the output 149531e725cSNickeau * @param string $format 150531e725cSNickeau * @param Doku_Renderer $renderer 151531e725cSNickeau * @param array $data - what the function handle() return'ed 152531e725cSNickeau * @return boolean - rendered correctly? (however, returned value is not used at the moment) 153531e725cSNickeau * @see DokuWiki_Syntax_Plugin::render() 154531e725cSNickeau * 155531e725cSNickeau * 156531e725cSNickeau */ 1574cadd4f8SNickeau function render($format, Doku_Renderer $renderer, $data): bool 158531e725cSNickeau { 159531e725cSNickeau if ($format == 'xhtml') { 160531e725cSNickeau 161531e725cSNickeau /** @var Doku_Renderer_xhtml $renderer */ 162531e725cSNickeau $state = $data[PluginUtility::STATE]; 163531e725cSNickeau switch ($state) { 164531e725cSNickeau case DOKU_LEXER_EXIT : 165531e725cSNickeau case DOKU_LEXER_ENTER : 166531e725cSNickeau /** 167531e725cSNickeau * The {@link DOKU_LEXER_EXIT} of the {@link syntax_plugin_combo_text::handle()} 168531e725cSNickeau * has already created in the callstack the {@link syntax_plugin_combo_para} call 169531e725cSNickeau */ 170531e725cSNickeau $renderer->doc .= ""; 171531e725cSNickeau break; 172531e725cSNickeau case DOKU_LEXER_UNMATCHED : 173531e725cSNickeau $renderer->doc .= PluginUtility::renderUnmatched($data); 174531e725cSNickeau break; 175531e725cSNickeau } 176531e725cSNickeau return true; 177531e725cSNickeau } 178531e725cSNickeau 179531e725cSNickeau // unsupported $mode 180531e725cSNickeau return false; 181531e725cSNickeau } 182531e725cSNickeau 183531e725cSNickeau 184531e725cSNickeau} 185531e725cSNickeau 186