Permalink
Browse files

Adding in new CompilationException and removing cache file if it is c…

…alled. Also putting in new relative path fix for CSS stylesheets.
  • Loading branch information...
meenie committed Oct 17, 2013
1 parent 52c78f6 commit b83c399176b0a9bcf88fb214338e63f9a896bcbf
Showing with 83 additions and 28 deletions.
  1. +12 −0 src/Munee/Asset/Type.php
  2. +18 −0 src/Munee/Asset/Type/CompilationException.php
  3. +25 −20 src/Munee/Asset/Type/Css.php
  4. +28 −8 src/Munee/Dispatcher.php
View
@@ -174,6 +174,18 @@ public function getLastModifiedDate()
return $this->lastModifiedDate;
}
/**
* If an exception is handled this function will fire and clean up any files
* that have been cached as they have not properly compiled.
*/
public function cleanUpAfterError()
{
foreach ($this->request->files as $file) {
$cacheFile = $this->generateCacheFile($file);
unlink($cacheFile);
}
}
/**
* Callback method called before filters are run
*
@@ -0,0 +1,18 @@
<?php
/**
* Munee: Optimising Your Assets
*
* @copyright Cody Lundquist 2013
* @license http://opensource.org/licenses/mit-license.php
*/
namespace Munee\Asset\Type;
use Munee\ErrorException;
/**
* Class CompilationException
*
* @author Cody Lundquist
*/
class CompilationException extends ErrorException {}
@@ -8,7 +8,6 @@
namespace Munee\Asset\Type;
use Munee\ErrorException;
use Munee\Utils;
use Munee\Asset\Type;
use lessc;
@@ -77,7 +76,7 @@ protected function checkCache($originalFile, $cacheFile)
* @param string $originalFile
* @param string $cacheFile
*
* @throws ErrorException
* @throws CompilationException
*/
protected function beforeFilter($originalFile, $cacheFile)
{
@@ -86,9 +85,7 @@ protected function beforeFilter($originalFile, $cacheFile)
try {
$compiledLess = $less->cachedCompile($originalFile);
} catch (\Exception $e) {
// Remove the Cache File because it hasn't been properly compiled yet
unlink($cacheFile);
throw new ErrorException('Error in LESS Compiler', 0, $e);
throw new CompilationException('Error in LESS Compiler', 0, $e);
}
$compiledLess['compiled'] = $this->fixRelativeImagePaths($compiledLess['compiled'], $originalFile);
file_put_contents($cacheFile, serialize($compiledLess));
@@ -98,9 +95,7 @@ protected function beforeFilter($originalFile, $cacheFile)
try {
$compiled = $scss->compile(file_get_contents($originalFile));
} catch (\Exception $e) {
// Remove the Cache File because it hasn't been properly compiled yet
unlink($cacheFile);
throw new ErrorException('Error in SCSS Compiler', 0, $e);
throw new CompilationException('Error in SCSS Compiler', 0, $e);
}
$content = compact('compiled');
@@ -166,31 +161,41 @@ protected function isScss($file)
* @param $originalFile
*
* @return string
*
* @throws CompilationException
*/
protected function fixRelativeImagePaths($content, $originalFile)
{
$regEx = '%(url[\\s]*\\()[\\s\'"]*([^\\)\'"]*)[\\s\'"]*(\\))%';
$webroot = $this->request->webroot;
$changedContent = preg_replace_callback($regEx, function ($match) use ($originalFile, $webroot) {
$basePath = trim($match[2]);
// Skip conversion if the first character is a '/' since it's already an absolute path;
if ($basePath[0] !== '/') {
$basePathPrefix = str_replace($webroot, '', dirname($originalFile));
if (! empty($basePathPrefix)) {
$basePathPrefix .= '/';
$filePath = trim($match[2]);
// Skip conversion if the first character is a '/' since it's already an absolute path
if ($filePath[0] !== '/') {
$basePath = str_replace($webroot, '', dirname($originalFile));
$basePathParts = array_reverse(array_filter(explode('/', $basePath)));
$numOfRecursiveDirs = substr_count($filePath, '../');
if ($numOfRecursiveDirs > count($basePathParts)) {
throw new CompilationException(
'Error in stylesheet <strong>' . $originalFile .
'</strong>. The following URL goes above webroot: <strong>' . $filePath .
'</strong>'
);
}
$basePath = $basePathPrefix . $basePath;
$basePathParts = array_slice($basePathParts, $numOfRecursiveDirs);
$basePath = implode('/', array_reverse($basePathParts));
// Lets remove the relative path markers (../../) and the directory above them.
$count = 1;
while ($count > 0) {
$basePath = preg_replace('%([^/]+/\\.\\./|\\./)%', '', $basePath, -1, $count);
if (! empty($basePath) && $basePath[0] != '/') {
$basePath = '/' . $basePath;
}
$filePath = $basePath . '/' . $filePath;
$filePath = str_replace(array('../', './'), '', $filePath);
}
return $match[1] . $basePath . $match[3];
return $match[1] . $filePath . $match[3];
}, $content);
if (null !== $changedContent) {
View
@@ -87,16 +87,36 @@ public static function run(Request $Request, $options = array())
*/
return $Response->notModified ? null : $Response->render();
} catch (Asset\NotFoundException $e) {
$headerController->statusCode('HTTP/1.0', 404, 'Not Found');
$headerController->headerField('Status', '404 Not Found');
return 'Error: ' . $e->getMessage();
} catch (ErrorException $e) {
$errors = 'Error: ' . $e->getMessage();
while ($e = $e->getPrevious()) {
$errors .= "<br>" . $e->getMessage();
if (isset($headerController) && $headerController instanceof Asset\HeaderSetter) {
$headerController->statusCode('HTTP/1.0', 404, 'Not Found');
$headerController->headerField('Status', '404 Not Found');
}
return 'Not Found Error: ' . static::getErrors($e);
} catch (Asset\Type\CompilationException $e) {
if (isset($AssetType) && $AssetType instanceof Asset\Type) {
$AssetType->cleanUpAfterError();
}
return $errors;
return 'Compilation Error: ' . static::getErrors($e);
} catch (ErrorException $e) {
return 'Error: ' . static::getErrors($e);
}
}
/**
* Grabs all of the Exception messages in a chain
*
* @param \Exception $e
*
* @return string
*/
protected static function getErrors (\Exception $e) {
$errors = $e->getMessage();
while ($e = $e->getPrevious()) {
$errors .= "<br>" . $e->getMessage();
}
return $errors;
}
}

0 comments on commit b83c399

Please sign in to comment.