Fixed icons detection and caching

Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
This commit is contained in:
John Molakvoæ (skjnldsv) 2018-07-04 10:04:38 +02:00 committed by Julius Härtl
parent 8977c71f88
commit 9e5885963c
No known key found for this signature in database
GPG Key ID: 4C614C6ED2CDE6DF
4 changed files with 41 additions and 19 deletions

View File

@ -36,7 +36,7 @@ use OCP\IRequest;
use OCP\IURLGenerator; use OCP\IURLGenerator;
use OCP\IUserManager; use OCP\IUserManager;
use OCP\IUserSession; use OCP\IUserSession;
use OC\Template\SCSSCacher; use OC\Template\IconsCacher;
class AccessibilityController extends Controller { class AccessibilityController extends Controller {
@ -67,6 +67,9 @@ class AccessibilityController extends Controller {
/** @var IAppManager */ /** @var IAppManager */
private $appManager; private $appManager;
/** @var IconsCacher */
protected $iconsCacher;
/** /**
* Account constructor. * Account constructor.
* *
@ -88,7 +91,8 @@ class AccessibilityController extends Controller {
IURLGenerator $urlGenerator, IURLGenerator $urlGenerator,
ITimeFactory $timeFactory, ITimeFactory $timeFactory,
IUserSession $userSession, IUserSession $userSession,
IAppManager $appManager) { IAppManager $appManager,
IconsCacher $iconsCacher) {
parent::__construct($appName, $request); parent::__construct($appName, $request);
$this->appName = $appName; $this->appName = $appName;
$this->config = $config; $this->config = $config;
@ -98,6 +102,7 @@ class AccessibilityController extends Controller {
$this->timeFactory = $timeFactory; $this->timeFactory = $timeFactory;
$this->userSession = $userSession; $this->userSession = $userSession;
$this->appManager = $appManager; $this->appManager = $appManager;
$this->iconsCacher = $iconsCacher;
$this->serverRoot = \OC::$SERVERROOT; $this->serverRoot = \OC::$SERVERROOT;
$this->appRoot = $this->appManager->getAppPath($this->appName); $this->appRoot = $this->appManager->getAppPath($this->appName);
@ -148,7 +153,12 @@ class AccessibilityController extends Controller {
// Rebase all urls // Rebase all urls
$appWebRoot = substr($this->appRoot, strlen($this->serverRoot) - strlen(\OC::$WEBROOT)); $appWebRoot = substr($this->appRoot, strlen($this->serverRoot) - strlen(\OC::$WEBROOT));
$css = $this->rebaseUrls($css, $appWebRoot . '/css'); $css = $this->rebaseUrls($css, $appWebRoot . '/css');
if ($this->iconsCacher->getCachedCSS() && $this->iconsCacher->getCachedCSS()->getSize() > 0) {
$iconsCss = $this->invertSvgIconsColor($this->iconsCacher->getCachedCSS()->getContent());
$css = $css . $iconsCss;
}
$response = new DataDisplayResponse($css, Http::STATUS_OK, ['Content-Type' => 'text/css']); $response = new DataDisplayResponse($css, Http::STATUS_OK, ['Content-Type' => 'text/css']);
@ -200,4 +210,14 @@ class AccessibilityController extends Controller {
return preg_replace($re, $subst, $css); return preg_replace($re, $subst, $css);
} }
/**
* Remove all matches from the $rule regex
*
* @param string $css string to parse
* @return string
*/
private function invertSvgIconsColor(string $css) {
return str_replace(['/000', '/fff'], ['/fff', '/000'], $css);
}
} }

View File

@ -31,7 +31,6 @@ use OCP\AppFramework\Http\NotFoundResponse;
use OCP\AppFramework\Utility\ITimeFactory; use OCP\AppFramework\Utility\ITimeFactory;
use OCP\Files\NotFoundException; use OCP\Files\NotFoundException;
use OCP\IRequest; use OCP\IRequest;
use OC\Template\IconsCacher;
class SvgController extends Controller { class SvgController extends Controller {
@ -41,18 +40,13 @@ class SvgController extends Controller {
/** @var ITimeFactory */ /** @var ITimeFactory */
protected $timeFactory; protected $timeFactory;
/** @var IconsCacher */
protected $iconsCacher;
public function __construct(string $appName, public function __construct(string $appName,
IRequest $request, IRequest $request,
ITimeFactory $timeFactory, ITimeFactory $timeFactory) {
IconsCacher $iconsCacher) {
parent::__construct($appName, $request); parent::__construct($appName, $request);
$this->serverRoot = \OC::$SERVERROOT; $this->serverRoot = \OC::$SERVERROOT;
$this->timeFactory = $timeFactory; $this->timeFactory = $timeFactory;
$this->iconsCacher = $iconsCacher;
} }
/** /**
@ -68,7 +62,7 @@ class SvgController extends Controller {
*/ */
public function getSvgFromCore(string $folder, string $fileName, string $color = 'ffffff') { public function getSvgFromCore(string $folder, string $fileName, string $color = 'ffffff') {
$path = $this->serverRoot . "/core/img/$folder/$fileName.svg"; $path = $this->serverRoot . "/core/img/$folder/$fileName.svg";
return $this->getSvg($path, $color); return $this->getSvg($path, $color, $fileName);
} }
/** /**
@ -94,7 +88,7 @@ class SvgController extends Controller {
return new NotFoundResponse(); return new NotFoundResponse();
} }
$path = $this->serverRoot . $appPath ."/img/$fileName.svg"; $path = $this->serverRoot . $appPath ."/img/$fileName.svg";
return $this->getSvg($path, $color); return $this->getSvg($path, $color, $fileName);
} }
@ -105,7 +99,7 @@ class SvgController extends Controller {
* @param string $color * @param string $color
* @return DataDisplayResponse|NotFoundException * @return DataDisplayResponse|NotFoundException
*/ */
private function getSvg(string $path, string $color) { private function getSvg(string $path, string $color, string $fileName) {
if (!file_exists($path)) { if (!file_exists($path)) {
return new NotFoundResponse(); return new NotFoundResponse();
} }

View File

@ -90,7 +90,7 @@ class Group implements IGroup {
public function getDisplayName() { public function getDisplayName() {
if (is_null($this->displayName)) { if (is_null($this->displayName)) {
return $this->gid.'-name'; return $this->gid;
} }
return $this->displayName; return $this->displayName;
} }

View File

@ -45,7 +45,7 @@ class IconsCacher {
protected $urlGenerator; protected $urlGenerator;
/** @var string */ /** @var string */
private $iconVarRE = '/--([a-z-]+): url\("([a-z0-9-\/]+)[^;]+;/m'; private $iconVarRE = '/--([a-z0-9-]+): url\(["\']([a-z0-9-\/]+)[^;]+;/m';
/** @var string */ /** @var string */
private $fileName = 'icons-vars.css'; private $fileName = 'icons-vars.css';
@ -84,12 +84,17 @@ class IconsCacher {
* @param string $css * @param string $css
*/ */
public function setIconsCss(string $css) { public function setIconsCss(string $css) {
try { try {
$data = $this->folder->getFile($this->fileName)->getContent(); $currentData = $this->folder->getFile($this->fileName)->getContent();
} catch (NotFoundException $e) { } catch (NotFoundException $e) {
$data = ''; $currentData = '';
} }
$icons = $this->getIconsFromCss($data . $css);
// remove :root
$currentData = str_replace([':root {', '}'], '', $currentData);
$icons = $this->getIconsFromCss($currentData . $css);
$data = ''; $data = '';
foreach ($icons as $icon => $url) { foreach ($icons as $icon => $url) {
@ -127,7 +132,10 @@ class IconsCacher {
public function injectCss() { public function injectCss() {
// Only inject once // Only inject once
foreach (\OC_Util::$headers as $header) { foreach (\OC_Util::$headers as $header) {
if (strpos($header['attributes']['href'], $this->fileName) !== false) { if (
array_key_exists('attributes', $header) &&
array_key_exists('href', $header['attributes']) &&
strpos($header['attributes']['href'], $this->fileName) !== false) {
return; return;
} }
} }