<?php /* SVN FILE: $Id: SassMixinDefinitionNode.php 118 2010-09-21 09:45:11Z chris.l.yates@gmail.com $ */ /**
* SassMixinDefinitionNode 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 */
/**
* SassMixinDefinitionNode class. * Represents a Mixin definition. * @package PHamlP * @subpackage Sass.tree */
class SassMixinDefinitionNode extends SassNode {
const NODE_IDENTIFIER = '='; const MATCH = '/^(=|@mixin\s+)([-\w]+)\s*(?:\((.+?)\))?\s*$/i'; const IDENTIFIER = 1; const NAME = 2; const ARGUMENTS = 3; /** * @var string name of the mixin */ private $name; /** * @var array arguments for the mixin as name=>value pairs were value is the * default value or null for required arguments */ private $args = array(); /** * SassMixinDefinitionNode constructor. * @param object source token * @return SassMixinDefinitionNode */ public function __construct($token) { if ($token->level !== 0) { throw new SassMixinDefinitionNodeException('Mixins can only be defined at root level', array(), $this); } parent::__construct($token); preg_match(self::MATCH, $token->source, $matches); if (empty($matches)) { throw new SassMixinDefinitionNodeException('Invalid {what}', array('{what}'=>'Mixin'), $this); } $this->name = $matches[self::NAME]; if (isset($matches[self::ARGUMENTS])) { foreach (explode(',', $matches[self::ARGUMENTS]) as $arg) { $arg = explode( ($matches[self::IDENTIFIER] === self::NODE_IDENTIFIER ? '=' : ':'), trim($arg) ); $this->args[substr(trim($arg[0]), 1)] = (count($arg) == 2 ? trim($arg[1]) : null); } // foreach } } /** * Parse this node. * Add this mixin to the current context. * @param SassContext the context in which this node is parsed * @return array the parsed node - an empty array */ public function parse($context) { $context->addMixin($this->name, $this); return array(); } /** * Returns the arguments with default values for this mixin * @return array the arguments with default values for this mixin */ public function getArgs() { return $this->args; } /** * Returns a value indicating if the token represents this type of node. * @param object token * @return boolean true if the token represents this type of node, false if not */ public static function isa($token) { return $token->source[0] === self::NODE_IDENTIFIER; }
}