diff --git a/src/js/test/pace-caret.js b/src/js/test/pace-caret.js
index d6e4af60a..156a840a8 100644
--- a/src/js/test/pace-caret.js
+++ b/src/js/test/pace-caret.js
@@ -40,7 +40,9 @@ export async function init() {
mode2 = TestLogic.randomQuote.id;
}
let wpm;
- if (Config.paceCaret === "pb") {
+ if (TestLogic.isPaceRepeat == true) {
+ wpm = TestLogic.lastTestWpm;
+ } else if (Config.paceCaret === "pb") {
wpm = await DB.getLocalPB(
Config.mode,
mode2,
diff --git a/src/js/test/test-logic.js b/src/js/test/test-logic.js
index cc24e0713..e7935c7bb 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;
}
@@ -739,11 +745,13 @@ 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();
@@ -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 d940e80a1..bb0619808 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() {
function revertScreenshot() {
$("#notificationCenter").removeClass("hidden");
@@ -196,9 +195,9 @@ export function screenshot() {
$(".pageTest .loginTip").removeClass("hidden");
}
let revealReplay = false;
- if (!$("#resultReplay").hasClass('hidden')) {
+ if (!$("#resultReplay").hasClass("hidden")) {
revealReplay = true;
- Replay.pauseReplay()
+ Replay.pauseReplay();
}
$("#resultReplay").addClass("hidden");
$(".pageTest .ssWatermark").removeClass("hidden");
@@ -282,78 +281,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 += `