1531e725cSNickeau<?php 2531e725cSNickeau/** 3531e725cSNickeau * Copyright (c) 2020. ComboStrap, Inc. and its affiliates. All Rights Reserved. 4531e725cSNickeau * 5531e725cSNickeau * This source code is licensed under the GPL license found in the 6531e725cSNickeau * COPYING file in the root directory of this source tree. 7531e725cSNickeau * 8531e725cSNickeau * @license GPL 3 (https://www.gnu.org/licenses/gpl-3.0.en.html) 9531e725cSNickeau * @author ComboStrap <support@combostrap.com> 10531e725cSNickeau * 11531e725cSNickeau */ 12531e725cSNickeau 13531e725cSNickeauuse ComboStrap\ConditionalValue; 14*a6bf47aaSNickeauuse ComboStrap\Dimension; 15531e725cSNickeauuse ComboStrap\PluginUtility; 16531e725cSNickeauuse ComboStrap\TagAttributes; 17531e725cSNickeau 18531e725cSNickeau 19531e725cSNickeaurequire_once(__DIR__ . '/../class/PluginUtility.php'); 20531e725cSNickeau 21531e725cSNickeau/** 22531e725cSNickeau * The {@link https://combostrap.com/column column} of a {@link https://combostrap.com/grid grid} 23531e725cSNickeau * 24531e725cSNickeau * 25531e725cSNickeau * Note: The name of the class must follow this pattern ie syntax_plugin_PluginName_ComponentName 26531e725cSNickeau */ 27531e725cSNickeauclass syntax_plugin_combo_cell extends DokuWiki_Syntax_Plugin 28531e725cSNickeau{ 29531e725cSNickeau 30531e725cSNickeau const TAG = "cell"; 31531e725cSNickeau 32*a6bf47aaSNickeau const WIDTH_ATTRIBUTE = Dimension::WIDTH_KEY; 33531e725cSNickeau const VERTICAL_ATTRIBUTE = "vertical"; 34531e725cSNickeau 35531e725cSNickeau static function getTags() 36531e725cSNickeau { 37531e725cSNickeau return [self::TAG, "col", "column"]; 38531e725cSNickeau } 39531e725cSNickeau 40531e725cSNickeau /** 41531e725cSNickeau * Syntax Type. 42531e725cSNickeau * 43531e725cSNickeau * Needs to return one of the mode types defined in $PARSER_MODES in parser.php 44531e725cSNickeau * @see DokuWiki_Syntax_Plugin::getType() 45531e725cSNickeau */ 46531e725cSNickeau function getType() 47531e725cSNickeau { 48531e725cSNickeau return 'container'; 49531e725cSNickeau } 50531e725cSNickeau 51531e725cSNickeau /** 52531e725cSNickeau * @return array 53531e725cSNickeau * Allow which kind of plugin inside 54531e725cSNickeau * All 55531e725cSNickeau */ 56531e725cSNickeau public function getAllowedTypes() 57531e725cSNickeau { 58531e725cSNickeau return array('container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs'); 59531e725cSNickeau } 60531e725cSNickeau 61531e725cSNickeau public function accepts($mode) 62531e725cSNickeau { 63531e725cSNickeau 64531e725cSNickeau /** 65531e725cSNickeau * header mode is disable to take over 66531e725cSNickeau * and replace it with {@link syntax_plugin_combo_heading} 67531e725cSNickeau */ 68531e725cSNickeau if ($mode == "header") { 69531e725cSNickeau return false; 70531e725cSNickeau } 71531e725cSNickeau 72531e725cSNickeau 73531e725cSNickeau return syntax_plugin_combo_preformatted::disablePreformatted($mode); 74531e725cSNickeau 75531e725cSNickeau } 76531e725cSNickeau 77531e725cSNickeau /** 78531e725cSNickeau * How Dokuwiki will add P element 79531e725cSNickeau * 80531e725cSNickeau * * 'normal' - The plugin can be used inside paragraphs 81531e725cSNickeau * * 'block' - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs 82531e725cSNickeau * * 'stack' - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs 83531e725cSNickeau * 84531e725cSNickeau * @see DokuWiki_Syntax_Plugin::getPType() 85531e725cSNickeau */ 86531e725cSNickeau function getPType() 87531e725cSNickeau { 88531e725cSNickeau return 'stack'; 89531e725cSNickeau } 90531e725cSNickeau 91531e725cSNickeau /** 92531e725cSNickeau * @see Doku_Parser_Mode::getSort() 93531e725cSNickeau * 94531e725cSNickeau * the mode with the lowest sort number will win out 95531e725cSNickeau * the container (parent) must then have a lower number than the child 96531e725cSNickeau */ 97531e725cSNickeau function getSort() 98531e725cSNickeau { 99531e725cSNickeau return 100; 100531e725cSNickeau } 101531e725cSNickeau 102531e725cSNickeau /** 103531e725cSNickeau * Create a pattern that will called this plugin 104531e725cSNickeau * 105531e725cSNickeau * @param string $mode 106531e725cSNickeau * @see Doku_Parser_Mode::connectTo() 107531e725cSNickeau */ 108531e725cSNickeau function connectTo($mode) 109531e725cSNickeau { 110531e725cSNickeau 111531e725cSNickeau // A cell can be anywhere 112531e725cSNickeau foreach (self::getTags() as $tag) { 113531e725cSNickeau $pattern = PluginUtility::getContainerTagPattern($tag); 114531e725cSNickeau $this->Lexer->addEntryPattern($pattern, $mode, PluginUtility::getModeForComponent($this->getPluginComponent())); 115531e725cSNickeau } 116531e725cSNickeau 117531e725cSNickeau 118531e725cSNickeau } 119531e725cSNickeau 120531e725cSNickeau public function postConnect() 121531e725cSNickeau { 122531e725cSNickeau 123531e725cSNickeau foreach (self::getTags() as $tag) { 124531e725cSNickeau $this->Lexer->addExitPattern('</' . $tag . '>', PluginUtility::getModeForComponent($this->getPluginComponent())); 125531e725cSNickeau } 126531e725cSNickeau 127531e725cSNickeau } 128531e725cSNickeau 129531e725cSNickeau /** 130531e725cSNickeau * 131531e725cSNickeau * The handle function goal is to parse the matched syntax through the pattern function 132531e725cSNickeau * and to return the result for use in the renderer 133531e725cSNickeau * This result is always cached until the page is modified. 134531e725cSNickeau * @param string $match 135531e725cSNickeau * @param int $state 136531e725cSNickeau * @param int $pos 137531e725cSNickeau * @param Doku_Handler $handler 138531e725cSNickeau * @return array|bool 139531e725cSNickeau * @see DokuWiki_Syntax_Plugin::handle() 140531e725cSNickeau * 141531e725cSNickeau */ 142531e725cSNickeau function handle($match, $state, $pos, Doku_Handler $handler) 143531e725cSNickeau { 144531e725cSNickeau 145531e725cSNickeau switch ($state) { 146531e725cSNickeau 147531e725cSNickeau case DOKU_LEXER_ENTER: 148531e725cSNickeau 149531e725cSNickeau $attributes = TagAttributes::createFromTagMatch($match)->toCallStackArray(); 150531e725cSNickeau return array( 151531e725cSNickeau PluginUtility::STATE => $state, 152531e725cSNickeau PluginUtility::ATTRIBUTES => $attributes); 153531e725cSNickeau 154531e725cSNickeau case DOKU_LEXER_UNMATCHED: 155531e725cSNickeau return PluginUtility::handleAndReturnUnmatchedData(self::TAG, $match, $handler); 156531e725cSNickeau 157531e725cSNickeau case DOKU_LEXER_EXIT : 158531e725cSNickeau 159531e725cSNickeau return array( 160531e725cSNickeau PluginUtility::STATE => $state 161531e725cSNickeau ); 162531e725cSNickeau 163531e725cSNickeau 164531e725cSNickeau } 165531e725cSNickeau 166531e725cSNickeau return array(); 167531e725cSNickeau 168531e725cSNickeau } 169531e725cSNickeau 170531e725cSNickeau /** 171531e725cSNickeau * Render the output 172531e725cSNickeau * @param string $format 173531e725cSNickeau * @param Doku_Renderer $renderer 174531e725cSNickeau * @param array $data - what the function handle() return'ed 175531e725cSNickeau * @return boolean - rendered correctly? (however, returned value is not used at the moment) 176531e725cSNickeau * @see DokuWiki_Syntax_Plugin::render() 177531e725cSNickeau * 178531e725cSNickeau * 179531e725cSNickeau */ 180531e725cSNickeau function render($format, Doku_Renderer $renderer, $data) 181531e725cSNickeau { 182531e725cSNickeau 183531e725cSNickeau if ($format == 'xhtml') { 184531e725cSNickeau 185531e725cSNickeau /** @var Doku_Renderer_xhtml $renderer */ 186531e725cSNickeau $state = $data[PluginUtility::STATE]; 187531e725cSNickeau switch ($state) { 188531e725cSNickeau 189531e725cSNickeau case DOKU_LEXER_ENTER : 190531e725cSNickeau 191531e725cSNickeau PluginUtility::getSnippetManager()->attachCssSnippetForBar(self::TAG); 192531e725cSNickeau $callStackArray = $data[PluginUtility::ATTRIBUTES]; 193531e725cSNickeau $attributes = TagAttributes::createFromCallStackArray($callStackArray, self::TAG); 194531e725cSNickeau $attributes->addClassName("col"); 195531e725cSNickeau if ($attributes->hasComponentAttribute(self::VERTICAL_ATTRIBUTE)) { 196531e725cSNickeau $value = $attributes->getValue(self::VERTICAL_ATTRIBUTE); 197531e725cSNickeau if ($value == "center") { 198531e725cSNickeau //$attributes->addClassName("d-inline-flex"); 199531e725cSNickeau $attributes->addClassName("align-self-center"); 200531e725cSNickeau } 201531e725cSNickeau } 202531e725cSNickeau if ($attributes->hasComponentAttribute(syntax_plugin_combo_cell::WIDTH_ATTRIBUTE)) { 203531e725cSNickeau $sizeValues = $attributes->getValuesAndRemove(syntax_plugin_combo_cell::WIDTH_ATTRIBUTE); 204531e725cSNickeau foreach ($sizeValues as $sizeValue) { 205531e725cSNickeau $conditionalValue = ConditionalValue::createFrom($sizeValue); 206531e725cSNickeau if ($conditionalValue->getBreakpoint() == "xs") { 207531e725cSNickeau $attributes->addClassName("col-" . $conditionalValue->getValue()); 208531e725cSNickeau } else { 209531e725cSNickeau if ($conditionalValue->getBreakpoint() != null) { 210531e725cSNickeau $attributes->addClassName("col-$sizeValue"); 211531e725cSNickeau } else { 212531e725cSNickeau /** 213531e725cSNickeau * No breakpoint given 214531e725cSNickeau * If this is a number between 1 and 12, 215531e725cSNickeau * we take the assumption that this is a ratio 216531e725cSNickeau * otherwise, this a width in CSS length 217531e725cSNickeau */ 218531e725cSNickeau if ($sizeValue >= 1 && $sizeValue <= syntax_plugin_combo_row::GRID_TOTAL_COLUMNS) { 219531e725cSNickeau $attributes->addClassName("col-$sizeValue"); 220531e725cSNickeau } else { 221*a6bf47aaSNickeau $attributes->addComponentAttributeValue(Dimension::WIDTH_KEY, $sizeValue); 222531e725cSNickeau } 223531e725cSNickeau } 224531e725cSNickeau } 225531e725cSNickeau } 226531e725cSNickeau } 227531e725cSNickeau $renderer->doc .= $attributes->toHtmlEnterTag("div") . DOKU_LF; 228531e725cSNickeau break; 229531e725cSNickeau 230531e725cSNickeau case DOKU_LEXER_UNMATCHED : 231531e725cSNickeau 232531e725cSNickeau $renderer->doc .= PluginUtility::renderUnmatched($data); 233531e725cSNickeau break; 234531e725cSNickeau 235531e725cSNickeau case DOKU_LEXER_EXIT : 236531e725cSNickeau 237531e725cSNickeau $renderer->doc .= '</div>' . DOKU_LF; 238531e725cSNickeau break; 239531e725cSNickeau } 240531e725cSNickeau return true; 241531e725cSNickeau } 242531e725cSNickeau return false; 243531e725cSNickeau } 244531e725cSNickeau 245531e725cSNickeau 246531e725cSNickeau} 247