public function filterLoad(AssetInterface $asset) { $sass = new \Sass(); $includePaths = array_merge(array($asset->getSourceDirectory()), $this->includePaths); $sass->setIncludePath(implode(':', $includePaths)); if ($this->outputStyle) { $sass->setStyle($this->outputStyle); } $css = $sass->compile($asset->getContent()); $asset->setContent($css); }
<?php // директория со стилями (в конце слэш обязателен) $style_dir = MODX_BASE_PATH . 'assets/components/modxsite/templates/skins/wood/css/'; // сканирование содержимого $files = scandir(rtrim($style_dir, '/')); $scss = new Sass(); $scss->setStyle(Sass::STYLE_COMPRESSED); // выбор файлов с расширением scss foreach ($files as $scss_file) { if (is_file($style_dir . $scss_file) && strtolower(pathinfo($style_dir . $scss_file, PATHINFO_EXTENSION)) == 'scss') { // вычисление проверочного md5 хэша содержимого .scss файла $scss_hash = hash('md5', file_get_contents($style_dir . $scss_file)); // при отсутствии записанного (в .scsshash файл) хэша или его несовпадении с записанным - генерация css if (!file_exists($style_dir . $scss_file . 'hash') || $scss_hash != file_get_contents($style_dir . $scss_file . 'hash')) { //file_put_contents( $style_dir.substr($scss_file,0,-4).'css', $scss->compile($style_dir.$scss_file) ); file_put_contents($style_dir . substr($scss_file, 0, -4) . 'css', $scss->compileFile($style_dir . $scss_file)); // запись хэша file_put_contents($style_dir . $scss_file . 'hash', $scss_hash); } } }
/** * Обработка запроса, разбитие на: module/controller/action * @throws Boot_Exception */ private function getQuery() { $path_info = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : $_SERVER['REQUEST_URI']; if (preg_match("/^(\\/[^\\/\\.]+)\\.+\$/", $path_info, $match) && count($match) > 1) { $this->_redirect($match[1]); } //Если страница пытается загрузкить из асетов файл if (APPLICATION_ENV == 'development' && preg_match("/^\\/assets\\/(css|js)\\/.*?\\.(css|js)\$/", $path_info, $matches)) { switch ($matches[1]) { case "css": header("Content-Type: text/css"); break; case "js": header("Content-Type: application/javascript"); break; default: throw new Boot_Exception('Unknown file extension'); } //Если расширение css и файл найден if (file_exists(APPLICATION_PATH . $path_info) || $matches[1] == 'js') { echo file_get_contents(APPLICATION_PATH . $path_info); } else { //Если файл не найден, пробуем найти scss $filename = pathinfo(APPLICATION_PATH . $path_info, PATHINFO_FILENAME); $scss = pathinfo(APPLICATION_PATH . $path_info, PATHINFO_DIRNAME) . '/' . $filename . '.scss'; //Если файл существует if (file_exists($scss)) { //Компилируем SASS файл $sass = new Sass(); $sass->setStyle(Sass::STYLE_EXPANDED); $sass->setIncludePath(APPLICATION_ROOT); $sass->setComments(true); file_put_contents('/tmp/' . $filename . '.css', $sass->compileFile($scss)); //Добавляем префиксы $result = system('postcss --use autoprefixer -o /tmp/' . $filename . '.out.css /tmp/' . $filename . '.css', $r); if ($result) { throw new Boot_Exception($result); } else { echo file_get_contents('/tmp/' . $filename . '.out.css'); unlink('/tmp/' . $filename . '.out.css'); unlink('/tmp/' . $filename . '.css'); } // $autoprefixer = new Autoprefixer(['ff > 2', '> 2%', 'ie 8']); // echo $autoprefixer->compile($css); //Ruby Sass // //Компилируем sass // $return = system('sass -l -t expanded --sourcemap=none ' . escapeshellarg($scss) . ' ' . escapeshellarg('/tmp/' . $filename . '.css') . ' 2>&1'); // if( $return ) { // throw new Boot_Exception('sass error: ' . $return); // } // // //Добавляем префиксы // $return = system('postcss --use autoprefixer /tmp/' . $filename . '.css -o /tmp/' . $filename . '_out.css 2>&1'); // if( $return ) { // throw new Boot_Exception('autoprefixer error: ' . $return); // } // // //Выводим данные // readfile('/tmp/' . $filename . '_out.css'); } else { throw new Boot_Exception('File ' . $path_info . ' not found', 404); } } exit; } //Получаем строку запроса if ($_SERVER['QUERY_STRING']) { parse_str($_SERVER['QUERY_STRING'], $this->_request); } $query = $path_info; if (preg_match("/^(.*?)\\?/", $path_info, $match)) { $query = $match[1]; } //Сохраняем параметры запроса $this->_param = Boot_Routes::getInstance()->getParam(substr($query, 1, strlen($query))); }
<?php // -------------------------------------------------------------------------------------------------------------------- // Sanity check // -------------------------------------------------------------------------------------------------------------------- $script_name = basename($argv[0]); if ($argc < 3) { echo "Error: {$script_name} expects at least 2 parameters.\n"; echo "Usage: `php {$script_name} /path/to/input.scss /path/to/output.css`\n"; die; } $input_file_name = $argv[1]; $output_file_name = $argv[2]; if (!file_exists($input_file_name)) { die("Error: The file {$input_file_name} was not found.\n"); } // -------------------------------------------------------------------------------------------------------------------- // Sassify // -------------------------------------------------------------------------------------------------------------------- $includePaths = [__DIR__ . '/../assets/scss/partials', __DIR__ . '/../assets/scss/fonts', dirname(realpath($input_file_name))]; try { // Requires: https://github.com/sensational/sassphp $sass = new \Sass(); $sass->setStyle(Sass::STYLE_EXPANDED); $sass->setIncludePath(implode(':', $includePaths)); $css = $sass->compileFile($input_file_name); } catch (Exception $e) { die($e->getMessage()); } file_put_contents($output_file_name, $css); echo "{$output_file_name} was created successfully!\n";
/** * Чтение данных файла * @param $path * @throws Exception * @return string */ public function readfile($path) { //Получаем расширение файла $ext = strtolower(pathinfo($path, PATHINFO_EXTENSION)); //Если расширение входим в массив if (in_array($ext, [$this->ext, 'scss'])) { if ($this->compile) { //SASS if ($ext == 'scss') { //Компилируем SASS файл $sass = new Sass(); $sass->setStyle(Sass::STYLE_COMPRESSED); $sass->setIncludePath(APPLICATION_ROOT); $sass->setComments(false); $filename = pathinfo(APPLICATION_PATH . $path, PATHINFO_FILENAME); file_put_contents('/tmp/' . $filename . '.css', $sass->compileFile($path)); //Добавляем префиксы $result = system('postcss --use autoprefixer -o /tmp/' . $filename . '.out.css /tmp/' . $filename . '.css 2>&1', $r); if ($result) { throw new Boot_Exception($result); } else { $css = file_get_contents('/tmp/' . $filename . '.out.css'); unlink('/tmp/' . $filename . '.out.css'); unlink('/tmp/' . $filename . '.css'); return $css; } //Ruby SASS // //Компилируем sass // $filename = pathinfo(APPLICATION_PATH . $path, PATHINFO_FILENAME); // $return = system('sass -t compressed --sourcemap=none ' . escapeshellarg($path) . ' ' . escapeshellarg('/tmp/' . $filename . '.css') . ' 2>&1'); // if( $return ) { // throw new Boot_Exception('sass error: ' . $return); // } // // //Добавляем префиксы // $return = system('postcss --use autoprefixer /tmp/' . $filename . '.css -o /tmp/' . $filename . '_out.css 2>&1'); // if( $return ) { // throw new Boot_Exception('autoprefixer error: ' . $return); // } // // //Выводим данные // return file_get_contents('/tmp/' . $filename . '_out.css'); } //Выполняем для обычных css файлов return $this->compress(file_get_contents($path)); } else { switch ($this->ext) { case "css": return "<link href='" . str_replace(APPLICATION_PATH, "", preg_replace('/\\.scss$/i', '.css', $path)) . "' rel='stylesheet' type='text/css'>" . PHP_EOL; break; case "js": return "<script src='" . str_replace(APPLICATION_PATH, "", $path) . "' type=\"text/javascript\"></script>" . PHP_EOL; break; default: throw new Exception("Wrong file extension"); } } } return null; }