#!/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