register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, '_ajax_call'); } /** * handle ajax requests * @param $event Doku_Event * * {@link html_show()} * * https://www.dokuwiki.org/devel:plugin_programming_tips#handle_json_ajax_request * * CSRF checks are only for logged in users * This is public ({@link getSecurityToken()} */ function _ajax_call(&$event) { if ($event->data !== self::CALL_ID) { return; } //no other ajax call handlers needed $event->stopPropagation(); $event->preventDefault(); global $INPUT; $marki = $INPUT->str(self::MARKI_PARAM); $title = $INPUT->str('title') ?: "ComboStrap WebCode - Dokuwiki Renderer"; header('Content-Type: text/html; charset=utf-8'); /** * Conf */ PluginUtility::setConf(action_plugin_combo_css::CONF_DISABLE_DOKUWIKI_STYLESHEET, true); /** * Main content happens before the headers * to set the headers right */ global $conf; $conf["renderer_xhtml"] = "xhtml"; global $ID; $keep = $ID; try { $ID = "ajax_webcode_" . md5($marki); $mainContent = p_render('xhtml', p_get_instructions($marki), $info); /** * Html */ $htmlBeforeHeads = '' . DOKU_LF; $htmlBeforeHeads .= '' . DOKU_LF; $htmlBeforeHeads .= '' . DOKU_LF; $htmlBeforeHeads .= " $title" . DOKU_LF; // we echo because the tpl function just flush echo $htmlBeforeHeads; if (Site::isStrapTemplate()) { /** * The strap header function */ try { Site::loadStrapUtilityTemplateIfPresentAndSameVersion(); TplUtility::registerHeaderHandler(); } catch (ExceptionCombo $e) { \ComboStrap\LogUtility::log2file("Error while registering the header handler on webcode ajax call. Error: {$e->getMessage()}"); } } /** * To delete the not needed headers for an export * such as manifest, alternate, ... */ global $EVENT_HANDLER; $EVENT_HANDLER->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, '_delete_not_needed_headers'); /** * meta headers */ tpl_metaheaders(); $htmlAfterHeads = '' . DOKU_LF; $htmlAfterHeads .= '' . DOKU_LF; $htmlAfterHeads .= $mainContent . DOKU_LF; $htmlAfterHeads .= '' . DOKU_LF; $htmlAfterHeads .= '' . DOKU_LF; echo $htmlAfterHeads; http_response_code(200); } finally { $ID = $keep; } } /** * Dynamically called in the previous function * to delete the head * @param $event */ public function _delete_not_needed_headers(&$event) { $data = &$event->data; foreach ($data as $tag => &$heads) { switch ($tag) { case "link": $deletedRel = ["manifest", "search", "start", "alternate", "contents"]; foreach ($heads as $id => $headAttributes) { if (isset($headAttributes['rel'])) { $rel = $headAttributes['rel']; if (in_array($rel, $deletedRel)) { unset($heads[$id]); } } } break; case "meta": $deletedMeta = ["robots"]; foreach ($heads as $id => $headAttributes) { if (isset($headAttributes['name'])) { $rel = $headAttributes['name']; if (in_array($rel, $deletedMeta)) { unset($heads[$id]); } } } break; case "script": foreach ($heads as $id => $headAttributes) { if (isset($headAttributes['src'])) { $src = $headAttributes['src']; if (strpos($src, "lib/exe/js.php") !== false) { unset($heads[$id]); } } } } } } }