@testgorilla/tgo-typing-test 1.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/fesm2022/testgorilla-tgo-typing-test.mjs +795 -811
  2. package/fesm2022/testgorilla-tgo-typing-test.mjs.map +1 -1
  3. package/lib/helpers/config.d.ts +4 -4
  4. package/lib/utils/misc.d.ts +0 -1
  5. package/package.json +6 -8
  6. package/esm2022/index.mjs +0 -3
  7. package/esm2022/lib/components/tgo-typing-replay-input/tgo-typing-replay-input.component.mjs +0 -45
  8. package/esm2022/lib/components/tgo-typing-test/tgo-typing-test.component.mjs +0 -299
  9. package/esm2022/lib/helpers/config.mjs +0 -24
  10. package/esm2022/lib/helpers/constants/default-config.mjs +0 -103
  11. package/esm2022/lib/helpers/controllers/input-controller.mjs +0 -586
  12. package/esm2022/lib/helpers/controllers/quotes-controller.mjs +0 -118
  13. package/esm2022/lib/helpers/observables/config-event.mjs +0 -16
  14. package/esm2022/lib/helpers/observables/timer-event.mjs +0 -16
  15. package/esm2022/lib/helpers/states/active-page.mjs +0 -8
  16. package/esm2022/lib/helpers/states/composition.mjs +0 -20
  17. package/esm2022/lib/helpers/states/page-transition.mjs +0 -8
  18. package/esm2022/lib/helpers/states/slow-timer.mjs +0 -15
  19. package/esm2022/lib/helpers/states/test-active.mjs +0 -8
  20. package/esm2022/lib/helpers/states/time.mjs +0 -11
  21. package/esm2022/lib/helpers/test/caps-warning.mjs +0 -50
  22. package/esm2022/lib/helpers/test/caret.mjs +0 -80
  23. package/esm2022/lib/helpers/test/custom-text.mjs +0 -59
  24. package/esm2022/lib/helpers/test/english-punctuation.mjs +0 -29
  25. package/esm2022/lib/helpers/test/focus.mjs +0 -35
  26. package/esm2022/lib/helpers/test/manual-restart-tracker.mjs +0 -11
  27. package/esm2022/lib/helpers/test/out-of-focus.mjs +0 -14
  28. package/esm2022/lib/helpers/test/replay.mjs +0 -217
  29. package/esm2022/lib/helpers/test/test-input.mjs +0 -264
  30. package/esm2022/lib/helpers/test/test-logic.mjs +0 -927
  31. package/esm2022/lib/helpers/test/test-state.mjs +0 -13
  32. package/esm2022/lib/helpers/test/test-stats.mjs +0 -342
  33. package/esm2022/lib/helpers/test/test-timer.mjs +0 -207
  34. package/esm2022/lib/helpers/test/test-ui.mjs +0 -341
  35. package/esm2022/lib/helpers/test/test-words.mjs +0 -69
  36. package/esm2022/lib/helpers/test/timer-progress.mjs +0 -15
  37. package/esm2022/lib/helpers/test/weak-spot.mjs +0 -65
  38. package/esm2022/lib/helpers/test/wordset.mjs +0 -100
  39. package/esm2022/lib/utils/misc.mjs +0 -673
  40. package/esm2022/testgorilla-tgo-typing-test.mjs +0 -5
@@ -1,100 +0,0 @@
1
- import { randomElementFromArray, randomIntFromRange } from '../../utils/misc';
2
- let currentWordset = null;
3
- let currentWordGenerator = null;
4
- export class Wordset {
5
- words;
6
- length;
7
- constructor(words) {
8
- this.words = words;
9
- this.length = this.words.length;
10
- }
11
- randomWord() {
12
- return randomElementFromArray(this.words);
13
- }
14
- }
15
- const prefixSize = 2;
16
- class CharDistribution {
17
- chars;
18
- count;
19
- constructor() {
20
- this.chars = {};
21
- this.count = 0;
22
- }
23
- addChar(char) {
24
- this.count++;
25
- if (char in this.chars) {
26
- this.chars[char]++;
27
- }
28
- else {
29
- this.chars[char] = 1;
30
- }
31
- }
32
- randomChar() {
33
- const randomIndex = randomIntFromRange(0, this.count - 1);
34
- let runningCount = 0;
35
- for (const [char, charCount] of Object.entries(this.chars)) {
36
- runningCount += charCount;
37
- if (runningCount > randomIndex) {
38
- return char;
39
- }
40
- }
41
- return Object.keys(this.chars)[0];
42
- }
43
- }
44
- class WordGenerator extends Wordset {
45
- ngrams = {};
46
- constructor(words) {
47
- super(words);
48
- // Can generate an unbounded number of words in theory.
49
- this.length = Infinity;
50
- for (let word of words) {
51
- // Mark the end of each word with a space.
52
- word += " ";
53
- let prefix = "";
54
- for (const c of word) {
55
- // Add `c` to the distribution of chars that can come after `prefix`.
56
- if (!(prefix in this.ngrams)) {
57
- this.ngrams[prefix] = new CharDistribution();
58
- }
59
- this.ngrams[prefix].addChar(c);
60
- prefix = (prefix + c).substr(-prefixSize);
61
- }
62
- }
63
- }
64
- randomWord() {
65
- let word = "";
66
- for (;;) {
67
- const prefix = word.substr(-prefixSize);
68
- const charDistribution = this.ngrams[prefix];
69
- if (!charDistribution) {
70
- // This shouldn't happen if this.ngrams is complete. If it does
71
- // somehow, start generating a new word.
72
- word = "";
73
- continue;
74
- }
75
- // Pick a random char from the distribution that comes after `prefix`.
76
- const nextChar = charDistribution.randomChar();
77
- if (nextChar == " ") {
78
- // A space marks the end of the word, so stop generating and return.
79
- break;
80
- }
81
- word += nextChar;
82
- }
83
- return word;
84
- }
85
- }
86
- export function withWords(words, funbox) {
87
- if (funbox == "pseudolang") {
88
- if (currentWordGenerator == null || words !== currentWordGenerator.words) {
89
- currentWordGenerator = new WordGenerator(words);
90
- }
91
- return currentWordGenerator;
92
- }
93
- else {
94
- if (currentWordset == null || words !== currentWordset.words) {
95
- currentWordset = new Wordset(words);
96
- }
97
- return currentWordset;
98
- }
99
- }
100
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZHNldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3Rnby10eXBpbmctdGVzdC9zcmMvbGliL2hlbHBlcnMvdGVzdC93b3Jkc2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTlFLElBQUksY0FBYyxHQUFtQixJQUFJLENBQUM7QUFDMUMsSUFBSSxvQkFBb0IsR0FBeUIsSUFBSSxDQUFDO0FBRXRELE1BQU0sT0FBTyxPQUFPO0lBQ1gsS0FBSyxDQUFXO0lBQ2hCLE1BQU0sQ0FBUztJQUN0QixZQUFZLEtBQWU7UUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUNsQyxDQUFDO0lBRU0sVUFBVTtRQUNmLE9BQU8sc0JBQXNCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVDLENBQUM7Q0FDRjtBQUVELE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQztBQUVyQixNQUFNLGdCQUFnQjtJQUNiLEtBQUssQ0FBNkI7SUFDbEMsS0FBSyxDQUFTO0lBQ3JCO1FBQ0UsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDakIsQ0FBQztJQUVNLE9BQU8sQ0FBQyxJQUFZO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDckIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFH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QUFJLGNBQWMsSUFBSSxJQUFJLElBQUksS0FBSyxLQUFLLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM3RCxjQUFjLEdBQUcsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tRWxlbWVudEZyb21BcnJheSwgcmFuZG9tSW50RnJvbVJhbmdlIH0gZnJvbSAnLi4vLi4vdXRpbHMvbWlzYyc7XG5cbmxldCBjdXJyZW50V29yZHNldDogV29yZHNldCB8IG51bGwgPSBudWxsO1xubGV0IGN1cnJlbnRXb3JkR2VuZXJhdG9yOiBXb3JkR2VuZXJhdG9yIHwgbnVsbCA9IG51bGw7XG5cbmV4cG9ydCBjbGFzcyBXb3Jkc2V0IHtcbiAgcHVibGljIHdvcmRzOiBzdHJpbmdbXTtcbiAgcHVibGljIGxlbmd0aDogbnVtYmVyO1xuICBjb25zdHJ1Y3Rvcih3b3Jkczogc3RyaW5nW10pIHtcbiAgICB0aGlzLndvcmRzID0gd29yZHM7XG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLndvcmRzLmxlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyByYW5kb21Xb3JkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJhbmRvbUVsZW1lbnRGcm9tQXJyYXkodGhpcy53b3Jkcyk7XG4gIH1cbn1cblxuY29uc3QgcHJlZml4U2l6ZSA9IDI7XG5cbmNsYXNzIENoYXJEaXN0cmlidXRpb24ge1xuICBwdWJsaWMgY2hhcnM6IHsgW2NoYXI6IHN0cmluZ106IG51bWJlciB9O1xuICBwdWJsaWMgY291bnQ6IG51bWJlcjtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jaGFycyA9IHt9O1xuICAgIHRoaXMuY291bnQgPSAwO1xuICB9XG5cbiAgcHVibGljIGFkZENoYXIoY2hhcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb3VudCsrO1xuICAgIGlmIChjaGFyIGluIHRoaXMuY2hhcnMpIHtcbiAgICAgIHRoaXMuY2hhcnNbY2hhcl0rKztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGFyc1tjaGFyXSA9IDE7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJhbmRvbUNoYXIoKTogc3RyaW5nIHtcbiAgICBjb25zdCByYW5kb21JbmRleCA9IHJhbmRvbUludEZyb21SYW5nZSgwLCB0aGlzLmNvdW50IC0gMSk7XG4gICAgbGV0IHJ1bm5pbmdDb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCBbY2hhciwgY2hhckNvdW50XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmNoYXJzKSkge1xuICAgICAgcnVubmluZ0NvdW50ICs9IGNoYXJDb3VudDtcbiAgICAgIGlmIChydW5uaW5nQ291bnQgPiByYW5kb21JbmRleCkge1xuICAgICAgICByZXR1cm4gY2hhcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5jaGFycylbMF07XG4gIH1cbn1cblxuY2xhc3MgV29yZEdlbmVyYXRvciBleHRlbmRzIFdvcmRzZXQge1xuICBwdWJsaWMgbmdyYW1zOiB7IFtwcmVmaXg6IHN0cmluZ106IENoYXJEaXN0cmlidXRpb24gfSA9IHt9O1xuICBjb25zdHJ1Y3Rvcih3b3Jkczogc3RyaW5nW10pIHtcbiAgICBzdXBlcih3b3Jkcyk7XG4gICAgLy8gQ2FuIGdlbmVyYXRlIGFuIHVuYm91bmRlZCBudW1iZXIgb2Ygd29yZHMgaW4gdGhlb3J5LlxuICAgIHRoaXMubGVuZ3RoID0gSW5maW5pdHk7XG5cbiAgICBmb3IgKGxldCB3b3JkIG9mIHdvcmRzKSB7XG4gICAgICAvLyBNYXJrIHRoZSBlbmQgb2YgZWFjaCB3b3JkIHdpdGggYSBzcGFjZS5cbiAgICAgIHdvcmQgKz0gXCIgXCI7XG4gICAgICBsZXQgcHJlZml4ID0gXCJcIjtcbiAgICAgIGZvciAoY29uc3QgYyBvZiB3b3JkKSB7XG4gICAgICAgIC8vIEFkZCBgY2AgdG8gdGhlIGRpc3RyaWJ1dGlvbiBvZiBjaGFycyB0aGF0IGNhbiBjb21lIGFmdGVyIGBwcmVmaXhgLlxuICAgICAgICBpZiAoIShwcmVmaXggaW4gdGhpcy5uZ3JhbXMpKSB7XG4gICAgICAgICAgdGhpcy5uZ3JhbXNbcHJlZml4XSA9IG5ldyBDaGFyRGlzdHJpYnV0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZ3JhbXNbcHJlZml4XS5hZGRDaGFyKGMpO1xuICAgICAgICBwcmVmaXggPSAocHJlZml4ICsgYykuc3Vic3RyKC1wcmVmaXhTaXplKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgcmFuZG9tV29yZCgpOiBzdHJpbmcge1xuICAgIGxldCB3b3JkID0gXCJcIjtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBwcmVmaXggPSB3b3JkLnN1YnN0cigtcHJlZml4U2l6ZSk7XG4gICAgICBjb25zdCBjaGFyRGlzdHJpYnV0aW9uID0gdGhpcy5uZ3JhbXNbcHJlZml4XTtcbiAgICAgIGlmICghY2hhckRpc3RyaWJ1dGlvbikge1xuICAgICAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4gaWYgdGhpcy5uZ3JhbXMgaXMgY29tcGxldGUuIElmIGl0IGRvZXNcbiAgICAgICAgLy8gc29tZWhvdywgc3RhcnQgZ2VuZXJhdGluZyBhIG5ldyB3b3JkLlxuICAgICAgICB3b3JkID0gXCJcIjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBQaWNrIGEgcmFuZG9tIGNoYXIgZnJvbSB0aGUgZGlzdHJpYnV0aW9uIHRoYXQgY29tZXMgYWZ0ZXIgYHByZWZpeGAuXG4gICAgICBjb25zdCBuZXh0Q2hhciA9IGNoYXJEaXN0cmlidXRpb24ucmFuZG9tQ2hhcigpO1xuICAgICAgaWYgKG5leHRDaGFyID09IFwiIFwiKSB7XG4gICAgICAgIC8vIEEgc3BhY2UgbWFya3MgdGhlIGVuZCBvZiB0aGUgd29yZCwgc28gc3RvcCBnZW5lcmF0aW5nIGFuZCByZXR1cm4uXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgd29yZCArPSBuZXh0Q2hhcjtcbiAgICB9XG4gICAgcmV0dXJuIHdvcmQ7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhXb3Jkcyh3b3Jkczogc3RyaW5nW10sIGZ1bmJveDogc3RyaW5nKTogV29yZHNldCB7XG4gIGlmIChmdW5ib3ggPT0gXCJwc2V1ZG9sYW5nXCIpIHtcbiAgICBpZiAoY3VycmVudFdvcmRHZW5lcmF0b3IgPT0gbnVsbCB8fCB3b3JkcyAhPT0gY3VycmVudFdvcmRHZW5lcmF0b3Iud29yZHMpIHtcbiAgICAgIGN1cnJlbnRXb3JkR2VuZXJhdG9yID0gbmV3IFdvcmRHZW5lcmF0b3Iod29yZHMpO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudFdvcmRHZW5lcmF0b3I7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGN1cnJlbnRXb3Jkc2V0ID09IG51bGwgfHwgd29yZHMgIT09IGN1cnJlbnRXb3Jkc2V0LndvcmRzKSB7XG4gICAgICBjdXJyZW50V29yZHNldCA9IG5ldyBXb3Jkc2V0KHdvcmRzKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRXb3Jkc2V0O1xuICB9XG59XG4iXX0=