Files
outline/app/hooks/useTextStats.ts
2025-01-22 21:17:26 -05:00

34 lines
950 B
TypeScript

import emojiRegex from "emoji-regex";
/**
* Hook to calculate text statistics
* @param text The string to calculate statistics for
* @param selectedText A substring of the text to calculate statistics for
* @returns An object containing total and selected statistics
*/
export function useTextStats(text: string, selectedText: string = "") {
const numTotalWords = countWords(text);
const regex = emojiRegex();
const matches = Array.from(text.matchAll(regex));
return {
total: {
words: numTotalWords,
characters: text.length,
emoji: matches.length ?? 0,
readingTime: Math.max(1, Math.floor(numTotalWords / 200)),
},
selected: {
words: countWords(selectedText),
characters: selectedText.length,
},
};
}
function countWords(text: string): number {
const t = text.trim();
// Hyphenated words are counted as two words
return t ? t.replace(/-/g, " ").split(/\s+/g).length : 0;
}