diff --git a/public/js/script.js b/public/js/script.js
index 70cdc1b56..1df391f7b 100644
--- a/public/js/script.js
+++ b/public/js/script.js
@@ -23,6 +23,7 @@ let activeWordTop = 0;
let activeWordJumped = false;
let sameWordset = false;
let quotes = [];
+let focusState = false;
let accuracyStats = {
correct: 0,
@@ -229,14 +230,15 @@ function getLastChar(word) {
}
function setFocus(foc) {
- if (foc) {
- // focus = true;
+ if (foc && !focusState) {
+ focusState = true;
stopCaretAnimation();
$("#top").addClass("focus");
$("#bottom").addClass("focus");
$("body").css("cursor", "none");
$("#middle").addClass("focus");
- } else {
+ } else if (!foc && focusState) {
+ focusState = false;
startCaretAnimation();
$("#top").removeClass("focus");
$("#bottom").removeClass("focus");
@@ -520,18 +522,42 @@ function showWords() {
}
function updateActiveElement() {
- $("#words .word").removeClass("active");
- $($("#words .word")[currentWordIndex])
- .addClass("active")
- .removeClass("error");
- // activeWordTop = $("#words .word.active").position().top;
- activeWordTop = document.querySelector("#words .word.active").offsetTop;
+ let active = document.querySelector("#words .active");
+ if (active !== null) {
+ active.classList.remove("active");
+ }
+ // $("#words .word").removeClass("active");
+ // $($("#words .word")[currentWordIndex]).addClass("active").removeClass("error");
+
+ // document.querySelectorAll("#words .word")[currentWordIndex].classList.add("active");
+ try {
+ let activeWord = document.querySelectorAll("#words .word")[
+ currentWordIndex
+ ];
+ activeWord.classList.add("active");
+ activeWord.classList.remove("error");
+
+ // activeWordTop = $("#words .word.active").position().top;
+ activeWordTop = document.querySelector("#words .active").offsetTop;
+ } catch (e) {}
}
function compareInput(wrdIndex, input, showError) {
- $($("#words .word")[wrdIndex]).empty();
+ // let wrdAtIndex = $("#words .word")[wrdIndex];
+ let wordAtIndex;
+ let currentWord;
+ if (wrdIndex === null) {
+ wordAtIndex = document.querySelector("#words .word.active");
+ currentWord = wordsList[currentWordIndex];
+ } else {
+ wordAtIndex = document.querySelectorAll("#words .word")[wrdIndex];
+ wordsList[wrdIndex];
+ }
+ // while (wordAtIndex.firstChild) {
+ // wordAtIndex.removeChild(wordAtIndex.firstChild);
+ // }
let ret = "";
- let currentWord = wordsList[wrdIndex];
+
for (let i = 0; i < input.length; i++) {
if (currentWord[i] == input[i]) {
ret += '' + currentWord[i] + "";
@@ -561,12 +587,15 @@ function compareInput(wrdIndex, input, showError) {
}
}
}
+
if (input.length < currentWord.length) {
for (let i = input.length; i < currentWord.length; i++) {
ret += "" + currentWord[i] + "";
}
}
- $($("#words .word")[wrdIndex]).html(ret);
+
+ wordAtIndex.innerHTML = ret;
+
if (
(currentWord == input ||
(config.quickEnd && currentWord.length == input.length)) &&
@@ -756,21 +785,26 @@ function startCaretAnimation() {
}
function updateCaretPosition() {
+ // return;
if ($("#words").hasClass("hidden")) return;
+
let caret = $("#caret");
- let activeWord = $("#words .word.active");
+ // let activeWord = $("#words .word.active");
+
let inputLen = currentInput.length;
let currentLetterIndex = inputLen - 1;
if (currentLetterIndex == -1) {
currentLetterIndex = 0;
}
- let currentLetter = $("#words .word.active letter")[currentLetterIndex];
+ // let currentLetter = $("#words .word.active letter")[currentLetterIndex];
+ let currentLetter = document
+ .querySelector("#words .active")
+ .querySelectorAll("letter")[currentLetterIndex];
+
if ($(currentLetter).length == 0) return;
- // let currentLetterPos = currentLetter.position();
let currentLetterPosLeft = currentLetter.offsetLeft;
let currentLetterPosTop = currentLetter.offsetTop;
let letterHeight = $(currentLetter).height();
-
let newTop = 0;
let newLeft = 0;
@@ -1685,7 +1719,34 @@ function changeMode(mode, nosave) {
if (!nosave) saveConfigToCookie();
}
-function liveWPM() {
+// function liveWPM() {
+// let correctWordChars = 0;
+// for (let i = 0; i < inputHistory.length; i++) {
+// if (inputHistory[i] == wordsList[i]) {
+// //the word is correct
+// //+1 for space
+// correctWordChars += wordsList[i].length + 1;
+// }
+// }
+// let testNow = Date.now();
+// let testSeconds = (testNow - testStart) / 1000;
+// wpm = (correctWordChars * (60 / testSeconds)) / 5;
+// return Math.round(wpm);
+// }
+
+// function liveRaw() {
+// let chars = 0;
+// for (let i = 0; i < inputHistory.length; i++) {
+// chars += inputHistory[i].length + 1;
+// }
+// let testNow = Date.now();
+// let testSeconds = (testNow - testStart) / 1000;
+// raw = (chars * (60 / testSeconds)) / 5;
+// return Math.round(raw);
+// }
+
+function liveWpmAndRaw() {
+ let chars = 0;
let correctWordChars = 0;
for (let i = 0; i < inputHistory.length; i++) {
if (inputHistory[i] == wordsList[i]) {
@@ -1693,29 +1754,24 @@ function liveWPM() {
//+1 for space
correctWordChars += wordsList[i].length + 1;
}
- }
- let testNow = Date.now();
- let testSeconds = (testNow - testStart) / 1000;
- wpm = (correctWordChars * (60 / testSeconds)) / 5;
- return Math.round(wpm);
-}
-
-function liveRaw() {
- let chars = 0;
- for (let i = 0; i < inputHistory.length; i++) {
chars += inputHistory[i].length + 1;
}
let testNow = Date.now();
let testSeconds = (testNow - testStart) / 1000;
- raw = (chars * (60 / testSeconds)) / 5;
- return Math.round(raw);
+ let wpm = Math.round((correctWordChars * (60 / testSeconds)) / 5);
+ let raw = Math.round((chars * (60 / testSeconds)) / 5);
+ return {
+ wpm: wpm,
+ raw: raw,
+ };
}
function updateLiveWpm(wpm) {
if (!config.showLiveWpm) return;
if (wpm == 0 || !testActive) hideLiveWpm();
// let wpmstring = wpm < 100 ? ` ${wpm}` : `${wpm}`;
- $("#liveWpm").html(wpm);
+ document.querySelector("#liveWpm").innerHTML = wpm;
+ // $("#liveWpm").html(wpm);
}
function showLiveWpm() {
@@ -2312,6 +2368,8 @@ $(document).keypress(function (event) {
// if (config.mode == "time") {
restartTimer();
showTimer();
+ $("#liveWpm").text("0");
+ showLiveWpm();
// }
updateActiveElement();
updateTimer();
@@ -2332,11 +2390,18 @@ $(document).keypress(function (event) {
if (config.mode === "time") {
updateTimer();
}
- let wpm = liveWPM();
- updateLiveWpm(wpm);
- showLiveWpm();
- wpmHistory.push(wpm);
- rawHistory.push(liveRaw());
+ // console.time("livewpm");
+ // let wpm = liveWPM();
+ // updateLiveWpm(wpm);
+ // showLiveWpm();
+ // wpmHistory.push(wpm);
+ // rawHistory.push(liveRaw());
+ let wpmAndRaw = liveWpmAndRaw();
+ updateLiveWpm(wpmAndRaw.wpm);
+ wpmHistory.push(wpmAndRaw.wpm);
+ rawHistory.push(wpmAndRaw.raw);
+
+ // console.timeEnd("livewpm");
keypressPerSecond.push(currentKeypressCount);
currentKeypressCount = 0;
errorsPerSecond.push(currentErrorCount);
@@ -2377,18 +2442,21 @@ $(document).keypress(function (event) {
} else {
accuracyStats.correct++;
}
-
currentKeypressCount++;
currentInput += event["key"];
- $("#words .word.active").attr("input", currentInput);
setFocus(true);
activeWordTopBeforeJump = activeWordTop;
- compareInput(currentWordIndex, currentInput, !config.blindMode);
+ compareInput(null, currentInput, !config.blindMode);
// let newActiveTop = $("#words .word.active").position().top;
+
+ // console.time("offcheck1");
let newActiveTop = document.querySelector("#words .word.active").offsetTop;
+ console.timeEnd("offcheck1");
+ console.time("offcheck2");
if (activeWordTopBeforeJump != newActiveTop) {
activeWordJumped = true;
}
+ // console.timeEnd("offcheck2");
updateCaretPosition();
});
@@ -2456,7 +2524,7 @@ $(document).keydown((event) => {
}
currentWordIndex--;
updateActiveElement();
- compareInput(currentWordIndex, currentInput, !config.blindMode);
+ compareInput(null, currentInput, !config.blindMode);
}
} else {
// if ($($(".word")[currentWordIndex - 1]).hasClass("hidden")) {
@@ -2467,7 +2535,7 @@ $(document).keydown((event) => {
} else {
currentInput = currentInput.substring(0, currentInput.length - 1);
}
- compareInput(currentWordIndex, currentInput, !config.blindMode);
+ compareInput(null, currentInput, !config.blindMode);
}
// currentKeypressCount++;
updateCaretPosition();
@@ -2514,6 +2582,9 @@ $(document).keydown((event) => {
}
}
if (config.blindMode) $("#words .word.active letter").addClass("correct");
+ document
+ .querySelector("#words .word.active")
+ .setAttribute("input", currentInput);
if (currentWord == currentInput) {
inputHistory.push(currentInput);
currentInput = "";