%PDF- %PDF-
| Direktori : /home/qgbqkvz/www/wp-content/plugins/wp-scss/scssphp/src/Ast/Sass/Expression/ |
| Current File : /home/qgbqkvz/www/wp-content/plugins/wp-scss/scssphp/src/Ast/Sass/Expression/StringExpression.php |
<?php
/**
* SCSSPHP
*
* @copyright 2012-2020 Leaf Corcoran
*
* @license http://opensource.org/licenses/MIT MIT
*
* @link http://scssphp.github.io/scssphp
*/
namespace ScssPhp\ScssPhp\Ast\Sass\Expression;
use ScssPhp\ScssPhp\Ast\Sass\Expression;
use ScssPhp\ScssPhp\Ast\Sass\Interpolation;
use ScssPhp\ScssPhp\Parser\InterpolationBuffer;
use ScssPhp\ScssPhp\SourceSpan\FileSpan;
use ScssPhp\ScssPhp\Util\Character;
use ScssPhp\ScssPhp\Visitor\ExpressionVisitor;
/**
* A string literal.
*
* @internal
*/
final class StringExpression implements Expression
{
/**
* @var Interpolation
* @readonly
*/
private $text;
/**
* @var bool
* @readonly
*/
private $quotes;
public function __construct(Interpolation $text, bool $quotes = false)
{
$this->text = $text;
$this->quotes = $quotes;
}
/**
* Returns a string expression with no interpolation.
*/
public static function plain(string $text, FileSpan $span, bool $quotes = false): self
{
return new self(new Interpolation([$text], $span), $quotes);
}
/**
* Returns Sass source for a quoted string that, when evaluated, will have
* $text as its contents.
*/
public static function quoteText(string $text): string
{
$quote = self::bestQuote([$text]);
$buffer = $quote;
$buffer .= self::quoteInnerText($text, $quote, true);
$buffer .= $quote;
return $buffer;
}
public function getText(): Interpolation
{
return $this->text;
}
public function hasQuotes(): bool
{
return $this->quotes;
}
public function getSpan(): FileSpan
{
return $this->text->getSpan();
}
public function accept(ExpressionVisitor $visitor)
{
return $visitor->visitStringExpression($this);
}
public function asInterpolation(bool $static = false, string $quote = null): Interpolation
{
if (!$this->quotes) {
return $this->text;
}
$quote = $quote ?? self::bestQuote($this->text->getContents());
$buffer = new InterpolationBuffer();
$buffer->write($quote);
foreach ($this->text->getContents() as $value) {
if ($value instanceof Expression) {
$buffer->add($value);
} else {
$buffer->write(self::quoteInnerText($value, $quote, $static));
}
}
$buffer->write($quote);
return $buffer->buildInterpolation($this->text->getSpan());
}
private static function quoteInnerText(string $value, string $quote, bool $static = false): string
{
$buffer = '';
$length = \strlen($value);
for ($i = 0; $i < $length; $i++) {
$char = $value[$i];
if (Character::isNewline($char)) {
$buffer .= '\\a';
if ($i !== $length - 1) {
$next = $value[$i + 1];
if (Character::isWhitespace($next) || Character::isHex($next)) {
$buffer .= ' ';
}
}
} else {
if ($char === $quote || $char === '\\' || ($static && $char === '#' && $i < $length - 1 && $value[$i + 1] === '{')) {
$buffer .= '\\';
}
if (\ord($char) < 0x80) {
$buffer .= $char;
} else {
if (!preg_match('/./usA', $value, $m, 0, $i)) {
throw new \UnexpectedValueException('Invalid UTF-8 char');
}
$buffer .= $m[0];
$i += \strlen($m[0]) - 1; // skip over the extra bytes that have been processed.
}
}
}
return $buffer;
}
/**
* @param array<string|Expression> $parts
*
* @return string
*/
private static function bestQuote(array $parts): string
{
$containsDoubleQuote = false;
foreach ($parts as $part) {
if (!\is_string($part)) {
continue;
}
if (false !== strpos($part, "'")) {
return '"';
}
if (false !== strpos($part, '"')) {
$containsDoubleQuote = true;
}
}
return $containsDoubleQuote ? "'": '"';
}
public function __toString(): string
{
return (string) $this->asInterpolation();
}
}