Exemple #1
0
 /**
  * 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);
 }
Exemple #2
0
 /**
  * [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);
 }