2021-02-15 21:29:38 +01:00
|
|
|
<?php
|
|
|
|
/**
|
2023-07-07 22:33:10 +02:00
|
|
|
* @private
|
2021-02-15 21:29:38 +01:00
|
|
|
*/
|
|
|
|
class Less_Environment {
|
|
|
|
|
2023-07-07 22:33:10 +02:00
|
|
|
/**
|
|
|
|
* Information about the current file - for error reporting and importing and making urls relative etc.
|
|
|
|
*
|
|
|
|
* - rootpath: rootpath to append to URLs
|
|
|
|
*
|
|
|
|
* @var array|null $currentFileInfo;
|
|
|
|
*/
|
|
|
|
public $currentFileInfo;
|
2021-02-15 21:29:38 +01:00
|
|
|
|
2023-07-07 22:33:10 +02:00
|
|
|
/* Whether we are currently importing multiple copies */
|
|
|
|
public $importMultiple = false;
|
2021-02-15 21:29:38 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @var array
|
|
|
|
*/
|
2023-07-07 22:33:10 +02:00
|
|
|
public $frames = [];
|
2021-02-15 21:29:38 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @var array
|
|
|
|
*/
|
2023-07-07 22:33:10 +02:00
|
|
|
public $mediaBlocks = [];
|
2021-02-15 21:29:38 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @var array
|
|
|
|
*/
|
2023-07-07 22:33:10 +02:00
|
|
|
public $mediaPath = [];
|
2021-02-15 21:29:38 +01:00
|
|
|
|
|
|
|
public static $parensStack = 0;
|
|
|
|
|
|
|
|
public static $tabLevel = 0;
|
|
|
|
|
|
|
|
public static $lastRule = false;
|
|
|
|
|
|
|
|
public static $_outputMap;
|
|
|
|
|
|
|
|
public static $mixin_stack = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @var array
|
|
|
|
*/
|
2023-07-07 22:33:10 +02:00
|
|
|
public $functions = [];
|
2021-02-15 21:29:38 +01:00
|
|
|
|
|
|
|
public function Init() {
|
|
|
|
self::$parensStack = 0;
|
|
|
|
self::$tabLevel = 0;
|
|
|
|
self::$lastRule = false;
|
|
|
|
self::$mixin_stack = 0;
|
|
|
|
|
|
|
|
if ( Less_Parser::$options['compress'] ) {
|
|
|
|
|
2023-07-07 22:33:10 +02:00
|
|
|
self::$_outputMap = [
|
2021-02-15 21:29:38 +01:00
|
|
|
',' => ',',
|
|
|
|
': ' => ':',
|
|
|
|
'' => '',
|
|
|
|
' ' => ' ',
|
|
|
|
':' => ' :',
|
|
|
|
'+' => '+',
|
|
|
|
'~' => '~',
|
|
|
|
'>' => '>',
|
|
|
|
'|' => '|',
|
|
|
|
'^' => '^',
|
|
|
|
'^^' => '^^'
|
2023-07-07 22:33:10 +02:00
|
|
|
];
|
2021-02-15 21:29:38 +01:00
|
|
|
|
|
|
|
} else {
|
|
|
|
|
2023-07-07 22:33:10 +02:00
|
|
|
self::$_outputMap = [
|
2021-02-15 21:29:38 +01:00
|
|
|
',' => ', ',
|
|
|
|
': ' => ': ',
|
|
|
|
'' => '',
|
|
|
|
' ' => ' ',
|
|
|
|
':' => ' :',
|
|
|
|
'+' => ' + ',
|
|
|
|
'~' => ' ~ ',
|
|
|
|
'>' => ' > ',
|
|
|
|
'|' => '|',
|
|
|
|
'^' => ' ^ ',
|
|
|
|
'^^' => ' ^^ '
|
2023-07-07 22:33:10 +02:00
|
|
|
];
|
2021-02-15 21:29:38 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-07-07 22:33:10 +02:00
|
|
|
public function copyEvalEnv( $frames = [] ) {
|
2021-02-15 21:29:38 +01:00
|
|
|
$new_env = new Less_Environment();
|
|
|
|
$new_env->frames = $frames;
|
|
|
|
return $new_env;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static function isMathOn() {
|
2023-07-07 22:33:10 +02:00
|
|
|
return !Less_Parser::$options['strictMath'] || self::$parensStack;
|
2021-02-15 21:29:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public static function isPathRelative( $path ) {
|
|
|
|
return !preg_match( '/^(?:[a-z-]+:|\/)/', $path );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Canonicalize a path by resolving references to '/./', '/../'
|
|
|
|
* Does not remove leading "../"
|
2023-07-07 22:33:10 +02:00
|
|
|
* @param string $path or url
|
2021-02-15 21:29:38 +01:00
|
|
|
* @return string Canonicalized path
|
|
|
|
*/
|
|
|
|
public static function normalizePath( $path ) {
|
|
|
|
$segments = explode( '/', $path );
|
|
|
|
$segments = array_reverse( $segments );
|
|
|
|
|
2023-07-07 22:33:10 +02:00
|
|
|
$path = [];
|
2021-02-15 21:29:38 +01:00
|
|
|
$path_len = 0;
|
|
|
|
|
|
|
|
while ( $segments ) {
|
|
|
|
$segment = array_pop( $segments );
|
|
|
|
switch ( $segment ) {
|
|
|
|
|
|
|
|
case '.':
|
2023-07-07 22:33:10 +02:00
|
|
|
break;
|
2021-02-15 21:29:38 +01:00
|
|
|
|
|
|
|
case '..':
|
2023-07-07 22:33:10 +02:00
|
|
|
// @phan-suppress-next-line PhanTypeInvalidDimOffset False positive
|
2021-02-15 21:29:38 +01:00
|
|
|
if ( !$path_len || ( $path[$path_len - 1] === '..' ) ) {
|
|
|
|
$path[] = $segment;
|
|
|
|
$path_len++;
|
|
|
|
} else {
|
|
|
|
array_pop( $path );
|
|
|
|
$path_len--;
|
|
|
|
}
|
2023-07-07 22:33:10 +02:00
|
|
|
break;
|
2021-02-15 21:29:38 +01:00
|
|
|
|
|
|
|
default:
|
|
|
|
$path[] = $segment;
|
|
|
|
$path_len++;
|
2023-07-07 22:33:10 +02:00
|
|
|
break;
|
2021-02-15 21:29:38 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return implode( '/', $path );
|
|
|
|
}
|
|
|
|
|
|
|
|
public function unshiftFrame( $frame ) {
|
|
|
|
array_unshift( $this->frames, $frame );
|
|
|
|
}
|
|
|
|
|
|
|
|
public function shiftFrame() {
|
|
|
|
return array_shift( $this->frames );
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|