1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace ComboStrap; 4*04fd306cSNickeau 5*04fd306cSNickeau 6*04fd306cSNickeauuse action_plugin_combo_css; 7*04fd306cSNickeauuse ComboStrap\Api\ApiRouter; 8*04fd306cSNickeauuse ComboStrap\Meta\Field\PageTemplateName; 9*04fd306cSNickeauuse ComboStrap\Web\Url; 10*04fd306cSNickeauuse ComboStrap\Web\UrlEndpoint; 11*04fd306cSNickeau 12*04fd306cSNickeau/** 13*04fd306cSNickeau * 14*04fd306cSNickeau * This code permits to render a markup from a string passed as argument 15*04fd306cSNickeau * 16*04fd306cSNickeau * Technically, it's the same than {@link FetcherMarkup} 17*04fd306cSNickeau * but: 18*04fd306cSNickeau * * it outputs the HTML within a minimal HTML page (no layout as in {@link FetcherPage}) 19*04fd306cSNickeau * * it gets the input from the url query properties 20*04fd306cSNickeau * 21*04fd306cSNickeau * It's used primarily by {@link \syntax_plugin_combo_webcode} 22*04fd306cSNickeau * that's why it's called webcode. 23*04fd306cSNickeau * 24*04fd306cSNickeau */ 25*04fd306cSNickeauclass FetcherMarkupWebcode extends IFetcherAbs implements IFetcherString 26*04fd306cSNickeau{ 27*04fd306cSNickeau 28*04fd306cSNickeau const CANONICAL = "webcode"; 29*04fd306cSNickeau const NAME = "markup"; 30*04fd306cSNickeau 31*04fd306cSNickeau public const MARKUP_PROPERTY = "markup"; 32*04fd306cSNickeau const TITLE_PROPERTY = "title"; 33*04fd306cSNickeau 34*04fd306cSNickeau private string $requestedMarkup; 35*04fd306cSNickeau private string $requestedTitle = "ComboStrap WebCode - Markup Renderer"; 36*04fd306cSNickeau 37*04fd306cSNickeau public static function createFetcherMarkup(string $markup): FetcherMarkupWebcode 38*04fd306cSNickeau { 39*04fd306cSNickeau return (new FetcherMarkupWebcode()) 40*04fd306cSNickeau ->setRequestedMarkup($markup); 41*04fd306cSNickeau } 42*04fd306cSNickeau 43*04fd306cSNickeau /** 44*04fd306cSNickeau * @throws ExceptionBadState - the markup is mandatory 45*04fd306cSNickeau */ 46*04fd306cSNickeau function getFetchUrl(Url $url = null): Url 47*04fd306cSNickeau { 48*04fd306cSNickeau $url = UrlEndpoint::createAjaxUrl() 49*04fd306cSNickeau ->addQueryParameter(ApiRouter::AJAX_CALL_ATTRIBUTE, ApiRouter::AJAX_CALL_VALUE) 50*04fd306cSNickeau ->addQueryParameter(self::MARKUP_PROPERTY, $this->getRequestedMarkup()) 51*04fd306cSNickeau ->addQueryParameter(self::TITLE_PROPERTY, $this->getRequestedTitle()); 52*04fd306cSNickeau return parent::getFetchUrl($url); 53*04fd306cSNickeau } 54*04fd306cSNickeau 55*04fd306cSNickeau 56*04fd306cSNickeau function getBuster(): string 57*04fd306cSNickeau { 58*04fd306cSNickeau try { 59*04fd306cSNickeau return FileSystems::getCacheBuster(ClassUtility::getClassPath(FetcherMarkupWebcode::class)); 60*04fd306cSNickeau } catch (ExceptionNotFound|\ReflectionException $e) { 61*04fd306cSNickeau LogUtility::internalError("The cache buster should be good. Error:{$e->getMessage()}", self::NAME); 62*04fd306cSNickeau return ""; 63*04fd306cSNickeau } 64*04fd306cSNickeau } 65*04fd306cSNickeau 66*04fd306cSNickeau public function buildFromTagAttributes(TagAttributes $tagAttributes): IFetcher 67*04fd306cSNickeau { 68*04fd306cSNickeau 69*04fd306cSNickeau $markupProperty = self::MARKUP_PROPERTY; 70*04fd306cSNickeau $markup = $tagAttributes->getValueAndRemove($markupProperty); 71*04fd306cSNickeau if ($markup === null) { 72*04fd306cSNickeau throw new ExceptionBadArgument("The markup property ($markupProperty) is mandatory"); 73*04fd306cSNickeau } 74*04fd306cSNickeau $this->setRequestedMarkup($markup); 75*04fd306cSNickeau $title = $tagAttributes->getValueAndRemove(self::TITLE_PROPERTY); 76*04fd306cSNickeau if ($title !== null) { 77*04fd306cSNickeau $this->setRequestedTitle($title); 78*04fd306cSNickeau } 79*04fd306cSNickeau return parent::buildFromTagAttributes($tagAttributes); 80*04fd306cSNickeau } 81*04fd306cSNickeau 82*04fd306cSNickeau 83*04fd306cSNickeau public function getMime(): Mime 84*04fd306cSNickeau { 85*04fd306cSNickeau return Mime::getHtml(); 86*04fd306cSNickeau } 87*04fd306cSNickeau 88*04fd306cSNickeau public function getFetcherName(): string 89*04fd306cSNickeau { 90*04fd306cSNickeau return self::NAME; 91*04fd306cSNickeau } 92*04fd306cSNickeau 93*04fd306cSNickeau /** 94*04fd306cSNickeau * @return string 95*04fd306cSNickeau * @throws ExceptionBadState - if the markup was not defined 96*04fd306cSNickeau * @throws ExceptionCompile - if any error 97*04fd306cSNickeau */ 98*04fd306cSNickeau public function getFetchString(): string 99*04fd306cSNickeau { 100*04fd306cSNickeau 101*04fd306cSNickeau /** 102*04fd306cSNickeau * Conf 103*04fd306cSNickeau */ 104*04fd306cSNickeau ExecutionContext::getActualOrCreateFromEnv() 105*04fd306cSNickeau ->getConfig() 106*04fd306cSNickeau ->setConf(action_plugin_combo_css::CONF_DISABLE_DOKUWIKI_STYLESHEET, true); 107*04fd306cSNickeau 108*04fd306cSNickeau $fetcherCache = FetcherCache::createFrom($this); 109*04fd306cSNickeau if ($fetcherCache->isCacheUsable()) { 110*04fd306cSNickeau try { 111*04fd306cSNickeau return FileSystems::getContent($fetcherCache->getFile()); 112*04fd306cSNickeau } catch (ExceptionNotFound $e) { 113*04fd306cSNickeau $message = "The cache file should exists"; 114*04fd306cSNickeau if (PluginUtility::isDevOrTest()) { 115*04fd306cSNickeau throw new ExceptionRuntimeInternal($message); 116*04fd306cSNickeau } 117*04fd306cSNickeau LogUtility::internalError($message); 118*04fd306cSNickeau } 119*04fd306cSNickeau } 120*04fd306cSNickeau 121*04fd306cSNickeau $requestedMarkup = $this->getRequestedMarkup(); 122*04fd306cSNickeau 123*04fd306cSNickeau try { 124*04fd306cSNickeau $mainContent = FetcherMarkup::confRoot() 125*04fd306cSNickeau ->setRequestedMarkupString($requestedMarkup) 126*04fd306cSNickeau ->setDeleteRootBlockElement(true) 127*04fd306cSNickeau ->setRequestedMimeToXhtml() 128*04fd306cSNickeau ->setRequestedContextPathWithDefault() 129*04fd306cSNickeau ->setIsStandAloneCodeExecution(true) 130*04fd306cSNickeau ->build() 131*04fd306cSNickeau ->getFetchString(); 132*04fd306cSNickeau } catch (ExceptionNotExists|ExceptionCompile $e) { 133*04fd306cSNickeau throw new ExceptionRuntimeInternal("An error has occurred while transforming the markup fragment to HTML. Error: {$e->getMessage()}", self::CANONICAL, 1, $e); 134*04fd306cSNickeau } 135*04fd306cSNickeau 136*04fd306cSNickeau $title = $this->getRequestedTitle(); 137*04fd306cSNickeau 138*04fd306cSNickeau $html = TemplateForWebPage::create() 139*04fd306cSNickeau ->setRequestedTitle($title) 140*04fd306cSNickeau ->setRequestedTemplateName(PageTemplateName::BLANK_TEMPLATE_VALUE) 141*04fd306cSNickeau ->setRequestedEnableTaskRunner(false) 142*04fd306cSNickeau ->setIsIframe(true) 143*04fd306cSNickeau ->setMainContent($mainContent) 144*04fd306cSNickeau ->render(); 145*04fd306cSNickeau 146*04fd306cSNickeau $fetcherCache->storeCache($html); 147*04fd306cSNickeau return $html; 148*04fd306cSNickeau 149*04fd306cSNickeau } 150*04fd306cSNickeau 151*04fd306cSNickeau public function setRequestedMarkup(string $markup): FetcherMarkupWebcode 152*04fd306cSNickeau { 153*04fd306cSNickeau $this->requestedMarkup = $markup; 154*04fd306cSNickeau return $this; 155*04fd306cSNickeau 156*04fd306cSNickeau } 157*04fd306cSNickeau 158*04fd306cSNickeau public function setRequestedTitle(string $title): FetcherMarkupWebcode 159*04fd306cSNickeau { 160*04fd306cSNickeau $this->requestedTitle = $title; 161*04fd306cSNickeau return $this; 162*04fd306cSNickeau } 163*04fd306cSNickeau 164*04fd306cSNickeau /** 165*04fd306cSNickeau * @throws ExceptionBadState 166*04fd306cSNickeau */ 167*04fd306cSNickeau private function getRequestedMarkup(): string 168*04fd306cSNickeau { 169*04fd306cSNickeau if (!isset($this->requestedMarkup)) { 170*04fd306cSNickeau throw new ExceptionBadState("The markup was not defined.", self::CANONICAL); 171*04fd306cSNickeau } 172*04fd306cSNickeau return $this->requestedMarkup; 173*04fd306cSNickeau } 174*04fd306cSNickeau 175*04fd306cSNickeau private function getRequestedTitle(): string 176*04fd306cSNickeau { 177*04fd306cSNickeau return $this->requestedTitle; 178*04fd306cSNickeau } 179*04fd306cSNickeau 180*04fd306cSNickeau 181*04fd306cSNickeau public function getLabel(): string 182*04fd306cSNickeau { 183*04fd306cSNickeau return self::CANONICAL; 184*04fd306cSNickeau } 185*04fd306cSNickeau 186*04fd306cSNickeau} 187