',', ': ' => ':', '' => '', ' ' => ' ', ':' => ' :', '+' => '+', '~' => '~', '>' => '>', '|' => '|', '^' => '^', '^^' => '^^' ]; } else { self::$_outputMap = [ ',' => ', ', ': ' => ': ', '' => '', ' ' => ' ', ':' => ' :', '+' => ' + ', '~' => ' ~ ', '>' => ' > ', '|' => '|', '^' => ' ^ ', '^^' => ' ^^ ' ]; } } public function copyEvalEnv( $frames = [] ) { $new_env = new Less_Environment(); $new_env->frames = $frames; return $new_env; } public static function isMathOn() { return !Less_Parser::$options['strictMath'] || self::$parensStack; } public static function isPathRelative( $path ) { return !preg_match( '/^(?:[a-z-]+:|\/)/', $path ); } /** * Canonicalize a path by resolving references to '/./', '/../' * Does not remove leading "../" * @param string $path or url * @return string Canonicalized path */ public static function normalizePath( $path ) { $segments = explode( '/', $path ); $segments = array_reverse( $segments ); $path = []; $path_len = 0; while ( $segments ) { $segment = array_pop( $segments ); switch ( $segment ) { case '.': break; case '..': // @phan-suppress-next-line PhanTypeInvalidDimOffset False positive if ( !$path_len || ( $path[$path_len - 1] === '..' ) ) { $path[] = $segment; $path_len++; } else { array_pop( $path ); $path_len--; } break; default: $path[] = $segment; $path_len++; break; } } return implode( '/', $path ); } public function unshiftFrame( $frame ) { array_unshift( $this->frames, $frame ); } public function shiftFrame() { return array_shift( $this->frames ); } }