<?php /* SVN FILE: $Id: SassString.php 118 2010-09-21 09:45:11Z chris.l.yates@gmail.com $ */ /**

* SassString 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.script.literals
*/

require_once('SassLiteral.php');

/**

* SassString class.
* Provides operations and type testing for Sass strings.
* @package                     PHamlP
* @subpackage  Sass.script.literals
*/

class SassString extends SassLiteral {

const MATCH = '/^(((["\'])(.*)(\3))|(-[a-zA-Z][^\s]*))/i';
const _MATCH = '/^(["\'])(.*?)(\1)?$/'; // Used to match strings such as "Times New Roman",serif
const VALUE = 2;
const QUOTE = 3;

/**
 * @var string string quote type; double or single quotes, or unquoted.
 */
private $quote; 

      /**
       * class constructor
       * @param string string
       * @return SassString
       */
      public function __construct($value) {
              preg_match(self::_MATCH, $value, $matches);
              if ((isset($matches[self::QUOTE]))) {
                      $this->quote =  $matches[self::QUOTE];
                      $this->value = $matches[self::VALUE];                   
              }
              else {
                      $this->quote =  '';
                      $this->value = $value;                  
              }
      }

      /**
       * String addition.
       * Concatenates this and other.
       * The resulting string will be quoted in the same way as this.
       * @param sassString string to add to this
       * @return sassString the string result
       */
      public function op_plus($other) {
              if (!($other instanceof SassString)) {
                      throw new SassStringException('{what} must be a {type}', array('{what}'=>Phamlp::t('sass', 'Value'), '{type}'=>Phamlp::t('sass', 'string')), SassScriptParser::$context->node);
              }
              $this->value .= $other->value;
              return $this;
      }

      /**
       * String multiplication.
       * this is repeated other times
       * @param sassNumber the number of times to repeat this
       * @return sassString the string result
       */
      public function op_times($other) {
              if (!($other instanceof SassNumber) || !$other->isUnitless()) {
                      throw new SassStringException('{what} must be a {type}', array('{what}'=>Phamlp::t('sass', 'Value'), '{type}'=>Phamlp::t('sass', 'unitless number')), SassScriptParser::$context->node);
              }
              $this->value = str_repeat($this->value, $other->value);
              return $this;
      }

      /**
       * Returns the value of this string.
       * @return string the string
       */
      public function getValue() {
              return $this->value;
      }

      /**
       * Returns a string representation of the value.
       * @return string string representation of the value.
       */
      public function toString() {
              return $this->quote.$this->value.$this->quote;
      }

      public function toVar() {
              return SassScriptParser::$context->getVariable($this->value);
      }

      /**
       * Returns a value indicating if a token of this type can be matched at
       * the start of the subject string.
       * @param string the subject string
       * @return mixed match at the start of the string or false if no match
       */
      public static function isa($subject) {
              return (preg_match(self::MATCH, $subject, $matches) ? $matches[0] : false);
      }

}