summaryrefslogtreecommitdiffstats
path: root/library/vendor/lessphp/lib/Less/Tree/Media.php
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--library/vendor/lessphp/lib/Less/Tree/Media.php173
1 files changed, 173 insertions, 0 deletions
diff --git a/library/vendor/lessphp/lib/Less/Tree/Media.php b/library/vendor/lessphp/lib/Less/Tree/Media.php
new file mode 100644
index 0000000..ba25a67
--- /dev/null
+++ b/library/vendor/lessphp/lib/Less/Tree/Media.php
@@ -0,0 +1,173 @@
+<?php
+
+/**
+ * Media
+ *
+ * @package Less
+ * @subpackage tree
+ */
+class Less_Tree_Media extends Less_Tree {
+
+ public $features;
+ public $rules;
+ public $index;
+ public $currentFileInfo;
+ public $isReferenced;
+ public $type = 'Media';
+
+ public function __construct( $value = array(), $features = array(), $index = null, $currentFileInfo = null ) {
+ $this->index = $index;
+ $this->currentFileInfo = $currentFileInfo;
+
+ $selectors = $this->emptySelectors();
+
+ $this->features = new Less_Tree_Value( $features );
+
+ $this->rules = array( new Less_Tree_Ruleset( $selectors, $value ) );
+ $this->rules[0]->allowImports = true;
+ }
+
+ public function accept( $visitor ) {
+ $this->features = $visitor->visitObj( $this->features );
+ $this->rules = $visitor->visitArray( $this->rules );
+ }
+
+ /**
+ * @see Less_Tree::genCSS
+ */
+ public function genCSS( $output ) {
+ $output->add( '@media ', $this->currentFileInfo, $this->index );
+ $this->features->genCSS( $output );
+ Less_Tree::outputRuleset( $output, $this->rules );
+
+ }
+
+ public function compile( $env ) {
+ $media = new Less_Tree_Media( array(), array(), $this->index, $this->currentFileInfo );
+
+ $strictMathBypass = false;
+ if ( Less_Parser::$options['strictMath'] === false ) {
+ $strictMathBypass = true;
+ Less_Parser::$options['strictMath'] = true;
+ }
+
+ $media->features = $this->features->compile( $env );
+
+ if ( $strictMathBypass ) {
+ Less_Parser::$options['strictMath'] = false;
+ }
+
+ $env->mediaPath[] = $media;
+ $env->mediaBlocks[] = $media;
+
+ array_unshift( $env->frames, $this->rules[0] );
+ $media->rules = array( $this->rules[0]->compile( $env ) );
+ array_shift( $env->frames );
+
+ array_pop( $env->mediaPath );
+
+ return !$env->mediaPath ? $media->compileTop( $env ) : $media->compileNested( $env );
+ }
+
+ public function variable( $name ) {
+ return $this->rules[0]->variable( $name );
+ }
+
+ public function find( $selector ) {
+ return $this->rules[0]->find( $selector, $this );
+ }
+
+ public function emptySelectors() {
+ $el = new Less_Tree_Element( '', '&', $this->index, $this->currentFileInfo );
+ $sels = array( new Less_Tree_Selector( array( $el ), array(), null, $this->index, $this->currentFileInfo ) );
+ $sels[0]->mediaEmpty = true;
+ return $sels;
+ }
+
+ public function markReferenced() {
+ $this->rules[0]->markReferenced();
+ $this->isReferenced = true;
+ Less_Tree::ReferencedArray( $this->rules[0]->rules );
+ }
+
+ // evaltop
+ public function compileTop( $env ) {
+ $result = $this;
+
+ if ( count( $env->mediaBlocks ) > 1 ) {
+ $selectors = $this->emptySelectors();
+ $result = new Less_Tree_Ruleset( $selectors, $env->mediaBlocks );
+ $result->multiMedia = true;
+ }
+
+ $env->mediaBlocks = array();
+ $env->mediaPath = array();
+
+ return $result;
+ }
+
+ public function compileNested( $env ) {
+ $path = array_merge( $env->mediaPath, array( $this ) );
+
+ // Extract the media-query conditions separated with `,` (OR).
+ foreach ( $path as $key => $p ) {
+ $value = $p->features instanceof Less_Tree_Value ? $p->features->value : $p->features;
+ $path[$key] = is_array( $value ) ? $value : array( $value );
+ }
+
+ // Trace all permutations to generate the resulting media-query.
+ //
+ // (a, b and c) with nested (d, e) ->
+ // a and d
+ // a and e
+ // b and c and d
+ // b and c and e
+
+ $permuted = $this->permute( $path );
+ $expressions = array();
+ foreach ( $permuted as $path ) {
+
+ for ( $i = 0, $len = count( $path ); $i < $len; $i++ ) {
+ $path[$i] = Less_Parser::is_method( $path[$i], 'toCSS' ) ? $path[$i] : new Less_Tree_Anonymous( $path[$i] );
+ }
+
+ for ( $i = count( $path ) - 1; $i > 0; $i-- ) {
+ array_splice( $path, $i, 0, array( new Less_Tree_Anonymous( 'and' ) ) );
+ }
+
+ $expressions[] = new Less_Tree_Expression( $path );
+ }
+ $this->features = new Less_Tree_Value( $expressions );
+
+ // Fake a tree-node that doesn't output anything.
+ return new Less_Tree_Ruleset( array(), array() );
+ }
+
+ public function permute( $arr ) {
+ if ( !$arr )
+ return array();
+
+ if ( count( $arr ) == 1 )
+ return $arr[0];
+
+ $result = array();
+ $rest = $this->permute( array_slice( $arr, 1 ) );
+ foreach ( $rest as $r ) {
+ foreach ( $arr[0] as $a ) {
+ $result[] = array_merge(
+ is_array( $a ) ? $a : array( $a ),
+ is_array( $r ) ? $r : array( $r )
+ );
+ }
+ }
+
+ return $result;
+ }
+
+ public function bubbleSelectors( $selectors ) {
+ if ( !$selectors ) return;
+
+ $this->rules = array( new Less_Tree_Ruleset( $selectors, array( $this->rules[0] ) ) );
+ }
+
+}