mirror of
https://github.com/Combodo/iTop.git
synced 2026-02-12 23:14:18 +01:00
Replacing the SCSS->CSS conversion library by a newer one made by Leaf Corcoran: http://leafo.github.io/scssphp, tweaked to work on PHP 5.3
SVN:trunk[4203]
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
<?php
|
||||
use Html2Text\Html2Text;
|
||||
use Leafo\ScssPhp\Compiler;
|
||||
// Copyright (C) 2010-2016 Combodo SARL
|
||||
//
|
||||
// This file is part of iTop.
|
||||
@@ -1197,34 +1198,31 @@ class utils
|
||||
$sText = str_replace("\r", "\n", $sText);
|
||||
return str_replace("\n", '<br/>', htmlentities($sText, ENT_QUOTES, 'UTF-8'));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Eventually compiles the SASS (.scss) file into the CSS (.css) file
|
||||
*
|
||||
* @param string $sSaasRelPath Relative path to the SCSS file (must have the extension .scss)
|
||||
* @param string $sSassRelPath Relative path to the SCSS file (must have the extension .scss)
|
||||
* @return string Relative path to the CSS file (<name>.css)
|
||||
*/
|
||||
static public function GetCSSFromSASS($sSaasRelPath)
|
||||
static public function GetCSSFromSASS($sSassRelPath)
|
||||
{
|
||||
$sSaasPath = APPROOT.$sSaasRelPath;
|
||||
$sCssRelPath = preg_replace('/\.scss$/', '.css', $sSaasRelPath);
|
||||
$sSassPath = APPROOT.$sSassRelPath;
|
||||
$sCssRelPath = preg_replace('/\.scss$/', '.css', $sSassRelPath);
|
||||
$sCssPath = APPROOT.$sCssRelPath;
|
||||
clearstatcache();
|
||||
if (!file_exists($sCssPath) || (is_writable($sCssPath) && (filemtime($sCssPath) < filemtime($sSaasPath))))
|
||||
if (!file_exists($sCssPath) || (is_writable($sCssPath) && (filemtime($sCssPath) < filemtime($sSassPath))))
|
||||
{
|
||||
// Rebuild the CSS file from the Saas file
|
||||
if (file_exists(APPROOT.'lib/sass/sass/SassParser.php'))
|
||||
{
|
||||
require_once(APPROOT.'lib/sass/sass/SassParser.php'); //including Sass libary (Syntactically Awesome Stylesheets)
|
||||
$oParser = new SassParser(array('style'=>'expanded'));
|
||||
$sCss = $oParser->toCss($sSaasPath);
|
||||
file_put_contents($sCssPath, $sCss);
|
||||
}
|
||||
require_once(APPROOT.'lib/scssphp/scss.inc.php');
|
||||
$oScss = new Compiler();
|
||||
$oScss->setImportPaths(array(APPROOT.'/css'));
|
||||
$oScss->setFormatter('Leafo\\ScssPhp\\Formatter\\Expanded');
|
||||
$sCss = $oScss->compile(file_get_contents($sSassPath));
|
||||
file_put_contents($sCssPath, $sCss);
|
||||
}
|
||||
return $sCssRelPath;
|
||||
}
|
||||
|
||||
|
||||
static public function GetImageSize($sImageData)
|
||||
{
|
||||
if (function_exists('getimagesizefromstring')) // PHP 5.4.0 or higher
|
||||
|
||||
@@ -4,5 +4,5 @@ $complement-color: #1c94c4;
|
||||
$complement-light: #d6e8ef;
|
||||
$frame-background-color: #F1F1F1;
|
||||
$text-color: #000;
|
||||
// Beware the version number MUST beging with a letter otherwise it may be truncated...
|
||||
$version: v2.3.0b;
|
||||
// Beware the version number MUST be enclosed with quotes otherwise v2.3.0 becomes v2 0.3 .0
|
||||
$version: "v2.3.0b";
|
||||
1134
css/light-grey.css
1134
css/light-grey.css
File diff suppressed because it is too large
Load Diff
@@ -1,10 +1,10 @@
|
||||
@import 'css-variables.scss';
|
||||
|
||||
$hilight-color = $highlight-color;
|
||||
$summary-details-background = $grey-color;
|
||||
$main-header-background = $frame-background-color;
|
||||
$table-even-background = $frame-background-color;
|
||||
$popup-menu-highlight-color = $highlight-color;
|
||||
$hilight-color: $highlight-color;
|
||||
$summary-details-background: $grey-color;
|
||||
$main-header-background: $frame-background-color;
|
||||
$table-even-background: $frame-background-color;
|
||||
$popup-menu-highlight-color: $highlight-color;
|
||||
$popup-menu-text-color: #000;
|
||||
$popup-menu-background-color: #fff;
|
||||
$popup-menu-text-higlight-color: #fff;
|
||||
@@ -170,7 +170,7 @@ table.listResults td .view-image {
|
||||
table.listContainer {
|
||||
border: 0;
|
||||
padding: 0;
|
||||
margin:0;
|
||||
margin: 0;
|
||||
width: 100%;
|
||||
clear: both;
|
||||
}
|
||||
@@ -1261,7 +1261,7 @@ select#org_id {
|
||||
background-color: #fff;
|
||||
}
|
||||
.itop-dashboard a {
|
||||
cursor: unquote("not-allowed");
|
||||
cursor: not-allowed;
|
||||
}
|
||||
.dragHover {
|
||||
background: url(./ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png?v=#{$version});
|
||||
@@ -1775,9 +1775,9 @@ span.refresh-button {
|
||||
width: auto;
|
||||
margin-right: 5px;
|
||||
|
||||
-webkit-filter: unquote("grayscale(100%)");
|
||||
filter: unquote("grayscale(100%)");
|
||||
filter: unquote("gray");
|
||||
-webkit-filter: grayscale(100%);
|
||||
filter: grayscale(100%);
|
||||
filter: gray;
|
||||
filter: url("data:image/svg+xml;utf8,<svg version='1.1' xmlns='http://www.w3.org/2000/svg' height='0'><filter id='greyscale'><feColorMatrix type='matrix' values='0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0' /></filter></svg>#greyscale");
|
||||
|
||||
// IE has no filter option: at least, have some effect when hovering...
|
||||
|
||||
20
lib/scssphp/LICENSE.md
Normal file
20
lib/scssphp/LICENSE.md
Normal file
@@ -0,0 +1,20 @@
|
||||
Copyright (c) 2015 Leaf Corcoran, http://leafo.github.io/scssphp
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
47
lib/scssphp/README.md
Normal file
47
lib/scssphp/README.md
Normal file
@@ -0,0 +1,47 @@
|
||||
# scssphp
|
||||
### <http://leafo.github.io/scssphp>
|
||||
|
||||
[](http://travis-ci.org/leafo/scssphp)
|
||||
[](https://packagist.org/packages/leafo/scssphp)
|
||||
|
||||
`scssphp` is a compiler for SCSS written in PHP.
|
||||
|
||||
Checkout the homepage, <http://leafo.github.io/scssphp>, for directions on how to use.
|
||||
|
||||
## Running Tests
|
||||
|
||||
`scssphp` uses [PHPUnit](https://github.com/sebastianbergmann/phpunit) for testing.
|
||||
|
||||
Run the following command from the root directory to run every test:
|
||||
|
||||
vendor/bin/phpunit tests
|
||||
|
||||
There are several tests in the `tests/` directory:
|
||||
|
||||
* `ApiTest.php` contains various unit tests that test the PHP interface.
|
||||
* `ExceptionTest.php` contains unit tests that test for exceptions thrown by the parser and compiler.
|
||||
* `FailingTest.php` contains tests reported in Github issues that demonstrate compatibility bugs.
|
||||
* `InputTest.php` compiles every `.scss` file in the `tests/inputs` directory
|
||||
then compares to the respective `.css` file in the `tests/outputs` directory.
|
||||
* `ScssTest.php` extracts (ruby) `scss` tests from the `tests/scss_test.rb` file.
|
||||
* `ServerTest.php` contains functional tests for the `Server` class.
|
||||
|
||||
When changing any of the tests in `tests/inputs`, the tests will most likely
|
||||
fail because the output has changed. Once you verify that the output is correct
|
||||
you can run the following command to rebuild all the tests:
|
||||
|
||||
BUILD=1 vendor/bin/phpunit tests
|
||||
|
||||
This will compile all the tests, and save results into `tests/outputs`.
|
||||
|
||||
To enable the `scss` compatibility tests:
|
||||
|
||||
TEST_SCSS_COMPAT=1 vendor/bin/phpunit tests
|
||||
|
||||
## Coding Standard
|
||||
|
||||
`scssphp` source conforms to [PSR2](http://www.php-fig.org/psr/psr-2/).
|
||||
|
||||
Run the following command from the root directory to check the code for "sniffs".
|
||||
|
||||
vendor/bin/phpcs --standard=PSR2 bin src tests
|
||||
204
lib/scssphp/bin/pscss
Normal file
204
lib/scssphp/bin/pscss
Normal file
@@ -0,0 +1,204 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2012-2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
|
||||
error_reporting(E_ALL);
|
||||
|
||||
if (version_compare(PHP_VERSION, '5.4') < 0) {
|
||||
die('Requires PHP 5.4 or above');
|
||||
}
|
||||
|
||||
include __DIR__ . '/../scss.inc.php';
|
||||
|
||||
use Leafo\ScssPhp\Compiler;
|
||||
use Leafo\ScssPhp\Parser;
|
||||
use Leafo\ScssPhp\Version;
|
||||
|
||||
$style = null;
|
||||
$loadPaths = null;
|
||||
$precision = null;
|
||||
$dumpTree = false;
|
||||
$inputFile = null;
|
||||
$changeDir = false;
|
||||
$debugInfo = false;
|
||||
$lineNumbers = false;
|
||||
$ignoreErrors = false;
|
||||
$encoding = false;
|
||||
|
||||
/**
|
||||
* Parse argument
|
||||
*
|
||||
* @param integer $i
|
||||
* @param array $options
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
function parseArgument(&$i, $options) {
|
||||
global $argc;
|
||||
global $argv;
|
||||
|
||||
if (! preg_match('/^(?:' . implode('|', (array) $options) . ')=?(.*)/', $argv[$i], $matches)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (strlen($matches[1])) {
|
||||
return $matches[1];
|
||||
}
|
||||
|
||||
if ($i + 1 < $argc) {
|
||||
$i++;
|
||||
|
||||
return $argv[$i];
|
||||
}
|
||||
}
|
||||
|
||||
for ($i = 1; $i < $argc; $i++) {
|
||||
if ($argv[$i] === '-h' || $argv[$i] === '--help') {
|
||||
$exe = $argv[0];
|
||||
|
||||
$HELP = <<<EOT
|
||||
Usage: $exe [options] [input-file]
|
||||
|
||||
Options include:
|
||||
|
||||
-h, --help Show this message
|
||||
--continue-on-error Continue compilation (as best as possible) when error encountered
|
||||
--debug-info Annotate selectors with CSS referring to the source file and line number
|
||||
-f=format Set the output format (compact, compressed, crunched, expanded, or nested)
|
||||
-i=path Set import path
|
||||
--iso8859-1 Use iso8859-1 encoding instead of utf-8 (default utf-8)
|
||||
--line-numbers Annotate selectors with comments referring to the source file and line number
|
||||
-p=precision Set decimal number precision (default 5)
|
||||
-T Dump formatted parse tree
|
||||
-v, --version Print the version
|
||||
|
||||
EOT;
|
||||
exit($HELP);
|
||||
}
|
||||
|
||||
if ($argv[$i] === '-v' || $argv[$i] === '--version') {
|
||||
exit(Version::VERSION . "\n");
|
||||
}
|
||||
|
||||
if ($argv[$i] === '--continue-on-error') {
|
||||
$ignoreErrors = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($argv[$i] === '--debug-info') {
|
||||
$debugInfo = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($argv[$i] === '--iso8859-1') {
|
||||
$encoding = 'iso8859-1';
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($argv[$i] === '--line-numbers' || $argv[$i] === '--line-comments') {
|
||||
$lineNumbers = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($argv[$i] === '-T') {
|
||||
$dumpTree = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
$value = parseArgument($i, array('-f', '--style'));
|
||||
|
||||
if (isset($value)) {
|
||||
$style = $value;
|
||||
continue;
|
||||
}
|
||||
|
||||
$value = parseArgument($i, array('-i', '--load_paths'));
|
||||
|
||||
if (isset($value)) {
|
||||
$loadPaths = $value;
|
||||
continue;
|
||||
}
|
||||
|
||||
$value = parseArgument($i, array('-p', '--precision'));
|
||||
|
||||
if (isset($value)) {
|
||||
$precision = $value;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (file_exists($argv[$i])) {
|
||||
$inputFile = $argv[$i];
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ($inputFile) {
|
||||
$data = file_get_contents($inputFile);
|
||||
|
||||
$newWorkingDir = dirname(realpath($inputFile));
|
||||
$oldWorkingDir = getcwd();
|
||||
|
||||
if ($oldWorkingDir !== $newWorkingDir) {
|
||||
$changeDir = chdir($newWorkingDir);
|
||||
$inputFile = basename($inputFile);
|
||||
}
|
||||
} else {
|
||||
$data = '';
|
||||
|
||||
while (! feof(STDIN)) {
|
||||
$data .= fread(STDIN, 8192);
|
||||
}
|
||||
}
|
||||
|
||||
if ($dumpTree) {
|
||||
$parser = new Parser($inputFile);
|
||||
|
||||
print_r(json_decode(json_encode($parser->parse($data)), true));
|
||||
|
||||
exit();
|
||||
}
|
||||
|
||||
$scss = new Compiler();
|
||||
|
||||
if ($debugInfo && $inputFile) {
|
||||
$scss->setLineNumberStyle(Compiler::DEBUG_INFO);
|
||||
}
|
||||
|
||||
if ($lineNumbers && $inputFile) {
|
||||
$scss->setLineNumberStyle(Compiler::LINE_COMMENTS);
|
||||
}
|
||||
|
||||
if ($ignoreErrors) {
|
||||
$scss->setIgnoreErrors($ignoreErrors);
|
||||
}
|
||||
|
||||
if ($loadPaths) {
|
||||
$scss->setImportPaths(explode(PATH_SEPARATOR, $loadPaths));
|
||||
}
|
||||
|
||||
if ($precision) {
|
||||
$scss->setNumberPrecision($precision);
|
||||
}
|
||||
|
||||
if ($style) {
|
||||
$scss->setFormatter('Leafo\\ScssPhp\\Formatter\\' . ucfirst($style));
|
||||
}
|
||||
|
||||
if ($encoding) {
|
||||
$scss->setEncoding($encoding);
|
||||
}
|
||||
|
||||
echo $scss->compile($data, $inputFile);
|
||||
|
||||
if ($changeDir) {
|
||||
chdir($oldWorkingDir);
|
||||
}
|
||||
34
lib/scssphp/scss.inc.php
Normal file
34
lib/scssphp/scss.inc.php
Normal file
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
/*
|
||||
* Warning: The library original has been transformed to replace "short array notation" (i.e. []) with its pre-PHP 5.4 version (i.e. array())
|
||||
* in order to make it run on PHP 5.3, using a script based on the excellent php-parser (https://github.com/nikic/PHP-Parser by Nikita Popov)
|
||||
*
|
||||
if (version_compare(PHP_VERSION, '5.4') < 0) {
|
||||
throw new \Exception('scssphp requires PHP 5.4 or above');
|
||||
}
|
||||
*/
|
||||
if (!class_exists('scssc', false)) {
|
||||
include_once __DIR__ . '/src/Base/Range.php';
|
||||
include_once __DIR__ . '/src/Block.php';
|
||||
include_once __DIR__ . '/src/Colors.php';
|
||||
include_once __DIR__ . '/src/Compiler.php';
|
||||
include_once __DIR__ . '/src/Compiler/Environment.php';
|
||||
include_once __DIR__ . '/src/Exception/CompilerException.php';
|
||||
include_once __DIR__ . '/src/Exception/ParserException.php';
|
||||
include_once __DIR__ . '/src/Exception/ServerException.php';
|
||||
include_once __DIR__ . '/src/Formatter.php';
|
||||
include_once __DIR__ . '/src/Formatter/Compact.php';
|
||||
include_once __DIR__ . '/src/Formatter/Compressed.php';
|
||||
include_once __DIR__ . '/src/Formatter/Crunched.php';
|
||||
include_once __DIR__ . '/src/Formatter/Debug.php';
|
||||
include_once __DIR__ . '/src/Formatter/Expanded.php';
|
||||
include_once __DIR__ . '/src/Formatter/Nested.php';
|
||||
include_once __DIR__ . '/src/Formatter/OutputBlock.php';
|
||||
include_once __DIR__ . '/src/Node.php';
|
||||
include_once __DIR__ . '/src/Node/Number.php';
|
||||
include_once __DIR__ . '/src/Parser.php';
|
||||
include_once __DIR__ . '/src/Type.php';
|
||||
include_once __DIR__ . '/src/Util.php';
|
||||
include_once __DIR__ . '/src/Version.php';
|
||||
include_once __DIR__ . '/src/Server.php';
|
||||
}
|
||||
44
lib/scssphp/src/Base/Range.php
Normal file
44
lib/scssphp/src/Base/Range.php
Normal file
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
namespace Leafo\ScssPhp\Base;
|
||||
|
||||
/**
|
||||
* Range
|
||||
*
|
||||
* @author Anthon Pang <anthon.pang@gmail.com>
|
||||
*/
|
||||
class Range
|
||||
{
|
||||
public $first;
|
||||
public $last;
|
||||
/**
|
||||
* Initialize range
|
||||
*
|
||||
* @param integer|float $first
|
||||
* @param integer|float $last
|
||||
*/
|
||||
public function __construct($first, $last)
|
||||
{
|
||||
$this->first = $first;
|
||||
$this->last = $last;
|
||||
}
|
||||
/**
|
||||
* Test for inclusion in range
|
||||
*
|
||||
* @param integer|float $value
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function includes($value)
|
||||
{
|
||||
return $value >= $this->first && $value <= $this->last;
|
||||
}
|
||||
}
|
||||
52
lib/scssphp/src/Block.php
Normal file
52
lib/scssphp/src/Block.php
Normal file
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2012-2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
namespace Leafo\ScssPhp;
|
||||
|
||||
/**
|
||||
* Block
|
||||
*
|
||||
* @author Anthon Pang <anthon.pang@gmail.com>
|
||||
*/
|
||||
class Block
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $type;
|
||||
/**
|
||||
* @var \Leafo\ScssPhp\Block
|
||||
*/
|
||||
public $parent;
|
||||
/**
|
||||
* @var integer
|
||||
*/
|
||||
public $sourceIndex;
|
||||
/**
|
||||
* @var integer
|
||||
*/
|
||||
public $sourceLine;
|
||||
/**
|
||||
* @var integer
|
||||
*/
|
||||
public $sourceColumn;
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
public $selectors;
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
public $comments;
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
public $children;
|
||||
}
|
||||
28
lib/scssphp/src/Colors.php
Normal file
28
lib/scssphp/src/Colors.php
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2012-2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
namespace Leafo\ScssPhp;
|
||||
|
||||
/**
|
||||
* CSS Colors
|
||||
*
|
||||
* @author Leaf Corcoran <leafot@gmail.com>
|
||||
*/
|
||||
class Colors
|
||||
{
|
||||
/**
|
||||
* CSS Colors
|
||||
*
|
||||
* @see http://www.w3.org/TR/css3-color
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $cssColors = array('aliceblue' => '240,248,255', 'antiquewhite' => '250,235,215', 'aqua' => '0,255,255', 'aquamarine' => '127,255,212', 'azure' => '240,255,255', 'beige' => '245,245,220', 'bisque' => '255,228,196', 'black' => '0,0,0', 'blanchedalmond' => '255,235,205', 'blue' => '0,0,255', 'blueviolet' => '138,43,226', 'brown' => '165,42,42', 'burlywood' => '222,184,135', 'cadetblue' => '95,158,160', 'chartreuse' => '127,255,0', 'chocolate' => '210,105,30', 'coral' => '255,127,80', 'cornflowerblue' => '100,149,237', 'cornsilk' => '255,248,220', 'crimson' => '220,20,60', 'cyan' => '0,255,255', 'darkblue' => '0,0,139', 'darkcyan' => '0,139,139', 'darkgoldenrod' => '184,134,11', 'darkgray' => '169,169,169', 'darkgreen' => '0,100,0', 'darkgrey' => '169,169,169', 'darkkhaki' => '189,183,107', 'darkmagenta' => '139,0,139', 'darkolivegreen' => '85,107,47', 'darkorange' => '255,140,0', 'darkorchid' => '153,50,204', 'darkred' => '139,0,0', 'darksalmon' => '233,150,122', 'darkseagreen' => '143,188,143', 'darkslateblue' => '72,61,139', 'darkslategray' => '47,79,79', 'darkslategrey' => '47,79,79', 'darkturquoise' => '0,206,209', 'darkviolet' => '148,0,211', 'deeppink' => '255,20,147', 'deepskyblue' => '0,191,255', 'dimgray' => '105,105,105', 'dimgrey' => '105,105,105', 'dodgerblue' => '30,144,255', 'firebrick' => '178,34,34', 'floralwhite' => '255,250,240', 'forestgreen' => '34,139,34', 'fuchsia' => '255,0,255', 'gainsboro' => '220,220,220', 'ghostwhite' => '248,248,255', 'gold' => '255,215,0', 'goldenrod' => '218,165,32', 'gray' => '128,128,128', 'green' => '0,128,0', 'greenyellow' => '173,255,47', 'grey' => '128,128,128', 'honeydew' => '240,255,240', 'hotpink' => '255,105,180', 'indianred' => '205,92,92', 'indigo' => '75,0,130', 'ivory' => '255,255,240', 'khaki' => '240,230,140', 'lavender' => '230,230,250', 'lavenderblush' => '255,240,245', 'lawngreen' => '124,252,0', 'lemonchiffon' => '255,250,205', 'lightblue' => '173,216,230', 'lightcoral' => '240,128,128', 'lightcyan' => '224,255,255', 'lightgoldenrodyellow' => '250,250,210', 'lightgray' => '211,211,211', 'lightgreen' => '144,238,144', 'lightgrey' => '211,211,211', 'lightpink' => '255,182,193', 'lightsalmon' => '255,160,122', 'lightseagreen' => '32,178,170', 'lightskyblue' => '135,206,250', 'lightslategray' => '119,136,153', 'lightslategrey' => '119,136,153', 'lightsteelblue' => '176,196,222', 'lightyellow' => '255,255,224', 'lime' => '0,255,0', 'limegreen' => '50,205,50', 'linen' => '250,240,230', 'magenta' => '255,0,255', 'maroon' => '128,0,0', 'mediumaquamarine' => '102,205,170', 'mediumblue' => '0,0,205', 'mediumorchid' => '186,85,211', 'mediumpurple' => '147,112,219', 'mediumseagreen' => '60,179,113', 'mediumslateblue' => '123,104,238', 'mediumspringgreen' => '0,250,154', 'mediumturquoise' => '72,209,204', 'mediumvioletred' => '199,21,133', 'midnightblue' => '25,25,112', 'mintcream' => '245,255,250', 'mistyrose' => '255,228,225', 'moccasin' => '255,228,181', 'navajowhite' => '255,222,173', 'navy' => '0,0,128', 'oldlace' => '253,245,230', 'olive' => '128,128,0', 'olivedrab' => '107,142,35', 'orange' => '255,165,0', 'orangered' => '255,69,0', 'orchid' => '218,112,214', 'palegoldenrod' => '238,232,170', 'palegreen' => '152,251,152', 'paleturquoise' => '175,238,238', 'palevioletred' => '219,112,147', 'papayawhip' => '255,239,213', 'peachpuff' => '255,218,185', 'peru' => '205,133,63', 'pink' => '255,192,203', 'plum' => '221,160,221', 'powderblue' => '176,224,230', 'purple' => '128,0,128', 'rebeccapurple' => '102,51,153', 'red' => '255,0,0', 'rosybrown' => '188,143,143', 'royalblue' => '65,105,225', 'saddlebrown' => '139,69,19', 'salmon' => '250,128,114', 'sandybrown' => '244,164,96', 'seagreen' => '46,139,87', 'seashell' => '255,245,238', 'sienna' => '160,82,45', 'silver' => '192,192,192', 'skyblue' => '135,206,235', 'slateblue' => '106,90,205', 'slategray' => '112,128,144', 'slategrey' => '112,128,144', 'snow' => '255,250,250', 'springgreen' => '0,255,127', 'steelblue' => '70,130,180', 'tan' => '210,180,140', 'teal' => '0,128,128', 'thistle' => '216,191,216', 'tomato' => '255,99,71', 'transparent' => '0,0,0,0', 'turquoise' => '64,224,208', 'violet' => '238,130,238', 'wheat' => '245,222,179', 'white' => '255,255,255', 'whitesmoke' => '245,245,245', 'yellow' => '255,255,0', 'yellowgreen' => '154,205,50');
|
||||
}
|
||||
3989
lib/scssphp/src/Compiler.php
Normal file
3989
lib/scssphp/src/Compiler.php
Normal file
File diff suppressed because it is too large
Load Diff
36
lib/scssphp/src/Compiler/Environment.php
Normal file
36
lib/scssphp/src/Compiler/Environment.php
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2012-2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
namespace Leafo\ScssPhp\Compiler;
|
||||
|
||||
/**
|
||||
* Compiler environment
|
||||
*
|
||||
* @author Anthon Pang <anthon.pang@gmail.com>
|
||||
*/
|
||||
class Environment
|
||||
{
|
||||
/**
|
||||
* @var \Leafo\ScssPhp\Block
|
||||
*/
|
||||
public $block;
|
||||
/**
|
||||
* @var \Leafo\ScssPhp\Compiler\Environment
|
||||
*/
|
||||
public $parent;
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
public $store;
|
||||
/**
|
||||
* @var integer
|
||||
*/
|
||||
public $depth;
|
||||
}
|
||||
20
lib/scssphp/src/Exception/CompilerException.php
Normal file
20
lib/scssphp/src/Exception/CompilerException.php
Normal file
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2012-2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
namespace Leafo\ScssPhp\Exception;
|
||||
|
||||
/**
|
||||
* Compiler exception
|
||||
*
|
||||
* @author Oleksandr Savchenko <traveltino@gmail.com>
|
||||
*/
|
||||
class CompilerException extends \Exception
|
||||
{
|
||||
}
|
||||
20
lib/scssphp/src/Exception/ParserException.php
Normal file
20
lib/scssphp/src/Exception/ParserException.php
Normal file
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2012-2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
namespace Leafo\ScssPhp\Exception;
|
||||
|
||||
/**
|
||||
* Parser Exception
|
||||
*
|
||||
* @author Oleksandr Savchenko <traveltino@gmail.com>
|
||||
*/
|
||||
class ParserException extends \Exception
|
||||
{
|
||||
}
|
||||
20
lib/scssphp/src/Exception/ServerException.php
Normal file
20
lib/scssphp/src/Exception/ServerException.php
Normal file
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2012-2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
namespace Leafo\ScssPhp\Exception;
|
||||
|
||||
/**
|
||||
* Server Exception
|
||||
*
|
||||
* @author Anthon Pang <anthon.pang@gmail.com>
|
||||
*/
|
||||
class ServerException extends \Exception
|
||||
{
|
||||
}
|
||||
178
lib/scssphp/src/Formatter.php
Normal file
178
lib/scssphp/src/Formatter.php
Normal file
@@ -0,0 +1,178 @@
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2012-2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
namespace Leafo\ScssPhp;
|
||||
|
||||
use Leafo\ScssPhp\Formatter\OutputBlock;
|
||||
/**
|
||||
* Base formatter
|
||||
*
|
||||
* @author Leaf Corcoran <leafot@gmail.com>
|
||||
*/
|
||||
abstract class Formatter
|
||||
{
|
||||
/**
|
||||
* @var integer
|
||||
*/
|
||||
public $indentLevel;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $indentChar;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $break;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $open;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $close;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $tagSeparator;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $assignSeparator;
|
||||
/**
|
||||
* @var boolea
|
||||
*/
|
||||
public $keepSemicolons;
|
||||
/**
|
||||
* Initialize formatter
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public abstract function __construct();
|
||||
/**
|
||||
* Return indentation (whitespace)
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function indentStr()
|
||||
{
|
||||
return '';
|
||||
}
|
||||
/**
|
||||
* Return property assignment
|
||||
*
|
||||
* @api
|
||||
*
|
||||
* @param string $name
|
||||
* @param mixed $value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function property($name, $value)
|
||||
{
|
||||
return rtrim($name) . $this->assignSeparator . $value . ';';
|
||||
}
|
||||
/**
|
||||
* Strip semi-colon appended by property(); it's a separator, not a terminator
|
||||
*
|
||||
* @api
|
||||
*
|
||||
* @param array $lines
|
||||
*/
|
||||
public function stripSemicolon(&$lines)
|
||||
{
|
||||
if ($this->keepSemicolons) {
|
||||
return;
|
||||
}
|
||||
if (($count = count($lines)) && substr($lines[$count - 1], -1) === ';') {
|
||||
$lines[$count - 1] = substr($lines[$count - 1], 0, -1);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Output lines inside a block
|
||||
*
|
||||
* @param \Leafo\ScssPhp\Formatter\OutputBlock $block
|
||||
*/
|
||||
protected function blockLines(OutputBlock $block)
|
||||
{
|
||||
$inner = $this->indentStr();
|
||||
$glue = $this->break . $inner;
|
||||
echo $inner . implode($glue, $block->lines);
|
||||
if (!empty($block->children)) {
|
||||
echo $this->break;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Output block selectors
|
||||
*
|
||||
* @param \Leafo\ScssPhp\Formatter\OutputBlock $block
|
||||
*/
|
||||
protected function blockSelectors(OutputBlock $block)
|
||||
{
|
||||
$inner = $this->indentStr();
|
||||
echo $inner . implode($this->tagSeparator, $block->selectors) . $this->open . $this->break;
|
||||
}
|
||||
/**
|
||||
* Output block children
|
||||
*
|
||||
* @param \Leafo\ScssPhp\Formatter\OutputBlock $block
|
||||
*/
|
||||
protected function blockChildren(OutputBlock $block)
|
||||
{
|
||||
foreach ($block->children as $child) {
|
||||
$this->block($child);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Output non-empty block
|
||||
*
|
||||
* @param \Leafo\ScssPhp\Formatter\OutputBlock $block
|
||||
*/
|
||||
protected function block(OutputBlock $block)
|
||||
{
|
||||
if (empty($block->lines) && empty($block->children)) {
|
||||
return;
|
||||
}
|
||||
$pre = $this->indentStr();
|
||||
if (!empty($block->selectors)) {
|
||||
$this->blockSelectors($block);
|
||||
$this->indentLevel++;
|
||||
}
|
||||
if (!empty($block->lines)) {
|
||||
$this->blockLines($block);
|
||||
}
|
||||
if (!empty($block->children)) {
|
||||
$this->blockChildren($block);
|
||||
}
|
||||
if (!empty($block->selectors)) {
|
||||
$this->indentLevel--;
|
||||
if (empty($block->children)) {
|
||||
echo $this->break;
|
||||
}
|
||||
echo $pre . $this->close . $this->break;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Entry point to formatting a block
|
||||
*
|
||||
* @api
|
||||
*
|
||||
* @param \Leafo\ScssPhp\Formatter\OutputBlock $block An abstract syntax tree
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function format(OutputBlock $block)
|
||||
{
|
||||
ob_start();
|
||||
$this->block($block);
|
||||
$out = ob_get_clean();
|
||||
return $out;
|
||||
}
|
||||
}
|
||||
44
lib/scssphp/src/Formatter/Compact.php
Normal file
44
lib/scssphp/src/Formatter/Compact.php
Normal file
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2012-2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
namespace Leafo\ScssPhp\Formatter;
|
||||
|
||||
use Leafo\ScssPhp\Formatter;
|
||||
/**
|
||||
* Compact formatter
|
||||
*
|
||||
* @author Leaf Corcoran <leafot@gmail.com>
|
||||
*/
|
||||
class Compact extends Formatter
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->indentLevel = 0;
|
||||
$this->indentChar = '';
|
||||
$this->break = '';
|
||||
$this->open = ' {';
|
||||
$this->close = '}
|
||||
|
||||
';
|
||||
$this->tagSeparator = ',';
|
||||
$this->assignSeparator = ':';
|
||||
$this->keepSemicolons = true;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function indentStr()
|
||||
{
|
||||
return ' ';
|
||||
}
|
||||
}
|
||||
55
lib/scssphp/src/Formatter/Compressed.php
Normal file
55
lib/scssphp/src/Formatter/Compressed.php
Normal file
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2012-2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
namespace Leafo\ScssPhp\Formatter;
|
||||
|
||||
use Leafo\ScssPhp\Formatter;
|
||||
use Leafo\ScssPhp\Formatter\OutputBlock;
|
||||
/**
|
||||
* Compressed formatter
|
||||
*
|
||||
* @author Leaf Corcoran <leafot@gmail.com>
|
||||
*/
|
||||
class Compressed extends Formatter
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->indentLevel = 0;
|
||||
$this->indentChar = ' ';
|
||||
$this->break = '';
|
||||
$this->open = '{';
|
||||
$this->close = '}';
|
||||
$this->tagSeparator = ',';
|
||||
$this->assignSeparator = ':';
|
||||
$this->keepSemicolons = false;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function blockLines(OutputBlock $block)
|
||||
{
|
||||
$inner = $this->indentStr();
|
||||
$glue = $this->break . $inner;
|
||||
foreach ($block->lines as $index => $line) {
|
||||
if (substr($line, 0, 2) === '/*' && substr($line, 2, 1) !== '!') {
|
||||
unset($block->lines[$index]);
|
||||
} elseif (substr($line, 0, 3) === '/*!') {
|
||||
$block->lines[$index] = '/*' . substr($line, 3);
|
||||
}
|
||||
}
|
||||
echo $inner . implode($glue, $block->lines);
|
||||
if (!empty($block->children)) {
|
||||
echo $this->break;
|
||||
}
|
||||
}
|
||||
}
|
||||
53
lib/scssphp/src/Formatter/Crunched.php
Normal file
53
lib/scssphp/src/Formatter/Crunched.php
Normal file
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2012-2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
namespace Leafo\ScssPhp\Formatter;
|
||||
|
||||
use Leafo\ScssPhp\Formatter;
|
||||
use Leafo\ScssPhp\Formatter\OutputBlock;
|
||||
/**
|
||||
* Crunched formatter
|
||||
*
|
||||
* @author Anthon Pang <anthon.pang@gmail.com>
|
||||
*/
|
||||
class Crunched extends Formatter
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->indentLevel = 0;
|
||||
$this->indentChar = ' ';
|
||||
$this->break = '';
|
||||
$this->open = '{';
|
||||
$this->close = '}';
|
||||
$this->tagSeparator = ',';
|
||||
$this->assignSeparator = ':';
|
||||
$this->keepSemicolons = false;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function blockLines(OutputBlock $block)
|
||||
{
|
||||
$inner = $this->indentStr();
|
||||
$glue = $this->break . $inner;
|
||||
foreach ($block->lines as $index => $line) {
|
||||
if (substr($line, 0, 2) === '/*') {
|
||||
unset($block->lines[$index]);
|
||||
}
|
||||
}
|
||||
echo $inner . implode($glue, $block->lines);
|
||||
if (!empty($block->children)) {
|
||||
echo $this->break;
|
||||
}
|
||||
}
|
||||
}
|
||||
99
lib/scssphp/src/Formatter/Debug.php
Normal file
99
lib/scssphp/src/Formatter/Debug.php
Normal file
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2012-2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
namespace Leafo\ScssPhp\Formatter;
|
||||
|
||||
use Leafo\ScssPhp\Formatter;
|
||||
use Leafo\ScssPhp\Formatter\OutputBlock;
|
||||
/**
|
||||
* Debug formatter
|
||||
*
|
||||
* @author Anthon Pang <anthon.pang@gmail.com>
|
||||
*/
|
||||
class Debug extends Formatter
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->indentLevel = 0;
|
||||
$this->indentChar = '';
|
||||
$this->break = '
|
||||
';
|
||||
$this->open = ' {';
|
||||
$this->close = ' }';
|
||||
$this->tagSeparator = ', ';
|
||||
$this->assignSeparator = ': ';
|
||||
$this->keepSemicolons = true;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function indentStr()
|
||||
{
|
||||
return str_repeat(' ', $this->indentLevel);
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function blockLines(OutputBlock $block)
|
||||
{
|
||||
$indent = $this->indentStr();
|
||||
if (empty($block->lines)) {
|
||||
echo "{$indent}block->lines: []\n";
|
||||
return;
|
||||
}
|
||||
foreach ($block->lines as $index => $line) {
|
||||
echo "{$indent}block->lines[{$index}]: {$line}\n";
|
||||
}
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function blockSelectors(OutputBlock $block)
|
||||
{
|
||||
$indent = $this->indentStr();
|
||||
if (empty($block->selectors)) {
|
||||
echo "{$indent}block->selectors: []\n";
|
||||
return;
|
||||
}
|
||||
foreach ($block->selectors as $index => $selector) {
|
||||
echo "{$indent}block->selectors[{$index}]: {$selector}\n";
|
||||
}
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function blockChildren(OutputBlock $block)
|
||||
{
|
||||
$indent = $this->indentStr();
|
||||
if (empty($block->children)) {
|
||||
echo "{$indent}block->children: []\n";
|
||||
return;
|
||||
}
|
||||
$this->indentLevel++;
|
||||
foreach ($block->children as $i => $child) {
|
||||
$this->block($child);
|
||||
}
|
||||
$this->indentLevel--;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function block(OutputBlock $block)
|
||||
{
|
||||
$indent = $this->indentStr();
|
||||
echo "{$indent}block->type: {$block->type}\n" . "{$indent}block->depth: {$block->depth}\n";
|
||||
$this->blockSelectors($block);
|
||||
$this->blockLines($block);
|
||||
$this->blockChildren($block);
|
||||
}
|
||||
}
|
||||
61
lib/scssphp/src/Formatter/Expanded.php
Normal file
61
lib/scssphp/src/Formatter/Expanded.php
Normal file
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2012-2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
namespace Leafo\ScssPhp\Formatter;
|
||||
|
||||
use Leafo\ScssPhp\Formatter;
|
||||
use Leafo\ScssPhp\Formatter\OutputBlock;
|
||||
/**
|
||||
* Expanded formatter
|
||||
*
|
||||
* @author Leaf Corcoran <leafot@gmail.com>
|
||||
*/
|
||||
class Expanded extends Formatter
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->indentLevel = 0;
|
||||
$this->indentChar = ' ';
|
||||
$this->break = '
|
||||
';
|
||||
$this->open = ' {';
|
||||
$this->close = '}';
|
||||
$this->tagSeparator = ', ';
|
||||
$this->assignSeparator = ': ';
|
||||
$this->keepSemicolons = true;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function indentStr()
|
||||
{
|
||||
return str_repeat($this->indentChar, $this->indentLevel);
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function blockLines(OutputBlock $block)
|
||||
{
|
||||
$inner = $this->indentStr();
|
||||
$glue = $this->break . $inner;
|
||||
foreach ($block->lines as $index => $line) {
|
||||
if (substr($line, 0, 2) === '/*') {
|
||||
$block->lines[$index] = preg_replace('/(\\r|\\n)+/', $glue, $line);
|
||||
}
|
||||
}
|
||||
echo $inner . implode($glue, $block->lines);
|
||||
if (empty($block->selectors) || !empty($block->children)) {
|
||||
echo $this->break;
|
||||
}
|
||||
}
|
||||
}
|
||||
160
lib/scssphp/src/Formatter/Nested.php
Normal file
160
lib/scssphp/src/Formatter/Nested.php
Normal file
@@ -0,0 +1,160 @@
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2012-2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
namespace Leafo\ScssPhp\Formatter;
|
||||
|
||||
use Leafo\ScssPhp\Formatter;
|
||||
use Leafo\ScssPhp\Formatter\OutputBlock;
|
||||
/**
|
||||
* Nested formatter
|
||||
*
|
||||
* @author Leaf Corcoran <leafot@gmail.com>
|
||||
*/
|
||||
class Nested extends Formatter
|
||||
{
|
||||
/**
|
||||
* @var integer
|
||||
*/
|
||||
private $depth;
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->indentLevel = 0;
|
||||
$this->indentChar = ' ';
|
||||
$this->break = '
|
||||
';
|
||||
$this->open = ' {';
|
||||
$this->close = ' }';
|
||||
$this->tagSeparator = ', ';
|
||||
$this->assignSeparator = ': ';
|
||||
$this->keepSemicolons = true;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function indentStr()
|
||||
{
|
||||
$n = $this->depth - 1;
|
||||
return str_repeat($this->indentChar, max($this->indentLevel + $n, 0));
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function blockLines(OutputBlock $block)
|
||||
{
|
||||
$inner = $this->indentStr();
|
||||
$glue = $this->break . $inner;
|
||||
foreach ($block->lines as $index => $line) {
|
||||
if (substr($line, 0, 2) === '/*') {
|
||||
$block->lines[$index] = preg_replace('/(\\r|\\n)+/', $glue, $line);
|
||||
}
|
||||
}
|
||||
echo $inner . implode($glue, $block->lines);
|
||||
if (!empty($block->children)) {
|
||||
echo $this->break;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function blockSelectors(OutputBlock $block)
|
||||
{
|
||||
$inner = $this->indentStr();
|
||||
echo $inner . implode($this->tagSeparator, $block->selectors) . $this->open . $this->break;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function blockChildren(OutputBlock $block)
|
||||
{
|
||||
foreach ($block->children as $i => $child) {
|
||||
$this->block($child);
|
||||
if ($i < count($block->children) - 1) {
|
||||
echo $this->break;
|
||||
if (isset($block->children[$i + 1])) {
|
||||
$next = $block->children[$i + 1];
|
||||
if ($next->depth === max($block->depth, 1) && $child->depth >= $next->depth) {
|
||||
echo $this->break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function block(OutputBlock $block)
|
||||
{
|
||||
if ($block->type === 'root') {
|
||||
$this->adjustAllChildren($block);
|
||||
}
|
||||
if (empty($block->lines) && empty($block->children)) {
|
||||
return;
|
||||
}
|
||||
$this->depth = $block->depth;
|
||||
if (!empty($block->selectors)) {
|
||||
$this->blockSelectors($block);
|
||||
$this->indentLevel++;
|
||||
}
|
||||
if (!empty($block->lines)) {
|
||||
$this->blockLines($block);
|
||||
}
|
||||
if (!empty($block->children)) {
|
||||
$this->blockChildren($block);
|
||||
}
|
||||
if (!empty($block->selectors)) {
|
||||
$this->indentLevel--;
|
||||
echo $this->close;
|
||||
}
|
||||
if ($block->type === 'root') {
|
||||
echo $this->break;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Adjust the depths of all children, depth first
|
||||
*
|
||||
* @param \Leafo\ScssPhp\Formatter\OutputBlock $block
|
||||
*/
|
||||
private function adjustAllChildren(OutputBlock $block)
|
||||
{
|
||||
// flatten empty nested blocks
|
||||
$children = array();
|
||||
foreach ($block->children as $i => $child) {
|
||||
if (empty($child->lines) && empty($child->children)) {
|
||||
if (isset($block->children[$i + 1])) {
|
||||
$block->children[$i + 1]->depth = $child->depth;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
$children[] = $child;
|
||||
}
|
||||
$count = count($children);
|
||||
for ($i = 0; $i < $count; $i++) {
|
||||
$depth = $children[$i]->depth;
|
||||
$j = $i + 1;
|
||||
if (isset($children[$j]) && $depth < $children[$j]->depth) {
|
||||
$childDepth = $children[$j]->depth;
|
||||
for (; $j < $count; $j++) {
|
||||
if ($depth < $children[$j]->depth && $childDepth >= $children[$j]->depth) {
|
||||
$children[$j]->depth = $depth + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$block->children = $children;
|
||||
// make relative to parent
|
||||
foreach ($block->children as $child) {
|
||||
$this->adjustAllChildren($child);
|
||||
$child->depth = $child->depth - $block->depth;
|
||||
}
|
||||
}
|
||||
}
|
||||
44
lib/scssphp/src/Formatter/OutputBlock.php
Normal file
44
lib/scssphp/src/Formatter/OutputBlock.php
Normal file
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2012-2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
namespace Leafo\ScssPhp\Formatter;
|
||||
|
||||
/**
|
||||
* Output block
|
||||
*
|
||||
* @author Anthon Pang <anthon.pang@gmail.com>
|
||||
*/
|
||||
class OutputBlock
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $type;
|
||||
/**
|
||||
* @var integer
|
||||
*/
|
||||
public $depth;
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
public $selectors;
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
public $lines;
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
public $children;
|
||||
/**
|
||||
* @var \Leafo\ScssPhp\Formatter\OutputBlock
|
||||
*/
|
||||
public $parent;
|
||||
}
|
||||
36
lib/scssphp/src/Node.php
Normal file
36
lib/scssphp/src/Node.php
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2012-2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
namespace Leafo\ScssPhp;
|
||||
|
||||
/**
|
||||
* Base node
|
||||
*
|
||||
* @author Anthon Pang <anthon.pang@gmail.com>
|
||||
*/
|
||||
abstract class Node
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $type;
|
||||
/**
|
||||
* @var integer
|
||||
*/
|
||||
public $sourceIndex;
|
||||
/**
|
||||
* @var integer
|
||||
*/
|
||||
public $sourceLine;
|
||||
/**
|
||||
* @var integer
|
||||
*/
|
||||
public $sourceColumn;
|
||||
}
|
||||
249
lib/scssphp/src/Node/Number.php
Normal file
249
lib/scssphp/src/Node/Number.php
Normal file
@@ -0,0 +1,249 @@
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2012-2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
namespace Leafo\ScssPhp\Node;
|
||||
|
||||
use Leafo\ScssPhp\Compiler;
|
||||
use Leafo\ScssPhp\Node;
|
||||
use Leafo\ScssPhp\Type;
|
||||
/**
|
||||
* Dimension + optional units
|
||||
*
|
||||
* {@internal
|
||||
* This is a work-in-progress.
|
||||
*
|
||||
* The \ArrayAccess interface is temporary until the migration is complete.
|
||||
* }}
|
||||
*
|
||||
* @author Anthon Pang <anthon.pang@gmail.com>
|
||||
*/
|
||||
class Number extends Node implements \ArrayAccess
|
||||
{
|
||||
/**
|
||||
* @var integer
|
||||
*/
|
||||
public static $precision = 5;
|
||||
/**
|
||||
* @see http://www.w3.org/TR/2012/WD-css3-values-20120308/
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected static $unitTable = array('in' => array('in' => 1, 'pc' => 6, 'pt' => 72, 'px' => 96, 'cm' => 2.54, 'mm' => 25.4, 'q' => 101.6), 'turn' => array('deg' => 360, 'grad' => 400, 'rad' => 6.283185307179586, 'turn' => 1), 's' => array('s' => 1, 'ms' => 1000), 'Hz' => array('Hz' => 1, 'kHz' => 0.001), 'dpi' => array('dpi' => 1, 'dpcm' => 2.54, 'dppx' => 96));
|
||||
/**
|
||||
* @var integer|float
|
||||
*/
|
||||
public $dimension;
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
public $units;
|
||||
/**
|
||||
* Initialize number
|
||||
*
|
||||
* @param mixed $dimension
|
||||
* @param mixed $initialUnit
|
||||
*/
|
||||
public function __construct($dimension, $initialUnit)
|
||||
{
|
||||
$this->type = Type::T_NUMBER;
|
||||
$this->dimension = $dimension;
|
||||
$this->units = is_array($initialUnit) ? $initialUnit : ($initialUnit ? array($initialUnit => 1) : array());
|
||||
}
|
||||
/**
|
||||
* Coerce number to target units
|
||||
*
|
||||
* @param array $units
|
||||
*
|
||||
* @return \Leafo\ScssPhp\Node\Number
|
||||
*/
|
||||
public function coerce($units)
|
||||
{
|
||||
if ($this->unitless()) {
|
||||
return new Number($this->dimension, $units);
|
||||
}
|
||||
$dimension = $this->dimension;
|
||||
foreach (self::$unitTable['in'] as $unit => $conv) {
|
||||
$from = isset($this->units[$unit]) ? $this->units[$unit] : 0;
|
||||
$to = isset($units[$unit]) ? $units[$unit] : 0;
|
||||
$factor = pow($conv, $from - $to);
|
||||
$dimension /= $factor;
|
||||
}
|
||||
return new Number($dimension, $units);
|
||||
}
|
||||
/**
|
||||
* Normalize number
|
||||
*
|
||||
* @return \Leafo\ScssPhp\Node\Number
|
||||
*/
|
||||
public function normalize()
|
||||
{
|
||||
$dimension = $this->dimension;
|
||||
$units = array();
|
||||
$this->normalizeUnits($dimension, $units, 'in');
|
||||
return new Number($dimension, $units);
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function offsetExists($offset)
|
||||
{
|
||||
if ($offset === -3) {
|
||||
return $this->sourceColumn !== null;
|
||||
}
|
||||
if ($offset === -2) {
|
||||
return $this->sourceLine !== null;
|
||||
}
|
||||
if ($offset === -1 || $offset === 0 || $offset === 1 || $offset === 2) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function offsetGet($offset)
|
||||
{
|
||||
switch ($offset) {
|
||||
case -3:
|
||||
return $this->sourceColumn;
|
||||
case -2:
|
||||
return $this->sourceLine;
|
||||
case -1:
|
||||
return $this->sourceIndex;
|
||||
case 0:
|
||||
return $this->type;
|
||||
case 1:
|
||||
return $this->dimension;
|
||||
case 2:
|
||||
return $this->units;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function offsetSet($offset, $value)
|
||||
{
|
||||
if ($offset === 1) {
|
||||
$this->dimension = $value;
|
||||
} elseif ($offset === 2) {
|
||||
$this->units = $value;
|
||||
} elseif ($offset == -1) {
|
||||
$this->sourceIndex = $value;
|
||||
} elseif ($offset == -2) {
|
||||
$this->sourceLine = $value;
|
||||
} elseif ($offset == -3) {
|
||||
$this->sourceColumn = $value;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function offsetUnset($offset)
|
||||
{
|
||||
if ($offset === 1) {
|
||||
$this->dimension = null;
|
||||
} elseif ($offset === 2) {
|
||||
$this->units = null;
|
||||
} elseif ($offset === -1) {
|
||||
$this->sourceIndex = null;
|
||||
} elseif ($offset === -2) {
|
||||
$this->sourceLine = null;
|
||||
} elseif ($offset === -3) {
|
||||
$this->sourceColumn = null;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Returns true if the number is unitless
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function unitless()
|
||||
{
|
||||
return !array_sum($this->units);
|
||||
}
|
||||
/**
|
||||
* Returns unit(s) as the product of numerator units divided by the product of denominator units
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function unitStr()
|
||||
{
|
||||
$numerators = array();
|
||||
$denominators = array();
|
||||
foreach ($this->units as $unit => $unitSize) {
|
||||
if ($unitSize > 0) {
|
||||
$numerators = array_pad($numerators, count($numerators) + $unitSize, $unit);
|
||||
continue;
|
||||
}
|
||||
if ($unitSize < 0) {
|
||||
$denominators = array_pad($denominators, count($denominators) + $unitSize, $unit);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
return implode('*', $numerators) . (count($denominators) ? '/' . implode('*', $denominators) : '');
|
||||
}
|
||||
/**
|
||||
* Output number
|
||||
*
|
||||
* @param \Leafo\ScssPhp\Compiler $compiler
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function output(Compiler $compiler = null)
|
||||
{
|
||||
$dimension = round($this->dimension, self::$precision);
|
||||
$units = array_filter($this->units, function ($unitSize) {
|
||||
return $unitSize;
|
||||
});
|
||||
if (count($units) > 1 && array_sum($units) === 0) {
|
||||
$dimension = $this->dimension;
|
||||
$units = array();
|
||||
$this->normalizeUnits($dimension, $units, 'in');
|
||||
$dimension = round($dimension, self::$precision);
|
||||
$units = array_filter($units, function ($unitSize) {
|
||||
return $unitSize;
|
||||
});
|
||||
}
|
||||
$unitSize = array_sum($units);
|
||||
if ($compiler && ($unitSize > 1 || $unitSize < 0 || count($units) > 1)) {
|
||||
$compiler->throwError((string) $dimension . $this->unitStr() . ' isn\'t a valid CSS value.');
|
||||
}
|
||||
reset($units);
|
||||
list($unit, ) = each($units);
|
||||
return (string) $dimension . $unit;
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return $this->output();
|
||||
}
|
||||
/**
|
||||
* Normalize units
|
||||
*
|
||||
* @param integer|float $dimension
|
||||
* @param array $units
|
||||
* @param string $baseUnit
|
||||
*/
|
||||
private function normalizeUnits(&$dimension, &$units, $baseUnit = 'in')
|
||||
{
|
||||
$dimension = $this->dimension;
|
||||
$units = array();
|
||||
foreach ($this->units as $unit => $exp) {
|
||||
if (isset(self::$unitTable[$baseUnit][$unit])) {
|
||||
$factor = pow(self::$unitTable[$baseUnit][$unit], $exp);
|
||||
$unit = $baseUnit;
|
||||
$dimension /= $factor;
|
||||
}
|
||||
$units[$unit] = $exp + (isset($units[$unit]) ? $units[$unit] : 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
lib/scssphp/src/Parser.php
Normal file
BIN
lib/scssphp/src/Parser.php
Normal file
Binary file not shown.
364
lib/scssphp/src/Server.php
Normal file
364
lib/scssphp/src/Server.php
Normal file
@@ -0,0 +1,364 @@
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2012-2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
namespace Leafo\ScssPhp;
|
||||
|
||||
use Leafo\ScssPhp\Compiler;
|
||||
use Leafo\ScssPhp\Exception\ServerException;
|
||||
use Leafo\ScssPhp\Version;
|
||||
/**
|
||||
* Server
|
||||
*
|
||||
* @author Leaf Corcoran <leafot@gmail.com>
|
||||
*/
|
||||
class Server
|
||||
{
|
||||
/**
|
||||
* @var boolean
|
||||
*/
|
||||
private $showErrorsAsCSS;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $dir;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $cacheDir;
|
||||
/**
|
||||
* @var \Leafo\ScssPhp\Compiler
|
||||
*/
|
||||
private $scss;
|
||||
/**
|
||||
* Join path components
|
||||
*
|
||||
* @param string $left Path component, left of the directory separator
|
||||
* @param string $right Path component, right of the directory separator
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function join($left, $right)
|
||||
{
|
||||
return rtrim($left, '/\\') . DIRECTORY_SEPARATOR . ltrim($right, '/\\');
|
||||
}
|
||||
/**
|
||||
* Get name of requested .scss file
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
protected function inputName()
|
||||
{
|
||||
switch (true) {
|
||||
case isset($_GET['p']):
|
||||
return $_GET['p'];
|
||||
case isset($_SERVER['PATH_INFO']):
|
||||
return $_SERVER['PATH_INFO'];
|
||||
case isset($_SERVER['DOCUMENT_URI']):
|
||||
return substr($_SERVER['DOCUMENT_URI'], strlen($_SERVER['SCRIPT_NAME']));
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Get path to requested .scss file
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function findInput()
|
||||
{
|
||||
if (($input = $this->inputName()) && strpos($input, '..') === false && substr($input, -5) === '.scss') {
|
||||
$name = $this->join($this->dir, $input);
|
||||
if (is_file($name) && is_readable($name)) {
|
||||
return $name;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* Get path to cached .css file
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function cacheName($fname)
|
||||
{
|
||||
return $this->join($this->cacheDir, md5($fname) . '.css');
|
||||
}
|
||||
/**
|
||||
* Get path to meta data
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function metadataName($out)
|
||||
{
|
||||
return $out . '.meta';
|
||||
}
|
||||
/**
|
||||
* Determine whether .scss file needs to be re-compiled.
|
||||
*
|
||||
* @param string $out Output path
|
||||
* @param string $etag ETag
|
||||
*
|
||||
* @return boolean True if compile required.
|
||||
*/
|
||||
protected function needsCompile($out, &$etag)
|
||||
{
|
||||
if (!is_file($out)) {
|
||||
return true;
|
||||
}
|
||||
$mtime = filemtime($out);
|
||||
$metadataName = $this->metadataName($out);
|
||||
if (is_readable($metadataName)) {
|
||||
$metadata = unserialize(file_get_contents($metadataName));
|
||||
foreach ($metadata['imports'] as $import => $originalMtime) {
|
||||
$currentMtime = filemtime($import);
|
||||
if ($currentMtime !== $originalMtime || $currentMtime > $mtime) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
$metaVars = crc32(serialize($this->scss->getVariables()));
|
||||
if ($metaVars !== $metadata['vars']) {
|
||||
return true;
|
||||
}
|
||||
$etag = $metadata['etag'];
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Get If-Modified-Since header from client request
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
protected function getIfModifiedSinceHeader()
|
||||
{
|
||||
$modifiedSince = null;
|
||||
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
|
||||
$modifiedSince = $_SERVER['HTTP_IF_MODIFIED_SINCE'];
|
||||
if (false !== ($semicolonPos = strpos($modifiedSince, ';'))) {
|
||||
$modifiedSince = substr($modifiedSince, 0, $semicolonPos);
|
||||
}
|
||||
}
|
||||
return $modifiedSince;
|
||||
}
|
||||
/**
|
||||
* Get If-None-Match header from client request
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
protected function getIfNoneMatchHeader()
|
||||
{
|
||||
$noneMatch = null;
|
||||
if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
|
||||
$noneMatch = $_SERVER['HTTP_IF_NONE_MATCH'];
|
||||
}
|
||||
return $noneMatch;
|
||||
}
|
||||
/**
|
||||
* Compile .scss file
|
||||
*
|
||||
* @param string $in Input path (.scss)
|
||||
* @param string $out Output path (.css)
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function compile($in, $out)
|
||||
{
|
||||
$start = microtime(true);
|
||||
$css = $this->scss->compile(file_get_contents($in), $in);
|
||||
$elapsed = round(microtime(true) - $start, 4);
|
||||
$v = Version::VERSION;
|
||||
$t = date('r');
|
||||
$css = "/* compiled by scssphp {$v} on {$t} ({$elapsed}s) */\n\n" . $css;
|
||||
$etag = md5($css);
|
||||
file_put_contents($out, $css);
|
||||
file_put_contents($this->metadataName($out), serialize(array('etag' => $etag, 'imports' => $this->scss->getParsedFiles(), 'vars' => crc32(serialize($this->scss->getVariables())))));
|
||||
return array($css, $etag);
|
||||
}
|
||||
/**
|
||||
* Format error as a pseudo-element in CSS
|
||||
*
|
||||
* @param \Exception $error
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function createErrorCSS(\Exception $error)
|
||||
{
|
||||
$message = str_replace(array('\'', '
|
||||
'), array('\\\'', '\\A'), $error->getfile() . ':
|
||||
|
||||
' . $error->getMessage());
|
||||
return "body { display: none !important; }\n html:after {\n background: white;\n color: black;\n content: '{$message}';\n display: block !important;\n font-family: mono;\n padding: 1em;\n white-space: pre;\n }";
|
||||
}
|
||||
/**
|
||||
* Render errors as a pseudo-element within valid CSS, displaying the errors on any
|
||||
* page that includes this CSS.
|
||||
*
|
||||
* @param boolean $show
|
||||
*/
|
||||
public function showErrorsAsCSS($show = true)
|
||||
{
|
||||
$this->showErrorsAsCSS = $show;
|
||||
}
|
||||
/**
|
||||
* Compile .scss file
|
||||
*
|
||||
* @param string $in Input file (.scss)
|
||||
* @param string $out Output file (.css) optional
|
||||
*
|
||||
* @return string|bool
|
||||
*
|
||||
* @throws \Leafo\ScssPhp\Exception\ServerException
|
||||
*/
|
||||
public function compileFile($in, $out = null)
|
||||
{
|
||||
if (!is_readable($in)) {
|
||||
throw new ServerException('load error: failed to find ' . $in);
|
||||
}
|
||||
$pi = pathinfo($in);
|
||||
$this->scss->addImportPath($pi['dirname'] . '/');
|
||||
$compiled = $this->scss->compile(file_get_contents($in), $in);
|
||||
if ($out !== null) {
|
||||
return file_put_contents($out, $compiled);
|
||||
}
|
||||
return $compiled;
|
||||
}
|
||||
/**
|
||||
* Check if file need compiling
|
||||
*
|
||||
* @param string $in Input file (.scss)
|
||||
* @param string $out Output file (.css)
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function checkedCompile($in, $out)
|
||||
{
|
||||
if (!is_file($out) || filemtime($in) > filemtime($out)) {
|
||||
$this->compileFile($in, $out);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* Compile requested scss and serve css. Outputs HTTP response.
|
||||
*
|
||||
* @param string $salt Prefix a string to the filename for creating the cache name hash
|
||||
*/
|
||||
public function serve($salt = '')
|
||||
{
|
||||
$protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0';
|
||||
if ($input = $this->findInput()) {
|
||||
$output = $this->cacheName($salt . $input);
|
||||
$etag = $noneMatch = trim($this->getIfNoneMatchHeader(), '"');
|
||||
if ($this->needsCompile($output, $etag)) {
|
||||
try {
|
||||
list($css, $etag) = $this->compile($input, $output);
|
||||
$lastModified = gmdate('D, d M Y H:i:s', filemtime($output)) . ' GMT';
|
||||
header('Last-Modified: ' . $lastModified);
|
||||
header('Content-type: text/css');
|
||||
header('ETag: "' . $etag . '"');
|
||||
echo $css;
|
||||
} catch (\Exception $e) {
|
||||
if ($this->showErrorsAsCSS) {
|
||||
header('Content-type: text/css');
|
||||
echo $this->createErrorCSS($e);
|
||||
} else {
|
||||
header($protocol . ' 500 Internal Server Error');
|
||||
header('Content-type: text/plain');
|
||||
echo 'Parse error: ' . $e->getMessage() . '
|
||||
';
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
header('X-SCSS-Cache: true');
|
||||
header('Content-type: text/css');
|
||||
header('ETag: "' . $etag . '"');
|
||||
if ($etag === $noneMatch) {
|
||||
header($protocol . ' 304 Not Modified');
|
||||
return;
|
||||
}
|
||||
$modifiedSince = $this->getIfModifiedSinceHeader();
|
||||
$mtime = filemtime($output);
|
||||
if (strtotime($modifiedSince) === $mtime) {
|
||||
header($protocol . ' 304 Not Modified');
|
||||
return;
|
||||
}
|
||||
$lastModified = gmdate('D, d M Y H:i:s', $mtime) . ' GMT';
|
||||
header('Last-Modified: ' . $lastModified);
|
||||
echo file_get_contents($output);
|
||||
return;
|
||||
}
|
||||
header($protocol . ' 404 Not Found');
|
||||
header('Content-type: text/plain');
|
||||
$v = Version::VERSION;
|
||||
echo "/* INPUT NOT FOUND scss {$v} */\n";
|
||||
}
|
||||
/**
|
||||
* Based on explicit input/output files does a full change check on cache before compiling.
|
||||
*
|
||||
* @param string $in
|
||||
* @param string $out
|
||||
* @param boolean $force
|
||||
*
|
||||
* @return string Compiled CSS results
|
||||
*
|
||||
* @throws \Leafo\ScssPhp\Exception\ServerException
|
||||
*/
|
||||
public function checkedCachedCompile($in, $out, $force = false)
|
||||
{
|
||||
if (!is_file($in) || !is_readable($in)) {
|
||||
throw new ServerException('Invalid or unreadable input file specified.');
|
||||
}
|
||||
if (is_dir($out) || !is_writable(file_exists($out) ? $out : dirname($out))) {
|
||||
throw new ServerException('Invalid or unwritable output file specified.');
|
||||
}
|
||||
if ($force || $this->needsCompile($out, $etag)) {
|
||||
list($css, $etag) = $this->compile($in, $out);
|
||||
} else {
|
||||
$css = file_get_contents($out);
|
||||
}
|
||||
return $css;
|
||||
}
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string $dir Root directory to .scss files
|
||||
* @param string $cacheDir Cache directory
|
||||
* @param \Leafo\ScssPhp\Compiler|null $scss SCSS compiler instance
|
||||
*/
|
||||
public function __construct($dir, $cacheDir = null, $scss = null)
|
||||
{
|
||||
$this->dir = $dir;
|
||||
if (!isset($cacheDir)) {
|
||||
$cacheDir = $this->join($dir, 'scss_cache');
|
||||
}
|
||||
$this->cacheDir = $cacheDir;
|
||||
if (!is_dir($this->cacheDir)) {
|
||||
mkdir($this->cacheDir, 493, true);
|
||||
}
|
||||
if (!isset($scss)) {
|
||||
$scss = new Compiler();
|
||||
$scss->setImportPaths($this->dir);
|
||||
}
|
||||
$this->scss = $scss;
|
||||
$this->showErrorsAsCSS = false;
|
||||
if (!ini_get('date.timezone')) {
|
||||
date_default_timezone_set('UTC');
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Helper method to serve compiled scss
|
||||
*
|
||||
* @param string $path Root path
|
||||
*/
|
||||
public static function serveFrom($path)
|
||||
{
|
||||
$server = new self($path);
|
||||
$server->serve();
|
||||
}
|
||||
}
|
||||
68
lib/scssphp/src/Type.php
Normal file
68
lib/scssphp/src/Type.php
Normal file
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2012-2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
namespace Leafo\ScssPhp;
|
||||
|
||||
/**
|
||||
* Block/node types
|
||||
*
|
||||
* @author Anthon Pang <anthon.pang@gmail.com>
|
||||
*/
|
||||
class Type
|
||||
{
|
||||
const T_ASSIGN = 'assign';
|
||||
const T_AT_ROOT = 'at-root';
|
||||
const T_BLOCK = 'block';
|
||||
const T_BREAK = 'break';
|
||||
const T_CHARSET = 'charset';
|
||||
const T_COLOR = 'color';
|
||||
const T_COMMENT = 'comment';
|
||||
const T_CONTINUE = 'continue';
|
||||
const T_CONTROL = 'control';
|
||||
const T_DEBUG = 'debug';
|
||||
const T_DIRECTIVE = 'directive';
|
||||
const T_EACH = 'each';
|
||||
const T_ELSE = 'else';
|
||||
const T_ELSEIF = 'elseif';
|
||||
const T_ERROR = 'error';
|
||||
const T_EXPRESSION = 'exp';
|
||||
const T_EXTEND = 'extend';
|
||||
const T_FOR = 'for';
|
||||
const T_FUNCTION = 'function';
|
||||
const T_FUNCTION_CALL = 'fncall';
|
||||
const T_HSL = 'hsl';
|
||||
const T_IF = 'if';
|
||||
const T_IMPORT = 'import';
|
||||
const T_INCLUDE = 'include';
|
||||
const T_INTERPOLATE = 'interpolate';
|
||||
const T_INTERPOLATED = 'interpolated';
|
||||
const T_KEYWORD = 'keyword';
|
||||
const T_LIST = 'list';
|
||||
const T_MAP = 'map';
|
||||
const T_MEDIA = 'media';
|
||||
const T_MEDIA_EXPRESSION = 'mediaExp';
|
||||
const T_MEDIA_TYPE = 'mediaType';
|
||||
const T_MEDIA_VALUE = 'mediaValue';
|
||||
const T_MIXIN = 'mixin';
|
||||
const T_MIXIN_CONTENT = 'mixin_content';
|
||||
const T_NESTED_PROPERTY = 'nestedprop';
|
||||
const T_NOT = 'not';
|
||||
const T_NULL = 'null';
|
||||
const T_NUMBER = 'number';
|
||||
const T_RETURN = 'return';
|
||||
const T_ROOT = 'root';
|
||||
const T_SCSSPHP_IMPORT_ONCE = 'scssphp-import-once';
|
||||
const T_SELF = 'self';
|
||||
const T_STRING = 'string';
|
||||
const T_UNARY = 'unary';
|
||||
const T_VARIABLE = 'var';
|
||||
const T_WARN = 'warn';
|
||||
const T_WHILE = 'while';
|
||||
}
|
||||
49
lib/scssphp/src/Util.php
Normal file
49
lib/scssphp/src/Util.php
Normal file
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2012-2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
namespace Leafo\ScssPhp;
|
||||
|
||||
use Leafo\ScssPhp\Base\Range;
|
||||
/**
|
||||
* Utilties
|
||||
*
|
||||
* @author Anthon Pang <anthon.pang@gmail.com>
|
||||
*/
|
||||
class Util
|
||||
{
|
||||
/**
|
||||
* Asserts that `value` falls within `range` (inclusive), leaving
|
||||
* room for slight floating-point errors.
|
||||
*
|
||||
* @param string $name The name of the value. Used in the error message.
|
||||
* @param Range $range Range of values.
|
||||
* @param array $value The value to check.
|
||||
* @param string $unit The unit of the value. Used in error reporting.
|
||||
*
|
||||
* @return mixed `value` adjusted to fall within range, if it was outside by a floating-point margin.
|
||||
*
|
||||
* @throws \Exception
|
||||
*/
|
||||
public static function checkRange($name, Range $range, $value, $unit = '')
|
||||
{
|
||||
$val = $value[1];
|
||||
$grace = new Range(-1.0E-5, 1.0E-5);
|
||||
if ($range->includes($val)) {
|
||||
return $val;
|
||||
}
|
||||
if ($grace->includes($val - $range->first)) {
|
||||
return $range->first;
|
||||
}
|
||||
if ($grace->includes($val - $range->last)) {
|
||||
return $range->last;
|
||||
}
|
||||
throw new \Exception("{$name} {$val} must be between {$range->first} and {$range->last}{$unit}");
|
||||
}
|
||||
}
|
||||
21
lib/scssphp/src/Version.php
Normal file
21
lib/scssphp/src/Version.php
Normal file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
/**
|
||||
* SCSSPHP
|
||||
*
|
||||
* @copyright 2012-2015 Leaf Corcoran
|
||||
*
|
||||
* @license http://opensource.org/licenses/MIT MIT
|
||||
*
|
||||
* @link http://leafo.github.io/scssphp
|
||||
*/
|
||||
namespace Leafo\ScssPhp;
|
||||
|
||||
/**
|
||||
* SCSSPHP version
|
||||
*
|
||||
* @author Leaf Corcoran <leafot@gmail.com>
|
||||
*/
|
||||
class Version
|
||||
{
|
||||
const VERSION = 'v0.6.3';
|
||||
}
|
||||
@@ -2352,6 +2352,30 @@ DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
</pre>]]></text>
|
||||
</license>
|
||||
<license>
|
||||
<product>scssphp</product>
|
||||
<author>Leaf Corcoran</author>
|
||||
<license_type>MIT</license_type>
|
||||
<text><![CDATA[<pre>Copyright (c) 2015 Leaf Corcoran, http://leafo.github.io/scssphp
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
</pre>]]></text>
|
||||
</license>
|
||||
</licenses>
|
||||
Reference in New Issue
Block a user