Add real WPM and honest adaptive timing
This commit is contained in:
+32
-8
@@ -9,15 +9,39 @@ export function getORPIndex(wordLength: number): number {
|
||||
return 4; // 14+ chars: 5th letter
|
||||
}
|
||||
|
||||
export function getWordDelay(word: string, baseDelayMs: number): number {
|
||||
let multiplier = 1;
|
||||
multiplier += Math.sqrt(word.length) * 0.04;
|
||||
if (/[.!?]$/.test(word)) {
|
||||
multiplier = 2.5;
|
||||
} else if (/[,;:]$/.test(word)) {
|
||||
multiplier = 1.8;
|
||||
function stripTrailingClosers(s: string): string {
|
||||
// Handle punctuation followed by quotes/brackets like `word."` or `word.)`.
|
||||
return s.replace(/[)"'\]]+$/g, "");
|
||||
}
|
||||
|
||||
export function getTimingMultiplier(text: string, adaptiveTiming: boolean): number {
|
||||
if (!adaptiveTiming) return 1;
|
||||
|
||||
const tokens = text.trim().split(/\s+/).filter(Boolean);
|
||||
if (tokens.length === 0) return 1;
|
||||
|
||||
// Length-based slowdown: use the longest token in the display chunk.
|
||||
let maxLen = 0;
|
||||
for (const t of tokens) maxLen = Math.max(maxLen, t.length);
|
||||
let multiplier = 1 + Math.sqrt(maxLen) * 0.04;
|
||||
|
||||
// Punctuation-based pauses: based on the last token.
|
||||
const last = stripTrailingClosers(tokens[tokens.length - 1]);
|
||||
if (/[.!?]$/.test(last)) {
|
||||
multiplier = Math.max(multiplier, 2.5);
|
||||
} else if (/[,;:]$/.test(last)) {
|
||||
multiplier = Math.max(multiplier, 1.8);
|
||||
}
|
||||
return baseDelayMs * multiplier;
|
||||
|
||||
return multiplier;
|
||||
}
|
||||
|
||||
export function getWordDelay(
|
||||
text: string,
|
||||
baseDelayMs: number,
|
||||
adaptiveTiming: boolean,
|
||||
): number {
|
||||
return baseDelayMs * getTimingMultiplier(text, adaptiveTiming);
|
||||
}
|
||||
|
||||
export function formatReadingTime(minutes: number): string {
|
||||
|
||||
Reference in New Issue
Block a user