|  | require 'rake/clean'
require 'pathname'
def inkscape(from:, to:)
  from = from.expand_path.to_s
  to = to.expand_path.to_s
  sh '/Applications/Inkscape.app/Contents/Resources/script', '--export-text-to-path', "--export-plain-svg=#{to}", from
end
MODULE_TO_FILENAME = {}
$modules_dir = Pathname('lib/modules')
# Each file instantiates a module, which adds itself to MODULE_TO_FILENAME
FileList.new($modules_dir / '*.rb')
    .each {|file| require_relative file}
$modules = MODULE_TO_FILENAME.keys
$svg_build_dir = Pathname('_svg')
directory $svg_build_dir
$svg_install_dir = Pathname('../svg')
directory $svg_install_dir
$faceplate_file_to_module = Hash[$modules.map {|m| [m.faceplate_file, m]}]
$faceplate_files = $faceplate_file_to_module.keys
$faceplate_build_files = []
$faceplate_install_files = []
$faceplate_files.each do |faceplate_file|
  m = $faceplate_file_to_module[faceplate_file]
  module_source_file = MODULE_TO_FILENAME[m]
  faceplate_build_file = $svg_build_dir / faceplate_file.path
  $faceplate_build_files << faceplate_build_file
  file faceplate_build_file => [$svg_build_dir, module_source_file] do
    faceplate_file.write($svg_build_dir)
  end
  faceplate_install_file = $svg_install_dir / faceplate_file.path
  $faceplate_install_files << faceplate_install_file
  file faceplate_install_file => [$svg_install_dir, faceplate_build_file] do
    inkscape(from: faceplate_build_file, to: faceplate_install_file)
  end
end
$image_install_dir = Pathname('../images')
directory $image_install_dir
$image_build_dir = Pathname('_images')
directory $image_build_dir
$image_file_to_module = Hash[$modules.map {|m| [m.image_file, m]}]
$image_files = $image_file_to_module.keys
$image_build_files = []
$image_install_files = []
$image_files.each do |image_file|
  m = $image_file_to_module[image_file]
  module_source_file = MODULE_TO_FILENAME[m]
  image_build_file = $image_build_dir / image_file.path
  $image_build_files << image_build_file
  file image_build_file => [$image_build_dir, module_source_file] do
    image_file.write($image_build_dir)
  end
  image_install_file = $image_install_dir / image_file.path
  $image_install_files << image_install_file
  file image_install_file => [$image_install_dir, image_build_file] do
    inkscape(from: image_build_file, to: image_install_file)
  end
end
$controls = $modules.flat_map(&:controls)
$control_to_module = Hash[$controls.collect {|c| [c, c.faceplate]}]
$control_file_to_control = Hash[
    $controls
        .flat_map {|control| control.svg_files.map {|svg_file| [svg_file, control]}}
        .uniq {|pair| pair.first.path}
]
$control_files = $control_file_to_control.keys
$control_build_files = []
$control_install_files = []
$control_files.each do |control_file|
  control = $control_file_to_control[control_file]
  m = $control_to_module[control]
  module_source_file = MODULE_TO_FILENAME[m]
  control_build_file = $svg_build_dir / control_file.path
  $control_build_files << control_build_file
  control_install_file = $svg_install_dir / control_file.path
  $control_install_files << control_install_file
  directory control_build_file.parent
  file control_build_file => [module_source_file, control_build_file.parent] do
    control_file.write($svg_build_dir)
  end
  directory control_install_file.parent
  file control_install_file => [control_install_file.parent, control_build_file] do
    if control_file.has_text
      inkscape(from: control_build_file, to: control_install_file)
    else
      cp control_build_file, control_install_file
    end
  end
end
desc 'Build SVG files (does not install)'
task build: $control_build_files + $faceplate_build_files + $image_build_files
desc 'Install SVG files'
task install: $control_install_files + $faceplate_install_files + $image_install_files
desc 'Remove and rebuild SVG files (does not install)'
task fresh: [:clean, :default]
desc 'Remove, rebuild, and reinstall SVG files'
task reinstall: [:clobber, :install]
task default: [:build]
CLEAN.include $image_build_dir, $svg_build_dir
CLOBBER.include $image_install_dir, $svg_install_dir
 |