File: NamespaceValue.php

package info (click to toggle)
mediawiki 1%3A1.43.3%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 417,464 kB
  • sloc: php: 1,062,949; javascript: 664,290; sql: 9,714; python: 5,458; xml: 3,489; sh: 1,131; makefile: 64
file content (93 lines) | stat: -rw-r--r-- 2,611 bytes parent folder | download
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;
	}

}