Leafo\ScssPhp\Compiler::matchExtendsSingle PHP Method

matchExtendsSingle() protected method

Match extends single
protected matchExtendsSingle ( array $rawSingle, array &$outOrigin ) : boolean
$rawSingle array
$outOrigin array
return boolean
    protected function matchExtendsSingle($rawSingle, &$outOrigin)
    {
        $counts = [];
        $single = [];
        foreach ($rawSingle as $part) {
            // matches Number
            if (!is_string($part)) {
                return false;
            }
            if (!preg_match('/^[\\[.:#%]/', $part) && count($single)) {
                $single[count($single) - 1] .= $part;
            } else {
                $single[] = $part;
            }
        }
        $extendingDecoratedTag = false;
        if (count($single) > 1) {
            $matches = null;
            $extendingDecoratedTag = preg_match('/^[a-z0-9]+$/i', $single[0], $matches) ? $matches[0] : false;
        }
        foreach ($single as $part) {
            if (isset($this->extendsMap[$part])) {
                foreach ($this->extendsMap[$part] as $idx) {
                    $counts[$idx] = isset($counts[$idx]) ? $counts[$idx] + 1 : 1;
                }
            }
        }
        $outOrigin = [];
        $found = false;
        foreach ($counts as $idx => $count) {
            list($target, $origin, ) = $this->extends[$idx];
            // check count
            if ($count !== count($target)) {
                continue;
            }
            $this->extends[$idx][3] = true;
            $rem = array_diff($single, $target);
            foreach ($origin as $j => $new) {
                // prevent infinite loop when target extends itself
                if ($this->isSelfExtend($single, $origin)) {
                    return false;
                }
                $replacement = end($new);
                // Extending a decorated tag with another tag is not possible.
                if ($extendingDecoratedTag && $replacement[0] != $extendingDecoratedTag && preg_match('/^[a-z0-9]+$/i', $replacement[0])) {
                    unset($origin[$j]);
                    continue;
                }
                $combined = $this->combineSelectorSingle($replacement, $rem);
                if (count(array_diff($combined, $origin[$j][count($origin[$j]) - 1]))) {
                    $origin[$j][count($origin[$j]) - 1] = $combined;
                }
            }
            $outOrigin = array_merge($outOrigin, $origin);
            $found = true;
        }
        return $found;
    }
Compiler