You are here

Format.inc in Advanced CSS/JS Aggregation 6

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

File

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

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

  /**
   * Format Patterns
   *
   * @class Control: Compression Controller
   * @param (string) token: Copy of the injection token
   * @param (array) options: Reference to options
   * @param (regex) rsemicolon: Checks for semicolon without an escape '\' character before it
   * @param (regex) rcolon: Checks for colon without an escape '\' character before it
   * @param (array) readability: Mapping to readability functions
   */
  private $Control;
  private $token = '';
  private $options = array();
  private $rsemicolon = "/(?<!\\\\);/";
  private $rcolon = "/(?<!\\\\):/";
  private $readability = array(
    CSSCompression::READ_MAX => 'maximum',
    CSSCompression::READ_MED => 'medium',
    CSSCompression::READ_MIN => 'minimum',
    CSSCompression::READ_NONE => 'none',
  );

  /**
   * Stash a reference to the controller on each instantiation
   *
   * @param (class) control: CSSCompression Controller
   */
  public function __construct(CSSCompression_Control $control) {
    $this->Control = $control;
    $this->token = CSSCompression::TOKEN;
    $this->options =& $control->Option->options;
  }

  /**
   * Reformats compressed CSS into specified format
   *
   * @param (int) readability: Readability level of compressed output
   * @param (array) selectors: Array of selectors
   * @param (array) details: Array of declarations
   */
  public function readability($readability = CSSCompression::READ_NONE, $selectors = array(), $details = array()) {
    if (isset($this->readability[$readability])) {
      $fn = $this->readability[$readability];
      return trim($this
        ->{$fn}($selectors, $details));
    }
    else {
      return 'Invalid Readability Value';
    }
  }

  /**
   * Returns maxium readability, breaking on every selector, brace, and property
   *
   * @param (array) selectors: Array of selectors
   * @param (array) details: Array of declarations
   */
  private function maximum($selectors, $details) {
    $css = '';
    foreach ($selectors as $k => $v) {
      if (strpos($v, $this->token) === 0) {
        $css .= substr($v, strlen($this->token));
        $css .= $details[$k];
        continue;
      }
      else {
        if (!$details[$k] || trim($details[$k]) == '') {
          continue;
        }
      }
      $v = str_replace('>', ' > ', $v);
      $v = str_replace('+', ' + ', $v);
      $v = str_replace(',', ', ', $v);
      $css .= "{$v} {\n";
      $arr = preg_split($this->rsemicolon, $details[$k]);
      foreach ($arr as $item) {
        if (!$item) {
          continue;
        }
        list($prop, $val) = preg_split($this->rcolon, $item, 2);
        $css .= "\t{$prop}: {$val};\n";
      }

      // Kill that last semicolon at users request
      if ($this->options['unnecessary-semicolons']) {
        $css = preg_replace("/;\n\$/", "\n", $css);
      }
      $css .= "}\n\n";
    }
    return $css;
  }

  /**
   * Returns medium readability, putting selectors and rule sets on new lines
   *
   * @param (array) selectors: Array of selectors
   * @param (array) details: Array of declarations
   */
  private function medium($selectors, $details) {
    $css = '';
    foreach ($selectors as $k => $v) {
      if (strpos($v, $this->token) === 0) {
        $css .= substr($v, strlen($this->token));
        $css .= $details[$k];
        continue;
      }
      else {
        if ($details[$k] && $details[$k] != '') {
          $css .= "{$v} {\n\t" . $details[$k] . "\n}\n";
        }
      }
    }
    return $css;
  }

  /**
   * Returns minimum readability, breaking after every selector and it's rule set
   *
   * @param (array) selectors: Array of selectors
   * @param (array) details: Array of declarations
   */
  private function minimum($selectors, $details) {
    $css = '';
    foreach ($selectors as $k => $v) {
      if (strpos($v, $this->token) === 0) {
        $css .= substr($v, strlen($this->token));
        $css .= $details[$k];
        continue;
      }
      else {
        if ($details[$k] && $details[$k] != '') {
          $css .= "{$v}{" . $details[$k] . "}\n";
        }
      }
    }
    return $css;
  }

  /**
   * Returns an unreadable, but fully compressed script
   *
   * @param (array) selectors: Array of selectors
   * @param (array) details: Array of declarations
   */
  private function none($selectors, $details) {
    $css = '';
    foreach ($selectors as $k => $v) {
      if (strpos($v, $this->token) === 0) {
        $css .= substr($v, strlen($this->token));
        $css .= $details[$k];
        continue;
      }
      else {
        if ($details[$k] && $details[$k] != '') {
          $css .= trim("{$v}{" . $details[$k] . "}");
        }
      }
    }
    return $css;
  }

  /**
   * Access to private methods for testing
   *
   * @param (string) method: Method to be called
   * @param (array) args: Array of paramters to be passed in
   */
  public function access($method, $args) {
    if (method_exists($this, $method)) {
      return call_user_func_array(array(
        $this,
        $method,
      ), $args);
    }
    else {
      throw new CSSCompression_Exception("Unknown method in Format Class - " . $method);
    }
  }

}

Classes

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