You are here

Control.inc in Advanced CSS/JS Aggregation 7

Same filename and directory in other branches
  1. 6 advagg_css_compress/css-compressor-3.x/src/lib/Control.inc

File

advagg_css_compress/css-compressor-3.x/src/lib/Control.inc
View source
<?php

/**
 * CSS Compressor [VERSION]
 * [DATE]
 * Corey Hart @ http://www.codenothing.com
 */
class CSSCompression_Control {

  /**
   * Control Patterns
   *
   * @param (string) css: Holds compressed css string
   * @param (string) mode: Current compression mode state
   * @param (array) stats: Holds compression stats
   * @param (array) getters: Array of accessible getters
   */
  public $css = '';
  public $mode = '';
  public $stats = array();
  private $getters = array(
    'css',
    'mode',
    'stats',
  );

  /**
   * Subclasses that do the ground work for this compressor
   *
   * @class CSSCompression: Public facing compression class
   * @class Option: Option handling
   * @class Trim: Does the initial trimming for the css
   * @class Format: Formats the output
   * @class Numeric: Handles numeric compression
   * @class Color: Handles color compression
   * @class Individuals: Runs compression algorithms on individual properties and values
   * @class Selectors: Runs selector specific compressions
   * @class Combine: Handles combining of various properties
   * @class Organize: Reorganizes the sheet for futher compression
   * @class Cleanup: Cleans out all injected characters during compression
   * @class Compress: Central compression unit.
   * @param (array) subclasses: Array holding all the subclasses for inlusion
   */
  public $CSSCompression;
  public $Option;
  public $Trim;
  public $Format;
  public $Numeric;
  public $Color;
  public $Individuals;
  public $Selectors;
  public $Combine;
  public $Organize;
  public $Cleanup;
  public $Setup;
  public $Compress;
  private $subclasses = array(
    'Option',
    'Trim',
    'Format',
    'Numeric',
    'Color',
    'Individuals',
    'Selectors',
    'Combine',
    'Organize',
    'Cleanup',
    'Setup',
    'Compress',
  );

  /**
   * Pull in the Compression instance and build the subclasses
   *
   * @param (class) CSSCompression: CSSCompression Instance
   */
  public function __construct(CSSCompression $CSSCompression) {
    $this->CSSCompression = $CSSCompression;

    // Load all subclasses on demand
    if (!class_exists("CSSCompression_Option", false)) {
      $path = dirname(__FILE__) . '/';
      foreach ($this->subclasses as $class) {
        require DRUPAL_ROOT . '/' . $path . $class . '.inc';
      }
    }

    // Initialize each subclass
    foreach ($this->subclasses as $class) {
      $full = "CSSCompression_{$class}";
      $this->{$class} = new $full($this);
    }
  }

  /**
   * Control access to properties
   *
   *	- Getting stats/mode/css returns the current value of that property
   *	- Getting options will return the current full options array
   *	- Getting anything else returns that current value in the options array or NULL
   *
   * @param (string) name: Name of property that you want to access
   */
  public function get($name) {
    if (in_array($name, $this->getters)) {
      return $this->{$name};
    }
    else {
      if ($name == 'options') {
        return $this->Option->options;
      }
      else {
        return $this->Option
          ->option($name);
      }
    }
  }

  /**
   * The setter method only allows access to setting values in the options array
   *
   * @param (string) name: Key name of the option you want to set
   * @param (mixed) value: Value of the option you want to set
   */
  public function set($name, $value) {

    // Allow for passing array of options to merge into current ones
    if ($name === 'options' && is_array($value)) {
      return $this->Option
        ->merge($value);
    }
    else {
      if (isset(CSSCompression::$defaults[$name])) {
        return $this->Option
          ->option($name, $value);
      }
      else {
        throw new CSSCompression_Exception("Invalid Private Access to {$name} in CSSCompression.");
      }
    }
  }

  /**
   * Merges a predefined set options
   *
   * @param (string) mode: Name of mode to use.
   */
  public function mode($mode = NULL) {
    return $this->Options
      ->merge($mode);
  }

  /**
   * Resets options to their defaults, and flushes out variables
   *
   * @params none
   */
  public function reset() {
    $this->Option
      ->reset();
    return $this
      ->flush();
  }

  /**
   * Cleans out class variables for next run
   *
   * @params none
   */
  public function flush() {
    $this->css = '';
    $this->stats = array(
      'before' => array(
        'props' => 0,
        'selectors' => 0,
        'size' => 0,
        'time' => 0,
      ),
      'after' => array(
        'props' => 0,
        'selectors' => 0,
        'size' => 0,
        'time' => 0,
      ),
    );
    return true;
  }

  /**
   * Proxy to run Compression on the sheet passed. Handle options here.
   *
   * @param (string) css: Stylesheet to be compressed
   * @param (mixed) options: Array of options or mode to use.
   */
  public function compress($css = NULL, $options = NULL) {

    // Flush out old stats and variables
    $this
      ->flush();

    // If no additional options, just run compression
    if ($options === NULL) {
      return $this->css = $this->Compress
        ->compress($css);
    }

    // Store old params
    $old = $this->mode == '__custom' ? $this->Option
      ->option() : $this->mode;
    $readability = $this->Option
      ->option('readability');

    // Compress with new set of options
    $this->Option
      ->merge($options);
    $css = $this->Compress
      ->compress($css);

    // Reset original options
    $this
      ->reset();
    $this->Option
      ->merge($old);

    // Return the compressed css
    return $this->css = $css;
  }

  /**
   * Backdoor access to subclasses
   * ONLY FOR DEVELOPMENT/TESTING.
   *
   * @param (string) class: Name of the focus class
   * @param (array) config: Contains name reference and test arguments
   */
  public function access($class, $method, $args) {
    if ($class == 'Control') {
      return call_user_func_array(array(
        $class,
        $method,
      ), $args);
    }
    else {
      if (strpos($class, '.') !== false) {
        $parts = explode('.', $class);
        $class = $parts[0];
        $subclass = $parts[1];
        return $this->{$class}
          ->access($subclass, $method, $args);
      }
      else {
        if (in_array($class, $this->subclasses)) {
          return $this->{$class}
            ->access($method, $args);
        }
        else {
          throw new CSSCompression_Exception("Unknown Class Access - " . $class);
        }
      }
    }
  }

}

Classes

Namesort descending Description
CSSCompression_Control CSS Compressor [VERSION] [DATE] Corey Hart @ http://www.codenothing.com