aboutsummaryrefslogtreecommitdiff
path: root/lib/less.php/Visitor/toCSS.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/less.php/Visitor/toCSS.php')
-rw-r--r--lib/less.php/Visitor/toCSS.php292
1 files changed, 0 insertions, 292 deletions
diff --git a/lib/less.php/Visitor/toCSS.php b/lib/less.php/Visitor/toCSS.php
deleted file mode 100644
index 8aaca96..0000000
--- a/lib/less.php/Visitor/toCSS.php
+++ /dev/null
@@ -1,292 +0,0 @@
-<?php
-
-/**
- * toCSS Visitor
- *
- * @package Less
- * @subpackage visitor
- */
-class Less_Visitor_toCSS extends Less_VisitorReplacing{
-
- private $charset;
-
- public function __construct(){
- parent::__construct();
- }
-
- /**
- * @param Less_Tree_Ruleset $root
- */
- public function run( $root ){
- return $this->visitObj($root);
- }
-
- public function visitRule( $ruleNode ){
- if( $ruleNode->variable ){
- return array();
- }
- return $ruleNode;
- }
-
- public function visitMixinDefinition($mixinNode){
- // mixin definitions do not get eval'd - this means they keep state
- // so we have to clear that state here so it isn't used if toCSS is called twice
- $mixinNode->frames = array();
- return array();
- }
-
- public function visitExtend(){
- return array();
- }
-
- public function visitComment( $commentNode ){
- if( $commentNode->isSilent() ){
- return array();
- }
- return $commentNode;
- }
-
- public function visitMedia( $mediaNode, &$visitDeeper ){
- $mediaNode->accept($this);
- $visitDeeper = false;
-
- if( !$mediaNode->rules ){
- return array();
- }
- return $mediaNode;
- }
-
- public function visitDirective( $directiveNode ){
- if( isset($directiveNode->currentFileInfo['reference']) && (!property_exists($directiveNode,'isReferenced') || !$directiveNode->isReferenced) ){
- return array();
- }
- if( $directiveNode->name === '@charset' ){
- // Only output the debug info together with subsequent @charset definitions
- // a comment (or @media statement) before the actual @charset directive would
- // be considered illegal css as it has to be on the first line
- if( isset($this->charset) && $this->charset ){
-
- //if( $directiveNode->debugInfo ){
- // $comment = new Less_Tree_Comment('/* ' . str_replace("\n",'',$directiveNode->toCSS())." */\n");
- // $comment->debugInfo = $directiveNode->debugInfo;
- // return $this->visit($comment);
- //}
-
-
- return array();
- }
- $this->charset = true;
- }
- return $directiveNode;
- }
-
- public function checkPropertiesInRoot( $rulesetNode ){
-
- if( !$rulesetNode->firstRoot ){
- return;
- }
-
- foreach($rulesetNode->rules as $ruleNode){
- if( $ruleNode instanceof Less_Tree_Rule && !$ruleNode->variable ){
- $msg = "properties must be inside selector blocks, they cannot be in the root. Index ".$ruleNode->index.($ruleNode->currentFileInfo ? (' Filename: '.$ruleNode->currentFileInfo['filename']) : null);
- throw new Less_Exception_Compiler($msg);
- }
- }
- }
-
-
- public function visitRuleset( $rulesetNode, &$visitDeeper ){
-
- $visitDeeper = false;
-
- $this->checkPropertiesInRoot( $rulesetNode );
-
- if( $rulesetNode->root ){
- return $this->visitRulesetRoot( $rulesetNode );
- }
-
- $rulesets = array();
- $rulesetNode->paths = $this->visitRulesetPaths($rulesetNode);
-
-
- // Compile rules and rulesets
- $nodeRuleCnt = $rulesetNode->rules?count($rulesetNode->rules):0;
- for( $i = 0; $i < $nodeRuleCnt; ){
- $rule = $rulesetNode->rules[$i];
-
- if( property_exists($rule,'rules') ){
- // visit because we are moving them out from being a child
- $rulesets[] = $this->visitObj($rule);
- array_splice($rulesetNode->rules,$i,1);
- $nodeRuleCnt--;
- continue;
- }
- $i++;
- }
-
-
- // accept the visitor to remove rules and refactor itself
- // then we can decide now whether we want it or not
- if( $nodeRuleCnt > 0 ){
- $rulesetNode->accept($this);
-
- if( $rulesetNode->rules ){
-
- if( count($rulesetNode->rules) > 1 ){
- $this->_mergeRules( $rulesetNode->rules );
- $this->_removeDuplicateRules( $rulesetNode->rules );
- }
-
- // now decide whether we keep the ruleset
- if( $rulesetNode->paths ){
- //array_unshift($rulesets, $rulesetNode);
- array_splice($rulesets,0,0,array($rulesetNode));
- }
- }
-
- }
-
-
- if( count($rulesets) === 1 ){
- return $rulesets[0];
- }
- return $rulesets;
- }
-
-
- /**
- * Helper function for visitiRuleset
- *
- * return array|Less_Tree_Ruleset
- */
- private function visitRulesetRoot( $rulesetNode ){
- $rulesetNode->accept( $this );
- if( $rulesetNode->firstRoot || $rulesetNode->rules ){
- return $rulesetNode;
- }
- return array();
- }
-
-
- /**
- * Helper function for visitRuleset()
- *
- * @return array
- */
- private function visitRulesetPaths($rulesetNode){
-
- $paths = array();
- foreach($rulesetNode->paths as $p){
- if( $p[0]->elements[0]->combinator === ' ' ){
- $p[0]->elements[0]->combinator = '';
- }
-
- foreach($p as $pi){
- if( $pi->getIsReferenced() && $pi->getIsOutput() ){
- $paths[] = $p;
- break;
- }
- }
- }
-
- return $paths;
- }
-
- protected function _removeDuplicateRules( &$rules ){
- // remove duplicates
- $ruleCache = array();
- for( $i = count($rules)-1; $i >= 0 ; $i-- ){
- $rule = $rules[$i];
- if( $rule instanceof Less_Tree_Rule || $rule instanceof Less_Tree_NameValue ){
-
- if( !isset($ruleCache[$rule->name]) ){
- $ruleCache[$rule->name] = $rule;
- }else{
- $ruleList =& $ruleCache[$rule->name];
-
- if( $ruleList instanceof Less_Tree_Rule || $ruleList instanceof Less_Tree_NameValue ){
- $ruleList = $ruleCache[$rule->name] = array( $ruleCache[$rule->name]->toCSS() );
- }
-
- $ruleCSS = $rule->toCSS();
- if( array_search($ruleCSS,$ruleList) !== false ){
- array_splice($rules,$i,1);
- }else{
- $ruleList[] = $ruleCSS;
- }
- }
- }
- }
- }
-
- protected function _mergeRules( &$rules ){
- $groups = array();
-
- //obj($rules);
-
- $rules_len = count($rules);
- for( $i = 0; $i < $rules_len; $i++ ){
- $rule = $rules[$i];
-
- if( ($rule instanceof Less_Tree_Rule) && $rule->merge ){
-
- $key = $rule->name;
- if( $rule->important ){
- $key .= ',!';
- }
-
- if( !isset($groups[$key]) ){
- $groups[$key] = array();
- }else{
- array_splice($rules, $i--, 1);
- $rules_len--;
- }
-
- $groups[$key][] = $rule;
- }
- }
-
-
- foreach($groups as $parts){
-
- if( count($parts) > 1 ){
- $rule = $parts[0];
- $spacedGroups = array();
- $lastSpacedGroup = array();
- $parts_mapped = array();
- foreach($parts as $p){
- if( $p->merge === '+' ){
- if( $lastSpacedGroup ){
- $spacedGroups[] = self::toExpression($lastSpacedGroup);
- }
- $lastSpacedGroup = array();
- }
- $lastSpacedGroup[] = $p;
- }
-
- $spacedGroups[] = self::toExpression($lastSpacedGroup);
- $rule->value = self::toValue($spacedGroups);
- }
- }
-
- }
-
- public static function toExpression($values){
- $mapped = array();
- foreach($values as $p){
- $mapped[] = $p->value;
- }
- return new Less_Tree_Expression( $mapped );
- }
-
- public static function toValue($values){
- //return new Less_Tree_Value($values); ??
-
- $mapped = array();
- foreach($values as $p){
- $mapped[] = $p;
- }
- return new Less_Tree_Value($mapped);
- }
-}
-