|
|
@@ -111,8 +111,9 @@ class AccessibilityController extends Controller { |
|
|
|
public function getCss(): DataDisplayResponse { |
|
|
|
$css = ''; |
|
|
|
$imports = ''; |
|
|
|
$userValues = $this->getUserValues(); |
|
|
|
|
|
|
|
foreach ($this->getUserValues() as $key => $scssFile) { |
|
|
|
foreach ($userValues as $key => $scssFile) { |
|
|
|
if ($scssFile !== false) { |
|
|
|
$imports .= '@import "' . $scssFile . '";'; |
|
|
|
} |
|
|
@@ -144,6 +145,16 @@ class AccessibilityController extends Controller { |
|
|
|
// We don't want to override vars with url since path is different |
|
|
|
$css = $this->filterOutRule('/--[a-z-:]+url\([^;]+\)/mi', $css); |
|
|
|
|
|
|
|
// Calculate exact absolute path to file |
|
|
|
$path = $this->urlGenerator->linkToRoute($this->appName . '.accessibility.getCss', ['md5' => md5(implode('-', $userValues))]); |
|
|
|
$path = explode('/', $this->serverRoot . $path); |
|
|
|
array_pop($path); |
|
|
|
$path = implode('/', $path); |
|
|
|
$webDir = $this->getWebDir($path, $this->appName, $this->serverRoot, \OC::$WEBROOT); |
|
|
|
|
|
|
|
// Rebase all urls |
|
|
|
$css = $this->rebaseUrls($css, $webDir); |
|
|
|
|
|
|
|
$response = new DataDisplayResponse($css, Http::STATUS_OK, ['Content-Type' => 'text/css']); |
|
|
|
|
|
|
|
// Set cache control |
|
|
@@ -158,15 +169,60 @@ class AccessibilityController extends Controller { |
|
|
|
return $response; |
|
|
|
} |
|
|
|
|
|
|
|
private function getUserValues() { |
|
|
|
/** |
|
|
|
* Return an array with the user theme & font settings |
|
|
|
* |
|
|
|
* @return array |
|
|
|
*/ |
|
|
|
private function getUserValues(): array{ |
|
|
|
$userTheme = $this->config->getUserValue($this->userSession->getUser()->getUID(), $this->appName, 'theme', false); |
|
|
|
$userFont = $this->config->getUserValue($this->userSession->getUser()->getUID(), $this->appName, 'font', false); |
|
|
|
|
|
|
|
return [$userTheme, $userFont]; |
|
|
|
} |
|
|
|
|
|
|
|
private function filterOutRule(string $rule, string $css) { |
|
|
|
/** |
|
|
|
* Remove all matches from the $rule regex |
|
|
|
* |
|
|
|
* @param string $rule regex to match |
|
|
|
* @param string $css string to parse |
|
|
|
* @return string |
|
|
|
*/ |
|
|
|
private function filterOutRule(string $rule, string $css): string { |
|
|
|
return preg_replace($rule, '', $css); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Add the correct uri prefix to make uri valid again |
|
|
|
* |
|
|
|
* @param string $css |
|
|
|
* @param string $webDir |
|
|
|
* @return string |
|
|
|
*/ |
|
|
|
private function rebaseUrls(string $css, string $webDir): string { |
|
|
|
$re = '/url\([\'"]([^\/][\.\w?=\/-]*)[\'"]\)/x'; |
|
|
|
$subst = 'url(\'' . $webDir . '/$1\')'; |
|
|
|
|
|
|
|
return preg_replace($re, $subst, $css); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Get WebDir root |
|
|
|
* @param string $path the css file path |
|
|
|
* @param string $appName the app name |
|
|
|
* @param string $serverRoot the server root path |
|
|
|
* @param string $webRoot the nextcloud installation root path |
|
|
|
* @return string the webDir |
|
|
|
*/ |
|
|
|
private function getWebDir(string $path, string $appName, string $serverRoot, string $webRoot): string { |
|
|
|
// Detect if path is within server root AND if path is within an app path |
|
|
|
if ( strpos($path, $serverRoot) === false && $appWebPath = \OC_App::getAppWebPath($appName)) { |
|
|
|
// Get the file path within the app directory |
|
|
|
$appDirectoryPath = explode($appName, $path)[1]; |
|
|
|
// Remove the webroot |
|
|
|
return str_replace($webRoot, '', $appWebPath.$appDirectoryPath); |
|
|
|
} |
|
|
|
return $webRoot.substr($path, strlen($serverRoot)); |
|
|
|
} |
|
|
|
|
|
|
|
} |