You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					115 lines
				
				3.6 KiB
			
		
		
			
		
	
	
					115 lines
				
				3.6 KiB
			| 
											3 years ago
										 | 'use strict' | ||
|  | var objectAssign = require('object-assign') | ||
|  | 
 | ||
|  | module.exports = function () { | ||
|  |   return ThemeSetProto.newThemeSet() | ||
|  | } | ||
|  | 
 | ||
|  | var ThemeSetProto = {} | ||
|  | 
 | ||
|  | ThemeSetProto.baseTheme = require('./base-theme.js') | ||
|  | 
 | ||
|  | ThemeSetProto.newTheme = function (parent, theme) { | ||
|  |   if (!theme) { | ||
|  |     theme = parent | ||
|  |     parent = this.baseTheme | ||
|  |   } | ||
|  |   return objectAssign({}, parent, theme) | ||
|  | } | ||
|  | 
 | ||
|  | ThemeSetProto.getThemeNames = function () { | ||
|  |   return Object.keys(this.themes) | ||
|  | } | ||
|  | 
 | ||
|  | ThemeSetProto.addTheme = function (name, parent, theme) { | ||
|  |   this.themes[name] = this.newTheme(parent, theme) | ||
|  | } | ||
|  | 
 | ||
|  | ThemeSetProto.addToAllThemes = function (theme) { | ||
|  |   var themes = this.themes | ||
|  |   Object.keys(themes).forEach(function (name) { | ||
|  |     objectAssign(themes[name], theme) | ||
|  |   }) | ||
|  |   objectAssign(this.baseTheme, theme) | ||
|  | } | ||
|  | 
 | ||
|  | ThemeSetProto.getTheme = function (name) { | ||
|  |   if (!this.themes[name]) throw this.newMissingThemeError(name) | ||
|  |   return this.themes[name] | ||
|  | } | ||
|  | 
 | ||
|  | ThemeSetProto.setDefault = function (opts, name) { | ||
|  |   if (name == null) { | ||
|  |     name = opts | ||
|  |     opts = {} | ||
|  |   } | ||
|  |   var platform = opts.platform == null ? 'fallback' : opts.platform | ||
|  |   var hasUnicode = !!opts.hasUnicode | ||
|  |   var hasColor = !!opts.hasColor | ||
|  |   if (!this.defaults[platform]) this.defaults[platform] = {true: {}, false: {}} | ||
|  |   this.defaults[platform][hasUnicode][hasColor] = name | ||
|  | } | ||
|  | 
 | ||
|  | ThemeSetProto.getDefault = function (opts) { | ||
|  |   if (!opts) opts = {} | ||
|  |   var platformName = opts.platform || process.platform | ||
|  |   var platform = this.defaults[platformName] || this.defaults.fallback | ||
|  |   var hasUnicode = !!opts.hasUnicode | ||
|  |   var hasColor = !!opts.hasColor | ||
|  |   if (!platform) throw this.newMissingDefaultThemeError(platformName, hasUnicode, hasColor) | ||
|  |   if (!platform[hasUnicode][hasColor]) { | ||
|  |     if (hasUnicode && hasColor && platform[!hasUnicode][hasColor]) { | ||
|  |       hasUnicode = false | ||
|  |     } else if (hasUnicode && hasColor && platform[hasUnicode][!hasColor]) { | ||
|  |       hasColor = false | ||
|  |     } else if (hasUnicode && hasColor && platform[!hasUnicode][!hasColor]) { | ||
|  |       hasUnicode = false | ||
|  |       hasColor = false | ||
|  |     } else if (hasUnicode && !hasColor && platform[!hasUnicode][hasColor]) { | ||
|  |       hasUnicode = false | ||
|  |     } else if (!hasUnicode && hasColor && platform[hasUnicode][!hasColor]) { | ||
|  |       hasColor = false | ||
|  |     } else if (platform === this.defaults.fallback) { | ||
|  |       throw this.newMissingDefaultThemeError(platformName, hasUnicode, hasColor) | ||
|  |     } | ||
|  |   } | ||
|  |   if (platform[hasUnicode][hasColor]) { | ||
|  |     return this.getTheme(platform[hasUnicode][hasColor]) | ||
|  |   } else { | ||
|  |     return this.getDefault(objectAssign({}, opts, {platform: 'fallback'})) | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | ThemeSetProto.newMissingThemeError = function newMissingThemeError (name) { | ||
|  |   var err = new Error('Could not find a gauge theme named "' + name + '"') | ||
|  |   Error.captureStackTrace.call(err, newMissingThemeError) | ||
|  |   err.theme = name | ||
|  |   err.code = 'EMISSINGTHEME' | ||
|  |   return err | ||
|  | } | ||
|  | 
 | ||
|  | ThemeSetProto.newMissingDefaultThemeError = function newMissingDefaultThemeError (platformName, hasUnicode, hasColor) { | ||
|  |   var err = new Error( | ||
|  |     'Could not find a gauge theme for your platform/unicode/color use combo:\n' + | ||
|  |     '    platform = ' + platformName + '\n' + | ||
|  |     '    hasUnicode = ' + hasUnicode + '\n' + | ||
|  |     '    hasColor = ' + hasColor) | ||
|  |   Error.captureStackTrace.call(err, newMissingDefaultThemeError) | ||
|  |   err.platform = platformName | ||
|  |   err.hasUnicode = hasUnicode | ||
|  |   err.hasColor = hasColor | ||
|  |   err.code = 'EMISSINGTHEME' | ||
|  |   return err | ||
|  | } | ||
|  | 
 | ||
|  | ThemeSetProto.newThemeSet = function () { | ||
|  |   var themeset = function (opts) { | ||
|  |     return themeset.getDefault(opts) | ||
|  |   } | ||
|  |   return objectAssign(themeset, ThemeSetProto, { | ||
|  |     themes: objectAssign({}, this.themes), | ||
|  |     baseTheme: objectAssign({}, this.baseTheme), | ||
|  |     defaults: JSON.parse(JSON.stringify(this.defaults || {})) | ||
|  |   }) | ||
|  | } |