vscToTm.js (42 lines of code) (raw):
const json5 = require('json5')
const plist = require('plist')
const fs = require('fs')
function convert(vscTheme) {
const tmTheme = {
name: vscTheme.name,
settings: vscTheme.tokenColors
}
const defaultSettings = tmTheme.settings.find(setting => !setting.scope);
if (!defaultSettings) {
tmTheme.settings.unshift({ settings: {}});
}
const tmThemeDefaultSettings = tmTheme.settings[0].settings;
const vscThemeColors = vscTheme.colors;
const mapper = new SettingsMapper({tmThemeDefaultSettings, vscThemeColors});
mapper.addSetting("editorCursor.foreground", "caret");
mapper.addSetting("editor.selectionBackground", "selection");
mapper.addSetting("editor.lineHighlightBackground", "lineHighlight");
mapper.addSetting("editor.foreground", "foreground");
mapper.addSetting("editor.background", "background");
mapper.addSetting("editorWhitespace.foreground", "invisibles");
for (i = 1; i < tmTheme.settings.length; i++) {
const scope = tmTheme.settings[i].scope
if (scope) {
tmTheme.settings[i].scope = scope.toString()
}
}
return tmTheme
}
class SettingsMapper {
constructor({ tmThemeDefaultSettings, vscThemeColors }) {
this.tmThemeDefaultSettings = tmThemeDefaultSettings;
this.vscThemeColors = vscThemeColors;
}
addSetting(fromKey, toKey) {
if (fromKey in this.vscThemeColors) {
this.tmThemeDefaultSettings[toKey] = this.vscThemeColors[fromKey]
}
}
}
const vscTheme = json5.parse(fs.readFileSync(process.argv[2], "utf8"))
fs.writeFileSync(process.argv[3], plist.build(convert(vscTheme)))