XpressEngine Core  1.11.2
 All Classes Namespaces Files Functions Variables Pages
FrontEndFileHandler.class.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) NAVER <http://www.navercorp.com> */
3 
9 {
10 
11  static $isSSL = null;
12 
17  var $cssMap = array();
18 
23  var $jsHeadMap = array();
24 
29  var $jsBodyMap = array();
30 
35  var $cssMapIndex = array();
36 
41  var $jsHeadMapIndex = array();
42 
47  var $jsBodyMapIndex = array();
48 
55  function isSsl()
56  {
57  if(!is_null(self::$isSSL))
58  {
59  return self::$isSSL;
60  }
61 
62  $url_info = parse_url(Context::getRequestUrl());
63  self::$isSSL = ($url_info['scheme'] == 'https');
64 
65  return self::$isSSL;
66  }
67 
89  function loadFile($args)
90  {
91  if(!is_array($args))
92  {
93  $args = array($args);
94  }
95  $file = $this->getFileInfo($args[0], $args[2], $args[1]);
96 
97  $availableExtension = array('css' => 1, 'js' => 1);
98  if(!isset($availableExtension[$file->fileExtension]))
99  {
100  return;
101  }
102 
103  $file->index = (int) $args[3];
104 
105  if($file->fileExtension == 'css')
106  {
107  $map = &$this->cssMap;
108  $mapIndex = &$this->cssMapIndex;
109 
110  $this->_arrangeCssIndex($pathInfo['dirname'], $file);
111  }
112  else if($file->fileExtension == 'js')
113  {
114  if($args[1] == 'body')
115  {
116  $map = &$this->jsBodyMap;
117  $mapIndex = &$this->jsBodyMapIndex;
118  }
119  else
120  {
121  $map = &$this->jsHeadMap;
122  $mapIndex = &$this->jsHeadMapIndex;
123  }
124  }
125 
126  (is_null($file->index)) ? $file->index = 0 : $file->index = $file->index;
127  if(!isset($mapIndex[$file->key]) || $mapIndex[$file->key] > $file->index)
128  {
129  $this->unloadFile($args[0], $args[2], $args[1]);
130  $map[$file->index][$file->key] = $file;
131  $mapIndex[$file->key] = $file->index;
132  }
133  }
134 
143  private function getFileInfo($fileName, $targetIe = '', $media = 'all')
144  {
145  static $existsInfo = array();
146 
147  if(isset($existsInfo[$existsKey]))
148  {
149  return $existsInfo[$existsKey];
150  }
151 
152  $fileName = preg_replace('/(?:[\/]{3,})(.*)/', '//$1', $fileName);
153  $url_info = parse_url($fileName);
154  $pathInfo = pathinfo(str_replace('?' . $url_info['query'], '', $fileName));
155 
156  $file = new stdClass();
157  $file->fileName = basename($url_info['path']);
158  $file->filePath = $this->_getAbsFileUrl($pathInfo['dirname']);
159  $file->fileRealPath = FileHandler::getRealPath($pathInfo['dirname']);
160  $file->fileExtension = strtolower($pathInfo['extension']);
161  $file->fileNameNoExt = preg_replace('/\.min$/', '', $pathInfo['filename']);
162  $file->query = $url_info['query'];
163  $file->external = !!$url_info['host'];
164  $file->keyName = implode('.', array($file->fileNameNoExt, $file->fileExtension));
165  $file->cdnPath = $this->_normalizeFilePath($pathInfo['dirname']);
166 
167  if(!$file->external)
168  {
169  if(!__DEBUG__ && __XE_VERSION_STABLE__)
170  {
171  // if no debug mode, load minifed file
172  $minifiedFileName = implode('.', array($file->fileNameNoExt, 'min', $file->fileExtension));
173  $minifiedRealPath = implode('/', array($file->fileRealPath, $minifiedFileName));
174  if(file_exists($minifiedRealPath))
175  {
176  $file->fileName = $minifiedFileName;
177  }
178  }
179  else
180  {
181  // Remove .min
182  if(file_exists(implode('/', array($file->fileRealPath, $file->keyName))))
183  {
184  $file->fileName = $file->keyName;
185  }
186  }
187  }
188 
189  $file->targetIe = $targetIe;
190 
191  if($file->fileExtension == 'css')
192  {
193  $file->media = $media;
194  if(!$file->media)
195  {
196  $file->media = 'all';
197  }
198  $file->key = $file->filePath . $file->keyName . "\t" . $file->targetIe . "\t" . $file->media;
199  }
200  else if($file->fileExtension == 'js')
201  {
202  $file->key = $file->filePath . $file->keyName . "\t" . $file->targetIe;
203  }
204 
205  return $file;
206  }
207 
216  function unloadFile($fileName, $targetIe = '', $media = 'all')
217  {
218  $file = $this->getFileInfo($fileName, $targetIe, $media);
219 
220  if($file->fileExtension == 'css')
221  {
222  if(isset($this->cssMapIndex[$file->key]))
223  {
224  $index = $this->cssMapIndex[$file->key];
225  unset($this->cssMap[$index][$file->key], $this->cssMapIndex[$file->key]);
226  }
227  }
228  else
229  {
230  if(isset($this->jsHeadMapIndex[$file->key]))
231  {
232  $index = $this->jsHeadMapIndex[$file->key];
233  unset($this->jsHeadMap[$index][$file->key], $this->jsHeadMapIndex[$file->key]);
234  }
235  if(isset($this->jsBodyMapIndex[$file->key]))
236  {
237  $index = $this->jsBodyMapIndex[$file->key];
238  unset($this->jsBodyMap[$index][$file->key], $this->jsBodyMapIndex[$file->key]);
239  }
240  }
241  }
242 
249  function unloadAllFiles($type = 'all')
250  {
251  if($type == 'css' || $type == 'all')
252  {
253  $this->cssMap = array();
254  $this->cssMapIndex = array();
255  }
256 
257  if($type == 'js' || $type == 'all')
258  {
259  $this->jsHeadMap = array();
260  $this->jsBodyMap = array();
261  $this->jsHeadMapIndex = array();
262  $this->jsBodyMapIndex = array();
263  }
264  }
265 
271  function getCssFileList()
272  {
273  $map = &$this->cssMap;
274  $mapIndex = &$this->cssMapIndex;
275 
276  $this->_sortMap($map, $mapIndex);
277 
278  $result = array();
279  foreach($map as $indexedMap)
280  {
281  foreach($indexedMap as $file)
282  {
283  $query = '';
284  if(!$file->external && is_readable($file->cdnPath . '/' . $file->fileName))
285  {
286  $query = date('YmdHis', filemtime($file->cdnPath . '/' . $file->fileName));
287  }
288  if($file->query)
289  {
290  if($query) $query .= '&';
291  $query .= $file->query;
292  }
293  $query = ($query) ? '?' . $query : '';
294 
295  $fullFilePath = $file->filePath . '/' . $file->fileName . $query;
296  $result[] = array(
297  'file' => $fullFilePath,
298  'media' => $file->media,
299  'targetie' => $file->targetIe
300  );
301  }
302  }
303 
304  return $result;
305  }
306 
313  function getJsFileList($type = 'head')
314  {
315  $ignore = array('modernizr.js', 'common.js', 'js_app.js', 'xml2json.js', 'xml_handler.js', 'xml_js_filter.js');
316  $pathCommonJs = getScriptPath() . 'common/js';
317 
318  if($type == 'head')
319  {
320  $map = &$this->jsHeadMap;
321  $mapIndex = &$this->jsHeadMapIndex;
322  }
323  else
324  {
325  $map = &$this->jsBodyMap;
326  $mapIndex = &$this->jsBodyMapIndex;
327  }
328 
329  $this->_sortMap($map, $mapIndex);
330 
331  $result = array();
332  foreach($map as $indexedMap)
333  {
334  foreach($indexedMap as $file)
335  {
336  if((!__DEBUG__ && __XE_VERSION_STABLE__) && $file->filePath === $pathCommonJs)
337  {
338  if(in_array($file->fileName, $ignore))
339  {
340  continue;
341  }
342  }
343 
344  $query = '';
345  if(!$file->external && is_readable($file->cdnPath . '/' . $file->fileName))
346  {
347  $query = date('YmdHis', filemtime($file->cdnPath . '/' . $file->fileName));
348  }
349  if($file->query)
350  {
351  if($query) $query .= '&';
352  $query .= $file->query;
353  }
354  $query = ($query) ? '?' . $query : '';
355 
356  $fullFilePath = $file->filePath . '/' . $file->fileName . $query;
357  $result[] = array(
358  'file' => $fullFilePath,
359  'targetie' => $file->targetIe
360  );
361  }
362  }
363 
364  return $result;
365  }
366 
374  function _sortMap(&$map, &$index)
375  {
376  ksort($map);
377  }
378 
385  function _normalizeFilePath($path)
386  {
387  if(strpos($path, '://') === FALSE && $path{0} != '/' && $path{0} != '.')
388  {
389  $path = './' . $path;
390  }
391  elseif(!strncmp($path, '//', 2))
392  {
393  return preg_replace('#^//+#', '//', $path);
394  }
395 
396  $path = preg_replace('@/\./|(?<!:)\/\/@', '/', $path);
397 
398  while(strpos($path, '/../'))
399  {
400  $path = preg_replace('/\/([^\/]+)\/\.\.\//s', '/', $path, 1);
401  }
402 
403  return $path;
404  }
405 
412  function _getAbsFileUrl($path)
413  {
414  $path = $this->_normalizeFilePath($path);
415  $script_path = getScriptPath();
416 
417  if(strpos($path, './') === 0)
418  {
419  if($script_path == '/' || $script_path == '\\')
420  {
421  $path = '/' . substr($path, 2);
422  }
423  else
424  {
425  $path = $script_path . substr($path, 2);
426  }
427  }
428  else if(strpos($file, '../') === 0)
429  {
430  $path = $this->_normalizeFilePath($script_path . $path);
431  }
432 
433  return $path;
434  }
435 
443  function _arrangeCssIndex($dirName, &$file)
444  {
445  if($file->index !== 0)
446  {
447  return;
448  }
449 
450  $dirName = str_replace('./', '', $dirName);
451  $tmp = explode('/', $dirName);
452 
453  $cssSortList = array('common' => -100000, 'layouts' => -90000, 'modules' => -80000, 'widgets' => -70000, 'addons' => -60000);
454  $file->index = $cssSortList[$tmp[0]];
455  }
456 
457 }
458 /* End of file FrontEndFileHandler.class.php */
459 /* Location: ./classes/frontendfile/FrontEndFileHandler.class.php */
const __XE_VERSION_STABLE__
Definition: config.inc.php:36
unloadFile($fileName, $targetIe= '', $media= 'all')
_arrangeCssIndex($dirName, &$file)
$args
Definition: ko.install.php:185
getScriptPath()
Definition: func.inc.php:1364
getRealPath($source)