1
+ /*
2
+ some references:
3
+ https://www.typingtest.com/
4
+ https://first20hours.com/typing/
5
+ https://code.google.com/archive/p/amphetype/
6
+ https://colemak.com/
7
+ https://www.keybr.com/profile
8
+ https://www.typing.com/student/lesson/328/common-english-words
9
+ https://www.speedtypingonline.com/typing-tutor
10
+
11
+ https://www.computerhope.com/issues/ch001346.htm
12
+ https://comp.editors.narkive.com/UFCzZ2RJ/touch-typing-for-programmers
13
+
14
+ How to Calculate Typing Speed (WPM) and Accuracy
15
+ https://www.speedtypingonline.com/typing-equations
16
+
17
+ keyboard finger position
18
+ https://www.computerhope.com/issues/ch001346.htm
19
+ */
20
+
21
+ /*
22
+ PLAN OF ATTACK
23
+ Functions to make sense of
24
+ [x] start_stats
25
+ [x] update_stats
26
+ [ ] set_level
27
+ [ ] set_layout
28
+ [ ] keyHandler
29
+ [ ] next_word
30
+ [ ] level_up
31
+ [x] save
32
+ [x] load
33
+ [ ] render
34
+ [ ] render_layout
35
+ [ ] render_level
36
+ [ ] render_rigor
37
+ [ ] render_stats
38
+ [ ] inc_rigor
39
+ [ ] render_level_bar
40
+ [ ] render_word
41
+ [ ] generate_word
42
+ [x] get_level_chars
43
+ [ ] get_training_chars
44
+ [x] choose
45
+
46
+
47
+
48
+
49
+
50
+ */
1
51
2
52
var data = { } ;
3
53
data . chars = " jfkdlsahgyturieowpqbnvmcxz6758493021`-=[]\\;',./ABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$%^&*()_+{}|:\"<>?" ;
4
54
data . consecutive = 5 ;
5
- data . word_length = 7 ;
55
+ data . word_length = 8 ;
6
56
data . current_layout = "qwerty" ;
7
57
8
58
@@ -26,20 +76,20 @@ $(document).ready(function() {
26
76
$ ( document ) . keypress ( keyHandler ) ;
27
77
} ) ;
28
78
29
- /* TODO */
79
+
30
80
var start_time = 0 ;
31
81
/* - viene chiamata in keyHandler, on keypress
32
82
- div.stats
33
83
*/
34
84
function start_stats ( ) {
35
85
/*
36
86
quando start_time è 0, assegna il tempo in sec
37
- quando start_time è > 0, assegna
87
+ quando start_time è > 0, assegna il momento attuale
38
88
*/
39
89
start_time = start_time || Math . floor ( new Date ( ) . getTime ( ) / 1000 ) ;
40
90
}
41
91
42
- /* TODO */
92
+
43
93
var hpm = 0 ; /* hits per minute */
44
94
var ratio = 0 ;
45
95
var hits_correct = 0 ;
@@ -53,6 +103,7 @@ function update_stats() {
53
103
hpm = Math . floor ( ( hits_correct + hits_wrong ) / ( current_time - start_time ) * 60 ) ;
54
104
/*
55
105
built-in function that "returns false if the argument is positive or negative Infinity or NaN or undefined; otherwise, true."
106
+ if total hits per minute is not a finite number, then set it to 0
56
107
*/
57
108
if ( ! isFinite ( hpm ) ) {
58
109
hpm = 0 ;
@@ -75,19 +126,45 @@ function set_level(l) {
75
126
render ( ) ;
76
127
}
77
128
129
+ /*
130
+ var data = {};
131
+ data.chars = " jfkdlsahgyturieowpqbnvmcxz6758493021`-=[]\\;',./ABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$%^&*()_+{}|:\"<>?";
132
+ data.consecutive = 5;
133
+ data.word_length = 7;
134
+ data.current_layout = "qwerty";
135
+
136
+ var layouts = {};
137
+ layouts["qwerty"] = ...
138
+
139
+ - takes l, layout
140
+ -
141
+
142
+ */
78
143
function set_layout ( l ) {
79
- data . current_layout = l
80
- data . chars = layouts [ l ]
81
- data . in_a_row = { } ;
82
- for ( var i = 0 ; i < data . chars . length ; i ++ ) {
83
- data . in_a_row [ data . chars [ i ] ] = data . consecutive ;
84
- }
85
- data . word_index = 0 ;
86
- data . word_errors = { } ;
87
- data . word = generate_word ( ) ;
88
- data . keys_hit = "" ;
89
- save ( ) ;
90
- render ( ) ;
144
+ /* sovrascrivo il default "qwerty" con l */
145
+ data . current_layout = l
146
+ /* set data.chars alla string a cui punta layouts[l]
147
+ quindi, se layouts[l] è "colemak", data.chars corrisponderà a " ntesiroahdjglpufywqbkvmcxz1234567890'\",.!?:;/@$%&#*()_ABCDEFGHIJKLMNOPQRSTUVWXYZ~+-={}|^<>`[]\\"
148
+ */
149
+ data . chars = layouts [ l ] ;
150
+ data . in_a_row = { } ;
151
+ /*
152
+ {
153
+ " ": 5,
154
+ "n": 5,
155
+ "t": 5,
156
+ ...
157
+ }
158
+ */
159
+ for ( var i = 0 ; i < data . chars . length ; i ++ ) {
160
+ data . in_a_row [ data . chars [ i ] ] = data . consecutive ;
161
+ }
162
+ data . word_index = 0 ;
163
+ data . word_errors = { } ;
164
+ data . word = generate_word ( ) ;
165
+ data . keys_hit = "" ;
166
+ save ( ) ;
167
+ render ( ) ;
91
168
}
92
169
93
170
function keyHandler ( e ) {
@@ -125,14 +202,14 @@ function keyHandler(e) {
125
202
}
126
203
127
204
function next_word ( ) {
128
- if ( get_training_chars ( ) . length == 0 ) {
129
- level_up ( ) ;
130
- }
131
- data . word = generate_word ( ) ;
132
- data . word_index = 0 ;
133
- data . keys_hit = "" ;
134
- data . word_errors = { } ;
135
- update_stats ( ) ;
205
+ if ( get_training_chars ( ) . length == 0 ) {
206
+ level_up ( ) ;
207
+ }
208
+ data . word = generate_word ( ) ;
209
+ data . word_index = 0 ;
210
+ data . keys_hit = "" ;
211
+ data . word_errors = { } ;
212
+ update_stats ( ) ;
136
213
137
214
render ( ) ;
138
215
save ( ) ;
@@ -146,12 +223,18 @@ function level_up() {
146
223
set_level ( l ) ;
147
224
}
148
225
149
- /* TODO */
226
+ /*
227
+ - helper to save data into localStorage.
228
+ - viene usato 4 volte
229
+ */
150
230
function save ( ) {
151
231
localStorage . data = JSON . stringify ( data ) ;
152
232
}
153
233
154
- /* TODO */
234
+ /*
235
+ - retrieve data from localStorage
236
+ - usata 1 volta!
237
+ */
155
238
function load ( ) {
156
239
data = JSON . parse ( localStorage . data ) ;
157
240
}
@@ -290,37 +373,61 @@ function render_word() {
290
373
$ ( "#word" ) . html ( word + "<br>" + keys_hit ) ;
291
374
}
292
375
376
+ /*
377
+ - take nothing
378
+ - return word
379
+ */
293
380
function generate_word ( ) {
294
- word = '' ;
295
- for ( var i = 0 ; i < data . word_length ; i ++ ) {
296
- c = choose ( get_training_chars ( ) ) ;
297
- if ( c != undefined && c != word [ word . length - 1 ] ) {
298
- word += c ;
299
- }
300
- else {
301
- word += choose ( get_level_chars ( ) ) ;
302
- }
381
+ /* manca var, quindi word diventa global */
382
+ word = '' ;
383
+ for ( var i = 0 ; i < data . word_length ; i ++ ) {
384
+ /*
385
+ */
386
+ c = choose ( get_training_chars ( ) ) ;
387
+ if ( c != undefined && c != word [ word . length - 1 ] ) {
388
+ word += c ;
303
389
}
304
- return word ;
390
+ else {
391
+ word += choose ( get_level_chars ( ) ) ;
392
+ }
393
+ }
394
+ return word ;
305
395
}
306
396
307
- /* TODO */
397
+ /*
398
+ if
399
+ chars = " jfkdlsahgyturieowpqbnvmcxz6758493021`-=[]\\;',./ABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$%^&*()_+{}|:\"<>?";
400
+ level = "s"
401
+ then
402
+ return ["j", "f", "k", "d", "l", "s"]
403
+
404
+ return the list of chars to train, according to choosen level
405
+ */
308
406
function get_level_chars ( ) {
309
- return data . chars . slice ( 0 , data . level + 1 ) . split ( '' ) ;
407
+ return data . chars . slice ( 0 , data . level + 1 ) . split ( '' ) ;
310
408
}
311
409
410
+ /* TODO
411
+ -
412
+ */
312
413
function get_training_chars ( ) {
313
- var training_chars = [ ] ;
314
- var level_chars = get_level_chars ( ) ;
315
- for ( var x in level_chars ) {
316
- if ( data . in_a_row [ level_chars [ x ] ] < data . consecutive ) {
317
- training_chars . push ( level_chars [ x ] ) ;
318
- }
414
+ var training_chars = [ ] ;
415
+ var level_chars = get_level_chars ( ) ;
416
+ for ( var x in level_chars ) {
417
+ if ( data . in_a_row [ level_chars [ x ] ] < data . consecutive ) {
418
+ training_chars . push ( level_chars [ x ] ) ;
319
419
}
320
- return training_chars ;
420
+ }
421
+ return training_chars ;
321
422
}
322
423
323
- /* TODO */
424
+ /*
425
+ - guess: a is for array
426
+ - Math.random() mi da un numero random tra 0 e 1
427
+ - Math.random() * a.length mi da un numero random tra 0 e a.length
428
+ - Math.floor(Math.random() * a.length) mi da un numero intero random tra 0 e a.length
429
+ - return a random element of array a
430
+ */
324
431
function choose ( a ) {
325
- return a [ Math . floor ( Math . random ( ) * a . length ) ] ;
432
+ return a [ Math . floor ( Math . random ( ) * a . length ) ] ;
326
433
}
0 commit comments