1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeauuse ComboStrap\PluginUtility; 4*04fd306cSNickeauuse ComboStrap\TagAttribute\Boldness; 5*04fd306cSNickeau 6*04fd306cSNickeau 7*04fd306cSNickeau/** 8*04fd306cSNickeau * 9*04fd306cSNickeau * Taking over {@link \dokuwiki\Parsing\ParserMode\Formatting strong} 10*04fd306cSNickeau * 11*04fd306cSNickeau * * To disallow the preformatted mode 12*04fd306cSNickeau * * To add the one line constraint 13*04fd306cSNickeau * 14*04fd306cSNickeau */ 15*04fd306cSNickeauclass syntax_plugin_combo_strong extends DokuWiki_Syntax_Plugin 16*04fd306cSNickeau{ 17*04fd306cSNickeau 18*04fd306cSNickeau 19*04fd306cSNickeau const TAG = "strong"; 20*04fd306cSNickeau /** 21*04fd306cSNickeau * Explanation 22*04fd306cSNickeau * * `\n?` to take over the listblock {@link \dokuwiki\Parsing\ParserMode\Listblock} 23*04fd306cSNickeau * 24*04fd306cSNickeau * * Only on one line 25*04fd306cSNickeau * 26*04fd306cSNickeau */ 27*04fd306cSNickeau const ENTRY_PATTERN = "[ \t]*\*\*(?=[^\n]*\*\*)(?!\n)"; 28*04fd306cSNickeau const EXIT_PATTERN = "\*\*"; 29*04fd306cSNickeau 30*04fd306cSNickeau const CANONICAL = Boldness::CANONICAL; 31*04fd306cSNickeau 32*04fd306cSNickeau 33*04fd306cSNickeau public function getSort(): int 34*04fd306cSNickeau { 35*04fd306cSNickeau /** 36*04fd306cSNickeau * It's 9 37*04fd306cSNickeau * 38*04fd306cSNickeau * Before the 10 of {@link \dokuwiki\Parsing\ParserMode\Listblock} 39*04fd306cSNickeau * Before the original of 70 40*04fd306cSNickeau * {@link \dokuwiki\Parsing\ParserMode\Formatting} 41*04fd306cSNickeau */ 42*04fd306cSNickeau return 9; 43*04fd306cSNickeau } 44*04fd306cSNickeau 45*04fd306cSNickeau public function getType(): string 46*04fd306cSNickeau { 47*04fd306cSNickeau return 'formatting'; 48*04fd306cSNickeau } 49*04fd306cSNickeau 50*04fd306cSNickeau 51*04fd306cSNickeau /** 52*04fd306cSNickeau * 53*04fd306cSNickeau * How Dokuwiki will add P element 54*04fd306cSNickeau * 55*04fd306cSNickeau * * 'normal' - The plugin can be used inside paragraphs (inline) 56*04fd306cSNickeau * * 'block' - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs 57*04fd306cSNickeau * * 'stack' - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs 58*04fd306cSNickeau * 59*04fd306cSNickeau * @see DokuWiki_Syntax_Plugin::getPType() 60*04fd306cSNickeau * 61*04fd306cSNickeau * This is the equivalent of inline or block for css 62*04fd306cSNickeau */ 63*04fd306cSNickeau public function getPType(): string 64*04fd306cSNickeau { 65*04fd306cSNickeau return 'normal'; 66*04fd306cSNickeau } 67*04fd306cSNickeau 68*04fd306cSNickeau /** 69*04fd306cSNickeau * @return array 70*04fd306cSNickeau * Allow which kind of plugin inside 71*04fd306cSNickeau * 72*04fd306cSNickeau * No one of array('baseonly','container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs') 73*04fd306cSNickeau * because we manage self the content and we call self the parser 74*04fd306cSNickeau * 75*04fd306cSNickeau * Return an array of one or more of the mode types {@link $PARSER_MODES} in Parser.php 76*04fd306cSNickeau */ 77*04fd306cSNickeau function getAllowedTypes(): array 78*04fd306cSNickeau { 79*04fd306cSNickeau return array('formatting', 'substition', 'protected', 'disabled'); 80*04fd306cSNickeau } 81*04fd306cSNickeau 82*04fd306cSNickeau 83*04fd306cSNickeau public function connectTo($mode) 84*04fd306cSNickeau { 85*04fd306cSNickeau 86*04fd306cSNickeau $this->Lexer->addEntryPattern(self::ENTRY_PATTERN, $mode, PluginUtility::getModeFromTag($this->getPluginComponent())); 87*04fd306cSNickeau 88*04fd306cSNickeau 89*04fd306cSNickeau } 90*04fd306cSNickeau 91*04fd306cSNickeau public function postConnect() 92*04fd306cSNickeau { 93*04fd306cSNickeau 94*04fd306cSNickeau $this->Lexer->addExitPattern(self::EXIT_PATTERN, PluginUtility::getModeFromTag($this->getPluginComponent())); 95*04fd306cSNickeau 96*04fd306cSNickeau } 97*04fd306cSNickeau 98*04fd306cSNickeau 99*04fd306cSNickeau /** 100*04fd306cSNickeau * Handle the syntax 101*04fd306cSNickeau * 102*04fd306cSNickeau * At the end of the parser, the `section_open` and `section_close` calls 103*04fd306cSNickeau * are created in {@link action_plugin_combo_instructionspostprocessing} 104*04fd306cSNickeau * and the text inside for the toc is captured 105*04fd306cSNickeau * 106*04fd306cSNickeau * @param string $match 107*04fd306cSNickeau * @param int $state 108*04fd306cSNickeau * @param int $pos 109*04fd306cSNickeau * @param Doku_Handler $handler 110*04fd306cSNickeau * @return array 111*04fd306cSNickeau */ 112*04fd306cSNickeau public function handle($match, $state, $pos, Doku_Handler $handler): array 113*04fd306cSNickeau { 114*04fd306cSNickeau switch ($state) { 115*04fd306cSNickeau 116*04fd306cSNickeau case DOKU_LEXER_EXIT: 117*04fd306cSNickeau case DOKU_LEXER_ENTER: 118*04fd306cSNickeau $beforeSpaces = str_replace("**", "", $match); 119*04fd306cSNickeau return array( 120*04fd306cSNickeau PluginUtility::STATE => $state, 121*04fd306cSNickeau PluginUtility::PAYLOAD => $beforeSpaces 122*04fd306cSNickeau ); 123*04fd306cSNickeau case DOKU_LEXER_UNMATCHED : 124*04fd306cSNickeau 125*04fd306cSNickeau return PluginUtility::handleAndReturnUnmatchedData(self::TAG, $match, $handler); 126*04fd306cSNickeau 127*04fd306cSNickeau } 128*04fd306cSNickeau return array(); 129*04fd306cSNickeau } 130*04fd306cSNickeau 131*04fd306cSNickeau public function render($format, $renderer, $data): bool 132*04fd306cSNickeau { 133*04fd306cSNickeau 134*04fd306cSNickeau switch ($format) { 135*04fd306cSNickeau case "xhtml": 136*04fd306cSNickeau { 137*04fd306cSNickeau /** 138*04fd306cSNickeau * @var Doku_Renderer_xhtml $renderer 139*04fd306cSNickeau */ 140*04fd306cSNickeau $state = $data[PluginUtility::STATE]; 141*04fd306cSNickeau switch ($state) { 142*04fd306cSNickeau 143*04fd306cSNickeau case DOKU_LEXER_ENTER: 144*04fd306cSNickeau 145*04fd306cSNickeau $renderer->doc .= $data[PluginUtility::PAYLOAD] . "<strong>"; 146*04fd306cSNickeau return true; 147*04fd306cSNickeau case DOKU_LEXER_UNMATCHED: 148*04fd306cSNickeau $renderer->doc .= PluginUtility::renderUnmatched($data); 149*04fd306cSNickeau return true; 150*04fd306cSNickeau case DOKU_LEXER_EXIT: 151*04fd306cSNickeau $renderer->doc .= "</strong>"; 152*04fd306cSNickeau return true; 153*04fd306cSNickeau 154*04fd306cSNickeau } 155*04fd306cSNickeau break; 156*04fd306cSNickeau } 157*04fd306cSNickeau case "metadata": 158*04fd306cSNickeau /** 159*04fd306cSNickeau * For the automatic description, we render 160*04fd306cSNickeau * only the un-match 161*04fd306cSNickeau * 162*04fd306cSNickeau * @var Doku_Renderer_metadata $renderer 163*04fd306cSNickeau */ 164*04fd306cSNickeau $state = $data[PluginUtility::STATE]; 165*04fd306cSNickeau if ($state == DOKU_LEXER_UNMATCHED) { 166*04fd306cSNickeau $renderer->doc .= PluginUtility::renderUnmatched($data); 167*04fd306cSNickeau } 168*04fd306cSNickeau break; 169*04fd306cSNickeau } 170*04fd306cSNickeau 171*04fd306cSNickeau return false; 172*04fd306cSNickeau } 173*04fd306cSNickeau 174*04fd306cSNickeau 175*04fd306cSNickeau} 176