Files
2024-10-28 22:14:22 +01:00

374 lines
14 KiB
PHP

<?php
/**
* 2017 Keshva Thakur
* @author Keshva Thakur
* @copyright Keshva Thakur
* @license https://www.prestashop.com/en/osl-license
* @version 1.1.2
*/
if (!defined('_PS_VERSION_'))
exit;
class MINIFYCODE extends Module {
public function __construct() {
$this->name = 'minifycode';
$this->description = 'Minify HTML CSS JS';
$this->tab = 'front_office_features';
$this->version = '2.1.2';
$this->author = 'Keshva Thakur';
$this->need_instance = 0;
$this->ps_versions_compliancy = array('min' => '1.5', 'max' => _PS_VERSION_);
$this->bootstrap = true;
$this->module_key = '600c149930fb6d0da957b6c9bc6fb288';
$this->author_address = '0xD04CFFC02eCb7ea7Aa8D92c47607fD79f2C5c901';
$this->_html = '';
$this->unique_string = '';
$this->valid = '';
$this->simple_content_files_location = $this->_path . 'views/';
$this->ignore_changes_content_changes = false;
parent::__construct();
$this->displayName = $this->l('Minify HTML CSS JS');
$this->description = $this->l('Minify HTML CSS JS is a very small and efficient module');
$this->confirmUninstall = $this->l('Are you sure you want to uninstall?');
if (Configuration::get('html_minify_ps')) {
if (!function_exists('smartyMinifyHTMLCustomCode')) {
$this->context->smarty->registerFilter(
'output', __CLASS__ . '::smartyMinifyHTMLCustomCode'
);
}
}
if (Configuration::get('js_minify_ps')) {
if (!function_exists('smartyPackJSinHTMLCustom')) {
$this->context->smarty->registerFilter(
'output', __CLASS__ . '::smartyPackJSinHTMLCustom'
);
}
}
}
public static function smartyMinifyHTMLCustomCode($tpl_output, Smarty_Internal_Template $template) {
$context = Context::getContext();
if (isset($context->controller) && in_array($context->controller->php_self, array('pdf-invoice', 'pdf-order-return', 'pdf-order-slip'))) {
return $tpl_output;
}
$class = new MINIFYCODE();
$tpl_output = $class->minifyHTML($tpl_output);
return $tpl_output;
}
public static function smartyPackJSinHTMLCustom($tpl_output, Smarty_Internal_Template $template) {
$context = Context::getContext();
if (isset($context->controller) && in_array($context->controller->php_self, array('pdf-invoice', 'pdf-order-return', 'pdf-order-slip'))) {
return $tpl_output;
}
$class = new MINIFYCODE();
$tpl_output = $class->minifyJS($tpl_output);
return $tpl_output;
}
public function minifyHTML($html_content) {
if (strlen($html_content) > 0) {
require_once('views/templates/tools/minify_html/minify_html.class.php');
$html_content = str_replace(chr(194) . chr(160), '&nbsp;', $html_content);
if (trim($minified_content = Minify_HTML::minify($html_content, array('cssMinifier', 'jsMinifier'))) != '') {
$html_content = $minified_content;
}
return $html_content;
}
return false;
}
public function minifyJS($tpl_output) {
$context = Context::getContext();
if (isset($context->controller) && in_array($context->controller->php_self, array('pdf-invoice', 'pdf-order-return', 'pdf-order-slip'))) {
return $tpl_output;
}
$class = new MINIFYCODE();
$tpl_output = $class->packJSinHTML($tpl_output);
return $tpl_output;
}
public static $pattern_js = '/(<\s*script(?:\s+[^>]*(?:javascript|src)[^>]*)?\s*>)(.*)(<\s*\/script\s*[^>]*>)/Uims';
protected static $pattern_keepinline = 'data-keepinline';
public static function packJSinHTML($html_content) {
if (strlen($html_content) > 0) {
$html_content_copy = $html_content;
$class = new MINIFYCODE();
if (!preg_match('/' . MINIFYCODE::$pattern_keepinline . '/', $html_content)) {
$html_content = preg_replace_callback(
MINIFYCODE::$pattern_js, array('MINIFYCODE', 'packJSinHTMLpregCallback'), $html_content, $class->getBackTrackLimit());
// If the string is too big preg_replace return an error
// In this case, we don't compress the content
if (function_exists('preg_last_error') && preg_last_error() == PREG_BACKTRACK_LIMIT_ERROR) {
if (_PS_MODE_DEV_) {
Tools::error_log('ERROR: PREG_BACKTRACK_LIMIT_ERROR in function packJSinHTML');
}
return $html_content_copy;
}
}
return $html_content;
}
return false;
}
public static function getBackTrackLimit() {
static $limit = null;
if ($limit === null) {
$limit = @ini_get('pcre.backtrack_limit');
if (!$limit) {
$limit = -1;
}
}
return $limit;
}
public static function packJSinHTMLpregCallback($preg_matches) {
if (!(trim($preg_matches[2]))) {
return $preg_matches[0];
}
$preg_matches[1] = $preg_matches[1] . '/* <![CDATA[ */';
$class = new MINIFYCODE();
$preg_matches[2] = $class->packJS($preg_matches[2]);
$preg_matches[count($preg_matches) - 1] = '/* ]]> */' . $preg_matches[count($preg_matches) - 1];
unset($preg_matches[0]);
$output = implode('', $preg_matches);
return $output;
}
public static function packJS($js_content) {
if (!empty($js_content)) {
require_once('views/templates/tools/js_minify/jsmin.php');
try {
$js_content = JSMin::minify($js_content);
} catch (Exception $e) {
if (_PS_MODE_DEV_) {
echo $e->getMessage();
}
return ';' . trim($js_content, ';') . ';';
}
}
return ';' . trim($js_content, ';') . ';';
}
public function install() {
if (Shop::isFeatureActive()) {
Shop::setContext(Shop::CONTEXT_ALL);
}
if (!parent::install() || !$this->registerHook('header') || !$this->EnableHTMLCompress()) {
Configuration::updateValue('html_minify_ps', 0);
Configuration::updateValue('js_minify_ps', 0);
return false;
}
return true;
}
public function uninstall() {
if (!parent::uninstall() || !$this->DisableHTMLCompress()) {
Configuration::deleteByName('html_minify_ps');
Configuration::deleteByName('js_minify_ps');
return false;
}
return true;
}
public function customCopy($source, $dest, $options = array('folderPermission' => '0755', 'filePermission' => '0644')) {
$result = false;
if (is_file($source)) {
if ($dest[strlen($dest) - 1] == '/') {
if (!file_exists($dest)) {
cmfcDirectory::makeAll($dest, $options['folderPermission'], true);
}
$__dest = $dest . "/" . basename($source);
} else {
$__dest = $dest;
}
$result = copy($source, $__dest);
@chmod($__dest, $options['filePermission']);
} elseif (is_dir($source)) {
if ($dest[strlen($dest) - 1] == '/') {
if ($source[strlen($source) - 1] == '/') {
//Copy only contents
} else {
//Change parent itself and its contents
$dest = $dest . basename($source);
if (!file_exists($dest))
mkdir($dest);
@chmod($dest, $options['filePermission']);
}
} else {
if ($source[strlen($source) - 1] == '/') {
//Copy parent directory with new name and all its content
if (!file_exists($dest))
mkdir($dest, $options['folderPermission']);
@chmod($dest, $options['filePermission']);
} else {
//Copy parent directory with new name and all its content
if (!file_exists($dest))
mkdir($dest, $options['folderPermission']);
@chmod($dest, $options['filePermission']);
}
}
$dirHandle = opendir($source);
while ($file = readdir($dirHandle)) {
if ($file != "." && $file != "..") {
if (!is_dir($source . "/" . $file)) {
$__dest = $dest . "/" . $file;
} else {
$__dest = $dest . "/" . $file;
}
//echo "$source/$file ||| $__dest<br />";
$result = $this->customCopy($source . "/" . $file, $__dest, $options);
}
}
closedir($dirHandle);
} else {
$result = false;
}
return $result;
}
function mycopy($s1, $s2) {
$path = pathinfo($s2);
if (!file_exists($path['dirname'])) {
mkdir($path['dirname'], 0777, true);
}
if (!copy($s1, $s2)) {
echo "copy failed \n";
}
}
public function DisableHTMLCompress() {
return true;
}
public function EnableHTMLCompress() {
if (!file_exists(_PS_ROOT_DIR_ . DIRECTORY_SEPARATOR . 'tools' . DIRECTORY_SEPARATOR . 'minify_html' . DIRECTORY_SEPARATOR . 'minify_html.class.php')) {
// $code_files = _PS_MODULE_DIR_ . $this->name . DIRECTORY_SEPARATOR . 'views' . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . 'tools' . DIRECTORY_SEPARATOR;
// $dest = _PS_ROOT_DIR_ . DIRECTORY_SEPARATOR . 'tools' . DIRECTORY_SEPARATOR;
// $this->customCopy($code_files, $dest);
}
return true;
}
public function DisableCSSCompress() {
return true;
}
public function EnableCSSCompress() {
return true;
}
public function DisableJSCompress() {
return true;
}
public function EnableJSCompress() {
if (!file_exists(_PS_ROOT_DIR_ . DIRECTORY_SEPARATOR . 'tools' . DIRECTORY_SEPARATOR . 'minify_html' . DIRECTORY_SEPARATOR . 'jsmin.php')) {
// $code_files = _PS_MODULE_DIR_ . $this->name . DIRECTORY_SEPARATOR . 'views' . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . 'tools' . DIRECTORY_SEPARATOR;
// $dest = _PS_ROOT_DIR_ . DIRECTORY_SEPARATOR . 'tools' . DIRECTORY_SEPARATOR;
// $this->customCopy($code_files, $dest);
}
return true;
}
public function getContent() {
$this->processSubmit();
return $this->displayForm();
}
public function processSubmit() {
if (Tools::isSubmit('submit' . $this->name)) {
$on_off_option = Tools::getValue('html_minify_ps');
if ($on_off_option == '1') {
$this->EnableHTMLCompress();
Configuration::updateValue('html_minify_ps', $on_off_option);
$this->_html .= $this->displayConfirmation("Minify HTML enable sucessfully");
}
if ($on_off_option == '0') {
$this->DisableHTMLCompress();
Configuration::updateValue('html_minify_ps', $on_off_option);
$this->_html .= $this->displayConfirmation("Minify HTML disable sucessfully");
}
$on_off_css = Tools::getValue('css_minify_ps');
if ($on_off_css == '1') {
$this->EnableCSSCompress();
Configuration::updateValue('PS_CSS_THEME_CACHE', $on_off_css);
$this->_html .= $this->displayConfirmation("Minify CSS enable sucessfully");
}
if ($on_off_css == '0') {
$this->DisableCSSCompress();
Configuration::updateValue('PS_CSS_THEME_CACHE', $on_off_css);
$this->_html .= $this->displayConfirmation("Minify CSS disable sucessfully");
}
$on_off_js = Tools::getValue('js_minify_ps');
if ($on_off_js == '1') {
$this->EnableJSCompress();
Configuration::updateValue('js_minify_ps', $on_off_js);
$this->_html .= $this->displayConfirmation("Minify JS enable sucessfully");
}
if ($on_off_js == '0') {
$this->DisableJSCompress();
Configuration::updateValue('js_minify_ps', $on_off_js);
$this->_html .= $this->displayConfirmation("Minify JS disable sucessfully");
}
}
}
public function displayForm() {
$fields_form = array();
$html_minify_ps = Configuration::get('html_minify_ps');
$css_minify_ps = Configuration::get('PS_CSS_THEME_CACHE');
$js_minify_ps = Configuration::get('js_minify_ps');
$fields_form[]['form'] = array(
'input' => array(
array(
'name' => 'topform',
'type' => 'topform',
'html_minify_ps' => $html_minify_ps,
'css_minify_ps' => $css_minify_ps,
'js_minify_ps' => $js_minify_ps,
),
),
);
$helper = new HelperForm();
$helper->module = $this;
$helper->name_controller = $this->name;
$helper->token = Tools::getAdminTokenLite('AdminModules');
$helper->currentIndex = AdminController::$currentIndex . '&configure=' . $this->name;
return $this->_html . $helper->generateForm($fields_form);
}
}