aboutsummaryrefslogblamecommitdiff
path: root/gen_theme.rb
blob: ed50002718883e05fd367b06a1940ef95d679573 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12




                             
                





                                                 
                                                          































                                                                                          



                               

                           

                           















                                                               
                              






                                                


                                                                      
















                                                                         
                                






                                                                                           























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