in src/theme.ts [73:164]
export function parseTheme(source: IRawTheme | undefined): ParsedThemeRule[] {
if (!source) {
return [];
}
if (!source.settings || !Array.isArray(source.settings)) {
return [];
}
let settings = source.settings;
let result: ParsedThemeRule[] = [], resultLen = 0;
for (let i = 0, len = settings.length; i < len; i++) {
let entry = settings[i];
if (!entry.settings) {
continue;
}
let scopes: string[];
if (typeof entry.scope === 'string') {
let _scope = entry.scope;
// remove leading commas
_scope = _scope.replace(/^[,]+/, '');
// remove trailing commans
_scope = _scope.replace(/[,]+$/, '');
scopes = _scope.split(',');
} else if (Array.isArray(entry.scope)) {
scopes = entry.scope;
} else {
scopes = [''];
}
let fontStyle: number = FontStyle.NotSet;
if (typeof entry.settings.fontStyle === 'string') {
fontStyle = FontStyle.None;
let segments = entry.settings.fontStyle.split(' ');
for (let j = 0, lenJ = segments.length; j < lenJ; j++) {
let segment = segments[j];
switch (segment) {
case 'italic':
fontStyle = fontStyle | FontStyle.Italic;
break;
case 'bold':
fontStyle = fontStyle | FontStyle.Bold;
break;
case 'underline':
fontStyle = fontStyle | FontStyle.Underline;
break;
case 'strikethrough':
fontStyle = fontStyle | FontStyle.Strikethrough;
break;
}
}
}
let foreground: string | null = null;
if (typeof entry.settings.foreground === 'string' && isValidHexColor(entry.settings.foreground)) {
foreground = entry.settings.foreground;
}
let background: string | null = null;
if (typeof entry.settings.background === 'string' && isValidHexColor(entry.settings.background)) {
background = entry.settings.background;
}
for (let j = 0, lenJ = scopes.length; j < lenJ; j++) {
let _scope = scopes[j].trim();
let segments = _scope.split(' ');
let scope = segments[segments.length - 1];
let parentScopes: string[] | null = null;
if (segments.length > 1) {
parentScopes = segments.slice(0, segments.length - 1);
parentScopes.reverse();
}
result[resultLen++] = new ParsedThemeRule(
scope,
parentScopes,
i,
fontStyle,
foreground,
background
);
}
}
return result;
}