function sassCss($inputFilename, $outputFilename, $inputPath) { $compiler = new Leafo\ScssPhp\Compiler(); $compiler->addImportPath($inputPath); $input = file_get_contents($inputFilename); $output = $compiler->compile($input); file_put_contents($outputFilename, $output); }
/** * Create a css file from one or more scss files * */ public static function ParseScss(&$scss_files) { global $dataDir; $compiler = new \Leafo\ScssPhp\Compiler(); $compiled = false; $combined = array(); //add variables for url paths $combined[] = '$icon-font-path: "../../include/thirdparty/Bootstrap3/fonts/";'; try { foreach ($scss_files as $file) { //treat as scss markup if there are newline characters if (strpos($file, "\n") !== false) { $combined[] = $file; continue; } // handle relative and absolute paths if (!empty($dataDir) && strpos($file, $dataDir) === false) { $file = $dataDir . '/' . ltrim($file, '/'); } $combined[] = '@import "' . $file . '";'; } $compiler->addImportPath($dataDir); $compiled = $compiler->compile(implode("\n", $combined)); } catch (\Exception $e) { if (\gp\tool::LoggedIn()) { msg('SCSS Compile Failed: ' . $e->getMessage()); } return false; } $scss_files = $compiler->allParsedFiles(); $scss_files = array_keys($scss_files); return $compiled; }
/** * SCSSify the stylesheet and return the href of the compiled file * * @param string $src Source URL of the file to be parsed * @param string $handle An identifier for the file used to create the file name in the cache * @return string URL of the compiled stylesheet */ public function parse_stylesheet($src, $handle) { // we only want to handle .scss files if (!preg_match('/\\.scss(\\.php)?$/', preg_replace('/\\?.*$/', '', $src))) { return $src; } // get file path from $src if (!strstr($src, '?')) { $src .= '?'; } // prevent non-existent index warning when using list() & explode() // vars to pass into the compiler - default @themeurl var for image urls etc... $this->add_vars(array('theme-url' => '"' . get_template_directory_uri() . '"')); // Lets get the paths we need $scss_directory = str_replace(get_template_directory_uri() . "/", "", $src); $scss_directory = substr($scss_directory, 0, strrpos($scss_directory, '/')); $scss_directory = get_template_directory() . "/{$scss_directory}"; $scss_filename = substr(basename($src), 0, strrpos(basename($src), '?')); $css_filename = str_replace("scss", "css", $scss_filename); $css_directory_uri = wp_upload_dir()['baseurl'] . "/wp-scss-cache"; $this->set_scss_directory($scss_directory); $this->set_handle($handle); $this->set_src_path("{$scss_directory}/{$scss_filename}"); $this->add_vars(apply_filters('scss_vars', $this->get_vars(), $handle)); $scss_is_changed = $this->scss_is_changed(); $is_changed = $scss_is_changed['changed']; $hash = $scss_is_changed['hash']; $this->add_vars(array('color-map' => array("blue" => "green", "yellow" => "purple"))); // Don't recompile if the neither the vars nor the source have changed if (!$is_changed && !WP_DEBUG) { return "{$css_directory_uri}/{$css_filename}"; } // Do recompile if either the vars or soure have changed try { $scss = new \Leafo\ScssPhp\Compiler(); $scss->setVariables($this->vars); $scss->addImportPath($scss_directory); $compiled_css = $scss->compile(file_get_contents("{$scss_directory}/{$scss_filename}")); $this->save_parsed_css($this->get_css_directory() . "/{$css_filename}", $compiled_css); } catch (Exception $ex) { wp_die($ex->getMessage()); } return "{$css_directory_uri}/{$css_filename}?ver={$hash}"; }
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 } } }
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 } } }