1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
<?php
/**
* @private
* @see less-3.13.1.js#NamespaceValue.prototype
*/
class Less_Tree_NamespaceValue extends Less_Tree {
/** @var Less_Tree_Mixin_Call|Less_Tree_VariableCall */
public $value;
public $index;
public $lookups;
public $currentFileInfo;
public function __construct( $ruleCall, $lookups, $index = null, $currentFileInfo = null ) {
$this->value = $ruleCall;
$this->lookups = $lookups;
$this->index = $index;
$this->currentFileInfo = $currentFileInfo;
}
public function compile( $env ) {
/** @var Less_Tree_Ruleset $rules */
$rules = $this->value->compile( $env );
foreach ( $this->lookups as $name ) {
/**
* Eval'd DRs return rulesets.
* Eval'd mixins return rules, so let's make a ruleset if we need it.
* We need to do this because of late parsing of values
*/
if ( is_array( $rules ) ) {
$rules = new Less_Tree_Ruleset( [ new Less_Tree_Selector( [] ) ], $rules );
}
if ( $name === '' ) {
$rules = $rules->lastDeclaration();
} elseif ( $name[0] === '@' ) {
if ( ( $name[1] ?? '' ) === '@' ) {
$variable = ( new Less_Tree_Variable( substr( $name, 1 ) ) )->compile( $env );
$name = "@" . $variable->value;
}
if ( $rules instanceof Less_Tree_Ruleset ) {
$rules = $rules->variable( $name );
}
if ( !$rules ) {
throw new Less_Exception_Compiler(
"Variable $name not found",
null,
$this->index,
$this->currentFileInfo
);
}
} else {
if ( strncmp( $name, '$@', 2 ) === 0 ) {
$variable = ( new Less_Tree_Variable( substr( $name, 1 ) ) )->compile( $env );
$name = "$" . $variable->value;
} else {
$name = $name[0] === '$' ? $name : ( '$' . $name );
}
if ( $rules instanceof Less_Tree_Ruleset ) {
$rules = $rules->property( $name );
}
if ( !$rules ) {
throw new Less_Exception_Compiler(
"Property $name not found",
null,
$this->index,
$this->currentFileInfo
);
}
// Properties are an array of values, since a ruleset can have multiple props.
// We pick the last one (the "cascaded" value)
if ( is_array( $rules ) ) { // to satisfy phan checks
$rules = $rules[ count( $rules ) - 1 ];
}
}
if ( $rules->value ) {
$rules = $rules->compile( $env )->value;
}
if ( $rules instanceof Less_Tree_DetachedRuleset && $rules->ruleset ) {
// @todo - looks like this is never evaluated, investigate later
// @see https://github.com/less/less.js/commit/29468bffcd8a9f2f
$rules = $rules->ruleset->compile( $env );
}
}
return $rules;
}
}
|