xref: /plugin/combo/action/webcode.php (revision 21913ab3235d516e2fa19c7e3929b555b3a2bda1)
1*21913ab3SNickeau<?php
2*21913ab3SNickeau
3*21913ab3SNickeauuse ComboStrap\PluginUtility;
4*21913ab3SNickeauuse ComboStrap\Site;
5*21913ab3SNickeauuse ComboStrap\TplUtility;
6*21913ab3SNickeau
7*21913ab3SNickeauif (!defined('DOKU_INC')) die();
8*21913ab3SNickeau
9*21913ab3SNickeau/**
10*21913ab3SNickeau *
11*21913ab3SNickeau */
12*21913ab3SNickeauclass  action_plugin_combo_webcode extends DokuWiki_Action_Plugin
13*21913ab3SNickeau{
14*21913ab3SNickeau
15*21913ab3SNickeau    const CALL_ID = "webcode";
16*21913ab3SNickeau    const DW_PARAM = "dw";
17*21913ab3SNickeau    const CALL_PARAM = "call";
18*21913ab3SNickeau
19*21913ab3SNickeau    function register(Doku_Event_Handler $controller)
20*21913ab3SNickeau    {
21*21913ab3SNickeau        $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, '_ajax_call');
22*21913ab3SNickeau    }
23*21913ab3SNickeau
24*21913ab3SNickeau    /**
25*21913ab3SNickeau     * handle ajax requests
26*21913ab3SNickeau     * @param $event Doku_Event
27*21913ab3SNickeau     *
28*21913ab3SNickeau     * {@link html_show()}
29*21913ab3SNickeau     *
30*21913ab3SNickeau     * https://www.dokuwiki.org/devel:plugin_programming_tips#handle_json_ajax_request
31*21913ab3SNickeau     *
32*21913ab3SNickeau     * CSRF checks are only for logged in users
33*21913ab3SNickeau     * This is public ({@link getSecurityToken()}
34*21913ab3SNickeau     */
35*21913ab3SNickeau    function _ajax_call(&$event)
36*21913ab3SNickeau    {
37*21913ab3SNickeau
38*21913ab3SNickeau        if ($event->data !== self::CALL_ID) {
39*21913ab3SNickeau            return;
40*21913ab3SNickeau        }
41*21913ab3SNickeau        //no other ajax call handlers needed
42*21913ab3SNickeau        $event->stopPropagation();
43*21913ab3SNickeau        $event->preventDefault();
44*21913ab3SNickeau
45*21913ab3SNickeau
46*21913ab3SNickeau        global $INPUT;
47*21913ab3SNickeau        $dw = $INPUT->str(self::DW_PARAM);
48*21913ab3SNickeau        $title = $INPUT->str('title') ?: "ComboStrap WebCode - Dokuwiki Renderer";
49*21913ab3SNickeau
50*21913ab3SNickeau
51*21913ab3SNickeau        header('Content-Type: text/html; charset=utf-8');
52*21913ab3SNickeau
53*21913ab3SNickeau        /**
54*21913ab3SNickeau         * Conf
55*21913ab3SNickeau         */
56*21913ab3SNickeau        PluginUtility::setConf(action_plugin_combo_css::CONF_DISABLE_DOKUWIKI_STYLESHEET, true);
57*21913ab3SNickeau
58*21913ab3SNickeau        /**
59*21913ab3SNickeau         * Main content happens before the headers
60*21913ab3SNickeau         * to set the headers right
61*21913ab3SNickeau         */
62*21913ab3SNickeau        $mainContent = p_render('xhtml', p_get_instructions($dw), $info);
63*21913ab3SNickeau
64*21913ab3SNickeau        /**
65*21913ab3SNickeau         * Html
66*21913ab3SNickeau         */
67*21913ab3SNickeau        $htmlBeforeHeads = '<!DOCTYPE html>' . DOKU_LF;
68*21913ab3SNickeau        $htmlBeforeHeads .= '<html>' . DOKU_LF;
69*21913ab3SNickeau        $htmlBeforeHeads .= '<head>' . DOKU_LF;
70*21913ab3SNickeau        $htmlBeforeHeads .= "  <title>$title</title>" . DOKU_LF;
71*21913ab3SNickeau        // we echo because the tpl function just flush
72*21913ab3SNickeau        echo $htmlBeforeHeads;
73*21913ab3SNickeau
74*21913ab3SNickeau        if (Site::isStrapTemplate()) {
75*21913ab3SNickeau
76*21913ab3SNickeau            /**
77*21913ab3SNickeau             * The strap header function
78*21913ab3SNickeau             */
79*21913ab3SNickeau            PluginUtility::loadStrapUtilityTemplate();
80*21913ab3SNickeau            TplUtility::registerHeaderHandler();
81*21913ab3SNickeau        }
82*21913ab3SNickeau        /**
83*21913ab3SNickeau         * To delete the not needed headers for an export
84*21913ab3SNickeau         * such as manifest, alternate, ...
85*21913ab3SNickeau         */
86*21913ab3SNickeau        global $EVENT_HANDLER;
87*21913ab3SNickeau        $EVENT_HANDLER->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, '_delete_not_needed_headers');
88*21913ab3SNickeau
89*21913ab3SNickeau        /**
90*21913ab3SNickeau         * meta headers
91*21913ab3SNickeau         */
92*21913ab3SNickeau        tpl_metaheaders();
93*21913ab3SNickeau
94*21913ab3SNickeau
95*21913ab3SNickeau        $htmlAfterHeads = '</head>' . DOKU_LF;
96*21913ab3SNickeau        $htmlAfterHeads .= '<body>' . DOKU_LF;
97*21913ab3SNickeau        $htmlAfterHeads .= $mainContent . DOKU_LF;
98*21913ab3SNickeau        $htmlAfterHeads .= '</body>' . DOKU_LF;
99*21913ab3SNickeau        $htmlAfterHeads .= '</html>' . DOKU_LF;
100*21913ab3SNickeau        echo $htmlAfterHeads;
101*21913ab3SNickeau        http_response_code(200);
102*21913ab3SNickeau
103*21913ab3SNickeau    }
104*21913ab3SNickeau
105*21913ab3SNickeau    public function _delete_not_needed_headers(&$event)
106*21913ab3SNickeau    {
107*21913ab3SNickeau        $data = &$event->data;
108*21913ab3SNickeau
109*21913ab3SNickeau        foreach ($data as $tag => &$heads) {
110*21913ab3SNickeau            switch ($tag) {
111*21913ab3SNickeau                case "link":
112*21913ab3SNickeau                    $deletedRel = ["manifest", "search", "start", "alternate", "contents"];
113*21913ab3SNickeau                    foreach ($heads as $id => $headAttributes) {
114*21913ab3SNickeau                        if (isset($headAttributes['rel'])) {
115*21913ab3SNickeau                            $rel = $headAttributes['rel'];
116*21913ab3SNickeau                            if (in_array($rel, $deletedRel)) {
117*21913ab3SNickeau                                unset($heads[$id]);
118*21913ab3SNickeau                            }
119*21913ab3SNickeau                        }
120*21913ab3SNickeau                    }
121*21913ab3SNickeau                    break;
122*21913ab3SNickeau                case "meta":
123*21913ab3SNickeau                    $deletedMeta = ["robots"];
124*21913ab3SNickeau                    foreach ($heads as $id => $headAttributes) {
125*21913ab3SNickeau                        if (isset($headAttributes['name'])) {
126*21913ab3SNickeau                            $rel = $headAttributes['name'];
127*21913ab3SNickeau                            if (in_array($rel, $deletedMeta)) {
128*21913ab3SNickeau                                unset($heads[$id]);
129*21913ab3SNickeau                            }
130*21913ab3SNickeau                        }
131*21913ab3SNickeau                    }
132*21913ab3SNickeau                    break;
133*21913ab3SNickeau                case "script":
134*21913ab3SNickeau                    foreach ($heads as $id => $headAttributes) {
135*21913ab3SNickeau                        if (isset($headAttributes['src'])) {
136*21913ab3SNickeau                            $src = $headAttributes['src'];
137*21913ab3SNickeau                            if (strpos($src, "lib/exe/js.php") !== false) {
138*21913ab3SNickeau                                unset($heads[$id]);
139*21913ab3SNickeau                            }
140*21913ab3SNickeau                        }
141*21913ab3SNickeau                    }
142*21913ab3SNickeau            }
143*21913ab3SNickeau        }
144*21913ab3SNickeau    }
145*21913ab3SNickeau
146*21913ab3SNickeau
147*21913ab3SNickeau}
148