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