about summary refs log tree commit diff
path: root/app/lib/themes.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/lib/themes.rb')
-rw-r--r--app/lib/themes.rb75
1 files changed, 73 insertions, 2 deletions
diff --git a/app/lib/themes.rb b/app/lib/themes.rb
index 243ffb9ab..45ba47780 100644
--- a/app/lib/themes.rb
+++ b/app/lib/themes.rb
@@ -7,10 +7,81 @@ class Themes
   include Singleton
 
   def initialize
-    @conf = YAML.load_file(Rails.root.join('config', 'themes.yml'))
+    core = YAML.load_file(Rails.root.join('app', 'javascript', 'core', 'theme.yml'))
+    core['pack'] = {} unless core['pack']
+
+    result = {}
+    Rails.root.glob('app/javascript/flavours/*/theme.yml') do |pathname|
+      data = YAML.load_file(pathname)
+      next unless data['pack']
+
+      dir = pathname.dirname
+      name = dir.basename.to_s
+      locales = []
+      screenshots = []
+
+      if data['locales']
+        Dir.glob(File.join(dir, data['locales'], '*.{js,json}')) do |locale|
+          locale_name = File.basename(locale, File.extname(locale))
+          locales.push(locale_name) unless /defaultMessages|whitelist|index/.match?(locale_name)
+        end
+      end
+
+      if data['screenshot']
+        if data['screenshot'].is_a? Array
+          screenshots = data['screenshot']
+        else
+          screenshots.push(data['screenshot'])
+        end
+      end
+
+      data['name'] = name
+      data['locales'] = locales
+      data['screenshot'] = screenshots
+      data['skin'] = { 'default' => [] }
+      result[name] = data
+    end
+
+    Rails.root.glob('app/javascript/skins/*/*') do |pathname|
+      ext = pathname.extname.to_s
+      skin = pathname.basename.to_s
+      name = pathname.dirname.basename.to_s
+      next unless result[name]
+
+      if pathname.directory?
+        pack = []
+        pathname.glob('*.{css,scss}') do |sheet|
+          pack.push(sheet.basename(sheet.extname).to_s)
+        end
+      elsif /^\.s?css$/i.match?(ext)
+        skin = pathname.basename(ext).to_s
+        pack = ['common']
+      end
+
+      result[name]['skin'][skin] = pack if skin != 'default'
+    end
+
+    @core = core
+    @conf = result
+  end
+
+  attr_reader :core
+
+  def flavour(name)
+    @conf[name]
   end
 
-  def names
+  def flavours
     @conf.keys
   end
+
+  def skins_for(name)
+    @conf[name]['skin'].keys
+  end
+
+  def flavours_and_skins
+    flavours.map do |flavour|
+      [flavour, skins_for(flavour).map { |skin| [flavour, skin] }]
+    end
+  end
 end