Initial commit
This commit is contained in:
commit
b9c6b52198
|
@ -0,0 +1,9 @@
|
|||
root = true
|
||||
|
||||
[*.cr]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
trim_trailing_whitespace = true
|
|
@ -0,0 +1,5 @@
|
|||
/docs/
|
||||
/lib/
|
||||
/bin/
|
||||
/.shards/
|
||||
*.dwarf
|
|
@ -0,0 +1,5 @@
|
|||
[`~] [1!][2@][3#][4$][5%][6^][7&][8*][9(][0)][-_][=+] |<-|
|
||||
|tab| [q][w][e][r][t][y][u][i][o][p][\[{][\]}][\\|]
|
||||
|caps| [a][s][d][f][g][h][j][k][l][;:]['"] |enter|
|
||||
|shift| [z][x][c][v][b][n][m][,<][.>][/?] |shift|
|
||||
|ctrl| |sys| |alt| [ ] |alt| |fn| |ctrl|
|
|
@ -0,0 +1,13 @@
|
|||
name: keysmash-analyzer
|
||||
version: 0.1.0
|
||||
|
||||
authors:
|
||||
- Agatha Rose <agatharose@wantscuddl.es>
|
||||
|
||||
targets:
|
||||
keysmash-analyzer:
|
||||
main: src/keysmash-analyzer.cr
|
||||
|
||||
crystal: 0.35.1
|
||||
|
||||
license: MIT
|
|
@ -0,0 +1,42 @@
|
|||
class Keyboard
|
||||
property layout
|
||||
property raw_layout : String
|
||||
# path to layout file
|
||||
setter name : String
|
||||
|
||||
def initialize(@name)
|
||||
# character and frequency
|
||||
@layout = {} of Char => Int32
|
||||
@raw_layout = File.read(name)
|
||||
i = 0
|
||||
c = @raw_layout.chars
|
||||
# iterates over characters in layout
|
||||
while i < c.size
|
||||
# outputs a hashmap of characters inside [] in the layout and sets each to 0 uses
|
||||
if c[i] == '['
|
||||
until c[i+1] == ']'
|
||||
# character escape
|
||||
if c[i+1] == '\\'
|
||||
i += 1
|
||||
end
|
||||
@layout[c[i += 1]] = 0
|
||||
end
|
||||
end
|
||||
i += 1
|
||||
end
|
||||
end
|
||||
|
||||
def to_s(io : IO)
|
||||
# remove character escapes
|
||||
formatted = @raw_layout.gsub(/\\(\S)/, &.[1])
|
||||
# defines heatmap colors
|
||||
colors = %i(default light_yellow yellow light_red red)
|
||||
# add a keypress heatmap
|
||||
max = @layout.to_a.sort_by { |k, v| v }.reverse.to_h.values[0]
|
||||
formatted = formatted.gsub(/\[(.{1,2})\]/) {|m|
|
||||
# calculate proportion of key usage to colors
|
||||
m.colorize.fore(:white).back(colors[((@layout[m.chars[1]] * (colors.size - 1)) / max).to_i])
|
||||
}
|
||||
io << formatted
|
||||
end
|
||||
end
|
|
@ -0,0 +1,22 @@
|
|||
require "./keyboard.cr"
|
||||
require "colorize"
|
||||
|
||||
module KeysmashAnalyzer
|
||||
VERSION = "0.1.0"
|
||||
# uses ANSI escape codes to suggest default layout
|
||||
print "Please enter path to a layout: \x1b[s#{"layouts/en_us.txt".colorize(:dark_gray)}\x1b[u"
|
||||
input = gets
|
||||
# fall back to en_us.txt if no input is provided
|
||||
input = "layouts/en_us.txt" if input.nil? || input.blank?
|
||||
keyboard = Keyboard.new input
|
||||
print "Please keysmash into your terminal: "
|
||||
keysmash = gets
|
||||
exit if keysmash.nil?
|
||||
keysmash = keysmash.downcase
|
||||
# set usage frequency for each char
|
||||
keysmash.chars.each do |c|
|
||||
keyboard.layout[c] += 1
|
||||
end
|
||||
# print the heatmap
|
||||
puts keyboard
|
||||
end
|
Loading…
Reference in New Issue