1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeau 4*04fd306cSNickeaurequire_once(__DIR__ . '/../vendor/autoload.php'); 5*04fd306cSNickeau 6*04fd306cSNickeau// must be run within Dokuwiki 7*04fd306cSNickeauuse ComboStrap\BlockquoteTag; 8*04fd306cSNickeauuse ComboStrap\HeadingTag; 9*04fd306cSNickeauuse ComboStrap\PluginUtility; 10*04fd306cSNickeauuse ComboStrap\XmlTagProcessing; 11*04fd306cSNickeau 12*04fd306cSNickeau 13*04fd306cSNickeau/** 14*04fd306cSNickeau * The xml block tag (non-empty) pattern 15*04fd306cSNickeau */ 16*04fd306cSNickeauclass syntax_plugin_combo_xmlblocktag extends DokuWiki_Syntax_Plugin 17*04fd306cSNickeau{ 18*04fd306cSNickeau /** 19*04fd306cSNickeau * Should be the same than the last name of the class 20*04fd306cSNickeau */ 21*04fd306cSNickeau const TAG = "xmlblocktag"; 22*04fd306cSNickeau 23*04fd306cSNickeau 24*04fd306cSNickeau /** 25*04fd306cSNickeau * The Syntax Type determines which syntax may be nested 26*04fd306cSNickeau * 27*04fd306cSNickeau * Needs to return one of the mode types defined in $PARSER_MODES in parser.php 28*04fd306cSNickeau * @see DokuWiki_Syntax_Plugin::getType() 29*04fd306cSNickeau * See https://www.dokuwiki.org/devel:syntax_plugins#syntax_types 30*04fd306cSNickeau */ 31*04fd306cSNickeau function getType(): string 32*04fd306cSNickeau { 33*04fd306cSNickeau /** 34*04fd306cSNickeau * Choice between container, formatting and substition 35*04fd306cSNickeau * 36*04fd306cSNickeau * Icon had 'substition' and can still have other mode inside (ie tooltip) 37*04fd306cSNickeau * We choose substition then 38*04fd306cSNickeau * 39*04fd306cSNickeau * For heading, title, it was `baseonly` because 40*04fd306cSNickeau * Heading disappear when a table is just before because the {@link HeadingTag::SYNTAX_TYPE} was `formatting` 41*04fd306cSNickeau * The table was then accepting it and was deleting it at completion because there was no end of cell character (ie `|`) 42*04fd306cSNickeau * 43*04fd306cSNickeau */ 44*04fd306cSNickeau return 'substition'; 45*04fd306cSNickeau } 46*04fd306cSNickeau 47*04fd306cSNickeau /** 48*04fd306cSNickeau * @param string $mode 49*04fd306cSNickeau * @return bool 50*04fd306cSNickeau * Allowed type 51*04fd306cSNickeau */ 52*04fd306cSNickeau public function accepts($mode): bool 53*04fd306cSNickeau { 54*04fd306cSNickeau /** 55*04fd306cSNickeau * header mode is disable to take over 56*04fd306cSNickeau * and replace it with {@link syntax_plugin_combo_headingwiki} 57*04fd306cSNickeau */ 58*04fd306cSNickeau if ($mode == "header") { 59*04fd306cSNickeau return false; 60*04fd306cSNickeau } 61*04fd306cSNickeau 62*04fd306cSNickeau return syntax_plugin_combo_preformatted::disablePreformatted($mode); 63*04fd306cSNickeau 64*04fd306cSNickeau } 65*04fd306cSNickeau 66*04fd306cSNickeau /** 67*04fd306cSNickeau * How Dokuwiki will add P element 68*04fd306cSNickeau * 69*04fd306cSNickeau * * 'normal' - Inline (dokuwiki will not close an ongoing p) 70*04fd306cSNickeau * * 'block' - Block (dokuwiki does not not create p inside and close an open p) 71*04fd306cSNickeau * * 'stack' - Block (dokuwiki create p inside) 72*04fd306cSNickeau * 73*04fd306cSNickeau * @see DokuWiki_Syntax_Plugin::getPType() 74*04fd306cSNickeau */ 75*04fd306cSNickeau function getPType(): string 76*04fd306cSNickeau { 77*04fd306cSNickeau /** 78*04fd306cSNickeau * Ptype is the driver of the {@link \dokuwiki\Parsing\Handler\Block::process()} 79*04fd306cSNickeau * that creates the P tag. 80*04fd306cSNickeau * 81*04fd306cSNickeau * Works with block and stack for now 82*04fd306cSNickeau * Not with `normal` as if dokuwiki has created a p 83*04fd306cSNickeau * and that is encounters a block, it will close the p inside the stack unfortunately 84*04fd306cSNickeau * (You can try with {@link BlockquoteTag} 85*04fd306cSNickeau * 86*04fd306cSNickeau * For box, not stack, otherwise it creates p 87*04fd306cSNickeau * and as box is used mostly for layout purpose, it breaks the 88*04fd306cSNickeau * {@link \ComboStrap\TagAttribute\Align} flex css attribute 89*04fd306cSNickeau * 90*04fd306cSNickeau * For Cardbody, block value was !important! as 91*04fd306cSNickeau * it will not create an extra paragraph after it encounters a block 92*04fd306cSNickeau * 93*04fd306cSNickeau * For {@link \ComboStrap\GridTag}, 94*04fd306cSNickeau * not stack, otherwise you get extra p's 95*04fd306cSNickeau * and it will fucked up the flex layout 96*04fd306cSNickeau */ 97*04fd306cSNickeau return 'block'; 98*04fd306cSNickeau } 99*04fd306cSNickeau 100*04fd306cSNickeau /** 101*04fd306cSNickeau * @return array the kind of plugin that are allowed inside (ie an array of 102*04fd306cSNickeau * <a href="https://www.dokuwiki.org/devel:syntax_plugins#syntax_types">mode type</a> 103*04fd306cSNickeau * ie 104*04fd306cSNickeau * * array('container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs') 105*04fd306cSNickeau * * array of one or more of the mode types {@link $PARSER_MODES} in Parser.php 106*04fd306cSNickeau */ 107*04fd306cSNickeau public function getAllowedTypes(): array 108*04fd306cSNickeau { 109*04fd306cSNickeau /** 110*04fd306cSNickeau * Tweak: `paragraphs` is not in the allowed type 111*04fd306cSNickeau */ 112*04fd306cSNickeau return array('container', 'formatting', 'substition', 'protected', 'disabled'); 113*04fd306cSNickeau } 114*04fd306cSNickeau 115*04fd306cSNickeau 116*04fd306cSNickeau function getSort(): int 117*04fd306cSNickeau { 118*04fd306cSNickeau return 999; 119*04fd306cSNickeau } 120*04fd306cSNickeau 121*04fd306cSNickeau 122*04fd306cSNickeau function connectTo($mode) 123*04fd306cSNickeau { 124*04fd306cSNickeau 125*04fd306cSNickeau // One pattern to not compete between pattern 126*04fd306cSNickeau // this pattern ensure that the tag 127*04fd306cSNickeau // (ie that `accordion` will not intercept also the tag `accordionitem`) 128*04fd306cSNickeau 129*04fd306cSNickeau 130*04fd306cSNickeau $pattern = XmlTagProcessing::START_TAG_PATTERN; 131*04fd306cSNickeau $this->Lexer->addEntryPattern($pattern, $mode, PluginUtility::getModeFromTag($this->getPluginComponent())); 132*04fd306cSNickeau 133*04fd306cSNickeau } 134*04fd306cSNickeau 135*04fd306cSNickeau public function postConnect() 136*04fd306cSNickeau { 137*04fd306cSNickeau 138*04fd306cSNickeau $this->Lexer->addExitPattern('</[\w-]+>', PluginUtility::getModeFromTag($this->getPluginComponent())); 139*04fd306cSNickeau 140*04fd306cSNickeau } 141*04fd306cSNickeau 142*04fd306cSNickeau 143*04fd306cSNickeau function handle($match, $state, $pos, Doku_Handler $handler): array 144*04fd306cSNickeau { 145*04fd306cSNickeau return XmlTagProcessing::handleStatic($match, $state, $pos, $handler, $this); 146*04fd306cSNickeau } 147*04fd306cSNickeau 148*04fd306cSNickeau /** 149*04fd306cSNickeau * Render the output 150*04fd306cSNickeau * @param string $format 151*04fd306cSNickeau * @param Doku_Renderer $renderer 152*04fd306cSNickeau * @param array $data - what the function handle() return'ed 153*04fd306cSNickeau * @return boolean - rendered correctly? (however, returned value is not used at the moment) 154*04fd306cSNickeau * @see DokuWiki_Syntax_Plugin::render() 155*04fd306cSNickeau * 156*04fd306cSNickeau * 157*04fd306cSNickeau */ 158*04fd306cSNickeau function render($format, Doku_Renderer $renderer, $data): bool 159*04fd306cSNickeau { 160*04fd306cSNickeau 161*04fd306cSNickeau return XmlTagProcessing::renderStatic($format, $renderer, $data, $this); 162*04fd306cSNickeau 163*04fd306cSNickeau } 164*04fd306cSNickeau 165*04fd306cSNickeau 166*04fd306cSNickeau} 167*04fd306cSNickeau 168