xref: /plugin/combo/syntax/webcode.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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