PageRenderTime 25ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/includes/class_compress_js_css.php

https://github.com/igorw-forks/icy_phoenix
PHP | 235 lines | 204 code | 9 blank | 22 comment | 6 complexity | d95fe732775ce9600fa0e3a35491dddb MD5 | raw file
Possible License(s): AGPL-1.0
  1. <?php
  2. /**
  3. *
  4. * @package Icy Phoenix
  5. * @version $Id$
  6. * @copyright (c) 2008 Icy Phoenix
  7. * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  8. *
  9. */
  10. if (!defined('IN_ICYPHOENIX'))
  11. {
  12. die('Hacking attempt');
  13. }
  14. /**
  15. * Compress JS CSS class
  16. */
  17. /*
  18. USAGE
  19. echo $class_compress_js_css->compress_css('whatever.css', ''); // reads whatever.css and outputs compressed code
  20. echo $class_compress_js_css->compress_js('whatever.js'); // reads whatever.js and outputs compressed code
  21. */
  22. class class_compress_js_css
  23. {
  24. function compress_css($file, $urls = false)
  25. {
  26. $code = @file_get_contents($file);
  27. // replace urls
  28. if(is_string($urls))
  29. {
  30. $code = str_replace('url(' . $urls, 'url(', $code);
  31. }
  32. // remove comments
  33. $code = $this->_compress_clean($code, 'css');
  34. return $code;
  35. }
  36. function compress_js($file)
  37. {
  38. $code = @file_get_contents($file);
  39. // remove comments
  40. $code = $this->_compress_clean($code, 'js');
  41. return $code;
  42. }
  43. function _compress_clean($code, $type)
  44. {
  45. $start = 0;
  46. $lines = explode("\n", $code);
  47. // remove "//" type comments
  48. for($i = 0; $i < sizeof($lines); $i++)
  49. {
  50. if (($pos = strpos($lines[$i], '//')) !== false)
  51. {
  52. // check if its in string
  53. $prev = $pos > 0 ? substr($lines[$i], 0, $pos) : '';
  54. $count = substr_count($prev, "'") - substr_count($prev, "\\'");
  55. if(($count % 2) == 1) continue;
  56. $count = substr_count($prev, '"') - substr_count($prev, '\\"');
  57. if(($count % 2) == 1) continue;
  58. $lines[$i] = $pos > 0 ? substr($lines[$i], 0, $pos) : '';
  59. }
  60. }
  61. // trim lines
  62. for($i = 0; $i < sizeof($lines); $i++)
  63. {
  64. $lines[$i] = trim($lines[$i]);
  65. }
  66. $code = implode("\n", $lines);
  67. // remove /* */ comments
  68. $start = 0;
  69. while(($pos = strpos($code, '/*', $start)) !== false)
  70. {
  71. $pos2 = strpos($code, '*/', $start);
  72. $code = substr($code, 0, $pos) . ($pos2 === false ? '' : substr($code, $pos2 + 2));
  73. $start = $pos2 === false ? strlen($code) : $pos;
  74. }
  75. // remove spaces
  76. if ($type == 'js')
  77. {
  78. $code = str_replace(array("\t", "\n", "\r", ' '), array(' ', '', '', ' '), $code);
  79. while(strpos($code, ' ') !== false)
  80. {
  81. $code = str_replace(' ', ' ', $code);
  82. }
  83. }
  84. else
  85. {
  86. $code = str_replace(array("\t", "\n", "\r", ' '), array(' ', '', '', ' '), $code);
  87. while(strpos($code, ' ') !== false)
  88. {
  89. $code = str_replace(' ', ' ', $code);
  90. }
  91. }
  92. // remove extra characters
  93. if ($type == 'css')
  94. {
  95. $search = array('} ', ' }', ' {', '{ ', ': ', '; ', ', ');
  96. $replace = array('}', '}', '{', '{', ':', ';', ',');
  97. $code = str_replace($search, $replace, $code);
  98. }
  99. else
  100. {
  101. $search = array('} ', ' }', ' {', '{ ', '; ',
  102. ' || ', ' && ', ') {', ' =', '= ', ' !', ' :', ': {',
  103. ' +', '+ ', ' > ', ' < ', ' ? ', ') ');
  104. $replace = array('}', '}', '{', '{', ';',
  105. '||', '&&', '){', '=', '=', '!', ':', ':{',
  106. '+', '+', '>', '<', '?', ')');
  107. $code = str_replace($search, $replace, $code);
  108. $code = str_replace($search, $replace, $code);
  109. }
  110. return $code;
  111. }
  112. function full_compression($source_dir, $type, $files_to_compress = false)
  113. {
  114. $files = array();
  115. $time = 0;
  116. $type = ($type == 'css') ? 'css' : 'js';
  117. $res = @opendir($source_dir);
  118. $result = '';
  119. if($res === false)
  120. {
  121. return false;
  122. }
  123. if (!empty($files_to_compress) && is_array($files_to_compress))
  124. {
  125. foreach ($files_to_compress as $file_to_compress)
  126. {
  127. $file = $source_dir . '/' . $file_to_compress;
  128. $filetype = substr(strrchr($file_to_compress, '.'), 1);
  129. if ((file_exists($file)) && ($filetype == $type))
  130. {
  131. $files[] = $file_to_compress;
  132. $time = max($time, @filemtime($file));
  133. }
  134. }
  135. }
  136. else
  137. {
  138. while(($file = readdir($res)) !== false)
  139. {
  140. if(!is_dir($file) && !is_link($file) && ($file !== '.') && ($file !== '..'))
  141. {
  142. $filetype = substr(strrchr($file, '.'), 1);
  143. if ($filetype == $type)
  144. {
  145. $files[] = $file;
  146. $time = max($time, @filemtime($source_dir . '/' . $file));
  147. }
  148. }
  149. }
  150. @closedir($res);
  151. }
  152. if (empty($files))
  153. {
  154. return false;
  155. }
  156. if ($time > 0)
  157. {
  158. // check if file already exists
  159. $file_suffix = preg_replace('/__+/', '_', preg_replace('/[^a-z0-9_]/', '_', strtolower($source_dir)));
  160. while (substr($file_suffix, 0, 1) == '_')
  161. {
  162. $file_suffix = substr($file_suffix, 1);
  163. }
  164. while (substr($file_suffix, -1) == '_')
  165. {
  166. $file_suffix = substr($file_suffix, 0, -1);
  167. }
  168. $filename = MAIN_CACHE_FOLDER . $type . '_' .$file_suffix . '_' . $time . '.' . $type;
  169. if (!@file_exists($filename))
  170. {
  171. // compress
  172. sort($files);
  173. $code = '';
  174. $size_old = 0;
  175. for($i = 0; $i < sizeof($files); $i++)
  176. {
  177. $size_old += filesize($source_dir . '/' . $files[$i]);
  178. if ($type == 'css')
  179. {
  180. $code .= $this->compress_css($source_dir . '/' . $files[$i], false);
  181. }
  182. else
  183. {
  184. $code .= $this->compress_js($source_dir . '/' . $files[$i]);
  185. }
  186. }
  187. $cache_name = $filename . '.temp' . mt_rand(0, 10000);
  188. $f = @fopen($cache_name, 'w');
  189. @fputs($f, $code);
  190. @fclose($f);
  191. @chmod($f, 0777);
  192. @unlink($filename);
  193. @rename($cache_name, $filename);
  194. $result .= '<!-- compressed from ' . $size_old . ' to ' . strlen($code) . ' -->' . "\n";
  195. }
  196. if ($type == 'css')
  197. {
  198. $result .= '<link rel="stylesheet" href="' . $filename . '" type="text/css" />' . "\n";
  199. }
  200. else
  201. {
  202. $result .= '<script src="' . $filename . '" type="text/javascript"></script>' . "\n";
  203. }
  204. return $result;
  205. }
  206. sort($files);
  207. for($i = 0; $i < sizeof($files); $i++)
  208. {
  209. if ($type == 'css')
  210. {
  211. $result .= '<link rel="stylesheet" href="' . $source_dir . '/' . $files[$i] . '" type="text/css" />' . "\n";
  212. }
  213. else
  214. {
  215. $result .= '<script src="' . $source_dir . '/' . $files[$i] . '" type="text/javascript"></script>' . "\n";
  216. }
  217. }
  218. return $result;
  219. }
  220. }
  221. ?>