Appdata integration 2
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
This commit is contained in:
parent
3a7d6846fa
commit
1caaa7f4cd
|
@ -0,0 +1,83 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2016, John Molakvoæ (skjnldsv@protonmail.com)
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OC\Core\Controller;
|
||||
|
||||
use OC\AppFramework\Utility\TimeFactory;
|
||||
use OCP\AppFramework\Controller;
|
||||
use OCP\AppFramework\Http;
|
||||
use OCP\AppFramework\Http\NotFoundResponse;
|
||||
use OCP\AppFramework\Http\FileDisplayResponse;
|
||||
use OCP\ICssManager;
|
||||
use OCP\IRequest;
|
||||
|
||||
|
||||
class CssController extends Controller {
|
||||
|
||||
/** @var ICssManager */
|
||||
protected $cssManager;
|
||||
|
||||
/** @var TimeFactory */
|
||||
protected $timeFactory;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @param string $appName
|
||||
* @param IRequest $request
|
||||
* @param ICssManager $cssManager
|
||||
* @param TimeFactory $timeFactory
|
||||
*/
|
||||
public function __construct($appName, IRequest $request, ICssManager $cssManager, TimeFactory $timeFactory) {
|
||||
parent::__construct($appName, $request);
|
||||
|
||||
$this->cssManager = $cssManager;
|
||||
$this->timeFactory = $timeFactory;
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
* @NoCSRFRequired
|
||||
*
|
||||
* @param string $fileName css filename with extension
|
||||
* @return text/css
|
||||
*/
|
||||
public function getCss($fileName) {
|
||||
try {
|
||||
$cssFile = $this->cssManager->getCss($fileName);
|
||||
} catch(NotFoundException $e) {
|
||||
return new NotFoundResponse();
|
||||
}
|
||||
|
||||
if ($cssFile !== false) {
|
||||
$response = new FileDisplayResponse($cssFile, Http::STATUS_OK, ['Content-Type' => 'text/css']);
|
||||
$response->cacheFor(86400);
|
||||
$expires = new \DateTime();
|
||||
$expires->setTimestamp($this->timeFactory->getTime());
|
||||
$expires->add(new \DateInterval('PT24H'));
|
||||
$response->addHeader('Expires', $expires->format(\DateTime::RFC2822));
|
||||
$response->addHeader('Pragma', 'cache');
|
||||
return $response;
|
||||
} else {
|
||||
return new NotFoundResponse();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -55,6 +55,7 @@ $application->registerRoutes($this, [
|
|||
['name' => 'OCJS#getConfig', 'url' => '/core/js/oc.js', 'verb' => 'GET'],
|
||||
['name' => 'Preview#getPreview', 'url' => '/core/preview', 'verb' => 'GET'],
|
||||
['name' => 'Preview#getPreview', 'url' => '/core/preview.png', 'verb' => 'GET'],
|
||||
['name' => 'Css#getCss', 'url' => '/css/{fileName}', 'verb' => 'GET'],
|
||||
],
|
||||
'ocs' => [
|
||||
['root' => '/cloud', 'name' => 'OCS#getCapabilities', 'url' => '/capabilities', 'verb' => 'GET'],
|
||||
|
|
|
@ -95,6 +95,11 @@ class DIContainer extends SimpleContainer implements IAppContainer {
|
|||
return $this->getServer()->getAvatarManager();
|
||||
});
|
||||
|
||||
|
||||
$this->registerService('OCP\\ICssManager', function($c) {
|
||||
return $this->getServer()->getCssManager();
|
||||
});
|
||||
|
||||
$this->registerService('OCP\\Activity\\IManager', function($c) {
|
||||
return $this->getServer()->getActivityManager();
|
||||
});
|
||||
|
|
|
@ -0,0 +1,63 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2016, John Molakvoæ (skjnldsv@protonmail.com)
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OC;
|
||||
|
||||
use OCP\Files\IAppData;
|
||||
use OCP\Files\NotFoundException;
|
||||
use OCP\ICssManager;
|
||||
|
||||
/**
|
||||
* This class implements methods to access SCSS cached files
|
||||
*/
|
||||
class CssManager implements ICssManager {
|
||||
|
||||
/** @var IAppData */
|
||||
private $appData;
|
||||
|
||||
/**
|
||||
* CssManager constructor.
|
||||
*
|
||||
* @param IAppData $appData
|
||||
*/
|
||||
public function __construct(IAppData $appData) {
|
||||
$this->appData = $appData;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the css file and return ISimpleFile
|
||||
*
|
||||
* @param string $fileName css filename with extension
|
||||
* @return ISimpleFile
|
||||
*/
|
||||
public function getCss($fileName) {
|
||||
try {
|
||||
$folder = $this->appData->getFolder('css');
|
||||
} catch(NotFoundException $e) {
|
||||
throw new NotFoundException();
|
||||
}
|
||||
try {
|
||||
return $folder->getFile($fileName);
|
||||
} catch(NotFoundException $e) {
|
||||
throw new NotFoundException();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -417,6 +417,11 @@ class Server extends ServerContainer implements IServerContainer {
|
|||
$c->getConfig()
|
||||
);
|
||||
});
|
||||
$this->registerService('CssManager', function (Server $c) {
|
||||
return new CssManager(
|
||||
$c->getAppDataDir('server')
|
||||
);
|
||||
});
|
||||
$this->registerService('Logger', function (Server $c) {
|
||||
$logClass = $c->query('AllConfig')->getSystemValue('log_type', 'file');
|
||||
// TODO: Drop backwards compatibility for config in the future
|
||||
|
@ -908,6 +913,16 @@ class Server extends ServerContainer implements IServerContainer {
|
|||
return $this->query('AvatarManager');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the css manager
|
||||
*
|
||||
* @return \OCP\ICssManager
|
||||
*/
|
||||
public function getCssManager() {
|
||||
return $this->query('CssManager');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the root folder of ownCloud's data directory
|
||||
*
|
||||
|
|
|
@ -29,6 +29,13 @@ class CSSResourceLocator extends ResourceLocator {
|
|||
|
||||
protected $appData;
|
||||
|
||||
/**
|
||||
* @param \OCP\ILogger $logger
|
||||
* @param string $theme
|
||||
* @param array $core_map
|
||||
* @param array $party_map
|
||||
* @param IAppData $appData
|
||||
*/
|
||||
public function __construct(\OCP\ILogger $logger, $theme, $core_map, $party_map, $appData) {
|
||||
$this->appData = $appData;
|
||||
parent::__construct($logger, $theme, $core_map, $party_map);
|
||||
|
|
|
@ -111,6 +111,7 @@ abstract class ResourceLocator {
|
|||
*
|
||||
* @param string $root path to check
|
||||
* @param string $file the filename
|
||||
* @param IAppData $appData the appData folder
|
||||
* @param string|null $webRoot base for path, default map $root to $webRoot
|
||||
* @return bool True if the resource was found and cached, false otherwise
|
||||
*/
|
||||
|
|
|
@ -30,19 +30,21 @@ class SCSSCacher {
|
|||
protected $root;
|
||||
protected $folder;
|
||||
protected $file;
|
||||
protected $fileName;
|
||||
protected $fileNameSCSS;
|
||||
protected $fileNameCSS;
|
||||
protected $fileLoc;
|
||||
protected $fileCache;
|
||||
protected $rootCssLoc;
|
||||
|
||||
/** @var \OCP\ILogger */
|
||||
protected $logger;
|
||||
/** @var \OCP\Files\IAppData */
|
||||
protected $appData;
|
||||
|
||||
/**
|
||||
* @param \OCP\ILogger $logger
|
||||
* @param string $root
|
||||
* @param string $file
|
||||
* @param \OCP\Files\IAppData $appData
|
||||
*/
|
||||
public function __construct(\OCP\ILogger $logger, $root, $file, $appData) {
|
||||
$this->logger = $logger;
|
||||
|
@ -50,8 +52,10 @@ class SCSSCacher {
|
|||
$this->root = $root;
|
||||
$this->file = explode('/', $root.'/'.$file);
|
||||
|
||||
/* filenames */
|
||||
$this->fileNameSCSS = array_pop($this->file);
|
||||
$this->fileNameCSS = str_replace('.scss', '.css', $this->fileNameSCSS);
|
||||
|
||||
$this->fileLoc = implode('/', $this->file);
|
||||
|
||||
// base uri to css file
|
||||
|
@ -67,6 +71,10 @@ class SCSSCacher {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Process the caching process if needed
|
||||
* @return boolean
|
||||
*/
|
||||
public function process() {
|
||||
|
||||
if($this->is_cached()) {
|
||||
|
@ -77,6 +85,10 @@ class SCSSCacher {
|
|||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the file is cached or not
|
||||
* @return boolean
|
||||
*/
|
||||
private function is_cached() {
|
||||
try{
|
||||
$cachedfile = $this->folder->getFile($this->fileNameCSS);
|
||||
|
@ -90,6 +102,10 @@ class SCSSCacher {
|
|||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cache the file with AppData
|
||||
* @return boolean
|
||||
*/
|
||||
private function cache() {
|
||||
$scss = new Compiler();
|
||||
$scss->setImportPaths($this->fileLoc);
|
||||
|
@ -108,6 +124,7 @@ class SCSSCacher {
|
|||
$cachedfile = $this->folder->newFile($this->fileNameCSS);
|
||||
}
|
||||
|
||||
// Compile
|
||||
try {
|
||||
$compiledScss = $scss->compile('@import "'.$this->fileNameSCSS.'";');
|
||||
} catch(ParserException $e) {
|
||||
|
@ -115,20 +132,32 @@ class SCSSCacher {
|
|||
return false;
|
||||
}
|
||||
|
||||
if($cachedfile->putContent($this->rebaseUrls($compiledScss))) {
|
||||
$this->logger->debug($root.'/'.$file.' compiled and successfully cached', ['app' => 'SCSSPHP']);
|
||||
try {
|
||||
$cachedfile->putContent($this->rebaseUrls($compiledScss));
|
||||
$this->logger->debug($this->rootCssLoc.'/'.$this->fileNameSCSS.' compiled and successfully cached', ['app' => 'SCSSPHP']);
|
||||
return true;
|
||||
} catch(NotFoundException $e) {
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the correct uri prefix to make uri valid again
|
||||
* @param string $css
|
||||
* @return string
|
||||
*/
|
||||
private function rebaseUrls($css) {
|
||||
$re = '/url\([\'"](.*)[\'"]\)/x';
|
||||
$subst = 'url(\'../'.$this->rootCssLoc.'/$1\')';
|
||||
$subst = 'url(\'../../../'.$this->rootCssLoc.'/$1\')';
|
||||
return preg_replace($re, $subst, $css);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the cached css file uri
|
||||
* @return string
|
||||
*/
|
||||
public function getCachedSCSS() {
|
||||
return $this->fileCache;
|
||||
return "index.php/css/".$this->fileNameCSS;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2016, John Molakvoæ (skjnldsv@protonmail.com)
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCP;
|
||||
|
||||
/**
|
||||
* This class provides scss functionality
|
||||
* @since 11.0.0
|
||||
*/
|
||||
|
||||
interface ICssManager {
|
||||
|
||||
/**
|
||||
* Get the css file and return ISimpleFile
|
||||
*
|
||||
* @param string $fileName css filename with extension
|
||||
* @return ISimpleFile
|
||||
*/
|
||||
public function getCss($fileName);
|
||||
}
|
Loading…
Reference in New Issue