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