BetterDiscordApp-v2/client/src/modules/thememanager.js

130 lines
3.7 KiB
JavaScript
Raw Normal View History

2018-01-30 16:59:27 +01:00
/**
* BetterDiscord Theme Manager Module
* Copyright (c) 2015-present Jiiks/JsSucks - https://github.com/Jiiks / https://github.com/JsSucks
* All rights reserved.
* https://betterdiscord.net
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import ContentManager from './contentmanager';
import Theme from './theme';
2018-01-30 16:59:27 +01:00
export default class ThemeManager extends ContentManager {
2018-01-30 16:59:27 +01:00
static get localThemes() {
return this.localContent;
}
2018-02-13 17:57:05 +01:00
static get contentType() {
return 'theme';
}
static get moduleName() {
return 'Theme Manager';
}
2018-01-30 16:59:27 +01:00
static get pathId() {
return 'themes';
}
2018-02-21 18:46:27 +01:00
static get loadAllThemes() { return this.loadAllContent }
static get refreshThemes() { return this.refreshContent }
2018-01-30 16:59:27 +01:00
2018-02-05 15:19:24 +01:00
static get loadContent() { return this.loadTheme }
static async loadTheme(paths, configs, info, main) {
try {
const instance = new Theme({
2019-03-12 20:47:55 +01:00
configs, info, main, paths
});
2018-03-08 03:41:47 +01:00
if (instance.enabled) {
instance.userConfig.enabled = false;
instance.enable();
}
2018-02-05 15:19:24 +01:00
return instance;
} catch (err) {
throw err;
}
}
static get deleteTheme() { return this.deleteContent }
2018-02-21 18:46:27 +01:00
static get unloadTheme() { return this.unloadContent }
2018-02-22 17:19:35 +01:00
static async reloadTheme(theme) {
theme = await this.reloadContent(theme);
theme.recompile();
}
2018-02-21 18:46:27 +01:00
static enableTheme(theme) {
2018-03-22 03:13:32 +01:00
return theme.enable();
}
static disableTheme(theme) {
2018-03-22 03:13:32 +01:00
return theme.disable();
}
2018-02-21 18:46:27 +01:00
static get isTheme() { return this.isThisContent }
static isThisContent(theme) {
return theme instanceof Theme;
}
/**
* Returns a representation of a settings set's values in SCSS.
* @param {SettingsSet} settingsset The set to convert to SCSS
* @return {Promise}
*/
static async getConfigAsSCSS(settingsset) {
const variables = [];
2018-08-15 08:01:47 +02:00
for (const category of settingsset.categories) {
for (const setting of category.settings) {
2018-02-21 01:14:06 +01:00
const setting_scss = await this.parseSetting(setting);
if (setting_scss) variables.push(`$${setting_scss[0]}: ${setting_scss[1]};`);
2018-02-12 01:44:12 +01:00
}
}
2018-02-12 01:44:12 +01:00
return variables.join('\n');
}
/**
* Returns a representation of a settings set's values as an SCSS map.
* @param {SettingsSet} settingsset The set to convert to an SCSS map
* @return {Promise}
*/
static async getConfigAsSCSSMap(settingsset) {
const variables = [];
2018-08-15 08:01:47 +02:00
for (const category of settingsset.categories) {
for (const setting of category.settings) {
2018-02-21 01:14:06 +01:00
const setting_scss = await this.parseSetting(setting);
if (setting_scss) variables.push(`${setting_scss[0]}: (${setting_scss[1]})`);
}
}
2018-08-15 08:01:47 +02:00
return `(${variables.join(', ')})`;
}
/**
* Returns a setting's name and value as a string that can be included in SCSS.
* @param {Setting} setting The setting to convert to SCSS
* @return {Promise}
*/
2018-02-21 01:14:06 +01:00
static async parseSetting(setting) {
2018-07-18 21:57:05 +02:00
const name = setting.id.replace(/[^a-zA-Z0-9-]/g, '-').replace(/--/g, '-');
2018-03-01 20:00:24 +01:00
const scss = await setting.toSCSS();
2018-03-01 20:00:24 +01:00
if (scss) return [name, scss];
}
/**
* Escapes a string so it can be included in SCSS.
* @param {String} value The string to escape
* @return {String}
*/
static toSCSSString(value) {
if (typeof value !== 'string' && value.toString) value = value.toString();
return `'${typeof value === 'string' ? value.replace(/\\/g, '\\\\').replace(/'/g, '\\\'') : ''}'`;
}
2018-01-30 16:59:27 +01:00
}