Current File : /var/www/vinorea/modules/psxdesign/vendor/scssphp/scssphp/src/Formatter/Nested.php |
<?php
/**
* SCSSPHP
*
* @copyright 2012-2020 Leaf Corcoran
*
* @license http://opensource.org/licenses/MIT MIT
*
* @link http://scssphp.github.io/scssphp
*/
namespace PrestaShop\Module\PsxDesign\Vendor\ScssPhp\ScssPhp\Formatter;
use PrestaShop\Module\PsxDesign\Vendor\ScssPhp\ScssPhp\Formatter;
use PrestaShop\Module\PsxDesign\Vendor\ScssPhp\ScssPhp\Type;
/**
* Nested formatter
*
* @author Leaf Corcoran <leafot@gmail.com>
*
* @deprecated since 1.4.0. Use the Expanded formatter instead.
*
* @internal
*/
class Nested extends \PrestaShop\Module\PsxDesign\Vendor\ScssPhp\ScssPhp\Formatter
{
/**
* @var int
*/
private $depth;
/**
* {@inheritdoc}
*/
public function __construct()
{
@\trigger_error('The Nested formatter is deprecated since 1.4.0. Use the Expanded formatter instead.', \E_USER_DEPRECATED);
$this->indentLevel = 0;
$this->indentChar = ' ';
$this->break = "\n";
$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(\PrestaShop\Module\PsxDesign\Vendor\ScssPhp\ScssPhp\Formatter\OutputBlock $block)
{
$inner = $this->indentStr();
$glue = $this->break . $inner;
foreach ($block->lines as $index => $line) {
if (\substr($line, 0, 2) === '/*') {
$replacedLine = \preg_replace('/\\r\\n?|\\n|\\f/', $this->break, $line);
\assert($replacedLine !== null);
$block->lines[$index] = $replacedLine;
}
}
$this->write($inner . \implode($glue, $block->lines));
}
/**
* {@inheritdoc}
*/
protected function block(\PrestaShop\Module\PsxDesign\Vendor\ScssPhp\ScssPhp\Formatter\OutputBlock $block)
{
static $depths;
static $downLevel;
static $closeBlock;
static $previousEmpty;
static $previousHasSelector;
if ($block->type === 'root') {
$depths = [0];
$downLevel = '';
$closeBlock = '';
$this->depth = 0;
$previousEmpty = \false;
$previousHasSelector = \false;
}
$isMediaOrDirective = \in_array($block->type, [\PrestaShop\Module\PsxDesign\Vendor\ScssPhp\ScssPhp\Type::T_DIRECTIVE, \PrestaShop\Module\PsxDesign\Vendor\ScssPhp\ScssPhp\Type::T_MEDIA]);
$isSupport = $block->type === \PrestaShop\Module\PsxDesign\Vendor\ScssPhp\ScssPhp\Type::T_DIRECTIVE && $block->selectors && \strpos(\implode('', $block->selectors), '@supports') !== \false;
while ($block->depth < \end($depths) || $block->depth == 1 && \end($depths) == 1) {
\array_pop($depths);
$this->depth--;
if (!$this->depth && ($block->depth <= 1 || !$this->indentLevel && $block->type === \PrestaShop\Module\PsxDesign\Vendor\ScssPhp\ScssPhp\Type::T_COMMENT) && ($block->selectors && !$isMediaOrDirective || $previousHasSelector)) {
$downLevel = $this->break;
}
if (empty($block->lines) && empty($block->children)) {
$previousEmpty = \true;
}
}
if (empty($block->lines) && empty($block->children)) {
return;
}
$this->currentBlock = $block;
if (!empty($block->lines) || !empty($block->children) && ($this->depth < 1 || $isSupport)) {
if ($block->depth > \end($depths)) {
if (!$previousEmpty || $this->depth < 1) {
$this->depth++;
$depths[] = $block->depth;
} else {
// keep the current depth unchanged but take the block depth as a new reference for following blocks
\array_pop($depths);
$depths[] = $block->depth;
}
}
}
$previousEmpty = $block->type === \PrestaShop\Module\PsxDesign\Vendor\ScssPhp\ScssPhp\Type::T_COMMENT;
$previousHasSelector = \false;
if (!empty($block->selectors)) {
if ($closeBlock) {
$this->write($closeBlock);
$closeBlock = '';
}
if ($downLevel) {
$this->write($downLevel);
$downLevel = '';
}
$this->blockSelectors($block);
$this->indentLevel++;
}
if (!empty($block->lines)) {
if ($closeBlock) {
$this->write($closeBlock);
$closeBlock = '';
}
if ($downLevel) {
$this->write($downLevel);
$downLevel = '';
}
$this->blockLines($block);
$closeBlock = $this->break;
}
if (!empty($block->children)) {
if ($this->depth > 0 && ($isMediaOrDirective || !$this->hasFlatChild($block))) {
\array_pop($depths);
$this->depth--;
$this->blockChildren($block);
$this->depth++;
$depths[] = $block->depth;
} else {
$this->blockChildren($block);
}
}
// reclear to not be spoiled by children if T_DIRECTIVE
if ($block->type === \PrestaShop\Module\PsxDesign\Vendor\ScssPhp\ScssPhp\Type::T_DIRECTIVE) {
$previousHasSelector = \false;
}
if (!empty($block->selectors)) {
$this->indentLevel--;
if (!$this->keepSemicolons) {
$this->strippedSemicolon = '';
}
$this->write($this->close);
$closeBlock = $this->break;
if ($this->depth > 1 && !empty($block->children)) {
\array_pop($depths);
$this->depth--;
}
if (!$isMediaOrDirective) {
$previousHasSelector = \true;
}
}
if ($block->type === 'root') {
$this->write($this->break);
}
}
/**
* Block has flat child
*
* @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block
*
* @return bool
*/
private function hasFlatChild($block)
{
foreach ($block->children as $child) {
if (empty($child->selectors)) {
return \true;
}
}
return \false;
}
}