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

Title Deprecated Summary
CSSCompression_Format CSS Compressor [VERSION] [DATE] Corey Hart @ http://www.codenothing.com