diff options
author | Morris Jobke <hey@morrisjobke.de> | 2017-03-16 22:51:31 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-16 22:51:31 -0600 |
commit | ead9a10cc528beb265282049cab2462020660714 (patch) | |
tree | e5c0745fe3201eb0a56773f4b5ba4f5945881a81 | |
parent | 5683365a2cc605cbaf41290e4cdfde7028f9014a (diff) | |
parent | f86b5c2ebba9aaa76bbcc1dfc660f430b246d1a4 (diff) | |
download | nextcloud-server-ead9a10cc528beb265282049cab2462020660714.tar.gz nextcloud-server-ead9a10cc528beb265282049cab2462020660714.zip |
Merge pull request #3619 from nextcloud/fix-scss-for-apps
Fix SCSS usage in apps
-rw-r--r-- | lib/private/Template/CSSResourceLocator.php | 50 | ||||
-rwxr-xr-x | lib/private/Template/ResourceLocator.php | 33 | ||||
-rw-r--r-- | lib/private/Template/SCSSCacher.php | 15 | ||||
-rw-r--r-- | lib/private/TemplateLayout.php | 3 |
4 files changed, 94 insertions, 7 deletions
diff --git a/lib/private/Template/CSSResourceLocator.php b/lib/private/Template/CSSResourceLocator.php index 3a474a1ecfd..5f210ef307a 100644 --- a/lib/private/Template/CSSResourceLocator.php +++ b/lib/private/Template/CSSResourceLocator.php @@ -88,7 +88,8 @@ class CSSResourceLocator extends ResourceLocator { if (is_file($root.'/'.$file)) { if($this->scssCacher !== null) { if($this->scssCacher->process($root, $file, $app)) { - $this->append($root, $this->scssCacher->getCachedSCSS($app, $file), false); + + $this->append($root, $this->scssCacher->getCachedSCSS($app, $file), false, true, true); return true; } else { $this->logger->warning('Failed to compile and/or save '.$root.'/'.$file, ['app' => 'core']); @@ -101,4 +102,51 @@ class CSSResourceLocator extends ResourceLocator { } return false; } + + public function append($root, $file, $webRoot = null, $throw = true, $scss = false) { + if (!$scss) { + parent::append($root, $file, $webRoot, $throw); + } else { + if (!$webRoot) { + $tmpRoot = $root; + /* + * traverse the potential web roots upwards in the path + * + * example: + * - root: /srv/www/apps/myapp + * - available mappings: ['/srv/www'] + * + * First we check if a mapping for /srv/www/apps/myapp is available, + * then /srv/www/apps, /srv/www/apps, /srv/www, ... until we find a + * valid web root + */ + do { + if (isset($this->mapping[$tmpRoot])) { + $webRoot = $this->mapping[$tmpRoot]; + break; + } + + if ($tmpRoot === '/') { + $webRoot = ''; + $this->logger->error('ResourceLocator can not find a web root (root: {root}, file: {file}, webRoot: {webRoot}, throw: {throw})', [ + 'app' => 'lib', + 'root' => $root, + 'file' => $file, + 'webRoot' => $webRoot, + 'throw' => $throw ? 'true' : 'false' + ]); + break; + } + $tmpRoot = dirname($tmpRoot); + } while(true); + + } + + if ($throw && $tmpRoot === '/') { + throw new ResourceNotFoundException($file, $webRoot); + } + + $this->resources[] = array($tmpRoot, $webRoot, $file); + } + } } diff --git a/lib/private/Template/ResourceLocator.php b/lib/private/Template/ResourceLocator.php index e22ebdcab7d..9015bf5d97c 100755 --- a/lib/private/Template/ResourceLocator.php +++ b/lib/private/Template/ResourceLocator.php @@ -117,7 +117,38 @@ abstract class ResourceLocator { */ protected function append($root, $file, $webRoot = null, $throw = true) { if (!$webRoot) { - $webRoot = $this->mapping[$root]; + $tmpRoot = $root; + /* + * traverse the potential web roots upwards in the path + * + * example: + * - root: /srv/www/apps/myapp + * - available mappings: ['/srv/www'] + * + * First we check if a mapping for /srv/www/apps/myapp is available, + * then /srv/www/apps, /srv/www/apps, /srv/www, ... until we find a + * valid web root + */ + do { + if (isset($this->mapping[$tmpRoot])) { + $webRoot = $this->mapping[$tmpRoot]; + break; + } + + if ($tmpRoot === '/') { + $webRoot = ''; + $this->logger->error('ResourceLocator can not find a web root (root: {root}, file: {file}, webRoot: {webRoot}, throw: {throw})', [ + 'app' => 'lib', + 'root' => $root, + 'file' => $file, + 'webRoot' => $webRoot, + 'throw' => $throw ? 'true' : 'false' + ]); + break; + } + $tmpRoot = dirname($tmpRoot); + } while(true); + } $this->resources[] = array($root, $webRoot, $file); diff --git a/lib/private/Template/SCSSCacher.php b/lib/private/Template/SCSSCacher.php index 744ea80761e..b55cd0b93b0 100644 --- a/lib/private/Template/SCSSCacher.php +++ b/lib/private/Template/SCSSCacher.php @@ -46,17 +46,26 @@ class SCSSCacher { /** @var SystemConfig */ protected $systemConfig; + /** @var string */ + protected $serverRoot; + /** * @param ILogger $logger * @param IAppData $appData * @param IURLGenerator $urlGenerator * @param SystemConfig $systemConfig + * @param string $serverRoot */ - public function __construct(ILogger $logger, IAppData $appData, IURLGenerator $urlGenerator, SystemConfig $systemConfig) { + public function __construct(ILogger $logger, + IAppData $appData, + IURLGenerator $urlGenerator, + SystemConfig $systemConfig, + $serverRoot) { $this->logger = $logger; $this->appData = $appData; $this->urlGenerator = $urlGenerator; $this->systemConfig = $systemConfig; + $this->serverRoot = $serverRoot; } /** @@ -74,9 +83,7 @@ class SCSSCacher { $path = implode('/', $path); - $webDir = explode('/', $file); - array_pop($webDir); - $webDir = implode('/', $webDir); + $webDir = substr($path, strlen($this->serverRoot)+1); try { $folder = $this->appData->getFolder($app); diff --git a/lib/private/TemplateLayout.php b/lib/private/TemplateLayout.php index 3f8c75adc84..6d2c3b2674f 100644 --- a/lib/private/TemplateLayout.php +++ b/lib/private/TemplateLayout.php @@ -218,7 +218,8 @@ class TemplateLayout extends \OC_Template { \OC::$server->getLogger(), \OC::$server->getAppDataDir('css'), \OC::$server->getURLGenerator(), - \OC::$server->getSystemConfig() + \OC::$server->getSystemConfig(), + \OC::$SERVERROOT ); } else { $SCSSCacher = null; |