#!/usr/bin/env ruby # frozen_string_literal: true require 'liquid' require 'fileutils' require 'tmpdir' THEME_NAME = 'iPawbMini' # MAIN_MENU_TITLE = 'iPod mini' MAIN_MENU_TITLE = 'iPawb mini' DEST_DIR = File.join(__dir__, 'dist', THEME_NAME) DEST_ZIP = File.join(__dir__, 'dist', "#{THEME_NAME}.zip") TEMPLATE_PATH = File.join(__dir__, 'templates') BASE_TEMPLATE = 'base.liquid' TEMPLATES = { 'fms.liquid' => "wps/#{THEME_NAME}.fms", 'sbs.liquid' => "wps/#{THEME_NAME}.sbs", 'wps.liquid' => "wps/#{THEME_NAME}.wps" }.freeze THEME_CONFIG = { **TEMPLATES.map { |_, path| [path.split('.').last.downcase, "/.rockbox/#{path}"] }.to_h, 'selector type' => 'bar (inverse)', 'filetype colours' => '-', 'font' => '/.rockbox/fonts/10-Espy Sans-Bold.fnt', 'statusbar' => 'off', 'scrollbar' => 'right', 'scrollbar width' => '9', 'battery display' => 'graphic', 'show icons' => 'on', 'ui viewport' => '-' }.freeze def new_liquid(template_path) Liquid::Template.parse(IO.read(File.join(TEMPLATE_PATH, template_path))) end base_vars = { 'theme_name' => THEME_NAME, 'main_menu_title' => MAIN_MENU_TITLE, 'generated_at' => Time.now.to_s }.freeze if ARGV.include?("clean") puts "===> Removing dest dir" FileUtils.rm_f(DEST_DIR) end FileUtils.mkdir_p(DEST_DIR) GENERATED_FILES = Array.new puts "===> Generating WPS screens" FileUtils.mkdir_p(File.join(DEST_DIR, 'wps')) TEMPLATES.each do |src, dst| vars = base_vars.merge('filename' => src) template = new_liquid(src) content = template.render(**vars).strip assigns = template.instance_assigns.transform_values(&:chomp) result = new_liquid(BASE_TEMPLATE).render( 'content' => content, 'filename' => src, **vars, **assigns ) dest_full = File.join(DEST_DIR, dst) puts "writing #{dest_full} ..." GENERATED_FILES << dest_full File.open(dest_full, 'w') do |f| f.puts result end end puts "===> Generating theme config" FileUtils.mkdir_p(File.join(DEST_DIR, 'themes')) theme_config_path = File.join(DEST_DIR, 'themes', "#{THEME_NAME}.cfg") GENERATED_FILES << theme_config_path File.open(theme_config_path, 'w') do |f| f.puts "# #{THEME_NAME} Rockbox theme" f.puts "# Generated using gen_theme.rb at #{base_vars['generated_at']}" f.puts THEME_CONFIG.each do |key, value| f.puts "#{key}: #{value}" end end def copy(kind, pattern, dest_dir) source_files = Dir[*pattern] return if source_files.empty? puts "===> Copying #{kind}" FileUtils.mkdir_p(dest_dir) source_files.each do |source_file| dest_file = File.join(dest_dir, File.basename(source_file)) GENERATED_FILES << dest_file puts dest_file FileUtils.cp(source_file, dest_file) end end copy :fonts, File.join(__dir__, 'fonts', '*.fnt'), File.join(DEST_DIR, 'fonts') copy :images, File.join(__dir__, 'images', '*.bmp'), File.join(DEST_DIR, 'wps', THEME_NAME) if ARGV.include?("package") puts "===> Creating zip archive for distribution ..." FileUtils.rm_f DEST_ZIP rootdir = __dir__ dirs = GENERATED_FILES.map { |x| File.dirname(x.sub("#{rootdir}/dist/iPawbMini", '.rockbox')) }.uniq Dir.mktmpdir do |tmpdir| Dir.chdir(tmpdir) do dirs.each do |d| puts "mkdir\t#{d}" FileUtils.mkdir_p(d) end GENERATED_FILES.each do |source_file| dest_file = source_file.sub("#{rootdir}/dist/iPawbMini", '.rockbox') puts "cp\t#{source_file} -> #{dest_file}" FileUtils.cp(source_file, dest_file) end zip_command = ["zip", DEST_ZIP, "-r", ".rockbox"] puts zip_command.join(' ') system *zip_command end end end