diff --git a/package.json b/package.json index 1e839d4..7e4819f 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,11 @@ "label": "Omni", "uiTheme": "vs-dark", "path": "./theme/omni.json" + }, + { + "label": "Omni (No italic)", + "uiTheme": "vs-dark", + "path": "./theme/omni-no-italic.json" } ] }, diff --git a/scripts/build.js b/scripts/build.js index 1c7ef64..44747f9 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -3,19 +3,66 @@ const path = require('path'); const generate = require('./generate'); const THEME_DIR = path.join(__dirname, '..', 'theme'); +const BASE_THEME_FILENAME = 'omni.json'; +const NO_ITALIC_THEME_FILENAME = 'omni-no-italic.json'; if (!fs.existsSync(THEME_DIR)) { fs.mkdirSync(THEME_DIR); } +const removeItalics = (theme) => { + const clone = JSON.parse(JSON.stringify(theme)); + + clone.name = 'Omni (No italic)'; + + const stripFontStyle = (settings) => { + if (!settings || typeof settings.fontStyle !== 'string') { + return; + } + + const styles = settings.fontStyle + .split(/\s+/) + .map((style) => style.trim()) + .filter((style) => style && style.toLowerCase() !== 'italic'); + + if (styles.length === 0) { + delete settings.fontStyle; + } else { + settings.fontStyle = styles.join(' '); + } + }; + + if (Array.isArray(clone.tokenColors)) { + clone.tokenColors.forEach((token) => stripFontStyle(token.settings)); + } + + if ( + clone.semanticTokenColors && + typeof clone.semanticTokenColors === 'object' + ) { + Object.values(clone.semanticTokenColors).forEach((tokenSetting) => { + if (tokenSetting && typeof tokenSetting === 'object') { + stripFontStyle(tokenSetting); + } + }); + } + + return clone; +}; + module.exports = async () => { const { base } = await generate(); + const noItalic = removeItalics(base); return Promise.all([ fs.promises.writeFile( - path.join(THEME_DIR, 'omni.json'), + path.join(THEME_DIR, BASE_THEME_FILENAME), JSON.stringify(base, null, 4) ), + fs.promises.writeFile( + path.join(THEME_DIR, NO_ITALIC_THEME_FILENAME), + JSON.stringify(noItalic, null, 4) + ), ]); };