* @copyright Copyright (c) 2010 PBM Web Development * @license http://phamlp.googlecode.com/files/license.txt * @package PHamlP * @subpackage Sass.tree */ require_once(dirname(__FILE__).'/../script/SassScriptParser.php'); require_once(dirname(__FILE__).'/../renderers/SassRenderer.php'); /** * SassRootNode class. * Also the root node of a document. * @package PHamlP * @subpackage Sass.tree */ class SassRootNode extends SassNode { /** * @var SassScriptParser SassScript parser */ public $script; /** * @var SassRenderer the renderer for this node */ public $renderer; /** * @var SassParser */ public $parser; /** * @var array extenders for this tree in the form extendee=>extender */ public $extenders = array(); /** * Extend_parent - for resolving extends across imported files. */ public $extend_parent = null; /** * Root SassNode constructor. * @param SassParser Sass parser * @return SassNode */ public function __construct($parser) { parent::__construct((object) array( 'source' => '', 'level' => -1, 'filename' => $parser->filename, 'line' => 0, )); $this->parser = $parser; $this->script = new SassScriptParser(); $this->renderer = SassRenderer::getRenderer($parser->style); $this->root = $this; } /** * Parses this node and its children into the render tree. * Dynamic nodes are evaluated, files imported, etc. * Only static nodes for rendering are in the resulting tree. * @param SassContext the context in which this node is parsed * @return SassNode root node of the render tree */ public function parse($context) { $node = clone $this; $node->children = $this->parseChildren($context); return $node; } /** * Render this node. * @return string the rendered node */ public function render($context = null) { $context = new SassContext($context); $node = $this->parse($context); $output = ''; foreach ($node->children as $child) { $output .= $child->render(); } // foreach return $output; } public function extend($extendee, $selectors) { if ($this->extend_parent && method_exists($this->extend_parent, 'extend')) { return $this->extend_parent->extend($extendee, $selectors); } $this->extenders[$extendee] = (isset($this->extenders[$extendee]) ? array_merge($this->extenders[$extendee], $selectors) : $selectors); } public function getExtenders() { if ($this->extend_parent && method_exists($this->extend_parent, 'getExtenders')) { return $this->extend_parent->getExtenders(); } return $this->extenders; } /** * Returns a value indicating if the line represents this type of node. * Child classes must override this method. * @throws SassNodeException if not overriden */ public static function isa($line) { throw new SassNodeException('Child classes must override this method'); } }