diff options
Diffstat (limited to 'app/lib/themes.rb')
-rw-r--r-- | app/lib/themes.rb | 75 |
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 |