<?php /* SVN FILE: $Id: SassContext.php 118 2010-09-21 09:45:11Z chris.l.yates@gmail.com $ */ /**
* SassContext class file. * @author Chris Yates <chris.l.yates@gmail.com> * @copyright Copyright (c) 2010 PBM Web Development * @license http://phamlp.googlecode.com/files/license.txt * @package PHamlP * @subpackage Sass.tree */
/**
* SassContext class. * Defines the context that the parser is operating in and so allows variables * to be scoped. * A new context is created for Mixins and imported files. * @package PHamlP * @subpackage Sass.tree */
class SassContext {
/** * @var SassContext enclosing context */ protected $parent; /** * @var array mixins defined in this context */ protected $mixins = array(); /** * @var array variables defined in this context */ protected $variables = array(); /** * @var SassNode the node being processed */ public $node; /** * SassContext constructor. * @param SassContext - the enclosing context * @return SassContext */ public function __construct($parent = null) { $this->parent = $parent; } /** * Adds a mixin * @param string name of mixin * @return SassMixinDefinitionNode the mixin */ public function addMixin($name, $mixin) { $this->mixins[$name] = $mixin; return $this; } /** * Returns a mixin * @param string name of mixin to return * @return SassMixinDefinitionNode the mixin * @throws SassContextException if mixin not defined in this context */ public function getMixin($name) { if (isset($this->mixins[$name])) { return $this->mixins[$name]; } elseif (!empty($this->parent)) { return $this->parent->getMixin($name); } throw new SassContextException('Undefined {what}: {name}', array('{what}'=>'Mixin', '{name}'=>$name), $this->node); } /** * Returns a variable defined in this context * @param string name of variable to return * @return string the variable * @throws SassContextException if variable not defined in this context */ public function getVariable($name) { if (isset($this->variables[$name])) { return $this->variables[$name]; } elseif (!empty($this->parent)) { return $this->parent->getVariable($name); } else { throw new SassContextException('Undefined {what}: {name}', array('{what}'=>'Variable', '{name}'=>$name), $this->node); } } /** * Returns a value indicating if the variable exists in this context * @param string name of variable to test * @return boolean true if the variable exists in this context, false if not */ public function hasVariable($name) { return isset($this->variables[$name]); } /** * Sets a variable to the given value * @param string name of variable * @param sassLiteral value of variable */ public function setVariable($name, $value) { $this->variables[$name] = $value; return $this; } /** * Makes variables and mixins from this context available in the parent context. * Note that if there are variables or mixins with the same name in the two * contexts they will be set to that defined in this context. */ public function merge() { $this->parent->variables = array_merge($this->parent->variables, $this->variables); $this->parent->mixins = array_merge($this->parent->mixins, $this->mixins); }
}