#!/usr/bin/env ruby # https://developer.valvesoftware.com/wiki/Bind # https://developer.valvesoftware.com/wiki/List_of_L4D2_Cvars keys = [ { ingame: 'escape', short: 'ESC', title: 'Escape', keycap: 'ESC', }, { ingame: 'tab', short: 'TAB', title: 'Tabulator', keycap: '↹', }, { ingame: 'capslock', short: 'CAPS', title: 'Capslock', keycap: '⇪', }, { ingame: 'shift', short: 'SFT', title: 'Shift', keycap: '⇧', }, { ingame: 'ctrl', short: 'CTL', title: 'Control', keycap: 'CTL', }, { ingame: 'alt', short: 'ALT', title: 'ALT', keycap: 'ALT', }, { ingame: 'space', short: 'SPC', title: 'Space', keycap: 'SPACE', }, { ingame: 'backspace', short: 'BSP', title: 'Backspace', keycap: '⇦', }, { ingame: 'enter', short: 'ENT', title: 'Enter', keycap: '↵', }, { ingame: 'semicolon', short: ';', title: 'Semicolon', keycap: ';', }, { ingame: 'lwin', short: 'LWIN', title: 'Left Super', keycap: '⊞', }, { ingame: 'rwin', short: 'RWIN', title: 'Right Super', keycap: '⊞', }, { ingame: 'apps', short: 'MENU', title: 'Menu', keycap: '≡', }, { ingame: 'numlock', short: 'NUM', title: 'Numlock', keycap: 'NUM', }, { ingame: 'scrolllock', short: 'SCR', title: 'Scrollock', keycap: 'SCR', }, { ingame: 'uparrow', short: 'ARU', title: 'Arrow Up', keycap: '↑', }, { ingame: 'downarrow', short: 'ARD', title: 'Arrow Down', keycap: '↓', }, { ingame: 'leftarrow', short: 'ARL', title: 'Arrow Left', keycap: '←', }, { ingame: 'rightarrow', short: 'ARR', title: 'Arrow Right', keycap: '→', }, { ingame: 'ins', short: 'INS', title: 'Insert', keycap: 'INS', }, { ingame: 'del', short: 'DEL', title: 'Delete', keycap: 'DEL', }, { ingame: 'pgdn', short: 'PGD', title: 'Page Down', keycap: '⇣', }, { ingame: 'pgup', short: 'PGU', title: 'Page Up', keycap: '⇡', }, { ingame: 'home', short: 'HOM', title: 'Home', keycap: '⌂', }, { ingame: 'end', short: 'END', title: 'End', keycap: '⇥', }, { ingame: 'pause', short: 'PAU', title: 'Pause', keycap: '⏸', }, { ingame: 'kp_end', short: 'N1', title: 'Keypad 1 (End)', keycap: '1', }, { ingame: 'kp_downarrow', short: 'N2', title: 'Keypad 2 (Arrow Down)', keycap: '2', }, { ingame: 'kp_pgdn', short: 'N3', title: 'Keypad 3 (Page Down)', keycap: '3', }, { ingame: 'kp_leftarrow', short: 'N4', title: 'Keypad 4 (Arrow Left)', keycap: '4', }, { ingame: 'kp_5', short: 'N5', title: 'Keypad 5', keycap: '5', }, { ingame: 'kp_rightarrow', short: 'N6', title: 'Keypad 6 (Arrow Right)', keycap: '6', }, { ingame: 'kp_home', short: 'N7', title: 'Keypad 7 (Home)', keycap: '7', }, { ingame: 'kp_uparrow', short: 'N8', title: 'Keypad 8 (Arrow Up)', keycap: '8', }, { ingame: 'kp_pgup', short: 'N9', title: 'Keypad 9 (Page Up)', keycap: '9', }, { ingame: 'kp_enter', short: 'NENT', title: 'Keypad Enter', keycap: '↵', }, { ingame: 'kp_ins', short: 'NINS', title: 'Keypad 0', keycap: '0', }, { ingame: 'kp_del', short: 'NDEL', title: 'Keypad .', keycap: '.', }, { ingame: 'kp_slash', short: 'NSL', title: 'Keypad /', keycap: '/', }, { ingame: 'kp_multiply', short: 'NMUL', title: 'Keypad *', keycap: '*', }, { ingame: 'kp_minus', short: 'NMIN', title: 'Keypad -', keycap: '-', }, { ingame: 'kp_plus', short: 'NPLS', title: 'Keypad +', keycap: '+', }, { ingame: 'mwheeldown', short: 'WLD', title: 'Mousewheel Down', keycap: '⇟', }, { ingame: 'mwheelup', short: 'WLU', title: 'Mousewheel Up', keycap: '⇞', }, { ingame: 'mouse1', short: 'M1', title: 'Mouse 1', keycap: '🖱️1', }, { ingame: 'mouse2', short: 'M2', title: 'Mouse 2', keycap: '🖱️2', }, { ingame: 'mouse3', short: 'M3', title: 'Mouse 3', keycap: '🖱️3', }, { ingame: 'mouse4', short: 'M4', title: 'Mouse 4', keycap: '🖱️4', }, { ingame: 'mouse5', short: 'M5', title: 'Mouse 5', keycap: '🖱️5', }, ] %(0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜß,.+-*/#^´<>).each_char do |char| keys.append({ ingame: char, short: char, title: char, keycap: char, }) end (1..12).each do |num| keys.append({ ingame: "F#{num}", short: "F#{num}", title: "Function #{num}", keycap: "F#{num}", }) end keycaps = { 'h1': { width: 1, points: '-0.44,-0.44 0.44,-0.44 0.44,0.44 -0.44,0.44', }, 'h1.25': { width: 1.25, points: '-0.565,-0.44 0.565,-0.44 0.565,0.44 -0.565,0.44', }, 'h1.5': { width: 1.5, points: '-0.69,-0.44 0.69,-0.44 0.69,0.44 -0.69,0.44', }, 'h1.75': { width: 1.75, points: '-0.815,-0.44 0.815,-0.44 0.815,0.44 -0.815,0.44', }, 'h2': { width: 2, points: '-0.94,-0.44 0.94,-0.44 0.94,0.44 -0.94,0.44', }, 'h2.5': { width: 2.5, points: '-1.19,-0.44 1.19,-0.44 1.19,0.44 -1.19,0.44', }, 'h2.75': { width: 2.75, points: '-1.315,-0.44 1.315,-0.44 1.315,0.44 -1.315,0.44', }, 'h6.5': { width: 6.5, points: '-3.19,-0.44 3.19,-0.44 3.19,0.44 -3.19,0.44', }, 'v2': { width: 1, points: '-0.44,-0.44 0.44,-0.44 0.44,1.44 -0.44,1.44', }, 'enter_iso': { width: 1.5, points: '-0.69,-0.44 0.69,-0.44 0.69,1.44 -0.44,1.44 -0.44,0.44 -0.69,0.44', }, } keyboard = { 0 => 'ESC :1 F1 F2 F3 F4 :.5 F5 F6 F7 F8 :.5 F9 F10 F11 F12 :.25 PNT ROL PAU', 1.25 => '^ 1 2 3 4 5 6 7 8 9 0 ß ´ BSP:h2 :.25 INS HOM PGU :.25 NUM / * -', 2.25 => 'TAB:h1.5 Q W E R T Z U I O P Ü + ENT:enter_iso :.25 DEL END PGD :.25 7 8 9 +:v2', 3.25 => 'CAPS:h1.75 A S D F G H J K L Ö Ä # :1.25 :.25 :1 :1 :1 :.25 4 5 6', 4.25 => 'SFT:h1.25 < Y X C V B N M , . - SFT:h2.75 :.25 :1 ARU :1 :.25 1 2 3 ENT:v2', 5.25 => 'CTL:h1.25 LWIN:h1.25 ALT:h1.25 SPC:h6.5 AGR:h1.25 RWIN:h1.25 MENU CTL:h1.25 :.25 ARL ARD ARR :.25 0:h2 DEL' } keyboard_keys = [] total_h = 0 total_v = 0 keyboard.each do |row_v, row_text| row_h = 0 row_text.split.each do |element| if element.start_with? ':' row_h += element[1..].to_f else short, keycap = element.split(':') key = keys.find{|k| k[:short] == short} keycap ||= :h1 keyboard_keys.append({ is_known: !!key, label: key ? key[:keycap] : short, keycap: keycap, x: row_h + keycaps[keycap.to_sym][:width]/2.0, y: 0.5 + row_v, }) row_h += keycaps[keycap.to_sym][:width] end end total_h = [total_h, row_h].max total_v = [total_v, row_v].max end require "erb" html = ERB.new(File.read(File.join(__dir__, 'keyboard.erb'))).result_with_hash({keys: keyboard_keys, total_h: total_h, total_v: total_v+1}) File.write(File.join(__dir__, 'keyboard.html'), html)