-
-
-
+ useEffect(() => {
+ const result: any = {};
+ const inputText = text;
+ result.charCount = includeSpaces ? inputText.length : inputText.replace(/\s/g, "").length;
+ result.wordCount = (inputText.match(/[a-zA-ZäöüÄÖÜß]+/g) || []).length;
+ result.sentenceCount = (inputText.match(/[\w\s][.?!](?=\s|$)/g) || []).length;
+ result.exceedsLimit = result.charCount > config.charLimit;
+ result.readingTimeMinutes = Math.ceil(result.wordCount / 200);
-
-
-
+ const letters = inputText.toLowerCase().match(/[a-z]/g) || [];
+ const totalLetters = letters.length;
+ result.letterDensity = {};
-
-
Approx. reading time:
+ for (let char of letters) {
+ result.letterDensity[char] = (result.letterDensity[char] || 0) + 1;
+ }
+
+ for (let char in result.letterDensity) {
+ result.letterDensity[char] = +(result.letterDensity[char] / totalLetters).toFixed(3);
+ }
+
+ setAnalysis(result);
+ }, [text, includeSpaces]);
+
+ return (
+
+
+ Analyze your Text
in real-time.
+
+
+
-
-
-
- );
+ );
}
diff --git a/src/components/LetterDensity.tsx b/src/components/LetterDensity.tsx
index f1a5dc7..4ef41ad 100644
--- a/src/components/LetterDensity.tsx
+++ b/src/components/LetterDensity.tsx
@@ -1,29 +1,25 @@
"use client";
-import {Progress} from "@/components/ui/progress";
+import { Progress } from "@/components/ui/progress";
-export default function LetterDensity(){
- return(
+type LetterDensityProps = {
+ density: Record
;
+};
+
+export default function LetterDensity({ density }: LetterDensityProps) {
+ const sorted = Object.entries(density).sort((a, b) => b[1] - a[1]);
+
+ return (
Letter Density
-
-
-
-
+ {sorted.map(([letter, value]) => (
+
+
{letter}
+
+
{(value * 100).toFixed(2)}%
+
+ ))}
-
See more
- )
+ );
}
diff --git a/src/components/Stats.tsx b/src/components/Stats.tsx
index 01fba6b..503f0cd 100644
--- a/src/components/Stats.tsx
+++ b/src/components/Stats.tsx
@@ -1,44 +1,32 @@
-import { TrendingDownIcon, TrendingUpIcon } from "lucide-react"
+import {Card, CardDescription, CardHeader, CardTitle} from "@/components/ui/card";
-import { Badge } from "@/components/ui/badge"
-import {
- Card,
- CardDescription,
- CardFooter,
- CardHeader,
- CardTitle,
-} from "@/components/ui/card"
+interface StatsProps {
+ charCount: number;
+ wordCount: number;
+ sentenceCount: number;
+}
-export function Stats() {
+export function Stats({ charCount, wordCount, sentenceCount }: StatsProps) {
return (
-
+
-
-
- 03
-
+ {charCount}
Total Characters
-
-
- 03
-
+ {wordCount}
Word Count
-
-
- 03
-
+ {sentenceCount}
Sentence Count
- )
+ );
}