xref: /plugin/combo/action/webcode.php (revision 4cadd4f8c541149bdda95f080e38a6d4e3a640ca)
121913ab3SNickeau<?php
221913ab3SNickeau
3*4cadd4f8SNickeauuse ComboStrap\ExceptionCombo;
421913ab3SNickeauuse ComboStrap\PluginUtility;
521913ab3SNickeauuse ComboStrap\Site;
621913ab3SNickeauuse ComboStrap\TplUtility;
721913ab3SNickeau
821913ab3SNickeauif (!defined('DOKU_INC')) die();
921913ab3SNickeau
1021913ab3SNickeau/**
1121913ab3SNickeau *
1221913ab3SNickeau */
1321913ab3SNickeauclass  action_plugin_combo_webcode extends DokuWiki_Action_Plugin
1421913ab3SNickeau{
1521913ab3SNickeau
1621913ab3SNickeau    const CALL_ID = "webcode";
17531e725cSNickeau    const MARKI_PARAM = "marki";
18531e725cSNickeau
1921913ab3SNickeau
2021913ab3SNickeau    function register(Doku_Event_Handler $controller)
2121913ab3SNickeau    {
2221913ab3SNickeau        $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, '_ajax_call');
2321913ab3SNickeau    }
2421913ab3SNickeau
2521913ab3SNickeau    /**
2621913ab3SNickeau     * handle ajax requests
2721913ab3SNickeau     * @param $event Doku_Event
2821913ab3SNickeau     *
2921913ab3SNickeau     * {@link html_show()}
3021913ab3SNickeau     *
3121913ab3SNickeau     * https://www.dokuwiki.org/devel:plugin_programming_tips#handle_json_ajax_request
3221913ab3SNickeau     *
3321913ab3SNickeau     * CSRF checks are only for logged in users
3421913ab3SNickeau     * This is public ({@link getSecurityToken()}
3521913ab3SNickeau     */
3621913ab3SNickeau    function _ajax_call(&$event)
3721913ab3SNickeau    {
3821913ab3SNickeau
3921913ab3SNickeau        if ($event->data !== self::CALL_ID) {
4021913ab3SNickeau            return;
4121913ab3SNickeau        }
4221913ab3SNickeau        //no other ajax call handlers needed
4321913ab3SNickeau        $event->stopPropagation();
4421913ab3SNickeau        $event->preventDefault();
4521913ab3SNickeau
4621913ab3SNickeau
4721913ab3SNickeau        global $INPUT;
48531e725cSNickeau        $marki = $INPUT->str(self::MARKI_PARAM);
4921913ab3SNickeau        $title = $INPUT->str('title') ?: "ComboStrap WebCode - Dokuwiki Renderer";
5021913ab3SNickeau
5121913ab3SNickeau
5221913ab3SNickeau        header('Content-Type: text/html; charset=utf-8');
5321913ab3SNickeau
5421913ab3SNickeau        /**
5521913ab3SNickeau         * Conf
5621913ab3SNickeau         */
5721913ab3SNickeau        PluginUtility::setConf(action_plugin_combo_css::CONF_DISABLE_DOKUWIKI_STYLESHEET, true);
5821913ab3SNickeau
5921913ab3SNickeau        /**
6021913ab3SNickeau         * Main content happens before the headers
6121913ab3SNickeau         * to set the headers right
6221913ab3SNickeau         */
63531e725cSNickeau        global $conf;
64531e725cSNickeau        $conf["renderer_xhtml"] = "xhtml";
65c3437056SNickeau
66c3437056SNickeau        global $ID;
67c3437056SNickeau        $keep = $ID;
68c3437056SNickeau        try {
69c3437056SNickeau            $ID = "ajax_webcode_" . md5($marki);
70531e725cSNickeau            $mainContent = p_render('xhtml', p_get_instructions($marki), $info);
7121913ab3SNickeau
7221913ab3SNickeau            /**
7321913ab3SNickeau             * Html
7421913ab3SNickeau             */
7521913ab3SNickeau            $htmlBeforeHeads = '<!DOCTYPE html>' . DOKU_LF;
7621913ab3SNickeau            $htmlBeforeHeads .= '<html>' . DOKU_LF;
7721913ab3SNickeau            $htmlBeforeHeads .= '<head>' . DOKU_LF;
7821913ab3SNickeau            $htmlBeforeHeads .= "  <title>$title</title>" . DOKU_LF;
7921913ab3SNickeau            // we echo because the tpl function just flush
8021913ab3SNickeau            echo $htmlBeforeHeads;
8121913ab3SNickeau
8221913ab3SNickeau            if (Site::isStrapTemplate()) {
8321913ab3SNickeau
8421913ab3SNickeau                /**
8521913ab3SNickeau                 * The strap header function
8621913ab3SNickeau                 */
87*4cadd4f8SNickeau                try {
88*4cadd4f8SNickeau                    Site::loadStrapUtilityTemplateIfPresentAndSameVersion();
8921913ab3SNickeau                    TplUtility::registerHeaderHandler();
90*4cadd4f8SNickeau                } catch (ExceptionCombo $e) {
91*4cadd4f8SNickeau                    \ComboStrap\LogUtility::log2file("Error while registering the header handler on webcode ajax call. Error: {$e->getMessage()}");
9221913ab3SNickeau                }
93*4cadd4f8SNickeau
94531e725cSNickeau            }
95531e725cSNickeau
9621913ab3SNickeau            /**
9721913ab3SNickeau             * To delete the not needed headers for an export
9821913ab3SNickeau             * such as manifest, alternate, ...
9921913ab3SNickeau             */
10021913ab3SNickeau            global $EVENT_HANDLER;
10121913ab3SNickeau            $EVENT_HANDLER->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, '_delete_not_needed_headers');
10221913ab3SNickeau
10321913ab3SNickeau            /**
10421913ab3SNickeau             * meta headers
10521913ab3SNickeau             */
10621913ab3SNickeau            tpl_metaheaders();
10721913ab3SNickeau
10821913ab3SNickeau
10921913ab3SNickeau            $htmlAfterHeads = '</head>' . DOKU_LF;
11021913ab3SNickeau            $htmlAfterHeads .= '<body>' . DOKU_LF;
11121913ab3SNickeau            $htmlAfterHeads .= $mainContent . DOKU_LF;
11221913ab3SNickeau            $htmlAfterHeads .= '</body>' . DOKU_LF;
11321913ab3SNickeau            $htmlAfterHeads .= '</html>' . DOKU_LF;
11421913ab3SNickeau            echo $htmlAfterHeads;
11521913ab3SNickeau            http_response_code(200);
11621913ab3SNickeau
117c3437056SNickeau        } finally {
118c3437056SNickeau            $ID = $keep;
119c3437056SNickeau        }
120c3437056SNickeau
12121913ab3SNickeau    }
12221913ab3SNickeau
123531e725cSNickeau    /**
124531e725cSNickeau     * Dynamically called in the previous function
125531e725cSNickeau     * to delete the head
126531e725cSNickeau     * @param $event
127531e725cSNickeau     */
12821913ab3SNickeau    public function _delete_not_needed_headers(&$event)
12921913ab3SNickeau    {
13021913ab3SNickeau        $data = &$event->data;
13121913ab3SNickeau
13221913ab3SNickeau        foreach ($data as $tag => &$heads) {
13321913ab3SNickeau            switch ($tag) {
13421913ab3SNickeau                case "link":
13521913ab3SNickeau                    $deletedRel = ["manifest", "search", "start", "alternate", "contents"];
13621913ab3SNickeau                    foreach ($heads as $id => $headAttributes) {
13721913ab3SNickeau                        if (isset($headAttributes['rel'])) {
13821913ab3SNickeau                            $rel = $headAttributes['rel'];
13921913ab3SNickeau                            if (in_array($rel, $deletedRel)) {
14021913ab3SNickeau                                unset($heads[$id]);
14121913ab3SNickeau                            }
14221913ab3SNickeau                        }
14321913ab3SNickeau                    }
14421913ab3SNickeau                    break;
14521913ab3SNickeau                case "meta":
14621913ab3SNickeau                    $deletedMeta = ["robots"];
14721913ab3SNickeau                    foreach ($heads as $id => $headAttributes) {
14821913ab3SNickeau                        if (isset($headAttributes['name'])) {
14921913ab3SNickeau                            $rel = $headAttributes['name'];
15021913ab3SNickeau                            if (in_array($rel, $deletedMeta)) {
15121913ab3SNickeau                                unset($heads[$id]);
15221913ab3SNickeau                            }
15321913ab3SNickeau                        }
15421913ab3SNickeau                    }
15521913ab3SNickeau                    break;
15621913ab3SNickeau                case "script":
15721913ab3SNickeau                    foreach ($heads as $id => $headAttributes) {
15821913ab3SNickeau                        if (isset($headAttributes['src'])) {
15921913ab3SNickeau                            $src = $headAttributes['src'];
16021913ab3SNickeau                            if (strpos($src, "lib/exe/js.php") !== false) {
16121913ab3SNickeau                                unset($heads[$id]);
16221913ab3SNickeau                            }
16321913ab3SNickeau                        }
16421913ab3SNickeau                    }
16521913ab3SNickeau            }
16621913ab3SNickeau        }
16721913ab3SNickeau    }
16821913ab3SNickeau
16921913ab3SNickeau
17021913ab3SNickeau}
171