['onPageInitialized', 0], 'onShortcodeHandlers' => ['onShortcodeHandlers', 0], 'onTwigTemplatePaths' => ['onTwigTemplatePaths', 0], 'registerNextGenEditorPlugin' => ['registerNextGenEditorPluginShortcodes', 0], ]; } /** * Initialize configuration */ public function onPageInitialized() { if ($this->isAdmin()) { return; } $defaults = (array)$this->config->get('plugins.prism-highlight'); /** @var Page $page */ $page = $this->grav['page']; // wrong way - kept for compatibility if (isset($page->header()->prism)) { $this->config->set('plugins.prism-highlight', array_merge($defaults, $page->header()->prism)); } // correct way as documented if (isset($page->header()->{'prism-highlight'})) { $this->config->set('plugins.prism-highlight', array_merge($defaults, $page->header()->{'prism-highlight'})); } if ($this->config->get('plugins.prism-highlight.enabled')) { $this->enable([ 'onTwigSiteVariables' => ['onTwigSiteVariables', 0] ]); } } /** * Initialize configuration */ public function onShortcodeHandlers() { $this->grav['shortcode']->registerAllShortcodes(__DIR__.'/shortcodes'); } /** * Add current directory to twig lookup paths. */ public function onTwigTemplatePaths() { $this->grav['twig']->twig_paths[] = __DIR__ . '/templates'; } /** * if enabled on this page, load the JS + CSS theme. */ public function onTwigSiteVariables() { $selected_theme = $this->config->get('plugins.prism-highlight.theme') ?: 'prism-default.css'; $css = $this->config->get('plugins.prism-highlight.custom.css_location'); $theme = $this->config->get('plugins.prism-highlight.custom.theme_location'); $js = $this->config->get('plugins.prism-highlight.custom.js_location'); if (!file_exists($css)) { $css = 'plugin://prism-highlight/css/prism.css'; } if (!file_exists($theme)) { $theme = 'plugin://prism-highlight/css/themes/' . $selected_theme; } if (!file_exists($js)) { $js = 'plugin://prism-highlight/js/prism.js'; } $this->grav['assets']->addCss($css); $this->grav['assets']->addCss($theme); $this->grav['assets']->addJs($js, null, true, null, 'bottom'); $all_pre_blocks = $this->config->get('plugins.prism-highlight.all-pre-blocks'); $line_numbers = $this->config->get('plugins.prism-highlight.plugins.line-numbers'); $command_line = $this->config->get('plugins.prism-highlight.plugins.command-line'); $inline = ""; if ($all_pre_blocks || $line_numbers || $command_line) { $inline .= "var __prism_nodes = null;\n"; } // Always add at least plain text language if ($all_pre_blocks) { $inline .= "__prism_nodes = document.querySelectorAll('pre:not([class*=\"language-\"])');\n"; $inline .= $this->_addJsClass('language-txt'); } // Line Numbers management || Command Line management if ($line_numbers || $command_line) { $inline .= "__prism_nodes = document.querySelectorAll('pre');\n"; if ($line_numbers) { $inline .= $this->_addJsClass('line-numbers'); } if ($command_line) { $inline .= $this->_addJsClass('command-line'); } } if ($inline) { $this->grav['assets']->addInlineJs($inline, null, 'bottom'); } } public function registerNextGenEditorPluginShortcodes($event) { $plugins = $event['plugins']; $plugins['js'][] = 'plugin://prism-highlight/nextgen-editor/shortcodes/prism/prism.js'; $plugins['css'][] = 'plugin://prism-highlight/nextgen-editor/shortcodes/prism/prism.css'; $event['plugins'] = $plugins; return $event; } public static function themeOptions() { $options = []; $theme_files = glob(__dir__ . '/css/themes/*.css'); foreach ($theme_files as $theme_file) { $theme = basename($theme_file); $options[$theme] = Inflector::titleize(basename($theme, '.css')); } return $options; } private function _addJsClass($class = '') { return "__prism_nodes.forEach(function(node) { node.classList.add('" . $class . "'); });\n"; } }