summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMorris Jobke <hey@morrisjobke.de>2017-03-16 22:51:31 -0600
committerGitHub <noreply@github.com>2017-03-16 22:51:31 -0600
commitead9a10cc528beb265282049cab2462020660714 (patch)
treee5c0745fe3201eb0a56773f4b5ba4f5945881a81
parent5683365a2cc605cbaf41290e4cdfde7028f9014a (diff)
parentf86b5c2ebba9aaa76bbcc1dfc660f430b246d1a4 (diff)
downloadnextcloud-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.php50
-rwxr-xr-xlib/private/Template/ResourceLocator.php33
-rw-r--r--lib/private/Template/SCSSCacher.php15
-rw-r--r--lib/private/TemplateLayout.php3
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;