xref: /template/strap/ComboStrap/Prism.php (revision 37748cd8654635afbeca80942126742f0f4cc346)
1*37748cd8SNickeau<?php
2*37748cd8SNickeau
3*37748cd8SNickeaunamespace ComboStrap;
4*37748cd8SNickeau
5*37748cd8SNickeau
6*37748cd8SNickeauuse Doku_Renderer_xhtml;
7*37748cd8SNickeauuse syntax_plugin_combo_code;
8*37748cd8SNickeau
9*37748cd8SNickeauclass Prism
10*37748cd8SNickeau{
11*37748cd8SNickeau
12*37748cd8SNickeau    const SNIPPET_NAME = 'prism';
13*37748cd8SNickeau    /**
14*37748cd8SNickeau     * The class used to mark the added prism code
15*37748cd8SNickeau     */
16*37748cd8SNickeau    const BASE_PRISM_CDN = "https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/";
17*37748cd8SNickeau    /**
18*37748cd8SNickeau     * The default prompt for bash
19*37748cd8SNickeau     */
20*37748cd8SNickeau    const CONF_BASH_PROMPT = "bashPrompt";
21*37748cd8SNickeau    /**
22*37748cd8SNickeau     * The default prompt for batch (dos)
23*37748cd8SNickeau     */
24*37748cd8SNickeau    const CONF_BATCH_PROMPT = "batchPrompt";
25*37748cd8SNickeau    /**
26*37748cd8SNickeau     * The default prompt for powershell
27*37748cd8SNickeau     */
28*37748cd8SNickeau    const CONF_POWERSHELL_PROMPT = "powershellPrompt";
29*37748cd8SNickeau
30*37748cd8SNickeau    /**
31*37748cd8SNickeau     * The default name of prism
32*37748cd8SNickeau     * It does not follow the naming of the theming
33*37748cd8SNickeau     */
34*37748cd8SNickeau    const PRISM_THEME = "prism";
35*37748cd8SNickeau
36*37748cd8SNickeau    /**
37*37748cd8SNickeau     * @var string[] https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/themes/prism-{theme}.min.css
38*37748cd8SNickeau     *
39*37748cd8SNickeau     * or default
40*37748cd8SNickeau     *
41*37748cd8SNickeau     * https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/themes/prism.min.css
42*37748cd8SNickeau     *
43*37748cd8SNickeau     * or
44*37748cd8SNickeau     *
45*37748cd8SNickeau     * https://github.com/PrismJS/prism-themes
46*37748cd8SNickeau     *
47*37748cd8SNickeau     * from https://cdnjs.com/libraries/prism
48*37748cd8SNickeau     */
49*37748cd8SNickeau    const THEMES_INTEGRITY = [
50*37748cd8SNickeau        Prism::PRISM_THEME => "sha512-tN7Ec6zAFaVSG3TpNAKtk4DOHNpSwKHxxrsiw4GHKESGPs5njn/0sMCUMl2svV4wo4BK/rCP7juYz+zx+l6oeQ==",
51*37748cd8SNickeau        "coy" => "sha512-CKzEMG9cS0+lcH4wtn/UnxnmxkaTFrviChikDEk1MAWICCSN59sDWIF0Q5oDgdG9lxVrvbENSV1FtjLiBnMx7Q==",
52*37748cd8SNickeau        "dark" => "sha512-Njdz7T/p6Ud1FiTMqH87bzDxaZBsVNebOWmacBjMdgWyeIhUSFU4V52oGwo3sT+ud+lyIE98sS291/zxBfozKw==",
53*37748cd8SNickeau        "funky" => "sha512-q59Usnbm/Dz3MeqoMEATHqIwozatJmXr/bFurDR7hpB5e2KxU+j2mp89Am9wq9jwZRaikpnKGHw4LP/Kr9soZQ==",
54*37748cd8SNickeau        "okaidia" => "sha512-mIs9kKbaw6JZFfSuo+MovjU+Ntggfoj8RwAmJbVXQ5mkAX5LlgETQEweFPI18humSPHymTb5iikEOKWF7I8ncQ==",
55*37748cd8SNickeau        "solarizedlight" => "sha512-fibfhB71IpdEKqLKXP/96WuX1cTMmvZioYp7T6I+lTbvJrrjEGeyYdAf09GHpFptF8toQ32woGZ8bw9+HjZc0A==",
56*37748cd8SNickeau        "tomorrow" => "sha512-vswe+cgvic/XBoF1OcM/TeJ2FW0OofqAVdCZiEYkd6dwGXthvkSFWOoGGJgS2CW70VK5dQM5Oh+7ne47s74VTg==",
57*37748cd8SNickeau        "twilight" => "sha512-akb4nfKzpmhujLUyollw5waBPeohuVf0Z5+cL+4Ngc4Db+V8szzx6ZTujguFjpmD076W8LImVIbOblmQ+vZMKA=="
58*37748cd8SNickeau    ];
59*37748cd8SNickeau
60*37748cd8SNickeau    /**
61*37748cd8SNickeau     * The theme
62*37748cd8SNickeau     */
63*37748cd8SNickeau    const CONF_PRISM_THEME = "prismTheme";
64*37748cd8SNickeau    const PRISM_THEME_DEFAULT = "tomorrow";
65*37748cd8SNickeau    const SNIPPET_ID_AUTOLOADER = self::SNIPPET_NAME . "-autoloader";
66*37748cd8SNickeau
67*37748cd8SNickeau
68*37748cd8SNickeau    /**
69*37748cd8SNickeau     *
70*37748cd8SNickeau     * @param $theme
71*37748cd8SNickeau     *
72*37748cd8SNickeau     * Ter info: The theme of the default wiki is in the print.css file (search for code blocks)
73*37748cd8SNickeau     */
74*37748cd8SNickeau    public static function addSnippet($theme)
75*37748cd8SNickeau    {
76*37748cd8SNickeau        $BASE_PRISM_CDN = self::BASE_PRISM_CDN;
77*37748cd8SNickeau
78*37748cd8SNickeau        if ($theme == self::PRISM_THEME) {
79*37748cd8SNickeau            $themeStyleSheet = "prism.min.css";
80*37748cd8SNickeau        } else {
81*37748cd8SNickeau            $themeStyleSheet = "prism-$theme.min.css";
82*37748cd8SNickeau        }
83*37748cd8SNickeau        $themeIntegrity = self::THEMES_INTEGRITY[$theme];
84*37748cd8SNickeau
85*37748cd8SNickeau        /**
86*37748cd8SNickeau         * We miss a bottom margin
87*37748cd8SNickeau         * as a paragraph
88*37748cd8SNickeau         */
89*37748cd8SNickeau        PluginUtility::getSnippetManager()->attachCssSnippetForBar(self::SNIPPET_NAME );
90*37748cd8SNickeau
91*37748cd8SNickeau        /**
92*37748cd8SNickeau         * Javascript
93*37748cd8SNickeau         */
94*37748cd8SNickeau        $tags = array();
95*37748cd8SNickeau        $tags['script'][] = array("src" => "$BASE_PRISM_CDN/components/prism-core.min.js");
96*37748cd8SNickeau        $tags['script'][] = array("src" => "$BASE_PRISM_CDN/plugins/toolbar/prism-toolbar.min.js");
97*37748cd8SNickeau        // https://prismjs.com/plugins/normalize-whitespace/
98*37748cd8SNickeau        $tags['script'][] = array("src" => "$BASE_PRISM_CDN/plugins/normalize-whitespace/prism-normalize-whitespace.min.js");
99*37748cd8SNickeau        // https://prismjs.com/plugins/show-language/
100*37748cd8SNickeau        $tags['script'][] = array("src" => "$BASE_PRISM_CDN/plugins/show-language/prism-show-language.min.js");
101*37748cd8SNickeau        // https://prismjs.com/plugins/command-line/
102*37748cd8SNickeau        $tags['script'][] = array("src" => "$BASE_PRISM_CDN/plugins/command-line/prism-command-line.min.js");
103*37748cd8SNickeau        //https://prismjs.com/plugins/line-numbers/
104*37748cd8SNickeau        $tags['script'][] = array("src" => "$BASE_PRISM_CDN/plugins/line-numbers/prism-line-numbers.min.js");
105*37748cd8SNickeau        // https://prismjs.com/plugins/download-button/-->
106*37748cd8SNickeau        $tags['script'][] = array(
107*37748cd8SNickeau            "src" => "$BASE_PRISM_CDN/plugins/download-button/prism-download-button.min.js",
108*37748cd8SNickeau            "integrity" => "sha512-rGJwSZEEYPBQjqYxrdg6Ug/6i763XQogKx+N/GF1rCGvfmhIlIUFxCjc4FmEdCu5dvovqxHsoe3IPMKP+KlgNQ==",
109*37748cd8SNickeau            "crossorigin" => "anonymous"
110*37748cd8SNickeau        );
111*37748cd8SNickeau
112*37748cd8SNickeau        PluginUtility::getSnippetManager()->upsertTagsForBar(self::SNIPPET_NAME, $tags);
113*37748cd8SNickeau
114*37748cd8SNickeau        $javascriptCode = <<<EOD
115*37748cd8SNickeaudocument.addEventListener('DOMContentLoaded', (event) => {
116*37748cd8SNickeau
117*37748cd8SNickeau    if (typeof self === 'undefined' || !self.Prism || !self.document) {
118*37748cd8SNickeau        return;
119*37748cd8SNickeau    }
120*37748cd8SNickeau
121*37748cd8SNickeau    // Loading the css from https://cdnjs.com/libraries/prism
122*37748cd8SNickeau    const head = document.querySelector('head');
123*37748cd8SNickeau    const baseCdn = "$BASE_PRISM_CDN";
124*37748cd8SNickeau    const stylesheets = [
125*37748cd8SNickeau        ["themes/$themeStyleSheet", "$themeIntegrity"],
126*37748cd8SNickeau        ["plugins/toolbar/prism-toolbar.min.css","sha512-DSAA0ziYwggOJ3QyWFZhIaU8bSwQLyfnyIrmShRLBdJMtiYKT7Ju35ujBCZ6ApK3HURt34p2xNo+KX9ebQNEPQ=="],
127*37748cd8SNickeau        /*https://prismjs.com/plugins/command-line/*/
128*37748cd8SNickeau        ["plugins/command-line/prism-command-line.min.css","sha512-4Y1uID1tEWeqDdbb7452znwjRVwseCy9kK9BNA7Sv4PlMroQzYRznkoWTfRURSADM/SbfZSbv/iW5sNpzSbsYg=="],
129*37748cd8SNickeau        /*https://prismjs.com/plugins/line-numbers/*/
130*37748cd8SNickeau        ["plugins/line-numbers/prism-line-numbers.min.css","sha512-cbQXwDFK7lj2Fqfkuxbo5iD1dSbLlJGXGpfTDqbggqjHJeyzx88I3rfwjS38WJag/ihH7lzuGlGHpDBymLirZQ=="]
131*37748cd8SNickeau    ];
132*37748cd8SNickeau
133*37748cd8SNickeau    stylesheets.forEach(stylesheet => {
134*37748cd8SNickeau            let link = document.createElement('link');
135*37748cd8SNickeau            link.rel="stylesheet"
136*37748cd8SNickeau            link.href=baseCdn+"/"+stylesheet[0];
137*37748cd8SNickeau            link.integrity=stylesheet[1];
138*37748cd8SNickeau            link.crossOrigin="anonymous";
139*37748cd8SNickeau            head.append(link);
140*37748cd8SNickeau        }
141*37748cd8SNickeau    )
142*37748cd8SNickeau
143*37748cd8SNickeau
144*37748cd8SNickeau    Prism.plugins.NormalizeWhitespace.setDefaults({
145*37748cd8SNickeau        'remove-trailing': true,
146*37748cd8SNickeau        'remove-indent': true,
147*37748cd8SNickeau        'left-trim': true,
148*37748cd8SNickeau        'right-trim': true,
149*37748cd8SNickeau    });
150*37748cd8SNickeau
151*37748cd8SNickeau    if (!Prism.plugins.toolbar) {
152*37748cd8SNickeau        console.warn('Copy to Clipboard plugin loaded before Toolbar plugin.');
153*37748cd8SNickeau
154*37748cd8SNickeau        return;
155*37748cd8SNickeau    }
156*37748cd8SNickeau
157*37748cd8SNickeau    let ClipboardJS = window.ClipboardJS || undefined;
158*37748cd8SNickeau
159*37748cd8SNickeau    if (!ClipboardJS && typeof require === 'function') {
160*37748cd8SNickeau        ClipboardJS = require('clipboard');
161*37748cd8SNickeau    }
162*37748cd8SNickeau
163*37748cd8SNickeau    const callbacks = [];
164*37748cd8SNickeau
165*37748cd8SNickeau    if (!ClipboardJS) {
166*37748cd8SNickeau        const script = document.createElement('script');
167*37748cd8SNickeau        const head = document.querySelector('head');
168*37748cd8SNickeau
169*37748cd8SNickeau        script.onload = function() {
170*37748cd8SNickeau            ClipboardJS = window.ClipboardJS;
171*37748cd8SNickeau
172*37748cd8SNickeau            if (ClipboardJS) {
173*37748cd8SNickeau                while (callbacks.length) {
174*37748cd8SNickeau                    callbacks.pop()();
175*37748cd8SNickeau                }
176*37748cd8SNickeau            }
177*37748cd8SNickeau        };
178*37748cd8SNickeau
179*37748cd8SNickeau        script.src = 'https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js';
180*37748cd8SNickeau        head.appendChild(script);
181*37748cd8SNickeau    }
182*37748cd8SNickeau
183*37748cd8SNickeau    Prism.plugins.toolbar.registerButton('copy-to-clipboard', function (env) {
184*37748cd8SNickeau        var linkCopy = document.createElement('button');
185*37748cd8SNickeau        linkCopy.textContent = 'Copy';
186*37748cd8SNickeau        linkCopy.setAttribute('type', 'button');
187*37748cd8SNickeau
188*37748cd8SNickeau        var element = env.element;
189*37748cd8SNickeau
190*37748cd8SNickeau        if (!ClipboardJS) {
191*37748cd8SNickeau            callbacks.push(registerClipboard);
192*37748cd8SNickeau        } else {
193*37748cd8SNickeau            registerClipboard();
194*37748cd8SNickeau        }
195*37748cd8SNickeau
196*37748cd8SNickeau        return linkCopy;
197*37748cd8SNickeau
198*37748cd8SNickeau        function registerClipboard() {
199*37748cd8SNickeau            var clip = new ClipboardJS(linkCopy, {
200*37748cd8SNickeau                'text': function () {
201*37748cd8SNickeau                    return element.textContent;
202*37748cd8SNickeau                }
203*37748cd8SNickeau            });
204*37748cd8SNickeau
205*37748cd8SNickeau            clip.on('success', function() {
206*37748cd8SNickeau                linkCopy.textContent = 'Copied!';
207*37748cd8SNickeau
208*37748cd8SNickeau                resetText();
209*37748cd8SNickeau            });
210*37748cd8SNickeau            clip.on('error', function () {
211*37748cd8SNickeau                linkCopy.textContent = 'Press Ctrl+C to copy';
212*37748cd8SNickeau
213*37748cd8SNickeau                resetText();
214*37748cd8SNickeau            });
215*37748cd8SNickeau        }
216*37748cd8SNickeau
217*37748cd8SNickeau        function resetText() {
218*37748cd8SNickeau            setTimeout(function () {
219*37748cd8SNickeau                linkCopy.textContent = 'Copy';
220*37748cd8SNickeau            }, 5000);
221*37748cd8SNickeau        }
222*37748cd8SNickeau    });
223*37748cd8SNickeau
224*37748cd8SNickeau});
225*37748cd8SNickeauEOD;
226*37748cd8SNickeau        PluginUtility::getSnippetManager()->upsertJavascriptForBar(self::SNIPPET_NAME, $javascriptCode);
227*37748cd8SNickeau
228*37748cd8SNickeau    }
229*37748cd8SNickeau
230*37748cd8SNickeau    /**
231*37748cd8SNickeau     * Add the first block of prism
232*37748cd8SNickeau     * @param \Doku_Renderer_xhtml $renderer
233*37748cd8SNickeau     * @param TagAttributes $attributes
234*37748cd8SNickeau     * @param \DokuWiki_Syntax_Plugin $plugin
235*37748cd8SNickeau     */
236*37748cd8SNickeau    public static function htmlEnter(\Doku_Renderer_xhtml $renderer, \DokuWiki_Syntax_Plugin $plugin, $attributes = null)
237*37748cd8SNickeau    {
238*37748cd8SNickeau
239*37748cd8SNickeau        if ($attributes == null) {
240*37748cd8SNickeau            $attributes = TagAttributes::createEmpty();
241*37748cd8SNickeau        }
242*37748cd8SNickeau
243*37748cd8SNickeau        /**
244*37748cd8SNickeau         * Display none, no rendering
245*37748cd8SNickeau         */
246*37748cd8SNickeau        $display = $attributes->getValueAndRemove("display");
247*37748cd8SNickeau        if ($display != null) {
248*37748cd8SNickeau            if ($display == "none") {
249*37748cd8SNickeau                return;
250*37748cd8SNickeau            }
251*37748cd8SNickeau        }
252*37748cd8SNickeau
253*37748cd8SNickeau
254*37748cd8SNickeau
255*37748cd8SNickeau        /**
256*37748cd8SNickeau         * Add prism theme
257*37748cd8SNickeau         */
258*37748cd8SNickeau        $theme = $plugin->getConf(Prism::CONF_PRISM_THEME);
259*37748cd8SNickeau        Prism::addSnippet($theme);
260*37748cd8SNickeau
261*37748cd8SNickeau        /**
262*37748cd8SNickeau         * Logical tag
263*37748cd8SNickeau         */
264*37748cd8SNickeau        $logicalTag = $plugin->getPluginComponent();
265*37748cd8SNickeau        if ($attributes->getLogicalTag() != null) {
266*37748cd8SNickeau            $logicalTag = $attributes->getLogicalTag();
267*37748cd8SNickeau        }
268*37748cd8SNickeau        // for the https://combostrap.com/styling/userstyle
269*37748cd8SNickeau        $attributes->setLogicalTag($logicalTag."-container");
270*37748cd8SNickeau
271*37748cd8SNickeau        /**
272*37748cd8SNickeau         * The child element (code) of the `pre` element
273*37748cd8SNickeau         * The container is the passed `attributes`
274*37748cd8SNickeau         * We can then constrained in height ...
275*37748cd8SNickeau         * It contains the language
276*37748cd8SNickeau         */
277*37748cd8SNickeau        $codeAttributes = TagAttributes::createEmpty($logicalTag);
278*37748cd8SNickeau        $codeAttributes->setType($attributes->getType());
279*37748cd8SNickeau        $language = $attributes->getValue(TagAttributes::TYPE_KEY);
280*37748cd8SNickeau        if ($language == null) {
281*37748cd8SNickeau            // Prism does not have any default language
282*37748cd8SNickeau            // There is a bug has it tried to download the txt javascript
283*37748cd8SNickeau            // but without language, there is no styling
284*37748cd8SNickeau            $language = "txt";
285*37748cd8SNickeau        } else {
286*37748cd8SNickeau            $language = strtolower($language);
287*37748cd8SNickeau            Prism::addAutoloaderSnippet();
288*37748cd8SNickeau        }
289*37748cd8SNickeau
290*37748cd8SNickeau        if (in_array($language, \syntax_plugin_combo_webcode::MARKIS)) {
291*37748cd8SNickeau            // Marki is not fully markdown
292*37748cd8SNickeau            // because it accepts space in super set html container and
293*37748cd8SNickeau            // prism will highlight them as indented code
294*37748cd8SNickeau            $language = "html";
295*37748cd8SNickeau        }
296*37748cd8SNickeau        /**
297*37748cd8SNickeau         * Language name mapping between the dokuwiki default
298*37748cd8SNickeau         * and prism
299*37748cd8SNickeau         */
300*37748cd8SNickeau        if ($language == "rsplus") {
301*37748cd8SNickeau            $language = "r";
302*37748cd8SNickeau        }
303*37748cd8SNickeau        if ($language == "dos") {
304*37748cd8SNickeau            $language = "batch";
305*37748cd8SNickeau        }
306*37748cd8SNickeau        if ($language == "apache") {
307*37748cd8SNickeau            $language = "apacheconf";
308*37748cd8SNickeau        }
309*37748cd8SNickeau        if ($language == "babel") {
310*37748cd8SNickeau            $language = "javascript";
311*37748cd8SNickeau        }
312*37748cd8SNickeau
313*37748cd8SNickeau        StringUtility::addEolCharacterIfNotPresent($renderer->doc);
314*37748cd8SNickeau        $codeAttributes->addClassName('language-' . $language);
315*37748cd8SNickeau        /**
316*37748cd8SNickeau         * Code element
317*37748cd8SNickeau         * Don't put a fucking EOL after it
318*37748cd8SNickeau         * Otherwise it fucked up the output as the text below a code tag is printed
319*37748cd8SNickeau         */
320*37748cd8SNickeau        $codeHtml = $codeAttributes->toHtmlEnterTag('code');
321*37748cd8SNickeau        $attributes->addHtmlAfterEnterTag($codeHtml);
322*37748cd8SNickeau
323*37748cd8SNickeau
324*37748cd8SNickeau        /**
325*37748cd8SNickeau         * Pre Element
326*37748cd8SNickeau         * Line numbers
327*37748cd8SNickeau         */
328*37748cd8SNickeau        if ($attributes->hasComponentAttribute("line-numbers")) {
329*37748cd8SNickeau            $attributes->removeComponentAttribute("line-numbers");
330*37748cd8SNickeau            $attributes->addClassName('line-numbers');
331*37748cd8SNickeau        }
332*37748cd8SNickeau
333*37748cd8SNickeau
334*37748cd8SNickeau        // Command line
335*37748cd8SNickeau        if ($attributes->hasComponentAttribute("prompt")) {
336*37748cd8SNickeau            $attributes->addClassName("command-line");
337*37748cd8SNickeau            $attributes->addHtmlAttributeValue("data-prompt", $attributes->getValueAndRemove("prompt"));
338*37748cd8SNickeau        } else {
339*37748cd8SNickeau            switch ($language) {
340*37748cd8SNickeau                case "bash":
341*37748cd8SNickeau                    $attributes->addClassName("command-line");
342*37748cd8SNickeau                    $attributes->addHtmlAttributeValue("data-prompt", $plugin->getConf(self::CONF_BASH_PROMPT));
343*37748cd8SNickeau                    break;
344*37748cd8SNickeau                case "batch":
345*37748cd8SNickeau                    $attributes->addClassName("command-line");
346*37748cd8SNickeau                    $batch = trim($plugin->getConf(self::CONF_BATCH_PROMPT));
347*37748cd8SNickeau                    if (!empty($batch)) {
348*37748cd8SNickeau                        if (!strpos($batch, -1) == ">") {
349*37748cd8SNickeau                            $batch .= ">";
350*37748cd8SNickeau                        }
351*37748cd8SNickeau                    }
352*37748cd8SNickeau                    $attributes->addHtmlAttributeValue("data-prompt", $batch);
353*37748cd8SNickeau                    break;
354*37748cd8SNickeau                case "powershell":
355*37748cd8SNickeau                    $attributes->addClassName("command-line");
356*37748cd8SNickeau                    $powerShell = trim($plugin->getConf(self::CONF_POWERSHELL_PROMPT));
357*37748cd8SNickeau                    if (!empty($powerShell)) {
358*37748cd8SNickeau                        if (!strpos($powerShell, -1) == ">") {
359*37748cd8SNickeau                            $powerShell .= ">";
360*37748cd8SNickeau                        }
361*37748cd8SNickeau                    }
362*37748cd8SNickeau                    $attributes->addHtmlAttributeValue("data-prompt", $powerShell);
363*37748cd8SNickeau                    break;
364*37748cd8SNickeau            }
365*37748cd8SNickeau        }
366*37748cd8SNickeau
367*37748cd8SNickeau        // Download
368*37748cd8SNickeau        $attributes->addHtmlAttributeValue('data-download-link', true);
369*37748cd8SNickeau        if ($attributes->hasComponentAttribute(syntax_plugin_combo_code::FILE_PATH_KEY)) {
370*37748cd8SNickeau            $fileSrc = $attributes->getValueAndRemove(syntax_plugin_combo_code::FILE_PATH_KEY);
371*37748cd8SNickeau            $attributes->addHtmlAttributeValue('data-src', $fileSrc);
372*37748cd8SNickeau            $attributes->addHtmlAttributeValue('data-download-link-label', "Download " . $fileSrc);
373*37748cd8SNickeau        } else {
374*37748cd8SNickeau            $fileName = "file." . $language;
375*37748cd8SNickeau            $attributes->addHtmlAttributeValue('data-src', $fileName);
376*37748cd8SNickeau        }
377*37748cd8SNickeau        /**
378*37748cd8SNickeau         * No end of line after the pre, please, otherwise we get a new line
379*37748cd8SNickeau         * in the code output
380*37748cd8SNickeau         */
381*37748cd8SNickeau        $htmlCode = $attributes->toHtmlEnterTag("pre");
382*37748cd8SNickeau
383*37748cd8SNickeau
384*37748cd8SNickeau        /**
385*37748cd8SNickeau         * Return
386*37748cd8SNickeau         */
387*37748cd8SNickeau        $renderer->doc .= $htmlCode;
388*37748cd8SNickeau
389*37748cd8SNickeau    }
390*37748cd8SNickeau
391*37748cd8SNickeau    /**
392*37748cd8SNickeau     * @param Doku_Renderer_xhtml $renderer
393*37748cd8SNickeau     * @param TagAttributes $attributes
394*37748cd8SNickeau     */
395*37748cd8SNickeau    public static function htmlExit(\Doku_Renderer_xhtml $renderer, $attributes = null)
396*37748cd8SNickeau    {
397*37748cd8SNickeau
398*37748cd8SNickeau        if ($attributes != null) {
399*37748cd8SNickeau            /**
400*37748cd8SNickeau             * Display none, no rendering
401*37748cd8SNickeau             */
402*37748cd8SNickeau            $display = $attributes->getValueAndRemove("display");
403*37748cd8SNickeau            if ($display != null) {
404*37748cd8SNickeau                if ($display == "none") {
405*37748cd8SNickeau                    return;
406*37748cd8SNickeau                }
407*37748cd8SNickeau            }
408*37748cd8SNickeau        }
409*37748cd8SNickeau        $renderer->doc .= '</code>' . DOKU_LF . '</pre>' . DOKU_LF;
410*37748cd8SNickeau    }
411*37748cd8SNickeau
412*37748cd8SNickeau    /**
413*37748cd8SNickeau     * The autoloader try to download all language
414*37748cd8SNickeau     * Even the one such as txt that does not exist
415*37748cd8SNickeau     * This function was created to add it conditionally
416*37748cd8SNickeau     */
417*37748cd8SNickeau    private static function addAutoloaderSnippet()
418*37748cd8SNickeau    {
419*37748cd8SNickeau        $tags = [];
420*37748cd8SNickeau        $tags['script'][] = array("src" => self::BASE_PRISM_CDN . "/plugins/autoloader/prism-autoloader.min.js");
421*37748cd8SNickeau        PluginUtility::getSnippetManager()->upsertTagsForBar(self::SNIPPET_ID_AUTOLOADER, $tags);
422*37748cd8SNickeau    }
423*37748cd8SNickeau
424*37748cd8SNickeau
425*37748cd8SNickeau}
426