/** * Compile a less file to css and add to css folder * * @param string $file Path to less file * @param string $media Media type * @param string $conditionalStylesheet Load condition for file * * @return void */ public function addLessStylesheet($file, $media = 'all', $conditionalStylesheet = false) { $relPath = 'less/' . $file; $urlHelper = $this->getView()->plugin('url'); $currentTheme = $this->themeInfo->findContainingTheme($relPath); $helperHome = $urlHelper('home'); $home = APPLICATION_PATH . '/themes/' . $currentTheme . '/'; $cssDirectory = $helperHome . 'themes/' . $currentTheme . '/css/less/'; try { $less_files = [APPLICATION_PATH . '/themes/' . $currentTheme . '/' . $relPath => $cssDirectory]; $themeParents = array_keys($this->themeInfo->getThemeInfo()); $directories = []; foreach ($themeParents as $theme) { $directories[APPLICATION_PATH . '/themes/' . $theme . '/less/'] = $helperHome . 'themes/' . $theme . '/css/less/'; } $css_file_name = \Less_Cache::Get($less_files, ['cache_dir' => $home . 'css/less/', 'cache_method' => false, 'compress' => true, 'import_dirs' => $directories, 'output' => str_replace('.less', '.css', $file)]); $this->prependStylesheet($cssDirectory . $css_file_name, $media, $conditionalStylesheet); } catch (\Exception $e) { error_log($e->getMessage()); list($fileName, ) = explode('.', $file); $this->prependStylesheet($urlHelper('home') . "themes/{$currentTheme}/css/{$fileName}.css"); } }
/** * Initialize the theme. This needs to be triggered as part of the dispatch * event. * * @throws \Exception * @return void */ public function init() { // Determine the current theme: $currentTheme = $this->pickTheme($this->event->getRequest()); // Determine theme options: $this->sendThemeOptionsToView(); // Make sure the current theme is set correctly in the tools object: try { $this->tools->setTheme($currentTheme); } catch (\Exception $error) { // If an illegal value is passed in, the setter may throw an exception. // We should ignore it for now and throw it after we have set up the // theme (the setter will use a safe value instead of the illegal one). } // Using the settings we initialized above, actually configure the themes; we // need to do this even if there is an error, since we need a theme in order // to display an error message! $this->setUpThemes(array_reverse($this->tools->getThemeInfo())); // If we encountered an error loading theme settings, fail now. if (isset($error)) { throw new \Exception($error->getMessage()); } }
/** * Compile a LESS file inside a theme. * * @param string $theme Theme containing file * @param string $less Relative path to LESS file * * @return void */ protected function compileFile($theme, $less) { $parts = explode(':', $less); $less = $parts[0]; $finalOutDir = $this->basePath . '/themes/' . $theme . '/css/'; list($fileName, ) = explode('.', $less); $finalFile = $finalOutDir . $fileName . '.css'; $this->logMessage("\tcompiling '" . $less . "' into '" . $finalFile . "'"); $start = microtime(true); $directories = []; $info = new ThemeInfo($this->basePath . '/themes', $theme); foreach (array_keys($info->getThemeInfo()) as $curTheme) { $directories["{$this->basePath}/themes/{$curTheme}/less/"] = $this->fakePath . "themes/{$curTheme}/css/less"; } $lessDir = $this->basePath . '/themes/' . $theme . '/less/'; if (!file_exists($lessDir . $less)) { $this->logMessage("\t\t" . $lessDir . $less . ' does not exist; skipping.'); return; } $outFile = \Less_Cache::Get([$lessDir . $less => $this->fakePath . "themes/{$theme}/css/less"], ['cache_dir' => $this->tempPath, 'cache_method' => 'php', 'compress' => true, 'import_dirs' => $directories]); $css = file_get_contents($this->tempPath . '/' . $outFile); if (!is_dir(dirname($finalFile))) { mkdir(dirname($finalFile)); } file_put_contents($finalFile, $this->makeRelative($css, $less)); $this->logMessage("\t\t" . (microtime(true) - $start) . ' sec'); }