Classes

File io/optimization/CSSFileOptimizer.class.php

File io/optimization/CSSFileOptimizer.class.php

  1:   2:   3:   4:   5:   6:   7:   8:   9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:  33:  34:  35:  36:  37:  38:  39:  40:  41:  42:  43:  44:  45:  46:  47:  48:  49:  50:  51:  52:  53:  54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68:  69:  70:  71:  72:  73:  74:  75:  76:  77:  78:  79:  80:  81:  82:  83:  84:  85:  86:  87:  88:  89:  90:  91:  92:  93:  94:  95:  96:  97:  98:  99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 
<?php
/**
 * @package     IO
 * @subpackage  Optimization
 * @copyright   &copy; 2005-2019 PHPBoost
 * @license     https://www.gnu.org/licenses/gpl-3.0.html GNU/GPL-3.0
 * @author      Kevin MASSY <reidlos@phpboost.com>
 * @version     PHPBoost 5.2 - last update: 2018 06 14
 * @since       PHPBoost 3.0 - 2011 03 29
 * @contributor Julien BRISWALTER <j1.seth@phpboost.com>
 * @contributor mipel <mipel@phpboost.com>
*/

class CSSFileOptimizer
{
    protected $files = array();
    protected $scripts = array();
    protected $content = '';
    protected $regex_search_files_path = '';
    protected $replace_value_files_path = '';

    /**
     * Const Delete comments, tabulations, spaces and newline
    */
    const HIGH_OPTIMIZATION = 'high';

    /**
     * Const Delete comments, tabulations and spaces
    */
    const LOW_OPTIMIZATION = 'low';

    public function __construct()
    {
        $this->regex_search_files_path = "`url\([\'\"]?([^';}\)\'\"]+)[\'\"]?\)`u";
        $this->replace_value_files_path = 'url(":path/'. str_replace('"', '', '$1') .'")';
    }

    /**
     * This class allows you to add file to optimize. Required path file
     */
    public function add_file($path_file)
    {
        $this->files[] = $path_file;
    }

    /**
     * This class allows you to add script to optimize. Required script value
     */
    public function add_script($script)
    {
        if (!empty($script))
        {
            $this->scripts[] = $script;
        }
    }

    /**
     * This class optimize your code. Parameter $intensity serves to configuration highlest
     */
    public function optimize($intensity = self::HIGH_OPTIMIZATION)
    {
        $this->assemble_files();

        $content = '';
        if ($intensity == self::LOW_OPTIMIZATION)
        {
            $cleared_file_content = $this->delete_comments($this->content);
            $content = str_replace(array("\t", "  "), '', $cleared_file_content);
        }
        else
        {
            $cleared_file_content = $this->delete_comments($this->content);
            $content = str_replace(array("\r\n", "\n", "\r", "\t", "  "), ' ', $cleared_file_content);
            $content = str_replace(array("( ", " )", ", "), array("(", ")", ","), $content);
            $content = preg_replace(array('`\s*{\s*`', '`\s*}\s*`u', '`\s*:\s*`', '`\s*;\s*`u'), array('{', '}', ':', ';'), $content);
        }

        $this->content = trim($content);
    }

    public function export()
    {
        return $this->content;
    }

    /**
     * Exports optimized content to a file.
     */
    public function export_to_file($location)
    {
        if (!empty($this->files) || !empty($this->scripts))
        {
            $file = new File($location);
            $file->delete();
            $file->open(File::WRITE);
            $file->lock();
            $file->write($this->content);
            $file->unlock();
            $file->close();
            $file->change_chmod(0666);
        }
    }

    /**
     * This class return Array files
     */
    public function get_files()
    {
        return $this->files;
    }

    /**
     * This class return Array scripts
     */
    public function get_scripts()
    {
        return $this->scripts;
    }

    private function delete_comments($value)
    {
        $value = preg_replace('<!\-\- [\/\ a-zA-Z]* \-\->u', '', $value);
        $value = preg_replace('#/\*.*?\*/#su', '', $value);
        return $value;
    }

    private function assemble_files()
    {
        $content = '';
        foreach ($this->files as $file)
        {
            $content_file = php_strip_whitespace($file);
            if (!empty($this->regex_search_files_path) && !empty($this->replace_value_files_path))
            {
                $replace_path = StringVars::replace_vars($this->replace_value_files_path, array('path' => GeneralConfig::load()->get_site_path() . '/' . Path::get_package($file)));
                $content .= preg_replace($this->regex_search_files_path, $replace_path, $content_file);
            }
            else
            {
                $content .= $content_file;
            }
        }

        foreach ($this->scripts as $script)
        {
            $content .= $script;
        }

        $this->content = $content;
    }
}
?>