Changeset 115410 in spip-zone


Ignore:
Timestamp:
May 16, 2019, 1:42:58 PM (3 days ago)
Author:
cedric@…
Message:

Update de la lib scssphp depuis https://github.com/leafo/scssphp/tree/master

Location:
_plugins_/scssphp/trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/scssphp/trunk/lib/scssphp/README.md

    r115043 r115410  
    11# scssphp
    22### <http://leafo.github.io/scssphp>
    3 ### Maintenance branch forked from leafo/master
    43
    5 [![Build](https://travis-ci.org/Cerdic/scssphp.svg?branch=maint/leafo/master)](https://travis-ci.org/Cerdic/scssphp)
     4[![Build](https://travis-ci.org/leafo/scssphp.svg?branch=master)](http://travis-ci.org/leafo/scssphp)
    65[![License](https://poser.pugx.org/leafo/scssphp/license.svg)](https://packagist.org/packages/leafo/scssphp)
    76
  • _plugins_/scssphp/trunk/lib/scssphp/composer.json

    r115183 r115410  
    2222    },
    2323    "require": {
    24         "php": ">=5.4.0"
     24        "php": "^5.6.0 || ^7"
    2525    },
    2626    "require-dev": {
  • _plugins_/scssphp/trunk/lib/scssphp/src/Compiler.php

    r115301 r115410  
    520520    protected function matchExtends($selector, &$out, $from = 0, $initial = true)
    521521    {
     522        static $partsPile = [];
    522523        $selector = $this->glueFunctionSelectors($selector);
    523524
     
    527528            }
    528529
     530            // check that we are not building an infinite loop of extensions
     531            // if the new part is just including a previous part don't try to extend anymore
     532            if (count($part) > 1) {
     533                foreach ($partsPile as $previousPart) {
     534                    if (! count(array_diff($previousPart, $part))) {
     535                        continue 2;
     536                    }
     537                }
     538            }
     539
    529540            if ($this->matchExtendsSingle($part, $origin)) {
     541                $partsPile[] = $part;
    530542                $after = array_slice($selector, $i + 1);
    531543                $before = array_slice($selector, 0, $i);
     
    537549
    538550                    // remove shared parts
    539                     if ($initial) {
     551                    if (count($new)>1) {
    540552                        while ($k < $i && isset($new[$k]) && $selector[$k] === $new[$k]) {
    541553                            $k++;
     
    581593
    582594                    // recursively check for more matches
    583                     $this->matchExtends($result, $out, count($before) + count($mergedBefore), false);
     595                    $startRecursFrom = count($before) + min(count($nonBreakableBefore), count($mergedBefore));
     596                    $this->matchExtends($result, $out, $startRecursFrom, false);
    584597
    585598                    // selector sequence merging
     
    603616                    }
    604617                }
     618                array_pop($partsPile);
    605619            }
    606620        }
     
    619633        $counts = [];
    620634        $single = [];
     635
     636        // simple usual cases, no need to do the whole trick
     637        if (in_array($rawSingle, [['>'],['+'],['~']])) {
     638            return false;
     639        }
    621640
    622641        foreach ($rawSingle as $part) {
     
    774793        $this->pushEnv($media);
    775794
    776         $mediaQuery = $this->compileMediaQuery($this->multiplyMedia($this->env));
    777 
    778         if (! empty($mediaQuery)) {
    779             $this->scope = $this->makeOutputBlock(Type::T_MEDIA, [$mediaQuery]);
    780 
     795        $mediaQueries = $this->compileMediaQuery($this->multiplyMedia($this->env));
     796
     797        if (! empty($mediaQueries) && $mediaQueries) {
     798            $previousScope = $this->scope;
    781799            $parentScope = $this->mediaParent($this->scope);
    782             $parentScope->children[] = $this->scope;
     800            foreach ($mediaQueries as $mediaQuery) {
     801                $this->scope = $this->makeOutputBlock(Type::T_MEDIA, [$mediaQuery]);
     802
     803                $parentScope->children[] = $this->scope;
     804                $parentScope = $this->scope;
     805            }
    783806
    784807            // top level properties in a media cause it to be wrapped
     
    789812
    790813                if ($type !== Type::T_BLOCK &&
    791                     $type !== Type::T_MEDIA &&
    792                     $type !== Type::T_DIRECTIVE &&
    793                     $type !== Type::T_IMPORT
     814                  $type !== Type::T_MEDIA &&
     815                  $type !== Type::T_DIRECTIVE &&
     816                  $type !== Type::T_IMPORT
    794817                ) {
    795818                    $needsWrap = true;
     
    800823            if ($needsWrap) {
    801824                $wrapped = new Block;
    802                 $wrapped->sourceName   = $media->sourceName;
    803                 $wrapped->sourceIndex  = $media->sourceIndex;
    804                 $wrapped->sourceLine   = $media->sourceLine;
     825                $wrapped->sourceName = $media->sourceName;
     826                $wrapped->sourceIndex = $media->sourceIndex;
     827                $wrapped->sourceLine = $media->sourceLine;
    805828                $wrapped->sourceColumn = $media->sourceColumn;
    806                 $wrapped->selectors    = [];
    807                 $wrapped->comments     = [];
    808                 $wrapped->parent       = $media;
    809                 $wrapped->children     = $media->children;
     829                $wrapped->selectors = [];
     830                $wrapped->comments = [];
     831                $wrapped->parent = $media;
     832                $wrapped->children = $media->children;
    810833
    811834                $media->children = [[Type::T_BLOCK, $wrapped]];
     835                if (isset($this->lineNumberStyle)) {
     836                    $annotation = $this->makeOutputBlock(Type::T_COMMENT);
     837                    $annotation->depth = 0;
     838
     839                    $file = $this->sourceNames[$media->sourceIndex];
     840                    $line = $media->sourceLine;
     841
     842                    switch ($this->lineNumberStyle) {
     843                        case static::LINE_COMMENTS:
     844                            $annotation->lines[] = '/* line ' . $line
     845                                                 . ($file ? ', ' . $file : '')
     846                                                 . ' */';
     847                            break;
     848
     849                        case static::DEBUG_INFO:
     850                            $annotation->lines[] = '@media -sass-debug-info{'
     851                                                 . ($file ? 'filename{font-family:"' . $file . '"}' : '')
     852                                                 . 'line{font-family:' . $line . '}}';
     853                            break;
     854                    }
     855
     856                    $this->scope->children[] = $annotation;
     857                }
    812858            }
    813859
    814860            $this->compileChildrenNoReturn($media->children, $this->scope);
    815861
    816             $this->scope = $this->scope->parent;
     862            $this->scope = $previousScope;
    817863        }
    818864
     
    13131359        // after evaluating interpolates, we might need a second pass
    13141360        if ($this->shouldEvaluate) {
     1361            $selectors = $this->revertSelfSelector($selectors);
    13151362            $buffer = $this->collapseSelectors($selectors);
    13161363            $parser = $this->parserFactory(__METHOD__);
     
    13681415     *
    13691416     * @param array $selectors
     1417     * @param bool $selectorFormat
     1418     *   if false return a collapsed string
     1419     *   if true return an array description of a structured selector
    13701420     *
    13711421     * @return string
    13721422     */
    1373     protected function collapseSelectors($selectors)
     1423    protected function collapseSelectors($selectors, $selectorFormat = false)
    13741424    {
    13751425        $parts = [];
    13761426
    13771427        foreach ($selectors as $selector) {
    1378             $output = '';
    1379 
    1380             array_walk_recursive(
    1381                 $selector,
    1382                 function ($value, $key) use (&$output) {
    1383                     $output .= $value;
    1384                 }
    1385             );
    1386 
     1428            $output = [];
     1429            $glueNext = false;
     1430            foreach ($selector as $node) {
     1431                $compound = '';
     1432
     1433                array_walk_recursive(
     1434                    $node,
     1435                    function ($value, $key) use (&$compound) {
     1436                        $compound .= $value;
     1437                    }
     1438                );
     1439                if ($selectorFormat && $this->isImmediateRelationshipCombinator($compound)) {
     1440                    if (count($output)) {
     1441                        $output[count($output) - 1] .= ' ' . $compound;
     1442                    } else {
     1443                        $output[] = $compound;
     1444                    }
     1445                    $glueNext = true;
     1446                } elseif ($glueNext) {
     1447                    $output[count($output) - 1] .= ' ' . $compound;
     1448                    $glueNext = false;
     1449                } else {
     1450                    $output[] = $compound;
     1451                }
     1452            }
     1453
     1454            if ($selectorFormat) {
     1455                foreach ($output as &$o) {
     1456                    $o = [Type::T_STRING, '', [$o]];
     1457                }
     1458                $output = [Type::T_LIST, ' ', $output];
     1459            } else {
     1460                $output = implode(' ', $output);
     1461            }
    13871462            $parts[] = $output;
    13881463        }
    13891464
    1390         return implode(', ', $parts);
     1465        if ($selectorFormat) {
     1466            $parts = [Type::T_LIST, ',', $parts];
     1467        } else {
     1468            $parts = implode(', ', $parts);
     1469        }
     1470
     1471        return $parts;
     1472    }
     1473
     1474    /**
     1475     * Parse down the selector and revert [self] to "&" before a reparsing
     1476     *
     1477     * @param array $selectors
     1478     *
     1479     * @return array
     1480     */
     1481    protected function revertSelfSelector($selectors)
     1482    {
     1483        foreach ($selectors as &$part) {
     1484            if (is_array($part)) {
     1485                if ($part === [Type::T_SELF]) {
     1486                    $part = '&';
     1487                } else {
     1488                    $part = $this->revertSelfSelector($part);
     1489                }
     1490            }
     1491        }
     1492        return $selectors;
    13911493    }
    13921494
     
    15031605          Parser::SOURCE_COLUMN => $this->sourceColumn
    15041606        ];
     1607        // infinite calling loop
     1608        if (count($this->callStack) > 25000) {
     1609            // not displayed but you can var_dump it to deep debug
     1610            $msg = $this->callStackMessage(true, 100);
     1611            $msg = "Infinite calling loop";
     1612            $this->throwError($msg);
     1613        }
    15051614    }
    15061615
     
    15151624     * @param array                                $stms
    15161625     * @param \Leafo\ScssPhp\Formatter\OutputBlock $out
     1626     * @param string                               $traceName
    15171627     *
    15181628     * @return array|null
    15191629     */
    1520     protected function compileChildren($stms, OutputBlock $out)
    1521     {
     1630    protected function compileChildren($stms, OutputBlock $out, $traceName = '')
     1631    {
     1632        $this->pushCallStack($traceName);
    15221633        foreach ($stms as $stm) {
    15231634            $ret = $this->compileChild($stm, $out);
     
    15271638            }
    15281639        }
     1640        $this->popCallStack();
    15291641
    15301642        return null;
     
    15371649     * @param \Leafo\ScssPhp\Formatter\OutputBlock $out
    15381650     * @param \Leafo\ScssPhp\Block                 $selfParent
     1651     * @param string                               $traceName
    15391652     *
    15401653     * @throws \Exception
    15411654     */
    1542     protected function compileChildrenNoReturn($stms, OutputBlock $out, $selfParent = null)
    1543     {
     1655    protected function compileChildrenNoReturn($stms, OutputBlock $out, $selfParent = null, $traceName = '')
     1656    {
     1657        $this->pushCallStack($traceName);
    15441658        foreach ($stms as $stm) {
    15451659            if ($selfParent && isset($stm[1]) && is_object($stm[1]) && $stm[1] instanceof Block) {
     
    15611675            }
    15621676        }
     1677        $this->popCallStack();
    15631678    }
    15641679
     
    16261741     * @param array $queryList
    16271742     *
    1628      * @return string
     1743     * @return array
    16291744     */
    16301745    protected function compileMediaQuery($queryList)
    16311746    {
    1632         $out = '@media';
    1633         $first = true;
     1747        $start = '@media ';
     1748        $default = trim($start);
     1749        $out = [];
     1750        $current = "";
    16341751
    16351752        foreach ($queryList as $query) {
     
    16371754            $parts = [];
    16381755
     1756            $mediaTypeOnly = true;
     1757            foreach ($query as $q) {
     1758                if ($q[0] !== Type::T_MEDIA_TYPE) {
     1759                    $mediaTypeOnly = false;
     1760                    break;
     1761                }
     1762            }
    16391763            foreach ($query as $q) {
    16401764                switch ($q[0]) {
    16411765                    case Type::T_MEDIA_TYPE:
    1642                         if ($type) {
    1643                             $type = $this->mergeMediaTypes(
    1644                                 $type,
    1645                                 array_map([$this, 'compileValue'], array_slice($q, 1))
    1646                             );
    1647 
    1648                             if (empty($type)) { // merge failed
    1649                                 return null;
     1766                        $newType = array_map([$this, 'compileValue'], array_slice($q, 1));
     1767                        // combining not and anything else than media type is too risky and should be avoided
     1768                        if (! $mediaTypeOnly) {
     1769                            if (in_array(Type::T_NOT, $newType) || ($type && in_array(Type::T_NOT, $type) )) {
     1770                                if ($type) {
     1771                                    array_unshift($parts, implode(' ', array_filter($type)));
     1772                                }
     1773                                if (! empty($parts)) {
     1774                                    if (strlen($current)) {
     1775                                        $current .= $this->formatter->tagSeparator;
     1776                                    }
     1777                                    $current .= implode(' and ', $parts);
     1778                                }
     1779                                if ($current) {
     1780                                    $out[] = $start . $current;
     1781                                }
     1782                                $current = "";
     1783                                $type = null;
     1784                                $parts = [];
    16501785                            }
    1651                         } else {
    1652                             $type = array_map([$this, 'compileValue'], array_slice($q, 1));
     1786                        }
     1787                        if ($newType === ['all'] && $default) {
     1788                            $default = $start . 'all';
     1789                        }
     1790                        // all can be safely ignored and mixed with whatever else
     1791                        if ($newType !== ['all']) {
     1792                            if ($type) {
     1793                                $type = $this->mergeMediaTypes($type, $newType);
     1794
     1795                                if (empty($type)) {
     1796                                    // merge failed : ignore this query that is not valid, skip to the next one
     1797                                    $parts = [];
     1798                                    $default = ''; // if everything fail, no @media at all
     1799                                    continue 3;
     1800                                }
     1801                            } else {
     1802                                $type = $newType;
     1803                            }
    16531804                        }
    16541805                        break;
     
    16791830
    16801831            if (! empty($parts)) {
    1681                 if ($first) {
    1682                     $first = false;
    1683                     $out .= ' ';
    1684                 } else {
    1685                     $out .= $this->formatter->tagSeparator;
    1686                 }
    1687 
    1688                 $out .= implode(' and ', $parts);
    1689             }
    1690         }
    1691 
     1832                if (strlen($current)) {
     1833                    $current .= $this->formatter->tagSeparator;
     1834                }
     1835
     1836                $current .= implode(' and ', $parts);
     1837            }
     1838        }
     1839
     1840        if ($current) {
     1841            $out[] = $start . $current;
     1842        }
     1843        // no @media type except all, and no conflict?
     1844        if (!$out && $default) {
     1845            $out[] = $default;
     1846        }
    16921847        return $out;
    16931848    }
     
    17101865        $part2 = end($selectors2);
    17111866
    1712         if (! $this->isImmediateRelationshipCombinator($part1[0]) || $part1 !== $part2) {
     1867        if (! $this->isImmediateRelationshipCombinator($part1[0]) && $part1 !== $part2) {
    17131868            return array_merge($selectors1, $selectors2);
    17141869        }
     
    17201875            $part2 = array_pop($selectors2);
    17211876
    1722             if ($this->isImmediateRelationshipCombinator($part1[0]) && $part1 !== $part2) {
    1723                 $merged = array_merge($selectors1, [$part1], $selectors2, [$part2], $merged);
     1877            if (! $this->isImmediateRelationshipCombinator($part1[0]) && $part1 !== $part2) {
     1878                if ($this->isImmediateRelationshipCombinator(reset($merged)[0])) {
     1879                    array_unshift($merged, [$part1[0] . $part2[0]]);
     1880                    $merged = array_merge($selectors1, $selectors2, $merged);
     1881                } else {
     1882                    $merged = array_merge($selectors1, [$part1], $selectors2, [$part2], $merged);
     1883                }
    17241884                break;
    17251885            }
    17261886
    17271887            array_unshift($merged, $part1);
    1728             array_unshift($merged, [array_pop($selectors1)[0] . array_pop($selectors2)[0]]);
    17291888        } while (! empty($selectors1) && ! empty($selectors2));
    17301889
     
    22132372                $this->env->marker = 'mixin';
    22142373
    2215                 $this->pushCallStack($this->env->marker . " " . $name);
    2216                 $this->compileChildrenNoReturn($mixin->children, $out, $selfParent);
    2217                 $this->popCallStack();
     2374                $this->compileChildrenNoReturn($mixin->children, $out, $selfParent, $this->env->marker . " " . $name);
    22182375
    22192376                $this->storeEnv = $storeEnv;
     
    22232380
    22242381            case Type::T_MIXIN_CONTENT:
    2225                 $content = $this->get(static::$namespaces['special'] . 'content', false, $this->getStoreEnv())
    2226                          ?: $this->get(static::$namespaces['special'] . 'content', false, $this->env);
     2382                $content = $this->get(static::$namespaces['special'] . 'content', false, isset($this->storeEnv) ? $this->storeEnv : $this->env);
    22272383
    22282384                if (! $content) {
     
    25272683            case Type::T_INTERPOLATE:
    25282684                $value[1] = $this->reduce($value[1]);
     2685                if ($inExp) {
     2686                    return $value[1];
     2687                }
    25292688
    25302689                return $value;
     
    25352694            case Type::T_SELF:
    25362695                $selfSelector = $this->multiplySelectors($this->env);
    2537                 $selfSelector = $this->collapseSelectors($selfSelector);
    2538 
    2539                 return [Type::T_STRING, '', [$selfSelector]];
     2696                $selfSelector = $this->collapseSelectors($selfSelector, true);
     2697                return $selfSelector;
    25402698
    25412699            default:
     
    32533411            }
    32543412
    3255             $selectors = [];
    3256 
    3257             foreach ($env->selectors as $selector) {
    3258                 foreach ($parentSelectors as $parent) {
    3259                     if ($selfParentSelectors) {
    3260                         $previous = null;
    3261 
    3262                         foreach ($selfParentSelectors as $selfParent) {
    3263                             // if no '&' in the selector, each call will give same result, only add once
    3264                             $s = $this->joinSelectors($parent, $selector, $selfParent);
    3265 
    3266                             if ($s !== $previous) {
     3413            $selectors = $env->selectors;
     3414
     3415            do {
     3416                $stillHasSelf = false;
     3417                $prevSelectors = $selectors;
     3418                $selectors = [];
     3419
     3420                foreach ($prevSelectors as $selector) {
     3421                    foreach ($parentSelectors as $parent) {
     3422                        if ($selfParentSelectors) {
     3423                            foreach ($selfParentSelectors as $selfParent) {
     3424                                // if no '&' in the selector, each call will give same result, only add once
     3425                                $s = $this->joinSelectors($parent, $selector, $stillHasSelf, $selfParent);
    32673426                                $selectors[serialize($s)] = $s;
    32683427                            }
    3269 
    3270                             $previous = $s;
     3428                        } else {
     3429                            $s = $this->joinSelectors($parent, $selector, $stillHasSelf);
     3430                            $selectors[serialize($s)] = $s;
    32713431                        }
    3272                     } else {
    3273                         $s = $this->joinSelectors($parent, $selector);
    3274                         $selectors[serialize($s)] = $s;
    32753432                    }
    32763433                }
    3277             }
     3434            } while ($stillHasSelf);
    32783435
    32793436            $parentSelectors = $selectors;
     
    32903447     * @param array $parent
    32913448     * @param array $child
     3449     * @param bool  &$stillHasSelf
    32923450     * @param array $selfParentSelectors
    32933451
    32943452     * @return array
    32953453     */
    3296     protected function joinSelectors($parent, $child, $selfParentSelectors = null)
     3454    protected function joinSelectors($parent, $child, &$stillHasSelf, $selfParentSelectors = null)
    32973455    {
    32983456        $setSelf = false;
     
    33033461
    33043462            foreach ($part as $p) {
    3305                 if ($p === static::$selfSelector) {
     3463                // only replace & once and should be recalled to be able to make combinations
     3464                if ($p === static::$selfSelector && $setSelf) {
     3465                    $stillHasSelf = true;
     3466                }
     3467                if ($p === static::$selfSelector && !$setSelf) {
    33063468                    $setSelf = true;
    33073469
     
    33773539            foreach ($parentQueries as $parentQuery) {
    33783540                foreach ($originalQueries as $childQuery) {
    3379                     $childQueries []= array_merge($parentQuery, $childQuery);
     3541                    $childQueries []= array_merge($parentQuery, [[Type::T_MEDIA_TYPE, [Type::T_KEYWORD, 'all']]], $childQuery);
    33803542                }
    33813543            }
     
    39574119        $msg = "$msg: $loc";
    39584120
     4121        $callStackMsg = $this->callStackMessage();
     4122        if ($callStackMsg) {
     4123            $msg .= "\nCall Stack:\n" . $callStackMsg;
     4124        }
     4125
     4126        throw new CompilerException($msg);
     4127    }
     4128
     4129    /**
     4130     * @param bool $all
     4131     * @param null $limit
     4132     * @return string
     4133     */
     4134    protected function callStackMessage($all = false, $limit = null)
     4135    {
     4136        $callStackMsg = [];
     4137        $ncall = 0;
     4138
    39594139        if ($this->callStack) {
    3960             $msg .= "\nCall Stack:\n";
    3961             $ncall = 0;
    3962 
    39634140            foreach (array_reverse($this->callStack) as $call) {
    3964                 $msg .= "#" . $ncall++ . " " . $call['n'] . " ";
    3965                 $msg .= (isset($this->sourceNames[$call[Parser::SOURCE_INDEX]])
    3966                       ? $this->sourceNames[$call[Parser::SOURCE_INDEX]]
    3967                       : '(unknown file)');
    3968                 $msg .= " on line " . $call[Parser::SOURCE_LINE] . "\n";
    3969             }
    3970         }
    3971 
    3972         throw new CompilerException($msg);
     4141                if ($all || (isset($call['n']) && $call['n'])) {
     4142                    $msg = "#" . $ncall++ . " " . $call['n'] . " ";
     4143                    $msg .= (isset($this->sourceNames[$call[Parser::SOURCE_INDEX]])
     4144                          ? $this->sourceNames[$call[Parser::SOURCE_INDEX]]
     4145                          : '(unknown file)');
     4146                    $msg .= " on line " . $call[Parser::SOURCE_LINE];
     4147                    $callStackMsg[] = $msg;
     4148                    if (!is_null($limit) && $ncall>$limit) {
     4149                        break;
     4150                    }
     4151                }
     4152            }
     4153        }
     4154
     4155        return implode("\n", $callStackMsg);
    39734156    }
    39744157
     
    40374220
    40384221        $this->env->marker = 'function';
    4039         $this->pushCallStack($this->env->marker . " " . $name);
    4040 
    4041         $ret = $this->compileChildren($func->children, $tmp);
    4042 
    4043         $this->popCallStack();
     4222
     4223        $ret = $this->compileChildren($func->children, $tmp, $this->env->marker . " " . $name);
    40444224
    40454225        $this->storeEnv = $storeEnv;
  • _plugins_/scssphp/trunk/lib/scssphp/src/Formatter/Compressed.php

    r115044 r115410  
    6060        }
    6161    }
     62
     63    /**
     64     * Output block selectors
     65     *
     66     * @param \Leafo\ScssPhp\Formatter\OutputBlock $block
     67     */
     68    protected function blockSelectors(OutputBlock $block)
     69    {
     70        $inner = $this->indentStr();
     71
     72        $this->write($inner
     73            . implode($this->tagSeparator, str_replace(array(' > ', ' + ', ' ~ '), array('>', '+', '~'), $block->selectors))
     74            . $this->open . $this->break);
     75    }
    6276}
  • _plugins_/scssphp/trunk/lib/scssphp/src/Formatter/Crunched.php

    r115044 r115410  
    5858        }
    5959    }
     60
     61    /**
     62     * Output block selectors
     63     *
     64     * @param \Leafo\ScssPhp\Formatter\OutputBlock $block
     65     */
     66    protected function blockSelectors(OutputBlock $block)
     67    {
     68        $inner = $this->indentStr();
     69
     70        $this->write($inner
     71            . implode($this->tagSeparator, str_replace(array(' > ', ' + ', ' ~ '), array('>', '+', '~'), $block->selectors))
     72            . $this->open . $this->break);
     73    }
    6074}
  • _plugins_/scssphp/trunk/lib/scssphp/src/Parser.php

    r115301 r115410  
    24312431        if ($this->match(
    24322432            $this->utf8
    2433                 ? '([\pL\w\-_]+|#[{][$][\pL\w\-_]+[}])'
    2434                 : '([\w\-_]+|#[{][$][\w\-_]+[}])',
     2433                ? '([\pL\w\-_]+)'
     2434                : '([\w\-_]+)',
    24352435            $m
    24362436        )) {
    24372437            $placeholder = $m[1];
    24382438
     2439            return true;
     2440        }
     2441        if ($this->interpolation($placeholder)) {
    24392442            return true;
    24402443        }
  • _plugins_/scssphp/trunk/paquet.xml

    r115305 r115410  
    22        prefix="scssphp"
    33        categorie="outil"
    4         version="2.0.0"
     4        version="2.0.1"
    55        etat="stable"
    66        compatibilite="[3.1.0;3.2.*]"
Note: See TracChangeset for help on using the changeset viewer.