You are here

selectors.php in Sassy 7

File

phamlp/sass/extensions/compass/functions/selectors.php
View source
<?php

/* SVN FILE: $Id: SassBoolean.php 49 2010-04-04 10:51:24Z chris.l.yates $ */

/**
 * Compass extension SassScript selectors functions 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.extensions.compass.functions
 */

/**
 * Compass extension SassScript selectors functions class.
 * A collection of functions for use in SassSCript.
 * @package			PHamlP
 * @subpackage	Sass.extensions.compass.functions
 */
class SassExtentionsCompassFunctionsSelectors {
  const COMMA_SEPARATOR = '/\\s*,\\s*/';
  private static $defaultDisplay = array(
    'block' => array(
      'address',
      'blockquote',
      'center',
      'dir',
      'div',
      'dd',
      'dl',
      'dt',
      'fieldset',
      'form',
      'frameset h1',
      'h2',
      'h3',
      'h4',
      'h5',
      'h6',
      'hr',
      'isindex',
      'menu',
      'noframes',
      'noscript',
      'ol',
      'p',
      'pre',
      'ul',
    ),
    'inline' => array(
      'a',
      'abbr',
      'acronym',
      'b',
      'basefont',
      'bdo',
      'big',
      'br',
      'cite',
      'code',
      'dfn',
      'em',
      'font',
      'i',
      'img',
      'input',
      'kbd',
      'label',
      'q',
      's',
      'samp',
      'select',
      'small',
      'span',
      'strike',
      'strong',
      'sub',
      'sup',
      'textarea',
      'tt',
      'u',
      'var',
    ),
    'table' => array(
      'table',
    ),
    'list-item' => array(
      'li',
    ),
    'table-row-group' => array(
      'tbody',
    ),
    'table-header-group' => array(
      'thead',
    ),
    'table-footer-group' => array(
      'tfoot',
    ),
    'table-row' => array(
      'tr',
    ),
    'table-cell' => array(
      'th',
      'td',
    ),
  );

  # Permute multiple selectors each of which may be comma delimited, the end result is

  # a new selector that is the equivalent of nesting each under the previous selector.

  # To illustrate, the following mixins are equivalent:

  # =mixin-a($selector1, $selector2, $selector3)

  #	 #{$selector1}

  #		 #{$selector2}

  #			 #{$selector3}

  #				 width: 2px

  # =mixin-b($selector1, $selector2, $selector3)

  #	 #{nest($selector, $selector2, $selector3)}

  #		 width: 2px
  public static function nest() {
    if (func_num_args() < 2) {
      throw new SassScriptFunctionException('nest() requires two or more arguments', array(), SassScriptParser::$context->node);
    }
    $args = func_get_args();
    $arg = array_shift($args);
    $ancestors = preg_split(self::COMMA_SEPARATOR, $arg->value);
    foreach ($args as $arg) {
      $nested = array();
      foreach (preg_split(self::COMMA_SEPARATOR, $arg->value) as $descenant) {
        foreach ($ancestors as $ancestor) {
          $nested[] = "{$ancestor} {$descenant}";
        }
      }
      $ancestors = $nested;
    }
    sort($nested);
    return new SassString(join(', ', $nested));
  }

  # Permute two selectors, the first may be comma delimited.

  # The end result is a new selector that is the equivalent of nesting the second

  # selector under the first one in a sass file and preceding it with an &.

  # To illustrate, the following mixins are equivalent:

  # =mixin-a($selector, $to_append)

  #	 #{$selector}

  #		 &#{$to_append}

  #			 width: 2px

  # =mixin-b($selector, $to_append)

  #	 #{append_selector($selector, $to_append)}

  #		 width: 2px
  public static function append_selector($selector, $to_append) {
    $appended = array();
    foreach (preg_split(self::COMMA_SEPARATOR, $selector->value) as $ancestor) {
      foreach (preg_split(self::COMMA_SEPARATOR, $to_append->value) as $descendant) {
        $appended[] = $ancestor . $descendant;
      }
    }
    return new SassString(join(', ', $appended));
  }

  # Return the header selectors for the levels indicated

  # Defaults to all headers h1 through h6

  # For example:

  # headers(all) => h1, h2, h3, h4, h5, h6

  # headers(4) => h1, h2, h3, h4

  # headers(2,4) => h2, h3, h4
  public static function headers($from = null, $to = null) {
    if (!$from || $from instanceof SassString && $from->value === "all") {
      $from = new SassNumber(1);
      $to = new SassNumber(6);
    }
    elseif ($from && !$to) {
      $to = $from;
      $from = new SassNumber(1);
    }
    return new SassString('h' . join(', h', range($from->value, $to->value)));
  }
  public static function headings($from = null, $to = null) {
    return self::headers($from, $to);
  }

  # Return an enumerated set of comma separated selectors.

  # For example

  # enumerate('foo', 1, 4) => foo-1, foo-2, foo-3, foo-4
  public static function enumerate($prefix, $from, $to, $separator = null) {
    $_prefix = $prefix->value . (!$separator ? '-' : $separator->value);
    return new SassString($_prefix . join(', ' . $_prefix, range($from->value, $to->value)));
  }

  # returns a comma delimited string for all the

  # elements according to their default css3 display value.
  public static function elements_of_type($display) {
    return new SassString(join(', ', self::$defaultDisplay[$display->value]));
  }

}

Classes

Namesort descending Description
SassExtentionsCompassFunctionsSelectors Compass extension SassScript selectors functions class. A collection of functions for use in SassSCript. @package PHamlP @subpackage Sass.extensions.compass.functions