* @license http://www.gnu.org/licenses/gpl-2.0.txt GPL, version 2 * @author Icinga Development Team */ // {{{ICINGA_LICENSE_HEADER}}} namespace Icinga\Web; use \Exception; use \RecursiveDirectoryIterator; use \RecursiveIteratorIterator; use \RegexIterator; use \RecursiveRegexIterator; use \Zend_Controller_Front; /** * Less compiler prints files or directories to stdout */ class LessCompiler { /** * Collection of items: File or directories * * @var array */ private $items = array(); /** * lessphp compiler * * @var \lessc */ private $lessc; private $baseUrl; /** * Create a new instance */ public function __construct() { require_once 'vendor/lessphp/lessc.inc.php'; $this->lessc = new \lessc(); $this->lessc->setVariables( array( 'baseurl' => '\'' . Zend_Controller_Front::getInstance()->getBaseUrl(). '\'' ) ); } /** * Add usable style item to stack * * @param string $item File or directory */ public function addItem($item) { $this->items[] = $item; } /** * Compile and print a single file * * @param string $file */ public function printFile($file) { $ext = pathinfo($file, PATHINFO_EXTENSION); echo PHP_EOL. '/* CSS: ' . $file . ' */' . PHP_EOL; if ($ext === 'css') { readfile($file); } elseif ($ext === 'less') { try { echo $this->lessc->compileFile($file); } catch (Exception $e) { echo '/* ' . PHP_EOL . ' ===' . PHP_EOL; echo ' Error in file ' . $file . PHP_EOL; echo ' ' . $e->getMessage() . PHP_EOL . PHP_EOL; echo ' ' . 'This file was dropped cause of errors.' . PHP_EOL; echo ' ===' . PHP_EOL . '*/' . PHP_EOL; } } echo PHP_EOL; } /** * Compile and print a path content (recursive) * * @param string $path */ public function printPathRecursive($path) { $directoryInterator = new RecursiveDirectoryIterator($path); $iterator = new RecursiveIteratorIterator($directoryInterator); $filteredIterator = new RegexIterator($iterator, '/\.(css|less)$/', RecursiveRegexIterator::GET_MATCH); foreach ($filteredIterator as $file => $extension) { $this->printFile($file); } } /** * Compile and print the whole item stack */ public function printStack() { foreach ($this->items as $item) { if (is_dir($item)) { $this->printPathRecursive($item); } elseif (is_file($item)) { $this->printFile($item); } } } }