#!/usr/bin/ruby require 'erb' require 'fileutils' require 'json' require 'shellwords' include FileUtils def die!(msg) warn msg exit 1 end def render_template(template, attrs = {}) context = Class.new(OpenStruct).new(**attrs).instance_eval('binding') ERB.new(template, trim_mode: '-').result(context) end def gen_font_confs(fonts, out_dir = '.') out_dir = File.expand_path(out_dir) mkdir_p(out_dir) Dir.chdir(__dir__) do template = File.read('45-noto.xml.erb') fonts.each do |subpkg, data| conf_name = "45-noto#{'-' + subpkg if subpkg != '@'}.conf" conf = if File.exists?(conf_name) File.read(conf_name) else render_template(template, data: data) end File.write(File.join(out_dir, conf_name), conf) end end Dir.chdir(__dir__) do template = File.read('58-noto.xml.erb') data = fonts .values .flat_map { _1['fonts'] } .group_by { _1['alias'] } conf = render_template(template, data: data) File.write(File.join(out_dir, '58-noto.conf'), conf) cp '58-noto-math.conf', File.join(out_dir, '58-noto-math.conf') end end fonts = JSON.load_file(File.join(__dir__, 'noto-meta.json')) case (action = ARGV[0]) when 'list-subpkgs' puts fonts.keys.select { _1 != '@' }.sort_by { [-_1.size, _1] } when 'gen-font-confs' gen_font_confs(fonts, ARGV[1]) when 'pkgdesc', 'font-basenames' key = ARGV[1].sub(/^font-noto-/, '') data = fonts[key] or die! "unknown font subpkgname: #{ARGV[1]}" case action when 'pkgdesc' puts data['pkgdesc'] when 'font-basenames' puts data['fonts'].map { _1['family'].gsub(' ', '') } end else die! "invalid action: #{action}" end