1007225e5Sgerardnico<?php 2007225e5Sgerardnico 3007225e5Sgerardnico 4007225e5Sgerardnico// must be run within Dokuwiki 5a6bf47aaSNickeauuse ComboStrap\CallStack; 64cadd4f8SNickeauuse ComboStrap\ColorRgb; 7a6bf47aaSNickeauuse ComboStrap\Dimension; 8007225e5Sgerardnicouse ComboStrap\PluginUtility; 9*04fd306cSNickeauuse ComboStrap\TagAttribute\BackgroundAttribute; 1021913ab3SNickeauuse ComboStrap\TagAttributes; 11*04fd306cSNickeauuse ComboStrap\XmlTagProcessing; 12007225e5Sgerardnico 13007225e5Sgerardnico 14007225e5Sgerardnico/** 15007225e5Sgerardnico * Class syntax_plugin_combo_note 16007225e5Sgerardnico * Implementation of a note 17007225e5Sgerardnico * called an alert in <a href="https://getbootstrap.com/docs/4.0/components/alerts/">bootstrap</a> 18007225e5Sgerardnico */ 19007225e5Sgerardnicoclass syntax_plugin_combo_note extends DokuWiki_Syntax_Plugin 20007225e5Sgerardnico{ 21007225e5Sgerardnico 22007225e5Sgerardnico const TAG = "note"; 23531e725cSNickeau const COMPONENT = "combo_note"; 24*04fd306cSNickeau const INFO_TYPE = "info"; 25*04fd306cSNickeau const IMPORTANT_TYPE = "important"; 26*04fd306cSNickeau const WARNING_TYPE = "warning"; 27*04fd306cSNickeau const TIP_TYPE = "tip"; 28007225e5Sgerardnico 29007225e5Sgerardnico /** 30007225e5Sgerardnico * Syntax Type. 31007225e5Sgerardnico * 32007225e5Sgerardnico * Needs to return one of the mode types defined in $PARSER_MODES in parser.php 33007225e5Sgerardnico * @see DokuWiki_Syntax_Plugin::getType() 34007225e5Sgerardnico */ 35*04fd306cSNickeau function getType(): string 36007225e5Sgerardnico { 37007225e5Sgerardnico return 'container'; 38007225e5Sgerardnico } 39007225e5Sgerardnico 40007225e5Sgerardnico /** 41007225e5Sgerardnico * How Dokuwiki will add P element 42007225e5Sgerardnico * 43007225e5Sgerardnico * * 'normal' - The plugin can be used inside paragraphs 44007225e5Sgerardnico * * 'block' - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs 45007225e5Sgerardnico * * 'stack' - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs 46007225e5Sgerardnico * 47007225e5Sgerardnico * @see DokuWiki_Syntax_Plugin::getPType() 48007225e5Sgerardnico */ 49007225e5Sgerardnico function getPType() 50007225e5Sgerardnico { 51f6358c49Sgerardnico return 'stack'; 52007225e5Sgerardnico } 53007225e5Sgerardnico 54007225e5Sgerardnico /** 55007225e5Sgerardnico * @return array 56007225e5Sgerardnico * Allow which kind of plugin inside 57007225e5Sgerardnico * 585f891b7eSNickeau * ************************ 595f891b7eSNickeau * This function has no effect because {@link SyntaxPlugin::accepts()} is used 605f891b7eSNickeau * ************************ 61007225e5Sgerardnico */ 62007225e5Sgerardnico function getAllowedTypes() 63007225e5Sgerardnico { 64007225e5Sgerardnico return array('container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs'); 65007225e5Sgerardnico } 66007225e5Sgerardnico 675f891b7eSNickeau 68007225e5Sgerardnico function getSort() 69007225e5Sgerardnico { 70007225e5Sgerardnico return 201; 71007225e5Sgerardnico } 72007225e5Sgerardnico 73*04fd306cSNickeau public function accepts($mode): bool 745f891b7eSNickeau { 755f891b7eSNickeau /** 765f891b7eSNickeau * header mode is disable to take over 77531e725cSNickeau * and replace it with {@link syntax_plugin_combo_heading} 785f891b7eSNickeau */ 795f891b7eSNickeau if ($mode == "header") { 805f891b7eSNickeau return false; 815f891b7eSNickeau } 8221913ab3SNickeau return syntax_plugin_combo_preformatted::disablePreformatted($mode); 8321913ab3SNickeau 845f891b7eSNickeau } 855f891b7eSNickeau 865f891b7eSNickeau 87007225e5Sgerardnico function connectTo($mode) 88007225e5Sgerardnico { 89007225e5Sgerardnico 90*04fd306cSNickeau $pattern = XmlTagProcessing::getContainerTagPattern(self::TAG); 919337a630SNickeau $this->Lexer->addEntryPattern($pattern, $mode, PluginUtility::getModeFromTag($this->getPluginComponent())); 92007225e5Sgerardnico } 93007225e5Sgerardnico 94007225e5Sgerardnico 95007225e5Sgerardnico function postConnect() 96007225e5Sgerardnico { 97007225e5Sgerardnico 989337a630SNickeau $this->Lexer->addExitPattern('</' . self::TAG . '>', PluginUtility::getModeFromTag($this->getPluginComponent())); 99007225e5Sgerardnico 100007225e5Sgerardnico } 101007225e5Sgerardnico 102007225e5Sgerardnico function handle($match, $state, $pos, Doku_Handler $handler) 103007225e5Sgerardnico { 104007225e5Sgerardnico 105007225e5Sgerardnico switch ($state) { 106007225e5Sgerardnico 107007225e5Sgerardnico case DOKU_LEXER_ENTER : 108*04fd306cSNickeau $defaultAttributes = array(TagAttributes::TYPE_KEY => self::INFO_TYPE); 109*04fd306cSNickeau $knwonTypes = [self::INFO_TYPE, self::TIP_TYPE, self::IMPORTANT_TYPE, self::WARNING_TYPE]; 110*04fd306cSNickeau $attributes = TagAttributes::createFromTagMatch($match, $defaultAttributes, $knwonTypes); 11132b85071SNickeau return array( 11232b85071SNickeau PluginUtility::STATE => $state, 113*04fd306cSNickeau PluginUtility::ATTRIBUTES => $attributes->toCallStackArray() 11432b85071SNickeau ); 115007225e5Sgerardnico 116007225e5Sgerardnico case DOKU_LEXER_UNMATCHED : 11732b85071SNickeau return PluginUtility::handleAndReturnUnmatchedData(self::TAG, $match, $handler); 118007225e5Sgerardnico 119007225e5Sgerardnico case DOKU_LEXER_EXIT : 120007225e5Sgerardnico 121a6bf47aaSNickeau $callStack = CallStack::createFromHandler($handler); 122a6bf47aaSNickeau Dimension::addScrollToggleOnClickIfNoControl($callStack); 123a6bf47aaSNickeau 124a6bf47aaSNickeau 125007225e5Sgerardnico // Important otherwise we don't get an exit in the render 12632b85071SNickeau return array( 12732b85071SNickeau PluginUtility::STATE => $state 12832b85071SNickeau ); 129007225e5Sgerardnico 130007225e5Sgerardnico 131007225e5Sgerardnico } 132007225e5Sgerardnico return array(); 133007225e5Sgerardnico 134007225e5Sgerardnico } 135007225e5Sgerardnico 136007225e5Sgerardnico /** 137007225e5Sgerardnico * Render the output 138007225e5Sgerardnico * @param string $format 139007225e5Sgerardnico * @param Doku_Renderer $renderer 140007225e5Sgerardnico * @param array $data - what the function handle() return'ed 141007225e5Sgerardnico * @return boolean - rendered correctly? (however, returned value is not used at the moment) 142007225e5Sgerardnico * @see DokuWiki_Syntax_Plugin::render() 143007225e5Sgerardnico * 144007225e5Sgerardnico * 145007225e5Sgerardnico */ 146007225e5Sgerardnico function render($format, Doku_Renderer $renderer, $data) 147007225e5Sgerardnico { 148007225e5Sgerardnico if ($format == 'xhtml') { 149007225e5Sgerardnico 150007225e5Sgerardnico /** @var Doku_Renderer_xhtml $renderer */ 15132b85071SNickeau $state = $data[PluginUtility::STATE]; 152007225e5Sgerardnico switch ($state) { 153007225e5Sgerardnico case DOKU_LEXER_ENTER : 154*04fd306cSNickeau PluginUtility::getSnippetManager()->attachCssInternalStyleSheet(self::TAG); 155531e725cSNickeau $attributes = TagAttributes::createFromCallStackArray($data[PluginUtility::ATTRIBUTES], self::TAG); 15621913ab3SNickeau $attributes->addClassName("alert"); 15721913ab3SNickeau $type = $attributes->getValue(TagAttributes::TYPE_KEY); 158007225e5Sgerardnico // Switch for the color 159007225e5Sgerardnico switch ($type) { 160*04fd306cSNickeau case self::IMPORTANT_TYPE: 161007225e5Sgerardnico $type = "warning"; 162007225e5Sgerardnico break; 163*04fd306cSNickeau case self::WARNING_TYPE: 164007225e5Sgerardnico $type = "danger"; 165007225e5Sgerardnico break; 166007225e5Sgerardnico } 167007225e5Sgerardnico 168*04fd306cSNickeau if ($type != self::TIP_TYPE) { 16921913ab3SNickeau $attributes->addClassName("alert-" . $type); 170007225e5Sgerardnico } else { 171007225e5Sgerardnico // There is no alert-tip color 172007225e5Sgerardnico // base color was background color and we have modified the luminance 1734cadd4f8SNickeau if (!$attributes->hasComponentAttribute(ColorRgb::COLOR)) { 1744cadd4f8SNickeau $attributes->addComponentAttributeValue(ColorRgb::COLOR, "#6c6400"); // lum - 51 175007225e5Sgerardnico } 17621913ab3SNickeau if (!$attributes->hasComponentAttribute("border-color")) { 17721913ab3SNickeau $attributes->addComponentAttributeValue("border-color", "#FFF78c"); // lum - 186 178007225e5Sgerardnico } 179*04fd306cSNickeau if (!$attributes->hasComponentAttribute(BackgroundAttribute::BACKGROUND_COLOR)) { 180*04fd306cSNickeau $attributes->addComponentAttributeValue(BackgroundAttribute::BACKGROUND_COLOR, "#fff79f"); // lum - 195 181007225e5Sgerardnico } 182007225e5Sgerardnico } 183007225e5Sgerardnico 1844cadd4f8SNickeau $attributes->addOutputAttributeValue("role", "note"); 18521913ab3SNickeau $renderer->doc .= $attributes->toHtmlEnterTag('div'); 186007225e5Sgerardnico break; 187007225e5Sgerardnico 188007225e5Sgerardnico case DOKU_LEXER_UNMATCHED : 18932b85071SNickeau $renderer->doc .= PluginUtility::renderUnmatched($data); 190007225e5Sgerardnico break; 191007225e5Sgerardnico 192007225e5Sgerardnico case DOKU_LEXER_EXIT : 193007225e5Sgerardnico $renderer->doc .= '</div>'; 194007225e5Sgerardnico break; 195007225e5Sgerardnico } 196007225e5Sgerardnico return true; 197007225e5Sgerardnico } 198007225e5Sgerardnico 199007225e5Sgerardnico // unsupported $mode 200007225e5Sgerardnico return false; 201007225e5Sgerardnico } 202007225e5Sgerardnico 203007225e5Sgerardnico 204007225e5Sgerardnico} 205007225e5Sgerardnico 206