xref: /plugin/combo/action/webcode.php (revision c3437056399326d621a01da73b649707fbb0ae69)
121913ab3SNickeau<?php
221913ab3SNickeau
321913ab3SNickeauuse ComboStrap\PluginUtility;
421913ab3SNickeauuse ComboStrap\Site;
521913ab3SNickeauuse ComboStrap\TplUtility;
621913ab3SNickeau
721913ab3SNickeauif (!defined('DOKU_INC')) die();
821913ab3SNickeau
921913ab3SNickeau/**
1021913ab3SNickeau *
1121913ab3SNickeau */
1221913ab3SNickeauclass  action_plugin_combo_webcode extends DokuWiki_Action_Plugin
1321913ab3SNickeau{
1421913ab3SNickeau
1521913ab3SNickeau    const CALL_ID = "webcode";
16531e725cSNickeau    const MARKI_PARAM = "marki";
17531e725cSNickeau
1821913ab3SNickeau
1921913ab3SNickeau    function register(Doku_Event_Handler $controller)
2021913ab3SNickeau    {
2121913ab3SNickeau        $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, '_ajax_call');
2221913ab3SNickeau    }
2321913ab3SNickeau
2421913ab3SNickeau    /**
2521913ab3SNickeau     * handle ajax requests
2621913ab3SNickeau     * @param $event Doku_Event
2721913ab3SNickeau     *
2821913ab3SNickeau     * {@link html_show()}
2921913ab3SNickeau     *
3021913ab3SNickeau     * https://www.dokuwiki.org/devel:plugin_programming_tips#handle_json_ajax_request
3121913ab3SNickeau     *
3221913ab3SNickeau     * CSRF checks are only for logged in users
3321913ab3SNickeau     * This is public ({@link getSecurityToken()}
3421913ab3SNickeau     */
3521913ab3SNickeau    function _ajax_call(&$event)
3621913ab3SNickeau    {
3721913ab3SNickeau
3821913ab3SNickeau        if ($event->data !== self::CALL_ID) {
3921913ab3SNickeau            return;
4021913ab3SNickeau        }
4121913ab3SNickeau        //no other ajax call handlers needed
4221913ab3SNickeau        $event->stopPropagation();
4321913ab3SNickeau        $event->preventDefault();
4421913ab3SNickeau
4521913ab3SNickeau
4621913ab3SNickeau        global $INPUT;
47531e725cSNickeau        $marki = $INPUT->str(self::MARKI_PARAM);
4821913ab3SNickeau        $title = $INPUT->str('title') ?: "ComboStrap WebCode - Dokuwiki Renderer";
4921913ab3SNickeau
5021913ab3SNickeau
5121913ab3SNickeau        header('Content-Type: text/html; charset=utf-8');
5221913ab3SNickeau
5321913ab3SNickeau        /**
5421913ab3SNickeau         * Conf
5521913ab3SNickeau         */
5621913ab3SNickeau        PluginUtility::setConf(action_plugin_combo_css::CONF_DISABLE_DOKUWIKI_STYLESHEET, true);
5721913ab3SNickeau
5821913ab3SNickeau        /**
5921913ab3SNickeau         * Main content happens before the headers
6021913ab3SNickeau         * to set the headers right
6121913ab3SNickeau         */
62531e725cSNickeau        global $conf;
63531e725cSNickeau        $conf["renderer_xhtml"] = "xhtml";
64*c3437056SNickeau
65*c3437056SNickeau        global $ID;
66*c3437056SNickeau        $keep = $ID;
67*c3437056SNickeau        try {
68*c3437056SNickeau            $ID = "ajax_webcode_" . md5($marki);
69531e725cSNickeau            $mainContent = p_render('xhtml', p_get_instructions($marki), $info);
7021913ab3SNickeau
7121913ab3SNickeau            /**
7221913ab3SNickeau             * Html
7321913ab3SNickeau             */
7421913ab3SNickeau            $htmlBeforeHeads = '<!DOCTYPE html>' . DOKU_LF;
7521913ab3SNickeau            $htmlBeforeHeads .= '<html>' . DOKU_LF;
7621913ab3SNickeau            $htmlBeforeHeads .= '<head>' . DOKU_LF;
7721913ab3SNickeau            $htmlBeforeHeads .= "  <title>$title</title>" . DOKU_LF;
7821913ab3SNickeau            // we echo because the tpl function just flush
7921913ab3SNickeau            echo $htmlBeforeHeads;
8021913ab3SNickeau
8121913ab3SNickeau            if (Site::isStrapTemplate()) {
8221913ab3SNickeau
8321913ab3SNickeau                /**
8421913ab3SNickeau                 * The strap header function
8521913ab3SNickeau                 */
86531e725cSNickeau                $loaded = PluginUtility::loadStrapUtilityTemplateIfPresentAndSameVersion();
87531e725cSNickeau                if ($loaded) {
8821913ab3SNickeau                    TplUtility::registerHeaderHandler();
8921913ab3SNickeau                }
90531e725cSNickeau            }
91531e725cSNickeau
9221913ab3SNickeau            /**
9321913ab3SNickeau             * To delete the not needed headers for an export
9421913ab3SNickeau             * such as manifest, alternate, ...
9521913ab3SNickeau             */
9621913ab3SNickeau            global $EVENT_HANDLER;
9721913ab3SNickeau            $EVENT_HANDLER->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, '_delete_not_needed_headers');
9821913ab3SNickeau
9921913ab3SNickeau            /**
10021913ab3SNickeau             * meta headers
10121913ab3SNickeau             */
10221913ab3SNickeau            tpl_metaheaders();
10321913ab3SNickeau
10421913ab3SNickeau
10521913ab3SNickeau            $htmlAfterHeads = '</head>' . DOKU_LF;
10621913ab3SNickeau            $htmlAfterHeads .= '<body>' . DOKU_LF;
10721913ab3SNickeau            $htmlAfterHeads .= $mainContent . DOKU_LF;
10821913ab3SNickeau            $htmlAfterHeads .= '</body>' . DOKU_LF;
10921913ab3SNickeau            $htmlAfterHeads .= '</html>' . DOKU_LF;
11021913ab3SNickeau            echo $htmlAfterHeads;
11121913ab3SNickeau            http_response_code(200);
11221913ab3SNickeau
113*c3437056SNickeau        } finally {
114*c3437056SNickeau            $ID = $keep;
115*c3437056SNickeau        }
116*c3437056SNickeau
11721913ab3SNickeau    }
11821913ab3SNickeau
119531e725cSNickeau    /**
120531e725cSNickeau     * Dynamically called in the previous function
121531e725cSNickeau     * to delete the head
122531e725cSNickeau     * @param $event
123531e725cSNickeau     */
12421913ab3SNickeau    public function _delete_not_needed_headers(&$event)
12521913ab3SNickeau    {
12621913ab3SNickeau        $data = &$event->data;
12721913ab3SNickeau
12821913ab3SNickeau        foreach ($data as $tag => &$heads) {
12921913ab3SNickeau            switch ($tag) {
13021913ab3SNickeau                case "link":
13121913ab3SNickeau                    $deletedRel = ["manifest", "search", "start", "alternate", "contents"];
13221913ab3SNickeau                    foreach ($heads as $id => $headAttributes) {
13321913ab3SNickeau                        if (isset($headAttributes['rel'])) {
13421913ab3SNickeau                            $rel = $headAttributes['rel'];
13521913ab3SNickeau                            if (in_array($rel, $deletedRel)) {
13621913ab3SNickeau                                unset($heads[$id]);
13721913ab3SNickeau                            }
13821913ab3SNickeau                        }
13921913ab3SNickeau                    }
14021913ab3SNickeau                    break;
14121913ab3SNickeau                case "meta":
14221913ab3SNickeau                    $deletedMeta = ["robots"];
14321913ab3SNickeau                    foreach ($heads as $id => $headAttributes) {
14421913ab3SNickeau                        if (isset($headAttributes['name'])) {
14521913ab3SNickeau                            $rel = $headAttributes['name'];
14621913ab3SNickeau                            if (in_array($rel, $deletedMeta)) {
14721913ab3SNickeau                                unset($heads[$id]);
14821913ab3SNickeau                            }
14921913ab3SNickeau                        }
15021913ab3SNickeau                    }
15121913ab3SNickeau                    break;
15221913ab3SNickeau                case "script":
15321913ab3SNickeau                    foreach ($heads as $id => $headAttributes) {
15421913ab3SNickeau                        if (isset($headAttributes['src'])) {
15521913ab3SNickeau                            $src = $headAttributes['src'];
15621913ab3SNickeau                            if (strpos($src, "lib/exe/js.php") !== false) {
15721913ab3SNickeau                                unset($heads[$id]);
15821913ab3SNickeau                            }
15921913ab3SNickeau                        }
16021913ab3SNickeau                    }
16121913ab3SNickeau            }
16221913ab3SNickeau        }
16321913ab3SNickeau    }
16421913ab3SNickeau
16521913ab3SNickeau
16621913ab3SNickeau}
167