-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkeystats.js
153 lines (130 loc) · 4.43 KB
/
keystats.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/* Javascript rewrite of the java applet originally written by Jon A. Maxwell
Naveed Ahmed
*/
function CKeyStats(name, keymap){
this.distanceTotal = 0;
this.sameHandTotal = 0;
this.sameFingerTotal = 0;
this.keysTotal = 0;
this.learningCost = 0;
this.rowTotal = [];// = new int[Keyboard.ROWS];
this.lhTotal = []; //= new int[5]; //fingers on lh
this.rhTotal = []; //;= new int[5];
this.name = name;
this.keyboard = new CKeyboard(keymap);
}
CKeyStats.prototype.calculate = function(text){
// reset counters
var keyboard = this.keyboard;
this.distanceTotal = this.sameHandTotal = this.sameFingerTotal = this.keysTotal = 0;
if(this.name != "qwerty")
this.learningCost = keyboard.calculateLearningCost();
var i=0;
for (i=0; i < keyboard.ROWS; i++)
{
this.rowTotal[i] = 0;
}
for (i=0; i < 5; i++)
{
this.lhTotal[i] = this.rhTotal[i] = 0;
}
var distancePrev = 0.0;
var row, col;
var rowPrev = -1, colPrev = -1;
var finger;
var fingerPrev = null;
var fingerNum;
var fingerNumPrev = -1;
for (i=0; i < text.length; i++) {
var k = keyboard.locate(text.charAt(i));
if (k == null)
continue;
row = k.y;
col = k.x;
finger = keyboard.closestFinger(row, col);
fingerNum = finger.number;
this.keysTotal++;
this.rowTotal[row]++;
if (finger.hand == CFinger.RIGHTHAND)
this.rhTotal[fingerNum]++;
if (finger.hand == CFinger.LEFTHAND)
this.lhTotal[fingerNum]++;
// sameHandTotal
if (null != fingerPrev)
// repeated key doesn't count toward same hand
if (row != rowPrev || col != colPrev)
if (finger.hand == fingerPrev.hand)
// thumb doesn't count as either hand
if (fingerNum != CFinger.THUMB && fingerNumPrev != CFinger.THUMB)
this.sameHandTotal++;
// sameFingerTotal
if (null != fingerPrev)
// repeated key doesn't count toward same finger
// (and so thumb won't ever count since it only hits space)
if (row != rowPrev || col != colPrev)
if (finger == fingerPrev)
this.sameFingerTotal++;
// distanceTotal
var distance = keyboard.distanceKeyFinger(row, col);
if (finger != fingerPrev) {
this.distanceTotal += distancePrev; // prev finger moves back to home
this.distanceTotal += distance; // and this finger moves to key
} else {
// same finger, so it moves from prev key to this key
// note that distancePrev is always the distance from home row
// finger to previous key not the distance between these two
this.distanceTotal += keyboard.distanceKeys(row,col,rowPrev, colPrev);
}
// set prev from current
distancePrev = distance;
fingerPrev = finger;
fingerNumPrev = fingerNum;
rowPrev = row;
colPrev = col;
} // for each char
};
CKeyStats.prototype.displayStats = function(resultsDiv) {
// total non-space (row 5) keys
var rowTotal = this.rowTotal;
var top4rowTotal = rowTotal[0] + rowTotal[1] + rowTotal[2] + rowTotal[3];
var i=0;
resultsDiv.find(".totalKeys").text(this.keysTotal);
resultsDiv.find(".learning-cost").text(this.learningCost);
// row percents
// percent of non-space keys
for (i=0; i<4; i++) {
if (top4rowTotal > 0)
resultsDiv.find(".row" + i).text( numeral(rowTotal[i]/top4rowTotal).format("0.0%"));
else
resultsDiv.find(".row" + i).text("0%");
}
// finger percents: lhTotal, rhTotal
// percent of non-space keys
if (top4rowTotal > 0) {
var s = "";
for (i=0; i<4; i++)
{
s = s.concat(" " + numeral(this.lhTotal[i]/top4rowTotal).format("0.0%"));
}
s = s.concat(" -- ");
for (i=0; i<4; i++)
{
s = s.concat(" " + numeral(this.rhTotal[i]/top4rowTotal).format("0.0%"));
}
resultsDiv.find(".fingers").text(s);
}
else
{
resultsDiv.find(".fingers").text(" 0% 0% 0% 0% -- 0% 0% 0% 0%");
}
resultsDiv.find(".distance").text(numeral(this.distanceTotal).format("0,0.000"));
// same hand percent, same finger percent
// percent of non-space keys
if (top4rowTotal > 0) {
resultsDiv.find(".sameHand").text(numeral(this.sameHandTotal/top4rowTotal).format("0.0%"));
resultsDiv.find(".sameFinger").text(numeral(this.sameFingerTotal/top4rowTotal).format("0.0%"));
} else {
resultsDiv.find(".sameHand").text("0%");
resultsDiv.find(".sameFinger").text("0%");
}
};