/**
  * Parse a Scss file and convert it into CSS
  *
  * @param string $src source file path
  * @param string $dst destination file path
  * @param array $options parser options
  * @return mixed
  * @throws \Exception
  */
 public function parse($src, $dst, $options)
 {
     if (!file_exists($src)) {
         throw new \Exception("Failed to open file \"{$src}\"");
     }
     $this->importPaths = !empty($options['importPaths']) ? $options['importPaths'] : $this->importPaths;
     $this->lineComments = isset($options['lineComments']) ? $options['lineComments'] : $this->lineComments;
     $this->outputStyle = isset($options['outputStyle']) ? $options['outputStyle'] : $this->outputStyle;
     $this->outputStyle = strtolower($this->outputStyle);
     $parser = new \Leafo\ScssPhp\Compiler();
     if (!empty($this->importPaths) && is_array($this->importPaths)) {
         foreach ($this->importPaths as $path) {
             $paths[] = Yii::getAlias($path);
         }
         $parser->setImportPaths($paths);
     } else {
         $parser->setImportPaths([dirname($src)]);
     }
     if (in_array($this->outputStyle, $this->formatters)) {
         if ($this->lineComments && in_array($this->outputStyle, ['compressed', 'crunched'])) {
             $this->lineComments = false;
         }
         $parser->setFormatter('Leafo\\ScssPhp\\Formatter\\' . ucfirst($this->outputStyle));
     }
     if ($this->lineComments) {
         $content = self::insertLineComments($src, self::getRelativeFilename($src, $dst));
         file_put_contents($dst, self::parseLineComments($parser->compile($content, $src)));
     } else {
         file_put_contents($dst, $parser->compile(file_get_contents($src), $src));
     }
 }
Exemple #2
0
 public function run()
 {
     include getcwd() . '/vendor/autoload.php';
     $config = (include getcwd() . '/config/scss.php');
     $source = '';
     echo "Loading files...\n";
     foreach ($config['scssFiles'] as $file) {
         echo "   {$file}\n";
         $source .= file_get_contents(getcwd() . '/' . $file);
     }
     $importPaths = [];
     echo "Setting import paths...\n";
     foreach ($config['importPaths'] as $path) {
         echo "   {$path}\n";
         $importPaths[] = getcwd() . '/' . $path;
     }
     $scss = new \Leafo\ScssPhp\Compiler();
     $scss->setImportPaths($importPaths);
     # build a compressed version first
     echo "Writing production.css...\n";
     $scss->setFormatter('Leafo\\ScssPhp\\Formatter\\Crunched');
     $result = $scss->compile($source);
     $prodOutput = getcwd() . '/' . $config['outputPath'] . '/production.css';
     if (file_exists($prodOutput) === true) {
         unlink($prodOutput);
     }
     file_put_contents($prodOutput, $result);
     # now build a debug version
     echo "Writing debug.css...\n";
     $scss->setFormatter('Leafo\\ScssPhp\\Formatter\\Expanded');
     $scss->setLineNumberStyle(\Leafo\ScssPhp\Compiler::LINE_COMMENTS);
     $result = $scss->compile($source);
     $debugOutput = getcwd() . '/' . $config['outputPath'] . '/debug.css';
     if (file_exists($debugOutput) === true) {
         unlink($debugOutput);
     }
     file_put_contents($debugOutput, $result);
     echo "Complete.\n";
 }
Exemple #3
0
 /**
  * scssphp compiler
  * @link https://github.com/leafo/scssphp
  *
  * @param string $file
  * @return string
  */
 protected function scssphp($file)
 {
     if (!class_exists('\\Leafo\\ScssPhp\\Compiler')) {
         return Result::errorMissingPackage($this, 'scssphp', 'leafo/scssphp');
     }
     $scssCode = file_get_contents($file);
     $scss = new \Leafo\ScssPhp\Compiler();
     // set options for the scssphp compiler
     if (isset($this->compilerOptions['importDirs'])) {
         $scss->setImportPaths($this->compilerOptions['importDirs']);
     }
     if (isset($this->compilerOptions['formatter'])) {
         $scss->setFormatter($this->compilerOptions['formatter']);
     }
     return $scss->compile($scssCode);
 }
Exemple #4
0
 /**
  * Create a new css file based on sass file
  * @param string $sourceFilePath
  * @param string $targetFilenamePath
  * @throws Exception
  */
 public function createNewCss($sourceFilePath, $targetFilenamePath, $importFallback = null)
 {
     $config = $this->_getConfig();
     $targetDir = dirname($targetFilenamePath);
     $this->_createDir($targetDir);
     $this->_createDir($config['cache_dir']);
     if ($config['use_ruby']) {
         $options = '--cache-location ' . $config['cache_dir'] . ' --style ' . $config['output_style'];
         if ($config['debug']) {
             $options .= ' --debug-info --line-numbers';
         }
         $command = $config['sass_command'] . ' ' . $options . ' ' . $sourceFilePath . ':' . $targetFilenamePath;
         $execResult = exec($command, $output);
         if ($execResult != '') {
             throw new Exception("Error while processing sass file with command '{$command}':\n" . implode("\n", $output));
         }
     } else {
         /** @var \Leafo\ScssPhp\Compiler $compiler */
         $compiler = new \Leafo\ScssPhp\Compiler();
         switch ($config['output_style']) {
             case Laurent_Sass_Model_Config_Style::STYLE_COMPACT:
             default:
                 $formatter = \Leafo\ScssPhp\Formatter\Compact::class;
                 break;
             case Laurent_Sass_Model_Config_Style::STYLE_NESTED:
                 $formatter = \Leafo\ScssPhp\Formatter\Nested::class;
                 break;
             case Laurent_Sass_Model_Config_Style::STYLE_COMPRESSED:
                 $formatter = \Leafo\ScssPhp\Formatter\Compressed::class;
                 break;
             case Laurent_Sass_Model_Config_Style::STYLE_EXPANDED:
                 $formatter = \Leafo\ScssPhp\Formatter\Expanded::class;
                 break;
         }
         if (Mage::getIsDeveloperMode()) {
             $compiler->setLineNumberStyle(Leafo\ScssPhp\Compiler::LINE_COMMENTS);
         }
         $compiler->setFormatter($formatter);
         $compiler->setImportPaths(array(dirname($sourceFilePath), Mage::getBaseDir('lib') . '/scssphp/stylesheets', $importFallback));
         file_put_contents($targetFilenamePath, $compiler->compile(sprintf('@import "%s"', basename($sourceFilePath))));
     }
 }
Exemple #5
0
 public function init($hi = null)
 {
     $this->inject(function ($Params, $Request) {
         $scss = new \Leafo\ScssPhp\Compiler();
         $scss->setImportPaths($this->tipsy()->config()['path'] . 'public/assets/');
         $scss->setFormatter('Leafo\\ScssPhp\\Formatter\\Compressed');
         $file = $this->tipsy()->config()['path'] . 'public/' . $Request->path();
         $data = $scss->compile(file_get_contents($file));
         $mtime = filemtime($file);
         header('HTTP/1.1 200 OK');
         header('Date: ' . date('r'));
         header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $mtime) . ' GMT');
         header('Accept-Ranges: bytes');
         header('Content-Length: ' . strlen($data));
         header('Content-type: text/css');
         header('Vary: Accept-Encoding');
         header('Cache-Control: max-age=290304000, public');
         echo $data;
     });
 }
Exemple #6
0
 /** Initialize the SASS compiler. */
 protected function _initSass()
 {
     $this->bootstrap('Config');
     $config = Zend_Registry::get('configGlobal');
     $logger = Zend_Registry::get('logger');
     if ($config->environment == 'development') {
         $directory = new RecursiveDirectoryIterator(BASE_PATH);
         $iterator = new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::LEAVES_ONLY, RecursiveIteratorIterator::CATCH_GET_CHILD);
         $regex = new RegexIterator($iterator, '#(?:core|(?:modules|privateModules)/.*)/public/scss/(?!mixins).*\\.scss$#', RegexIterator::GET_MATCH);
         $scssPaths = array();
         foreach ($regex as $scssPath) {
             $scssPaths = array_merge($scssPaths, $scssPath);
         }
         $scssc = new Leafo\ScssPhp\Compiler();
         $scssc->setImportPaths(array(BASE_PATH . '/core/public/scss/mixins', BASE_PATH . '/core/public/scss/mixins/bourbon'));
         $scssc->setFormatter('Leafo\\ScssPhp\\Formatter\\Compressed');
         foreach ($scssPaths as $scssPath) {
             $cssPath = preg_replace('#((?:core|(?:modules|privateModules)/.*)/public)/scss/(.*)\\.scss$#', '\\1/css/\\2.css', $scssPath);
             if (!file_exists($cssPath) || filemtime($cssPath) < filemtime($scssPath)) {
                 $cssDirectoryName = pathinfo($cssPath, PATHINFO_DIRNAME);
                 if (!file_exists($cssDirectoryName)) {
                     $level = error_reporting(0);
                     mkdir($cssDirectoryName, 0755, true);
                     error_reporting($level);
                 }
                 if (is_dir($cssDirectoryName) && is_writable($cssDirectoryName)) {
                     $scss = file_get_contents($scssPath);
                     $css = $scssc->compile($scss) . PHP_EOL;
                     file_put_contents($cssPath, $css);
                 } else {
                     $logger->debug('Could not compile SASS located at ' . $scssPath);
                 }
             }
         }
     }
 }
Exemple #7
0
 /**
  * Compile SCSS into CSS.
  * 
  * @param string|array $source_filename
  * @param string $target_filename
  * @param array $variables (optional)
  * @parsm bool $minify (optional)
  * @return bool
  */
 public static function compileSCSS($source_filename, $target_filename, $variables = array(), $minify = false)
 {
     // Get the cleaned and concatenated content.
     $content = self::concatCSS($source_filename, $target_filename);
     // Compile!
     try {
         $scss_compiler = new \Leafo\ScssPhp\Compiler();
         $scss_compiler->setFormatter($minify ? '\\Leafo\\ScssPhp\\Formatter\\Crunched' : '\\Leafo\\ScssPhp\\Formatter\\Expanded');
         $scss_compiler->setImportPaths(array(dirname(is_array($source_filename) ? array_first($source_filename) : $source_filename)));
         if ($variables) {
             $scss_compiler->setVariables($variables);
         }
         $charset = strpos($content, '@charset') === false ? '@charset "UTF-8";' . "\n" : '';
         $content = $charset . $scss_compiler->compile($content) . "\n";
         $result = true;
     } catch (\Exception $e) {
         $content = '/*' . "\n" . 'Error while compiling SCSS:' . "\n" . $e->getMessage() . "\n" . '*/' . "\n";
         $result = false;
     }
     // Save the result to the target file.
     Storage::write($target_filename, $content);
     return $result;
 }
 /**
  *
  * @param type $variables
  * @param type $functions
  * @return \Leafo\ScssPhp\Server|boolean
  */
 function get_scss_parser($variables, $functions)
 {
     if (!(include_once SCSSPHP_INC . 'scss.inc.php')) {
         trigger_error('Unable to process .scss file -- SCSSPHP not configured correctly on your server. Check the SCSSPHP_INC setting in settings/package_settings.php.');
         return false;
     }
     $scss = new Leafo\ScssPhp\Compiler();
     $scss->setFormatter('Leafo\\ScssPhp\\Formatter\\Compressed');
     $scss->setVariables($variables);
     foreach ($functions as $name => $func) {
         $scss->registerFunction($name, $func);
     }
     return new \Leafo\ScssPhp\Server('.', '.', $scss);
 }
Exemple #9
0
$path = realpath(__DIR__ . "/" . preg_replace("/(\\.min)(\\.scss)\$/i", "\$2", $url));
if (!is_string($path) || strpos($path, __DIR__) !== 0 || !is_string($content = file_get_contents($path))) {
    header("HTTP/1.1 404 Not Found");
    echo "404 Not Found";
}
$debugging = !isset($_GET["debug"]) || $_GET["debug"] == "true" ? true : false;
$cache = $debugging === true || !isset($_GET["cache"]) || $_GET["cache"] == "false" ? false : true;
$minified = strtolower(substr($url, -9, 4)) == ".min" ? true : false;
// Get a cached copy
$cachepath = $realpath . "-" . md5($content) . ($minified ? ".min" : "") . ".css";
if ($cache === true && is_string($compiled = file_get_contents($cachepath))) {
    header("Content-Type: text/css");
    echo $compiled;
}
$scss = new Leafo\ScssPhp\Compiler();
$scss->setImportPaths(array(__DIR__, dirname($path)));
if ($minified === true) {
    // Minified output?
    $scss->setFormatter("Leafo\\ScssPhp\\Formatter\\Crunched");
}
if ($debugging === true) {
    // Debugging output?
    $scss->setLineNumberStyle(Leafo\ScssPhp\Compiler::LINE_COMMENTS);
}
$compiled = $scss->compile($content, $path);
if ($cache === true) {
    file_put_contents($cachepath, $compiled);
}
// Output the compiled content as css
header("Content-Type: text/css");
echo $compiled;
function nebula_render_scss($specific_scss = null, $child = false)
{
    $override = apply_filters('pre_nebula_render_scss', false, $specific_scss, $child);
    if ($override !== false) {
        return $override;
    }
    if (nebula_option('nebula_scss', 'enabled') && (isset($_GET['sass']) || isset($_GET['scss']) || $_GET['settings-updated'] == 'true') && (is_dev() || is_client())) {
        $specific_scss = 'all';
    }
    $theme_directory = get_template_directory();
    $theme_directory_uri = get_template_directory_uri();
    if ($child) {
        $theme_directory = get_stylesheet_directory();
        $theme_directory_uri = get_stylesheet_directory_uri();
    }
    $stylesheets_directory = $theme_directory . '/stylesheets';
    $stylesheets_directory_uri = $theme_directory_uri . '/stylesheets';
    require_once get_template_directory() . '/includes/libs/scssphp/scss.inc.php';
    //SCSSPHP is a compiler for SCSS 3.x
    $scss = new \Leafo\ScssPhp\Compiler();
    $scss->addImportPath($stylesheets_directory . '/scss/partials/');
    if (nebula_option('nebula_minify_css', 'enabled') && !is_debug()) {
        $scss->setFormatter('Leafo\\ScssPhp\\Formatter\\Compressed');
        //Minify CSS (while leaving "/*!" comments for WordPress).
    } else {
        $scss->setFormatter('Leafo\\ScssPhp\\Formatter\\Compact');
        //Compact, but readable, CSS lines
        if (is_debug()) {
            $scss->setLineNumberStyle(\Leafo\ScssPhp\Compiler::LINE_COMMENTS);
            //Adds line number reference comments in the rendered CSS file for debugging.
        }
    }
    if (empty($specific_scss) || $specific_scss == 'all') {
        //Partials
        $latest_partial = 0;
        foreach (glob($stylesheets_directory . '/scss/partials/*') as $partial_file) {
            if (filemtime($partial_file) > $latest_partial) {
                $latest_partial = filemtime($partial_file);
            }
        }
        //Combine Developer Stylesheets
        if (nebula_option('nebula_dev_stylesheets')) {
            nebula_combine_dev_stylesheets($stylesheets_directory, $stylesheets_directory_uri);
        }
        //Compile each SCSS file
        foreach (glob($stylesheets_directory . '/scss/*.scss') as $file) {
            //@TODO "Nebula" 0: Change to glob_r() but will need to create subdirectories if they don't exist.
            $file_path_info = pathinfo($file);
            if (is_file($file) && $file_path_info['extension'] == 'scss' && $file_path_info['filename'][0] != '_') {
                //If file exists, and has .scss extension, and doesn't begin with "_".
                $file_counter++;
                $css_filepath = $file_path_info['filename'] == 'style' ? $theme_directory . '/style.css' : $stylesheets_directory . '/css/' . $file_path_info['filename'] . '.css';
                if (!file_exists($css_filepath) || filemtime($file) > filemtime($css_filepath) || $latest_partial > filemtime($css_filepath) || is_debug() || $specific_scss == 'all') {
                    //If .css file doesn't exist, or is older than .scss file (or any partial), or is debug mode, or forced
                    ini_set('memory_limit', '512M');
                    //Increase memory limit for this script. //@TODO "Nebula" 0: Is this the best thing to do here? Other options?
                    WP_Filesystem();
                    global $wp_filesystem;
                    $existing_css_contents = file_exists($css_filepath) ? $wp_filesystem->get_contents($css_filepath) : '';
                    if (!strpos(strtolower($existing_css_contents), 'scss disabled')) {
                        //If the correlating .css file doesn't contain a comment to prevent overwriting
                        $this_scss_contents = $wp_filesystem->get_contents($file);
                        //Copy SCSS file contents
                        $compiled_css = $scss->compile($this_scss_contents);
                        //Compile the SCSS
                        $enhanced_css = nebula_scss_variables($compiled_css);
                        //Compile server-side variables into SCSS
                        $wp_filesystem->put_contents($css_filepath, $enhanced_css);
                        //Save the rendered CSS.
                    }
                }
            }
        }
        if (!$child && is_child_theme()) {
            //If not in the second (child) pass, and is a child theme.
            nebula_render_scss($specific_scss, true);
            //Re-run on child theme stylesheets
        }
    } else {
        if (file_exists($specific_scss)) {
            //If $specific_scss is a filepath
            WP_Filesystem();
            global $wp_filesystem;
            $scss_contents = $wp_filesystem->get_contents($specific_scss);
            $compiled_css = $scss->compile($scss_contents);
            //Compile the SCSS
            $enhanced_css = nebula_scss_variables($compiled_css);
            //Compile server-side variables into SCSS
            $wp_filesystem->put_contents(str_replace('.scss', '.css', $specific_scss), $enhanced_css);
            //Save the rendered CSS in the same directory.
        } else {
            //If $scss_file is raw SCSS string
            $compiled_css = $scss->compile($specific_scss);
            return nebula_scss_variables($compiled_css);
            //Return the rendered CSS
        }
    }
}
Exemple #11
0
function nebula_render_scss($specific_scss = null)
{
    require_once get_template_directory() . '/includes/libs/scssphp/scss.inc.php';
    //SCSSPHP is a compiler for SCSS 3.x
    $scss = new \Leafo\ScssPhp\Compiler();
    $scss->addImportPath(get_template_directory() . '/stylesheets/scss/partials/');
    if (nebula_option('nebula_minify_css', 'enabled') && !is_debug()) {
        $scss->setFormatter('Leafo\\ScssPhp\\Formatter\\Compressed');
        //Minify CSS (while leaving "/*!" comments for WordPress).
    } else {
        $scss->setFormatter('Leafo\\ScssPhp\\Formatter\\Compact');
        //Compact, but readable, CSS lines
        if (is_debug()) {
            //$scss->setLineNumberStyle(\Leafo\ScssPhp\Compiler::LINE_COMMENTS); //Adds line number reference comments in the rendered CSS file for debugging. //@TODO: "Nebula" 0: This is broken!! This line was working at one point and has not been changed since... However, it's just choking up on login.scss and tinymce.scss and style.scss for some reason- it compiles others before that...
            //$scss->setLineNumberStyle(\Leafo\ScssPhp\Compiler::LINE_COMMENTS); //Using this one for testing...
        }
    }
    if (empty($specific_scss) || $specific_scss == 'all') {
        //Partials
        $latest_partial = 0;
        foreach (glob(get_template_directory() . '/stylesheets/scss/partials/*') as $partial_file) {
            if (filemtime($partial_file) > $latest_partial) {
                $latest_partial = filemtime($partial_file);
            }
        }
        //Combine Developer Stylesheets
        if (nebula_option('nebula_dev_stylesheets')) {
            $file_counter = 0;
            $partials = array('variables', 'mixins', 'helpers');
            $automation_warning = "/**** Warning: This is an automated file! Anything added to this file manually will be removed! ****/\r\n\r\n";
            $dev_stylesheet_files = glob(get_template_directory() . '/stylesheets/scss/dev/*css');
            $dev_scss_file = get_template_directory() . '/stylesheets/scss/dev.scss';
            if (!empty($dev_stylesheet_files) || strlen($dev_scss_file) > strlen($automation_warning) + 10) {
                //If there are dev SCSS (or CSS) files -or- if dev.scss needs to be reset
                file_put_contents(get_template_directory() . '/stylesheets/scss/dev.scss', $automation_warning);
                //Empty /stylesheets/scss/dev.scss
            }
            foreach ($dev_stylesheet_files as $file) {
                $file_path_info = pathinfo($file);
                if (is_file($file) && in_array($file_path_info['extension'], array('css', 'scss'))) {
                    $file_counter++;
                    //Include partials in dev.scss
                    if ($file_counter == 1) {
                        $import_partials = '';
                        foreach ($partials as $partial) {
                            $import_partials .= "@import '" . $partial . "';\r\n";
                        }
                        file_put_contents($dev_scss_file, $automation_warning . $import_partials . "\r\n");
                    }
                    $this_scss_contents = file_get_contents($file);
                    //Copy file contents
                    $empty_scss = $this_scss_contents == '' ? ' (empty)' : '';
                    $dev_scss_contents = file_get_contents(get_template_directory() . '/stylesheets/scss/dev.scss');
                    $dev_scss_contents .= "\r\n/* ==========================================================================\r\n   " . 'File #' . $file_counter . ': ' . get_template_directory_uri() . "/stylesheets/scss/dev/" . $file_path_info['filename'] . '.' . $file_path_info['extension'] . $empty_scss . "\r\n   ========================================================================== */\r\n\r\n" . $this_scss_contents . "\r\n\r\n/* End of " . $file_path_info['filename'] . '.' . $file_path_info['extension'] . " */\r\n\r\n\r\n";
                    file_put_contents(get_template_directory() . '/stylesheets/scss/dev.scss', $dev_scss_contents);
                }
            }
            if ($file_counter > 0) {
                add_action('wp_enqueue_scripts', 'enqueue_dev_styles');
                function enqueue_dev_styles()
                {
                    wp_enqueue_style('nebula-dev_styles', get_template_directory_uri() . '/stylesheets/css/dev.css?c=' . rand(1, 99999), array('nebula-main'), null);
                }
            }
        }
        //Compile each SCSS file
        foreach (glob(get_template_directory() . '/stylesheets/scss/*.scss') as $file) {
            //@TODO "Nebula" 0: Change to glob_r() but will need to create subdirectories if they don't exist.
            $file_path_info = pathinfo($file);
            if (is_file($file) && $file_path_info['extension'] == 'scss' && $file_path_info['filename'][0] != '_') {
                //If file exists, and has .scss extension, and doesn't begin with "_".
                $file_counter++;
                $css_filepath = $file_path_info['filename'] == 'style' ? get_template_directory() . '/style.css' : get_template_directory() . '/stylesheets/css/' . $file_path_info['filename'] . '.css';
                if (!file_exists($css_filepath) || filemtime($file) > filemtime($css_filepath) || $latest_partial > filemtime($css_filepath) || is_debug() || $specific_scss == 'all') {
                    //If .css file doesn't exist, or is older than .scss file (or any partial), or is debug mode, or forced
                    ini_set('memory_limit', '512M');
                    //Increase memory limit for this script. //@TODO "Nebula" 0: Is this the best thing to do here? Other options?
                    $existing_css_contents = file_exists($css_filepath) ? file_get_contents($css_filepath) : '';
                    if (!strpos(strtolower($existing_css_contents), 'scss disabled')) {
                        //If the correlating .css file doesn't contain a comment to prevent overwriting
                        $this_scss_contents = file_get_contents($file);
                        //Copy SCSS file contents
                        $compiled_css = $scss->compile($this_scss_contents);
                        //Compile the SCSS
                        $enhanced_css = nebula_scss_variables($compiled_css);
                        //Compile server-side variables into SCSS
                        file_put_contents($css_filepath, $enhanced_css);
                        //Save the rendered CSS
                    }
                }
            }
        }
    } else {
        if (file_exists($specific_scss)) {
            //If $specific_scss is a filepath
            $scss_contents = file_get_contents($specific_scss);
            //Copy SCSS file contents
            $compiled_css = $scss->compile($scss_contents);
            //Compile the SCSS
            $enhanced_css = nebula_scss_variables($compiled_css);
            //Compile server-side variables into SCSS
            file_put_contents(str_replace('.scss', '.css', $specific_scss), $enhanced_css);
            //Save the rendered CSS in the same directory
        } else {
            //If $scss_file is raw SCSS string
            $compiled_css = $scss->compile($specific_scss);
            return nebula_scss_variables($compiled_css);
            //Return the rendered CSS
        }
    }
}