Refactor glitch-soc's theme handling
This commit is contained in:
		
							parent
							
								
									07cb948f39
								
							
						
					
					
						commit
						30d9abdfc9
					
				| @ -73,70 +73,6 @@ class ApplicationController < ActionController::Base | |||||||
|     new_user_session_path |     new_user_session_path | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def pack(data, pack_name, skin = 'default') |  | ||||||
|     return nil unless pack?(data, pack_name) |  | ||||||
|     pack_data = { |  | ||||||
|       common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.flavour(current_flavour) : Themes.instance.core, 'common', skin), |  | ||||||
|       flavour: data['name'], |  | ||||||
|       pack: pack_name, |  | ||||||
|       preload: nil, |  | ||||||
|       skin: nil, |  | ||||||
|       supported_locales: data['locales'], |  | ||||||
|     } |  | ||||||
|     if data['pack'][pack_name].is_a?(Hash) |  | ||||||
|       pack_data[:common] = nil if data['pack'][pack_name]['use_common'] == false |  | ||||||
|       pack_data[:pack] = nil unless data['pack'][pack_name]['filename'] |  | ||||||
|       if data['pack'][pack_name]['preload'] |  | ||||||
|         pack_data[:preload] = [data['pack'][pack_name]['preload']] if data['pack'][pack_name]['preload'].is_a?(String) |  | ||||||
|         pack_data[:preload] = data['pack'][pack_name]['preload'] if data['pack'][pack_name]['preload'].is_a?(Array) |  | ||||||
|       end |  | ||||||
|       if skin != 'default' && data['skin'][skin] |  | ||||||
|         pack_data[:skin] = skin if data['skin'][skin].include?(pack_name) |  | ||||||
|       else  #  default skin |  | ||||||
|         pack_data[:skin] = 'default' if data['pack'][pack_name]['stylesheet'] |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|     pack_data |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def pack?(data, pack_name) |  | ||||||
|     if data['pack'].is_a?(Hash) && data['pack'].key?(pack_name) |  | ||||||
|       return true if data['pack'][pack_name].is_a?(String) || data['pack'][pack_name].is_a?(Hash) |  | ||||||
|     end |  | ||||||
|     false |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def nil_pack(data, pack_name, skin = 'default') |  | ||||||
|     { |  | ||||||
|       common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.flavour(current_flavour) : Themes.instance.core, 'common', skin), |  | ||||||
|       flavour: data['name'], |  | ||||||
|       pack: nil, |  | ||||||
|       preload: nil, |  | ||||||
|       skin: nil, |  | ||||||
|       supported_locales: data['locales'], |  | ||||||
|     } |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def resolve_pack(data, pack_name, skin = 'default') |  | ||||||
|     result = pack(data, pack_name, skin) |  | ||||||
|     unless result |  | ||||||
|       if data['name'] && data.key?('fallback') |  | ||||||
|         if data['fallback'].nil? |  | ||||||
|           return nil_pack(data, pack_name, skin) |  | ||||||
|         elsif data['fallback'].is_a?(String) && Themes.instance.flavour(data['fallback']) |  | ||||||
|           return resolve_pack(Themes.instance.flavour(data['fallback']), pack_name) |  | ||||||
|         elsif data['fallback'].is_a?(Array) |  | ||||||
|           data['fallback'].each do |fallback| |  | ||||||
|             return resolve_pack(Themes.instance.flavour(fallback), pack_name) if Themes.instance.flavour(fallback) |  | ||||||
|           end |  | ||||||
|         end |  | ||||||
|         return nil_pack(data, pack_name, skin) |  | ||||||
|       end |  | ||||||
|       return data.key?('name') && data['name'] != Setting.default_settings['flavour'] ? resolve_pack(Themes.instance.flavour(Setting.default_settings['flavour']), pack_name) : nil_pack(data, pack_name, skin) |  | ||||||
|     end |  | ||||||
|     result |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def use_pack(pack_name) |   def use_pack(pack_name) | ||||||
|     @core = resolve_pack(Themes.instance.core, pack_name) |     @core = resolve_pack(Themes.instance.core, pack_name) | ||||||
|     @theme = resolve_pack(Themes.instance.flavour(current_flavour), pack_name, current_skin) |     @theme = resolve_pack(Themes.instance.flavour(current_flavour), pack_name, current_skin) | ||||||
| @ -223,4 +159,68 @@ class ApplicationController < ActionController::Base | |||||||
|       format.json { render json: { error: Rack::Utils::HTTP_STATUS_CODES[code] }, status: code } |       format.json { render json: { error: Rack::Utils::HTTP_STATUS_CODES[code] }, status: code } | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  | 
 | ||||||
|  |   private | ||||||
|  | 
 | ||||||
|  |   def valid_pack?(data, pack_name) | ||||||
|  |     data['pack'].is_a?(Hash) && [String, Hash].any? { |c| data['pack'][pack_name].is_a?(c) } | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def nil_pack(data, pack_name, skin) | ||||||
|  |     { | ||||||
|  |       common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.flavour(current_flavour) : Themes.instance.core, 'common', skin), | ||||||
|  |       flavour: data['name'], | ||||||
|  |       pack: nil, | ||||||
|  |       preload: nil, | ||||||
|  |       skin: nil, | ||||||
|  |       supported_locales: data['locales'], | ||||||
|  |     } | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def pack(data, pack_name, skin) | ||||||
|  |     pack_data = { | ||||||
|  |       common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.flavour(current_flavour) : Themes.instance.core, 'common', skin), | ||||||
|  |       flavour: data['name'], | ||||||
|  |       pack: pack_name, | ||||||
|  |       preload: nil, | ||||||
|  |       skin: nil, | ||||||
|  |       supported_locales: data['locales'], | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return pack_data unless data['pack'][pack_name].is_a?(Hash) | ||||||
|  | 
 | ||||||
|  |     pack_data[:common] = nil if data['pack'][pack_name]['use_common'] == false | ||||||
|  |     pack_data[:pack] = nil unless data['pack'][pack_name]['filename'] | ||||||
|  | 
 | ||||||
|  |     preloads = data['pack'][pack_name]['preload'] | ||||||
|  |     pack_data[:preload] = [preloads] if preloads.is_a?(String) | ||||||
|  |     pack_data[:preload] = preloads if preloads.is_a?(Array) | ||||||
|  | 
 | ||||||
|  |     if skin != 'default' && data['skin'][skin] | ||||||
|  |       pack_data[:skin] = skin if data['skin'][skin].include?(pack_name) | ||||||
|  |     else # default skin | ||||||
|  |       pack_data[:skin] = 'default' if data['pack'][pack_name]['stylesheet'] | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     pack_data | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def resolve_pack(data, pack_name, skin = 'default') | ||||||
|  |     return pack(data, pack_name, skin) if valid_pack?(data, pack_name) | ||||||
|  |     return nil_pack(data, pack_name, skin) if data['name'].blank? | ||||||
|  | 
 | ||||||
|  |     fallbacks = [] | ||||||
|  |     if data.key?('fallback') | ||||||
|  |       fallbacks = data['fallback'] if data['fallback'].is_a?(Array) | ||||||
|  |       fallbacks = [data['fallback']] if data['fallback'].is_a?(String) | ||||||
|  |     elsif data['name'] != Setting.default_settings['flavour'] | ||||||
|  |       fallbacks = [Setting.default_settings['flavour']] | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     fallbacks.each do |fallback| | ||||||
|  |       return resolve_pack(Themes.instance.flavour(fallback), pack_name) if Themes.instance.flavour(fallback) | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     nil_pack(data, pack_name, skin) | ||||||
|  |   end | ||||||
| end | end | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user