diff --git a/src/js/test/pace-caret.js b/src/js/test/pace-caret.js
index d6e4af60a..00af76c62 100644
--- a/src/js/test/pace-caret.js
+++ b/src/js/test/pace-caret.js
@@ -6,7 +6,7 @@ import * as DB from "./db";
export let settings = null;
function resetCaretPosition() {
- if (Config.paceCaret === "off") return;
+ if (Config.paceCaret === "off" && !TestLogic.isPaceRepeat) return;
if (!$("#paceCaret").hasClass("hidden")) {
$("#paceCaret").addClass("hidden");
}
@@ -69,8 +69,9 @@ export async function init() {
console.log("avg pace " + wpm);
} else if (Config.paceCaret === "custom") {
wpm = Config.paceCaretCustomSpeed;
+ } else if (TestLogic.isPaceRepeat == true) {
+ wpm = TestLogic.lastTestWpm;
}
-
if (wpm < 1 || wpm == false || wpm == undefined || Number.isNaN(wpm)) {
settings = null;
return;
@@ -102,9 +103,6 @@ export function update(expectedStepEnd) {
if ($("#paceCaret").hasClass("hidden")) {
$("#paceCaret").removeClass("hidden");
}
- if ($("#paceCaret").hasClass("off")) {
- return;
- }
try {
settings.currentLetterIndex++;
if (
diff --git a/src/js/test/test-logic.js b/src/js/test/test-logic.js
index cc24e0713..8acb1f073 100644
--- a/src/js/test/test-logic.js
+++ b/src/js/test/test-logic.js
@@ -164,6 +164,8 @@ export let input = new Input();
export let corrected = new Corrected();
export let currentWordIndex = 0;
export let isRepeated = false;
+export let isPaceRepeat = false;
+export let lastTestWpm = 0;
export let hasTab = false;
export let randomQuote = null;
export let bailout = false;
@@ -176,6 +178,10 @@ export function setRepeated(tf) {
isRepeated = tf;
}
+export function setPaceRepeat(tf) {
+ isPaceRepeat = tf;
+}
+
export function setHasTab(tf) {
hasTab = tf;
}
@@ -336,7 +342,7 @@ export function startTest() {
}
try {
- if (Config.paceCaret !== "off") PaceCaret.start();
+ if (Config.paceCaret !== "off" || isPaceRepeat) PaceCaret.start();
} catch (e) {}
//use a recursive self-adjusting timer to avoid time drift
TestStats.setStart(performance.now());
@@ -739,18 +745,20 @@ export function restart(
$("#typingTest").css("opacity", 0).removeClass("hidden");
if (!withSameWordset) {
setRepeated(false);
+ setPaceRepeat(false);
setHasTab(false);
await init();
PaceCaret.init(nosave);
} else {
setRepeated(true);
+ setPaceRepeat(true);
setActive(false);
Replay.stopReplayRecording();
words.resetCurrentIndex();
input.reset();
- PaceCaret.init();
TestUI.showWords();
Funbox.activate();
+ PaceCaret.init();
}
if (Config.mode === "quote") {
setRepeated(false);
@@ -1020,6 +1028,9 @@ export function finish(difficultyFailed = false) {
inf = true;
}
TestTimer.clear();
+
+ lastTestWpm = stats.wpm;
+
let testtime = stats.time;
let afkseconds = TestStats.calculateAfkSeconds();
let afkSecondsPercent = Misc.roundTo2((afkseconds / testtime) * 100);
diff --git a/src/js/test/test-ui.js b/src/js/test/test-ui.js
index 54cfccaa8..ff32aa26e 100644
--- a/src/js/test/test-ui.js
+++ b/src/js/test/test-ui.js
@@ -184,7 +184,6 @@ export function colorful(tc) {
}
}
-
export function screenshot() {
let revealReplay = false;
function revertScreenshot() {
@@ -196,9 +195,10 @@ export function screenshot() {
if (firebase.auth().currentUser == null)
$(".pageTest .loginTip").removeClass("hidden");
}
+
if (!$("#resultReplay").hasClass('hidden')) {
revealReplay = true;
- Replay.pauseReplay()
+ Replay.pauseReplay();
}
$("#resultReplay").addClass("hidden");
$(".pageTest .ssWatermark").removeClass("hidden");
@@ -282,78 +282,99 @@ export function updateWordElement(showError) {
}
}
} else {
- let correctSoFar = false;
- if (currentWord.slice(0, input.length) == input) {
- // this is when input so far is correct
- correctSoFar = true;
- }
- let wordHighlightClassString = correctSoFar ? "correct" : "incorrect";
- if (Config.blindMode) {
- wordHighlightClassString = "correct";
+ let correctSoFar = false;
+ if (currentWord.slice(0, input.length) == input) {
+ // this is when input so far is correct
+ correctSoFar = true;
+ }
+ let wordHighlightClassString = correctSoFar ? "correct" : "incorrect";
+ if (Config.blindMode) {
+ wordHighlightClassString = "correct";
+ }
+
+ for (let i = 0; i < input.length; i++) {
+ let charCorrect;
+ if (currentWord[i] == input[i]) {
+ charCorrect = true;
+ } else {
+ charCorrect = false;
}
- for (let i = 0; i < input.length; i++) {
- let charCorrect;
- if (currentWord[i] == input[i]) {
- charCorrect = true;
+ let correctClass = "correct";
+ if (Config.highlightMode == "off") {
+ correctClass = "";
+ }
+
+ let currentLetter = currentWord[i];
+ let tabChar = "";
+ let nlChar = "";
+ if (currentLetter === "\t") {
+ tabChar = "tabChar";
+ currentLetter = ``;
+ } else if (currentLetter === "\n") {
+ nlChar = "nlChar";
+ currentLetter = ``;
+ }
+
+ if (charCorrect) {
+ ret += `