Files
custum-hyprpanel/scripts/makevivid.js
Jas Singh 9bb582c8cf Added a Vivid theme variant for all themes. (#402)
* Added vivid theme variants

* Update fill theme to handle vivids

* Fixed the network switch color
2024-10-30 01:48:03 -07:00

153 lines
5.6 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const fs = require('fs');
const path = require('path');
/**
* WARN: This script is generated by our good friend Chat Jippity
* It may contain errors and weird behaviors...
* Use at your own discretion
*/
const THEMES_DIR = path.join(__dirname, '../themes');
/**
* Swaps the .icon and .text (or .total) properties with the .background property for a given base path.
* @param {Object} themeData - The original theme JSON data.
* @param {String} basePath - The base path of the properties to swap (e.g., 'theme.bar.buttons.volume').
* @param {Array} additionalTextKeys - Additional property keys to treat as 'text' (e.g., ['total']).
*/
function swapProperties(themeData, basePath, additionalTextKeys = []) {
const iconKey = `${basePath}.icon`;
const backgroundKey = `${basePath}.background`;
const textKeys = additionalTextKeys.map((suffix) => `${basePath}.${suffix}`);
if (themeData.hasOwnProperty(iconKey) && themeData.hasOwnProperty(backgroundKey)) {
const originalIcon = themeData[iconKey];
const originalBackground = themeData[backgroundKey];
themeData[iconKey] = originalBackground;
console.log(`✅ Updated '${iconKey}': '${originalIcon}' -> '${themeData[iconKey]}'`);
themeData[backgroundKey] = originalIcon;
console.log(`✅ Updated '${backgroundKey}': '${originalBackground}' -> '${themeData[backgroundKey]}'`);
textKeys.forEach((textKey) => {
if (themeData.hasOwnProperty(textKey)) {
const originalText = themeData[textKey];
themeData[textKey] = originalBackground;
console.log(`✅ Updated '${textKey}': '${originalText}' -> '${themeData[textKey]}'`);
} else {
console.warn(`⚠️ Property '${textKey}' not found in the theme. Skipping.`);
}
});
console.log('');
} else {
console.warn(`⚠️ Missing '.icon' or '.background' for '${basePath}'. Skipping swap.\n`);
}
}
/**
* Identifies all base paths that match "theme.bar.buttons.*" and "theme.bar.buttons.modules.*"
* and have necessary properties to perform swaps.
* @param {Object} themeData - The original theme JSON data.
* @returns {Array} - An array of objects containing basePath and any additional text-like keys.
*/
function identifyBasePaths(themeData) {
const basePathsMap = new Map();
Object.keys(themeData).forEach((key) => {
const regex = /^theme\.bar\.buttons(?:\.modules)?\.\w+\.(icon|background|text|total)$/;
const match = key.match(regex);
if (match) {
const property = match[1];
const basePath = key.substring(0, key.lastIndexOf('.'));
if (!basePathsMap.has(basePath)) {
basePathsMap.set(basePath, []);
}
if (property === 'text' || property === 'total') {
basePathsMap.get(basePath).push(property);
}
}
});
const basePaths = [];
basePathsMap.forEach((additionalTextKeys, basePath) => {
basePaths.push({ basePath, additionalTextKeys });
});
return basePaths;
}
/**
* Generates a vivid variant of the given theme by swapping specified properties.
* @param {String} originalThemePath - Path to the original theme JSON file.
* @param {String} vividThemePath - Path to save the vivid variant JSON file.
*/
function generateVividTheme(originalThemePath, vividThemePath) {
try {
const data = fs.readFileSync(originalThemePath, 'utf8');
const theme = JSON.parse(data);
const basePathObjects = identifyBasePaths(theme);
if (basePathObjects.length === 0) {
console.warn(`⚠️ No swappable property groups found in '${path.basename(originalThemePath)}'. Skipping.\n`);
return;
}
const vividTheme = { ...theme };
basePathObjects.forEach(({ basePath, additionalTextKeys }) => {
swapProperties(vividTheme, basePath, additionalTextKeys);
});
fs.writeFileSync(vividThemePath, JSON.stringify(vividTheme, null, 4), 'utf8');
console.log(`✅ Created vivid variant: '${path.basename(vividThemePath)}'\n`);
} catch (error) {
console.error(`❌ Error processing '${path.basename(originalThemePath)}': ${error.message}\n`);
}
}
/**
* Main function to process all themes and generate their vivid variants.
*/
function main() {
if (!fs.existsSync(THEMES_DIR)) {
console.error(
`❌ Themes directory not found at '${THEMES_DIR}'. Please ensure it exists and contains theme JSON files.\n`,
);
process.exit(1);
}
const files = fs.readdirSync(THEMES_DIR);
const originalThemes = files.filter((file) => {
return file.endsWith('.json') && !file.includes('_vivid') && !file.includes('_split');
});
if (originalThemes.length === 0) {
console.log(' No eligible theme files found to process.\n');
return;
}
originalThemes.forEach((themeFile) => {
const themeName = path.parse(themeFile).name;
const originalThemePath = path.join(THEMES_DIR, themeFile);
const vividThemeFile = `${themeName}_vivid.json`;
const vividThemePath = path.join(THEMES_DIR, vividThemeFile);
if (fs.existsSync(vividThemePath)) {
console.log(` Vivid variant already exists for '${themeFile}'. Skipping.\n`);
return;
}
console.log(`🔄 Processing '${themeFile}'...`);
generateVividTheme(originalThemePath, vividThemePath);
});
console.log('🎉 All eligible vivid themes have been processed.\n');
}
main();