Changeset 124745 in spip-zone


Ignore:
Timestamp:
May 18, 2020, 3:00:58 PM (2 weeks ago)
Author:
Cerdic
Message:

Mise a jour de la lib ScssPHP en version 1.0.8+

Location:
_plugins_/scssphp/tags/v2.4.1
Files:
30 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/scssphp/tags/v2.4.1

    • Property subgit:lock:98c803f6c13095b1478d1975cb392a6fdca107f3 deleted
    • Property subgit:lock:95abd02025a85a5f64ecd7ed06be6923faad3cc8 set to 2020-05-18T17:03:17.841
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/README.md

    r115547 r124745  
    2525  then compares to the respective `.css` file in the `tests/outputs` directory.
    2626* `ScssTest.php` extracts (ruby) `scss` tests from the `tests/scss_test.rb` file.
    27 * `ServerTest.php` contains functional tests for the `Server` class.
    2827
    2928When changing any of the tests in `tests/inputs`, the tests will most likely
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Base/Range.php

    r115547 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2015-2019 Leaf Corcoran
     5 * @copyright 2015-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Block.php

    r115547 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Cache.php

    r118014 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Colors.php

    r118014 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Compiler.php

    r119818 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
     
    102102    static public $true         = [Type::T_KEYWORD, 'true'];
    103103    static public $false        = [Type::T_KEYWORD, 'false'];
     104    static public $NaN          = [Type::T_KEYWORD, 'NaN'];
     105    static public $Infinity     = [Type::T_KEYWORD, 'Infinity'];
    104106    static public $null         = [Type::T_NULL];
    105107    static public $nullString   = [Type::T_STRING, '', []];
     
    318320    protected function parserFactory($path)
    319321    {
    320         $parser = new Parser($path, count($this->sourceNames), $this->encoding, $this->cache);
     322        // https://sass-lang.com/documentation/at-rules/import
     323        // CSS files imported by Sass don’t allow any special Sass features.
     324        // In order to make sure authors don’t accidentally write Sass in their CSS,
     325        // all Sass features that aren’t also valid CSS will produce errors.
     326        // Otherwise, the CSS will be rendered as-is. It can even be extended!
     327        $cssOnly = false;
     328        if (substr($path, '-4') === '.css') {
     329            $cssOnly = true;
     330        }
     331        $parser = new Parser($path, count($this->sourceNames), $this->encoding, $this->cache, $cssOnly);
    321332
    322333        $this->sourceNames[] = $path;
     
    24312442                break;
    24322443
     2444            case Type::T_CUSTOM_PROPERTY:
     2445                list(, $name, $value) = $child;
     2446                $compiledName = $this->compileValue($name);
     2447
     2448                // if the value reduces to null from something else then
     2449                // the property should be discarded
     2450                if ($value[0] !== Type::T_NULL) {
     2451                    $value = $this->reduce($value);
     2452
     2453                    if ($value[0] === Type::T_NULL || $value === static::$nullString) {
     2454                        break;
     2455                    }
     2456                }
     2457
     2458                $compiledValue = $this->compileValue($value);
     2459
     2460                $line = $this->formatter->customProperty(
     2461                    $compiledName,
     2462                    $compiledValue
     2463                );
     2464
     2465                $this->appendOutputLine($out, Type::T_ASSIGN, $line);
     2466                break;
     2467
    24332468            case Type::T_ASSIGN:
    24342469                list(, $name, $value) = $child;
     
    25442579                $compiledValue = $this->compileValue($value);
    25452580
    2546                 $line = $this->formatter->property(
    2547                     $compiledName,
    2548                     $compiledValue
    2549                 );
    2550                 $this->appendOutputLine($out, Type::T_ASSIGN, $line);
     2581                // ignore empty value
     2582                if (strlen($compiledValue)) {
     2583                    $line = $this->formatter->property(
     2584                        $compiledName,
     2585                        $compiledValue
     2586                    );
     2587                    $this->appendOutputLine($out, Type::T_ASSIGN, $line);
     2588                }
    25512589                break;
    25522590
     
    30463084                        }
    30473085
    3048                         if (! $left->unitless() && ! $right->unitless()) {
     3086                        $baseUnitLeft = $left->isNormalizable();
     3087                        $baseUnitRight = $right->isNormalizable();
     3088                        if ($baseUnitLeft && $baseUnitRight && $baseUnitLeft === $baseUnitRight) {
    30493089                            $left = $left->normalize();
    30503090                            $right = $right->normalize();
     
    32913331    {
    32923332        if ($right[1] == 0) {
    3293             return [Type::T_STRING, '', [$left[1] . $left[2] . '/' . $right[1] . $right[2]]];
     3333            return ($left[1] == 0) ? static::$NaN : static::$Infinity;
    32943334        }
    32953335
     
    33073347    protected function opModNumberNumber($left, $right)
    33083348    {
     3349        if ($right[1] == 0) {
     3350            return static::$NaN;
     3351        }
     3352
    33093353        return new Node\Number($left[1] % $right[1], $left[2]);
    33103354    }
     
    45864630
    45874631        // for "normal" scss imports (ignore vanilla css and external requests)
    4588         if (! preg_match('~\.css$|^https?://~', $url)) {
     4632        if (! preg_match('~\.css$|^https?://|^//~', $url)) {
    45894633            // try both normal and the _partial filename
    45904634            $urls = [$url, preg_replace('~[^/]+$~', '_\0', $url)];
     
    46044648                    $full = $dir . $separator . $full;
    46054649
    4606                     if (is_file($file = $full . '.scss') ||
    4607                         ($hasExtension && is_file($file = $full))
    4608                     ) {
    4609                         return $file;
     4650                    if ($hasExtension) {
     4651                        if (is_file($file = $full)) {
     4652                            return $file;
     4653                        }
     4654                    } else {
     4655                        if (is_file($file = $full . '.scss') ||
     4656                            is_file($file = $full . '.css')
     4657                        ) {
     4658                            return $file;
     4659                        }
    46104660                    }
    46114661                }
     
    46174667                    return $file;
    46184668                }
     4669            }
     4670        }
     4671
     4672        if ($urls) {
     4673            if (!$hasExtension or preg_match('/[.]scss$/', $url)) {
     4674                $this->throwError("`$url` file not found for @import");
    46194675            }
    46204676        }
     
    48084864        // try a lib function
    48094865        $name = $this->normalizeName($name);
     4866        $libName = null;
    48104867
    48114868        if (isset($this->userFunctions[$name])) {
     
    52665323    {
    52675324        if (isset($item) && $item[0] === Type::T_LIST) {
     5325            // remove trailing null from the list
     5326            while (end($item[2]) === static::$null) {
     5327                array_pop($item[2]);
     5328            }
    52685329            return $item;
    52695330        }
     
    63326393    }
    63336394
    6334     protected static $libPercentage = ['value'];
     6395    protected static $libPercentage = ['number'];
    63356396    protected function libPercentage($args)
    63366397    {
     
    63386399    }
    63396400
    6340     protected static $libRound = ['value'];
     6401    protected static $libRound = ['number'];
    63416402    protected function libRound($args)
    63426403    {
     
    63466407    }
    63476408
    6348     protected static $libFloor = ['value'];
     6409    protected static $libFloor = ['number'];
    63496410    protected function libFloor($args)
    63506411    {
     
    63546415    }
    63556416
    6356     protected static $libCeil = ['value'];
     6417    protected static $libCeil = ['number'];
    63576418    protected function libCeil($args)
    63586419    {
     
    63626423    }
    63636424
    6364     protected static $libAbs = ['value'];
     6425    protected static $libAbs = ['number'];
    63656426    protected function libAbs($args)
    63666427    {
     
    63736434    {
    63746435        $numbers = $this->getNormalizedNumbers($args);
    6375         $min = null;
    6376 
    6377         foreach ($numbers as $key => $number) {
    6378             if (is_null($min) || $number[1] <= $min[1]) {
    6379                 $min = [$key, $number[1]];
    6380             }
    6381         }
    6382 
    6383         return $args[$min[0]];
     6436        $minOriginal = null;
     6437        $minNormalized = null;
     6438
     6439        foreach ($numbers as $key => $pair) {
     6440            list($original, $normalized) = $pair;
     6441            if (is_null($normalized) or is_null($minNormalized)) {
     6442                if (is_null($minOriginal) || $original[1] <= $minOriginal[1]) {
     6443                    $minOriginal = $original;
     6444                    $minNormalized = $normalized;
     6445                }
     6446            } elseif ($normalized[1] <= $minNormalized[1]) {
     6447                $minOriginal = $original;
     6448                $minNormalized = $normalized;
     6449            }
     6450        }
     6451
     6452        return $minOriginal;
    63846453    }
    63856454
     
    63876456    {
    63886457        $numbers = $this->getNormalizedNumbers($args);
    6389         $max = null;
    6390 
    6391         foreach ($numbers as $key => $number) {
    6392             if (is_null($max) || $number[1] >= $max[1]) {
    6393                 $max = [$key, $number[1]];
    6394             }
    6395         }
    6396 
    6397         return $args[$max[0]];
     6458        $maxOriginal = null;
     6459        $maxNormalized = null;
     6460
     6461        foreach ($numbers as $key => $pair) {
     6462            list($original, $normalized) = $pair;
     6463            if (is_null($normalized) or is_null($maxNormalized)) {
     6464                if (is_null($maxOriginal) || $original[1] >= $maxOriginal[1]) {
     6465                    $maxOriginal = $original;
     6466                    $maxNormalized = $normalized;
     6467                }
     6468            } elseif ($normalized[1] >= $maxNormalized[1]) {
     6469                $maxOriginal = $original;
     6470                $maxNormalized = $normalized;
     6471            }
     6472        }
     6473
     6474        return $maxOriginal;
    63986475    }
    63996476
     
    64196496            $number = $item->normalize();
    64206497
    6421             if (is_null($unit)) {
     6498            if (empty($unit)) {
    64226499                $unit = $number[2];
    64236500                $originalUnit = $item->unitStr();
    6424             } elseif ($number[1] && $unit !== $number[2]) {
     6501            } elseif ($number[1] && $unit !== $number[2] && !empty($number[2])) {
    64256502                $this->throwError('Incompatible units: "%s" and "%s".', $originalUnit, $item->unitStr());
    64266503                break;
    64276504            }
    64286505
    6429             $numbers[$key] = $number;
     6506            $numbers[$key] = [$args[$key], empty($number[2]) ? null : $number];
    64306507        }
    64316508
     
    69507027    }
    69517028
    6952     protected static $libRandom = ['limit'];
     7029    protected static $libRandom = ['limit:1'];
    69537030    protected function libRandom($args)
    69547031    {
     
    69577034
    69587035            if ($n < 1) {
    6959                 $this->throwError("limit must be greater than or equal to 1");
     7036                $this->throwError("\$limit must be greater than or equal to 1");
    69607037
    69617038                return null;
    69627039            }
    6963 
    6964             return new Node\Number(mt_rand(1, $n), '');
     7040            if ($n - intval($n) > 0) {
     7041                $this->throwError("Expected \$limit to be an integer but got $n for `random`");
     7042
     7043                return null;
     7044            }
     7045
     7046            return new Node\Number(mt_rand(1, intval($n)), '');
    69657047        }
    69667048
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Compiler/Environment.php

    r115547 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Exception/CompilerException.php

    r115547 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Exception/ParserException.php

    r115547 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Exception/RangeException.php

    r115547 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Exception/ServerException.php

    r115547 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Formatter.php

    r119345 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
     
    117117    {
    118118        return rtrim($name) . $this->assignSeparator . $value . ';';
     119    }
     120
     121    /**
     122     * Return custom property assignment
     123     * differs in that you have to keep spaces in the value as is
     124     *
     125     * @api
     126     *
     127     * @param string $name
     128     * @param mixed  $value
     129     *
     130     * @return string
     131     */
     132    public function customProperty($name, $value)
     133    {
     134        return rtrim($name) . trim($this->assignSeparator) . $value . ';';
    119135    }
    120136
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Formatter/Compact.php

    r115547 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Formatter/Compressed.php

    r115547 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Formatter/Crunched.php

    r115547 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Formatter/Debug.php

    r115547 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Formatter/Expanded.php

    r118014 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Formatter/Nested.php

    r118643 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Formatter/OutputBlock.php

    r115547 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Node.php

    r115547 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Node/Number.php

    r118014 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
     
    6565        'dpi' => [
    6666            'dpi'  => 1,
    67             'dpcm' => 2.54,
    68             'dppx' => 96,
     67            'dpcm' => 1/2.54,
     68            'dppx' => 1/96,
    6969        ],
    7070    ];
     
    111111        $dimension = $this->dimension;
    112112
    113         foreach (static::$unitTable['in'] as $unit => $conv) {
    114             $from       = isset($this->units[$unit]) ? $this->units[$unit] : 0;
    115             $to         = isset($units[$unit]) ? $units[$unit] : 0;
    116             $factor     = pow($conv, $from - $to);
    117             $dimension /= $factor;
     113        if (count($units)) {
     114            $baseUnit = array_keys($units);
     115            $baseUnit = reset($baseUnit);
     116            $baseUnit = $this->findBaseUnit($baseUnit);
     117            if ($baseUnit && isset(static::$unitTable[$baseUnit])) {
     118                foreach (static::$unitTable[$baseUnit] as $unit => $conv) {
     119                    $from       = isset($this->units[$unit]) ? $this->units[$unit] : 0;
     120                    $to         = isset($units[$unit]) ? $units[$unit] : 0;
     121                    $factor     = pow($conv, $from - $to);
     122                    $dimension /= $factor;
     123                }
     124            }
    118125        }
    119126
     
    131138        $units     = [];
    132139
    133         $this->normalizeUnits($dimension, $units, 'in');
     140        $this->normalizeUnits($dimension, $units);
    134141
    135142        return new Number($dimension, $units);
     
    233240
    234241    /**
     242     * Test if a number can be normalized in a baseunit
     243     * ie if it's units are homogeneous
     244     * @return bool
     245     */
     246    public function isNormalizable()
     247    {
     248        if ($this->unitless()) {
     249            return false;
     250        }
     251
     252        $baseUnit = null;
     253        foreach ($this->units as $unit => $exp) {
     254            $b = $this->findBaseUnit($unit);
     255            if (is_null($baseUnit)) {
     256                $baseUnit = $b;
     257            }
     258            if (is_null($b) or $b !== $baseUnit) {
     259                return false;
     260            }
     261        }
     262        return $baseUnit;
     263    }
     264
     265    /**
    235266     * Returns unit(s) as the product of numerator units divided by the product of denominator units
    236267     *
     
    249280
    250281            if ($unitSize < 0) {
    251                 $denominators = array_pad($denominators, count($denominators) + $unitSize, $unit);
     282                $denominators = array_pad($denominators, count($denominators) - $unitSize, $unit);
    252283                continue;
    253284            }
     
    276307            $units     = [];
    277308
    278             $this->normalizeUnits($dimension, $units, 'in');
     309            $this->normalizeUnits($dimension, $units);
    279310
    280311            $dimension = round($dimension, static::$precision);
     
    287318
    288319        if ($compiler && ($unitSize > 1 || $unitSize < 0 || count($units) > 1)) {
    289             $compiler->throwError((string) $dimension . $this->unitStr() . " isn't a valid CSS value.");
    290         }
    291 
    292         reset($units);
    293         $unit = key($units);
     320            $this->units = $units;
     321            $unit = $this->unitStr();
     322        } else {
     323            reset($units);
     324            $unit = key($units);
     325        }
     326
    294327        $dimension = number_format($dimension, static::$precision, '.', '');
    295328
     
    312345     * @param string        $baseUnit
    313346     */
    314     private function normalizeUnits(&$dimension, &$units, $baseUnit = 'in')
     347    private function normalizeUnits(&$dimension, &$units, $baseUnit = null)
    315348    {
    316349        $dimension = $this->dimension;
     
    318351
    319352        foreach ($this->units as $unit => $exp) {
    320             if (isset(static::$unitTable[$baseUnit][$unit])) {
     353            if (!$baseUnit) {
     354                $baseUnit = $this->findBaseUnit($unit);
     355            }
     356            if ($baseUnit && isset(static::$unitTable[$baseUnit][$unit])) {
    321357                $factor = pow(static::$unitTable[$baseUnit][$unit], $exp);
    322358
     
    328364        }
    329365    }
     366
     367    /**
     368     * Find the base unit family for a given unit
     369     * @param $unit
     370     * @return string|null
     371     */
     372    private function findBaseUnit($unit)
     373    {
     374        foreach (static::$unitTable as $baseUnit => $unitVariants) {
     375            if (isset($unitVariants[$unit])) {
     376                return $baseUnit;
     377            }
     378        }
     379        return null;
     380    }
    330381}
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Parser.php

    r119345 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
     
    6666    private $eatWhiteDefault;
    6767    private $discardComments;
     68    private $allowVars;
    6869    private $buffer;
    6970    private $utf8;
     
    7273    private $commentsSeen;
    7374
     75    private $cssOnly;
     76
    7477    /**
    7578     * Constructor
     
    8285     * @param \ScssPhp\ScssPhp\Cache $cache
    8386     */
    84     public function __construct($sourceName, $sourceIndex = 0, $encoding = 'utf-8', $cache = null)
     87    public function __construct($sourceName, $sourceIndex = 0, $encoding = 'utf-8', $cache = null, $cssOnly = false)
    8588    {
    8689        $this->sourceName       = $sourceName ?: '(stdin)';
     
    9093        $this->patternModifiers = $this->utf8 ? 'Aisu' : 'Ais';
    9194        $this->commentsSeen     = [];
    92         $this->discardComments  = false;
     95        $this->commentsSeen     = [];
     96        $this->allowVars        = true;
     97        $this->cssOnly          = $cssOnly;
    9398
    9499        if (empty(static::$operatorPattern)) {
     
    348353                $this->matchChar('{', false)
    349354            ) {
     355                if ($this->cssOnly) {
     356                    $this->throwParseError("SCSS syntax not allowed in CSS file");
     357                }
    350358                $atRoot = $this->pushSpecialBlock(Type::T_AT_ROOT, $s);
    351359                $atRoot->selector = $selector;
     
    371379                $this->matchChar('{', false)
    372380            ) {
     381                if ($this->cssOnly) {
     382                    $this->throwParseError("SCSS syntax not allowed in CSS file");
     383                }
    373384                $mixin = $this->pushSpecialBlock(Type::T_MIXIN, $s);
    374385                $mixin->name = $mixinName;
     
    391402                    $this->matchChar('{') && $hasBlock = true)
    392403            ) {
     404                if ($this->cssOnly) {
     405                    $this->throwParseError("SCSS syntax not allowed in CSS file");
     406                }
    393407                $child = [
    394408                    Type::T_INCLUDE,
     
    415429                $this->end()
    416430            ) {
     431                if ($this->cssOnly) {
     432                    $this->throwParseError("SCSS syntax not allowed in CSS file");
     433                }
    417434                $this->append([Type::T_SCSSPHP_IMPORT_ONCE, $importPath], $s);
    418435
     
    437454                $this->end()
    438455            ) {
     456                if ($this->cssOnly) {
     457                    $this->throwParseError("SCSS syntax not allowed in CSS file");
     458                }
    439459                $this->append([Type::T_IMPORT, $importPath], $s);
    440460
     
    448468                $this->end()
    449469            ) {
     470                if ($this->cssOnly) {
     471                    $this->throwParseError("SCSS syntax not allowed in CSS file");
     472                }
    450473                // check for '!flag'
    451474                $optional = $this->stripOptionalFlag($selectors);
     
    462485                $this->matchChar('{', false)
    463486            ) {
     487                if ($this->cssOnly) {
     488                    $this->throwParseError("SCSS syntax not allowed in CSS file");
     489                }
    464490                $func = $this->pushSpecialBlock(Type::T_FUNCTION, $s);
    465491                $func->name = $fnName;
     
    472498
    473499            if ($this->literal('@break', 6) && $this->end()) {
     500                if ($this->cssOnly) {
     501                    $this->throwParseError("SCSS syntax not allowed in CSS file");
     502                }
    474503                $this->append([Type::T_BREAK], $s);
    475504
     
    480509
    481510            if ($this->literal('@continue', 9) && $this->end()) {
     511                if ($this->cssOnly) {
     512                    $this->throwParseError("SCSS syntax not allowed in CSS file");
     513                }
    482514                $this->append([Type::T_CONTINUE], $s);
    483515
     
    488520
    489521            if ($this->literal('@return', 7) && ($this->valueList($retVal) || true) && $this->end()) {
     522                if ($this->cssOnly) {
     523                    $this->throwParseError("SCSS syntax not allowed in CSS file");
     524                }
    490525                $this->append([Type::T_RETURN, isset($retVal) ? $retVal : [Type::T_NULL]], $s);
    491526
     
    501536                $this->matchChar('{', false)
    502537            ) {
     538                if ($this->cssOnly) {
     539                    $this->throwParseError("SCSS syntax not allowed in CSS file");
     540                }
    503541                $each = $this->pushSpecialBlock(Type::T_EACH, $s);
    504542
     
    518556                $this->matchChar('{', false)
    519557            ) {
     558                if ($this->cssOnly) {
     559                    $this->throwParseError("SCSS syntax not allowed in CSS file");
     560                }
    520561                $while = $this->pushSpecialBlock(Type::T_WHILE, $s);
    521562                $while->cond = $cond;
     
    535576                $this->matchChar('{', false)
    536577            ) {
     578                if ($this->cssOnly) {
     579                    $this->throwParseError("SCSS syntax not allowed in CSS file");
     580                }
    537581                $for = $this->pushSpecialBlock(Type::T_FOR, $s);
    538582                $for->var   = $varName[1];
     
    547591
    548592            if ($this->literal('@if', 3) && $this->valueList($cond) && $this->matchChar('{', false)) {
     593                if ($this->cssOnly) {
     594                    $this->throwParseError("SCSS syntax not allowed in CSS file");
     595                }
    549596                $if = $this->pushSpecialBlock(Type::T_IF, $s);
    550597                while ($cond[0] === Type::T_LIST
     
    566613                $this->end()
    567614            ) {
     615                if ($this->cssOnly) {
     616                    $this->throwParseError("SCSS syntax not allowed in CSS file");
     617                }
    568618                $this->append([Type::T_DEBUG, $value], $s);
    569619
     
    577627                $this->end()
    578628            ) {
     629                if ($this->cssOnly) {
     630                    $this->throwParseError("SCSS syntax not allowed in CSS file");
     631                }
    579632                $this->append([Type::T_WARN, $value], $s);
    580633
     
    588641                $this->end()
    589642            ) {
     643                if ($this->cssOnly) {
     644                    $this->throwParseError("SCSS syntax not allowed in CSS file");
     645                }
    590646                $this->append([Type::T_ERROR, $value], $s);
    591647
     
    603659                        $this->matchChar(')') &&
    604660                    $this->end())) {
     661                if ($this->cssOnly) {
     662                    $this->throwParseError("SCSS syntax not allowed in CSS file");
     663                }
    605664                $this->append([Type::T_MIXIN_CONTENT, isset($argContent) ? $argContent : null], $s);
    606665
     
    672731            if ($this->matchChar('@', false) &&
    673732                $this->keyword($dirName) &&
    674                 ($this->variable($dirValue) || $this->openString('{', $dirValue) || true) &&
    675                 $this->matchChar('{', false)
     733                $this->directiveValue($dirValue, '{')
    676734            ) {
    677735                if ($dirName === 'media') {
     
    694752            if ($this->matchChar('@', false) &&
    695753                $this->keyword($dirName) &&
    696                 $this->valueList($dirValue) &&
     754                $this->directiveValue($dirValue) &&
    697755                $this->end()
    698756            ) {
     
    706764            return false;
    707765        }
     766
     767        // custom properties : right part is static
     768        if ((($isCustom = $this->literal('--', 2)) || $this->cssOnly) &&
     769            $this->propertyName($name) &&
     770            $this->matchChar(':', false)) {
     771            $start = $this->count;
     772            // but can be complex and finish with ; or }
     773            foreach ([';','}'] as $ending) {
     774                if ($this->openString($ending, $stringValue, '(', ')', false)
     775                    && $this->end()) {
     776                    $end = $this->count;
     777                    $value = $stringValue;
     778                    // check if we have only a partial value due to nested [] or { } to take in account
     779                    $nestingPairs = [['[', ']'], ['{', '}']];
     780                    foreach ($nestingPairs as $nestingPair) {
     781                        $p = strpos($this->buffer, $nestingPair[0], $start);
     782                        if ($p && $p < $end) {
     783                            $this->seek($start);
     784                            if ($this->openString($ending, $stringValue, $nestingPair[0], $nestingPair[1], false)
     785                                && $this->end()) {
     786                                if ($this->count > $end) {
     787                                    $end = $this->count;
     788                                    $value = $stringValue;
     789                                }
     790                            }
     791                        }
     792                    }
     793                    $this->seek($end);
     794                    $name = [Type::T_STRING, '', $isCustom ? ['--', $name] : [$name]];
     795                    $this->append([Type::T_CUSTOM_PROPERTY, $name, $value], $s);
     796                    return true;
     797                }
     798            }
     799            // TODO: output an error here if nothing found according to sass spec
     800        }
     801
     802        $this->seek($s);
    708803
    709804        // property shortcut
     
    728823            $this->end()
    729824        ) {
     825            if ($this->cssOnly) {
     826                $this->throwParseError("SCSS syntax not allowed in CSS file");
     827            }
    730828            // check for '!flag'
    731829            $assignmentFlags = $this->stripAssignmentFlags($value);
     
    744842        // opening css block
    745843        if ($this->selectors($selectors) && $this->matchChar('{', false)) {
     844            if ($this->cssOnly) {
     845                if (!empty($this->env->parent)) {
     846                    $this->throwParseError("SCSS syntax not allowed in CSS file");
     847                }
     848            }
    746849            $this->pushBlock($selectors, $s);
    747850
     
    770873
    771874            if ($this->matchChar('{', false)) {
     875                if ($this->cssOnly) {
     876                    $this->throwParseError("SCSS syntax not allowed in CSS file");
     877                }
    772878                $propBlock = $this->pushSpecialBlock(Type::T_NESTED_PROPERTY, $s);
    773879                $propBlock->prefix = $name;
     
    14881594            }
    14891595
     1596            return true;
     1597        }
     1598
     1599        return false;
     1600    }
     1601
     1602    /**
     1603     * Parse directive value list that considers $vars as keyword
     1604     * @param array $out
     1605     * @param bool|string $endChar
     1606     * @return bool
     1607     */
     1608    protected function directiveValue(&$out, $endChar = false)
     1609    {
     1610        $s = $this->count;
     1611        if ($this->variable($out)) {
     1612            if ($endChar && $this->matchChar($endChar, false)) {
     1613                return true;
     1614            }
     1615            if (!$endChar && $this->end()) {
     1616                return true;
     1617            }
     1618        }
     1619
     1620        $this->seek($s);
     1621
     1622        if ($endChar and $this->openString($endChar, $out)) {
     1623            if ($this->matchChar($endChar, false)) {
     1624                return true;
     1625            }
     1626        }
     1627
     1628        $this->seek($s);
     1629
     1630        $allowVars = $this->allowVars;
     1631        $this->allowVars = false;
     1632        //$res = $this->valueList($out);
     1633        $res = $this->genericList($out, 'spaceList', ',');
     1634        $this->allowVars = $allowVars;
     1635
     1636        if ($res) {
     1637            if ($endChar && $this->matchChar($endChar, false)) {
     1638                return true;
     1639            }
     1640            if (!$endChar && $this->end()) {
     1641                return true;
     1642            }
     1643        }
     1644
     1645        $this->seek($s);
     1646
     1647        if ($endChar && $this->matchChar($endChar, false)) {
    14901648            return true;
    14911649        }
     
    23342492     * @param array  $out
    23352493     * @param string $nestingOpen
    2336      *
    2337      * @return boolean
    2338      */
    2339     protected function openString($end, &$out, $nestingOpen = null)
     2494     * @param string $nestingClose
     2495     * @param bool $trimEnd
     2496     *
     2497     * @return boolean
     2498     */
     2499    protected function openString($end, &$out, $nestingOpen = null, $nestingClose = null, $trimEnd = true)
    23402500    {
    23412501        $oldWhite = $this->eatWhiteDefault;
    23422502        $this->eatWhiteDefault = false;
    23432503
    2344         $patt = '(.*?)([\'"]|#\{|' . $this->pregQuote($end) . '|' . static::$commentPattern . ')';
     2504        if ($nestingOpen && !$nestingClose) {
     2505            $nestingClose = $end;
     2506        }
     2507
     2508        $patt = '(.*?)([\'"]|#\{|'
     2509            . $this->pregQuote($end) . '|'
     2510            . (($nestingClose && $nestingClose !== $end) ? $this->pregQuote($nestingClose) . '|' : '')
     2511            . static::$commentPattern . ')';
    23452512
    23462513        $nestingLevel = 0;
     
    23612528            $this->count-= strlen($tok);
    23622529
    2363             if ($tok === $end && ! $nestingLevel--) {
     2530            if ($tok === $end && ! $nestingLevel) {
    23642531                break;
     2532            }
     2533
     2534            if ($tok === $nestingClose) {
     2535                $nestingLevel--;
    23652536            }
    23662537
     
    23812552        $this->eatWhiteDefault = $oldWhite;
    23822553
    2383         if (! $content) {
     2554        if (! $content || $tok !== $end) {
    23842555            return false;
    23852556        }
    23862557
    23872558        // trim the end
    2388         if (is_string(end($content))) {
     2559        if ($trimEnd && is_string(end($content))) {
    23892560            $content[count($content) - 1] = rtrim(end($content));
    23902561        }
     
    24062577    {
    24072578        $oldWhite = $this->eatWhiteDefault;
     2579        $allowVars = $this->allowVars;
     2580        $this->allowVars = true;
    24082581        $this->eatWhiteDefault = true;
    24092582
     
    24252598
    24262599            $this->eatWhiteDefault = $oldWhite;
     2600            $this->allowVars = $allowVars;
    24272601
    24282602            if ($this->eatWhiteDefault) {
     
    24362610
    24372611        $this->eatWhiteDefault = $oldWhite;
     2612        $this->allowVars = $allowVars;
    24382613
    24392614        return false;
     
    28132988
    28142989        if ($this->matchChar('$', false) && $this->keyword($name)) {
    2815             $out = [Type::T_VARIABLE, $name];
     2990            if ($this->allowVars) {
     2991                $out = [Type::T_VARIABLE, $name];
     2992            } else {
     2993                $out = [Type::T_KEYWORD, '$' . $name];
     2994            }
    28162995
    28172996            return true;
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/SourceMap/Base64.php

    r115547 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/SourceMap/Base64VLQ.php

    r118643 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/SourceMap/SourceMapGenerator.php

    r115547 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Type.php

    r115547 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
     
    2828    const T_CONTINUE = 'continue';
    2929    const T_CONTROL = 'control';
     30    const T_CUSTOM_PROPERTY = 'custom';
    3031    const T_DEBUG = 'debug';
    3132    const T_DIRECTIVE = 'directive';
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Util.php

    r115547 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
  • _plugins_/scssphp/tags/v2.4.1/lib/scssphp/src/Version.php

    r119345 r124745  
    33 * SCSSPHP
    44 *
    5  * @copyright 2012-2019 Leaf Corcoran
     5 * @copyright 2012-2020 Leaf Corcoran
    66 *
    77 * @license http://opensource.org/licenses/MIT MIT
     
    1919class Version
    2020{
    21     const VERSION = 'v1.0.6';
     21    const VERSION = 'v1.0.8';
    2222}
  • _plugins_/scssphp/tags/v2.4.1/paquet.xml

    r119818 r124745  
    22        prefix="scssphp"
    33        categorie="outil"
    4         version="2.2.0"
     4        version="2.2.1"
    55        etat="stable"
    66        compatibilite="[3.1.0;3.3.*]"
     
    2222        <pipeline nom="formulaire_admin" />
    2323
    24         <procure nom="scssphp" version="1.0.6" />
     24        <procure nom="scssphp" version="1.0.8" />
    2525
    2626        <necessite nom="php" compatibilite="[5.6.0;[" />
Note: See TracChangeset for help on using the changeset viewer.