15f891b7eSNickeau<?php 25f891b7eSNickeau/** 35f891b7eSNickeau * Copyright (c) 2021. ComboStrap, Inc. and its affiliates. All Rights Reserved. 45f891b7eSNickeau * 55f891b7eSNickeau * This source code is licensed under the GPL license found in the 65f891b7eSNickeau * COPYING file in the root directory of this source tree. 75f891b7eSNickeau * 85f891b7eSNickeau * @license GPL 3 (https://www.gnu.org/licenses/gpl-3.0.en.html) 95f891b7eSNickeau * @author ComboStrap <support@combostrap.com> 105f891b7eSNickeau * 115f891b7eSNickeau */ 125f891b7eSNickeau 135f891b7eSNickeau/** 145f891b7eSNickeau * Plugin Webcode: Show webcode (Css, HTML) in a iframe 155f891b7eSNickeau * 165f891b7eSNickeau */ 175f891b7eSNickeau 185f891b7eSNickeau// must be run within Dokuwiki 19531e725cSNickeauuse ComboStrap\CallStack; 20a6bf47aaSNickeauuse ComboStrap\Dimension; 214cadd4f8SNickeauuse ComboStrap\Display; 22*04fd306cSNickeauuse ComboStrap\ExceptionBadState; 23*04fd306cSNickeauuse ComboStrap\ExceptionCompile; 24*04fd306cSNickeauuse ComboStrap\ExceptionNotFound; 25*04fd306cSNickeauuse ComboStrap\ExecutionContext; 26*04fd306cSNickeauuse ComboStrap\FetcherMarkup; 27*04fd306cSNickeauuse ComboStrap\FetcherMarkupWebcode; 28*04fd306cSNickeauuse ComboStrap\FetcherRawLocalPath; 295f891b7eSNickeauuse ComboStrap\LogUtility; 305f891b7eSNickeauuse ComboStrap\PluginUtility; 31*04fd306cSNickeauuse ComboStrap\TagAttribute\StyleAttribute; 32*04fd306cSNickeauuse ComboStrap\Tag\WebCodeTag; 3321913ab3SNickeauuse ComboStrap\TagAttributes; 34*04fd306cSNickeauuse ComboStrap\WikiPath; 35*04fd306cSNickeauuse ComboStrap\XmlTagProcessing; 365f891b7eSNickeau 375f891b7eSNickeau 385f891b7eSNickeau/** 395f891b7eSNickeau * Webcode 405f891b7eSNickeau */ 415f891b7eSNickeauclass syntax_plugin_combo_webcode extends DokuWiki_Syntax_Plugin 425f891b7eSNickeau{ 435f891b7eSNickeau 44*04fd306cSNickeau // In the action bar 45*04fd306cSNickeau // In the code 465f891b7eSNickeau 475f891b7eSNickeau 485f891b7eSNickeau /** 495f891b7eSNickeau * Syntax Type. 505f891b7eSNickeau * 515f891b7eSNickeau * Needs to return one of the mode types defined in $PARSER_MODES in parser.php 525f891b7eSNickeau * @see https://www.dokuwiki.org/devel:syntax_plugins#syntax_types 535f891b7eSNickeau * 545f891b7eSNickeau * container because it may contain header in case of how to 555f891b7eSNickeau */ 565f891b7eSNickeau public function getType() 575f891b7eSNickeau { 585f891b7eSNickeau return 'container'; 595f891b7eSNickeau } 605f891b7eSNickeau 61531e725cSNickeau public function getPType() 62531e725cSNickeau { 63531e725cSNickeau return "stack"; 64531e725cSNickeau } 65531e725cSNickeau 66531e725cSNickeau 675f891b7eSNickeau /** 685f891b7eSNickeau * @return array 695f891b7eSNickeau * Allow which kind of plugin inside 705f891b7eSNickeau * 715f891b7eSNickeau * array('container', 'baseonly','formatting', 'substition', 'protected', 'disabled', 'paragraphs') 725f891b7eSNickeau * 735f891b7eSNickeau */ 745f891b7eSNickeau public function getAllowedTypes() 755f891b7eSNickeau { 765f891b7eSNickeau return array('container', 'baseonly', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs'); 775f891b7eSNickeau } 785f891b7eSNickeau 795f891b7eSNickeau 805f891b7eSNickeau public function accepts($mode) 815f891b7eSNickeau { 8221913ab3SNickeau 8321913ab3SNickeau return syntax_plugin_combo_preformatted::disablePreformatted($mode); 8421913ab3SNickeau 855f891b7eSNickeau } 865f891b7eSNickeau 875f891b7eSNickeau /** 885f891b7eSNickeau * @see Doku_Parser_Mode::getSort() 895f891b7eSNickeau * The mode (plugin) with the lowest sort number will win out 905f891b7eSNickeau * 915f891b7eSNickeau * See {@link Doku_Parser_Mode_code} 925f891b7eSNickeau */ 935f891b7eSNickeau public function getSort() 945f891b7eSNickeau { 955f891b7eSNickeau return 99; 965f891b7eSNickeau } 975f891b7eSNickeau 985f891b7eSNickeau /** 995f891b7eSNickeau * Called before any calls to ConnectTo 1005f891b7eSNickeau * @return void 1015f891b7eSNickeau */ 1025f891b7eSNickeau function preConnect() 1035f891b7eSNickeau { 1045f891b7eSNickeau } 1055f891b7eSNickeau 1065f891b7eSNickeau /** 1075f891b7eSNickeau * Create a pattern that will called this plugin 1085f891b7eSNickeau * 1095f891b7eSNickeau * @param string $mode 1105f891b7eSNickeau * 1115f891b7eSNickeau * All dokuwiki mode can be seen in the parser.php file 1125f891b7eSNickeau * @see Doku_Parser_Mode::connectTo() 1135f891b7eSNickeau */ 1145f891b7eSNickeau public function connectTo($mode) 1155f891b7eSNickeau { 1165f891b7eSNickeau 117*04fd306cSNickeau $pattern = XmlTagProcessing::getContainerTagPattern(WebCodeTag::TAG); 1189337a630SNickeau $this->Lexer->addEntryPattern($pattern, $mode, PluginUtility::getModeFromTag($this->getPluginComponent())); 1195f891b7eSNickeau 1205f891b7eSNickeau } 1215f891b7eSNickeau 1225f891b7eSNickeau 1235f891b7eSNickeau // This where the addPattern and addExitPattern are defined 1245f891b7eSNickeau public function postConnect() 1255f891b7eSNickeau { 126*04fd306cSNickeau $this->Lexer->addExitPattern('</' . WebCodeTag::TAG . '>', PluginUtility::getModeFromTag($this->getPluginComponent())); 1275f891b7eSNickeau } 1285f891b7eSNickeau 1295f891b7eSNickeau 1305f891b7eSNickeau /** 1315f891b7eSNickeau * Handle the match 1325f891b7eSNickeau * You get the match for each pattern in the $match variable 1335f891b7eSNickeau * $state says if it's an entry, exit or match pattern 1345f891b7eSNickeau * 1355f891b7eSNickeau * This is an instruction block and is cached apart from the rendering output 1365f891b7eSNickeau * There is two caches levels 1375f891b7eSNickeau * This cache may be suppressed with the url parameters ?purge=true 1385f891b7eSNickeau * 1395f891b7eSNickeau * The returned values are cached in an array that will be passed to the render method 1405f891b7eSNickeau * The handle function goal is to parse the matched syntax through the pattern function 1415f891b7eSNickeau * and to return the result for use in the renderer 1425f891b7eSNickeau * This result is always cached until the page is modified. 1435f891b7eSNickeau * @param string $match 1445f891b7eSNickeau * @param int $state 1455f891b7eSNickeau * @param int $pos 1465f891b7eSNickeau * @param Doku_Handler $handler 1475f891b7eSNickeau * @return array|bool 1485f891b7eSNickeau * @throws Exception 1495f891b7eSNickeau * @see DokuWiki_Syntax_Plugin::handle() 1505f891b7eSNickeau * 1515f891b7eSNickeau */ 1525f891b7eSNickeau public function handle($match, $state, $pos, Doku_Handler $handler) 1535f891b7eSNickeau { 1545f891b7eSNickeau switch ($state) { 1555f891b7eSNickeau 1565f891b7eSNickeau case DOKU_LEXER_ENTER : 1575f891b7eSNickeau 158531e725cSNickeau // Default 159*04fd306cSNickeau $defaultAttributes = WebCodeTag::getDefaultAttributes(); 1605f891b7eSNickeau 161531e725cSNickeau // Parse and create the call stack array 162*04fd306cSNickeau $knownTypes = WebCodeTag::getKnownTypes(); 163*04fd306cSNickeau $tagAttributes = TagAttributes::createFromTagMatch($match, $defaultAttributes, $knownTypes); 164531e725cSNickeau $callStackArray = $tagAttributes->toCallStackArray(); 1655f891b7eSNickeau 1665f891b7eSNickeau return array( 1675f891b7eSNickeau PluginUtility::STATE => $state, 168531e725cSNickeau PluginUtility::ATTRIBUTES => $callStackArray 1695f891b7eSNickeau ); 1705f891b7eSNickeau 1715f891b7eSNickeau 1725f891b7eSNickeau case DOKU_LEXER_UNMATCHED : 1735f891b7eSNickeau 174*04fd306cSNickeau return PluginUtility::handleAndReturnUnmatchedData(WebCodeTag::TAG, $match, $handler); 17532b85071SNickeau 1765f891b7eSNickeau 1775f891b7eSNickeau case DOKU_LEXER_EXIT: 1785f891b7eSNickeau 179*04fd306cSNickeau $array = WebCodeTag::handleExit($handler); 180*04fd306cSNickeau $array[PluginUtility::STATE] = $state; 181*04fd306cSNickeau return $array; 182531e725cSNickeau 1835f891b7eSNickeau 1845f891b7eSNickeau } 1855f891b7eSNickeau return false; 1865f891b7eSNickeau 1875f891b7eSNickeau } 1885f891b7eSNickeau 1895f891b7eSNickeau /** 1905f891b7eSNickeau * Render the output 1915f891b7eSNickeau * @param string $mode 1925f891b7eSNickeau * @param Doku_Renderer $renderer 1935f891b7eSNickeau * @param array $data - what the function handle() return'ed 1945f891b7eSNickeau * @return bool - rendered correctly (not used) 1955f891b7eSNickeau * 1965f891b7eSNickeau * The rendering process 1975f891b7eSNickeau * @see DokuWiki_Syntax_Plugin::render() 1985f891b7eSNickeau * 1995f891b7eSNickeau */ 2004cadd4f8SNickeau public function render($mode, Doku_Renderer $renderer, $data): bool 2015f891b7eSNickeau { 2025f891b7eSNickeau // The $data variable comes from the handle() function 2035f891b7eSNickeau // 2045f891b7eSNickeau // $mode = 'xhtml' means that we output html 2055f891b7eSNickeau // There is other mode such as metadata where you can output data for the headers (Not 100% sure) 2065f891b7eSNickeau if ($mode == 'xhtml') { 2075f891b7eSNickeau 2085f891b7eSNickeau 2095f891b7eSNickeau /** @var Doku_Renderer_xhtml $renderer */ 2105f891b7eSNickeau 2115f891b7eSNickeau $state = $data[PluginUtility::STATE]; 2125f891b7eSNickeau switch ($state) { 2135f891b7eSNickeau 2145f891b7eSNickeau 2155f891b7eSNickeau case DOKU_LEXER_UNMATCHED : 2165f891b7eSNickeau 21732b85071SNickeau $renderer->doc .= PluginUtility::renderUnmatched($data); 2185f891b7eSNickeau break; 2195f891b7eSNickeau case DOKU_LEXER_EXIT : 220531e725cSNickeau $callStackArray = $data[PluginUtility::ATTRIBUTES]; 221*04fd306cSNickeau $tagAttributes = TagAttributes::createFromCallStackArray($callStackArray, WebCodeTag::TAG); 222*04fd306cSNickeau $renderer->doc .= WebCodeTag::renderExit($tagAttributes, $data); 2235f891b7eSNickeau break; 2245f891b7eSNickeau } 2255f891b7eSNickeau 2265f891b7eSNickeau return true; 2275f891b7eSNickeau } 2285f891b7eSNickeau return false; 2295f891b7eSNickeau } 2305f891b7eSNickeau 2315f891b7eSNickeau /** 232*04fd306cSNickeau * @param $codes - the array containing the codes 233*04fd306cSNickeau * @param $attributes - the attributes of a call (for now the externalResources) 234*04fd306cSNickeau * @return void the HTML form code 2355f891b7eSNickeau */ 2365f891b7eSNickeau public function addCodePenButton($codes, $attributes) 2375f891b7eSNickeau { 2385f891b7eSNickeau // TODO 2395f891b7eSNickeau // http://blog.codepen.io/documentation/api/prefill/ 2405f891b7eSNickeau } 2415f891b7eSNickeau 2425f891b7eSNickeau 2435f891b7eSNickeau} 244