require 'rake' require 'color' require_relative 'controls' require_relative 'page-color' module DHE SOURCE_DIR = '/panels' class PageWithoutAFile < Jekyll::Page def read_yaml(*) @data ||= {} end end class Generator < Jekyll::Generator include DHE::PageColor def generate(site) module_pages = site.pages.select {|page| page.url.start_with? SOURCE_DIR} module_pages.each do |module_page| site.pages += control_pages(module_page) site.pages << image_page(module_page) end end def control_page(module_page, control) page = PageWithoutAFile.new(module_page.site, __dir__, module_page.url.pathmap("%{^#{SOURCE_DIR},controls}X"), control.name.ext('svg')) page.data['layout'] = 'control' page.data['width'] = control.width page.data['height'] = control.height page.content = control.svg page end def control_pages(module_page) controls(module_page).map {|control| control_page(module_page, control)} end def controls(page) page.data['controls'].flat_map {|type, variants| send(type, page, variants)} end def image_page(module_page) page = PageWithoutAFile.new(module_page.site, __dir__, module_page.url.pathmap("%{^#{SOURCE_DIR},images}d"), module_page.name) page.data.merge!(module_page.data) page.data['draw_controls'] = true page.data['dark'] = dark(page) page.data['light'] = light(page) page.content = module_page.content page end def buttons(page, variants) variants.flat_map do |style| [:off, :on].map do |state| ButtonControl.new(style: style, state: state, dark: dark(page), light: light(page)) end end end def ports(page, _) PortControl.new(metal_color: light(page), shadow_color: dark(page)) end def knobs(page, _) KnobControl.new(knob_color: dark(page), pointer_color: light(page)) end def switches(page, variants) variants.flat_map do |positions| states = [:high, :low] states << :mid if positions == 3 states.map do |state| SwitchControl.new(positions: positions, state: state, dark: dark(page), light: light(page)) end end end end end