/** * Creates a stylesheet link with LESS support * * @param string $style file name * @param array $attributes default attributes * @param bool $index include the index page * @param array $imports compare file date for these too, CSS and LESS in style @import * @return string */ public static function style($file, array $attributes = null, $index = false, $imports = null) { $imports = (array) $imports; // Compile only .less files if (substr_compare($file, '.less', -5, 5, false) === 0) { $css = substr_replace($file, 'css', -4); $compiled = is_file($css) ? filemtime($css) : 0; try { // Check if imported files have changed $compile = filemtime($file) > $compiled; if (!$compile && !empty($imports)) { foreach ($imports as $import) { if (filemtime($import) > $compiled) { $compile = true; break; } } } // Compile LESS if ($compile) { $compiler = new Less($file); file_put_contents($css, $compiler->parse()); } $file = $css; } catch (Exception $e) { Kohana::$log->add(Log::ERROR, __METHOD__ . ': Error compiling LESS file ' . $file . ', ' . $e->getMessage()); } } return HTML::style($file . '?' . filemtime($file), $attributes, $index); }
/** * [assets description] * @param Array $assets * @return String js or css */ public function compile($assets, $type) { $self = $this; $rewriteCssUrls = function ($content, $asset) use($self) { $source_dir = dirname($asset["file"]); $root_dir = $self->app['docs_root']; $csspath = ""; if (strlen($root_dir) < strlen($source_dir)) { $csspath = '/' . trim(str_replace($root_dir, '', $source_dir), "/") . "/"; } else { // todo } $offset = 0; while (($pos = strpos($content, 'url(', $offset)) !== false) { if (($urlend = strpos($content, ')', $pos)) !== false) { $path = trim(str_replace(array('"', "'"), "", substr($content, $pos + 4, $urlend - ($pos + 4)))); if (!preg_match("#^(http|/|data\\:)#", trim($path))) { $content = str_replace($path, $csspath . $path, $content); } } $offset = $pos + 1; } return $content; }; $output = array(); foreach ((array) $assets as $file) { $asset = array("ext" => pathinfo($file, PATHINFO_EXTENSION), "file" => $file); $ext = $asset['ext'] == "scss" || $asset['ext'] == "less" ? "css" : $asset['ext']; $content = ''; if (strpos($file, ':') !== false && ($____file = $this->app->path($file))) { $asset['file'] = $file = $____file; } if ($ext != $type) { continue; } switch ($asset['ext']) { case 'js': $content = @file_get_contents($file); break; case 'scss': case 'less': case 'css': switch ($asset['ext']) { case 'scss': $content = \Sass::parse($file); break; case 'less': $content = \Less::parse($file); break; default: $content = @file_get_contents($file); } $content = $rewriteCssUrls($content, $asset); break; default: continue; } $output[] = $content; } return implode("", $output); }