xref: /plugin/combo/ComboStrap/FetcherMarkupWebcode.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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