From 31da19f63c21235f6e1aeb19c4c9eba5e461d07d Mon Sep 17 00:00:00 2001 From: Sudhananda Biswas Date: Sat, 25 Apr 2026 12:29:47 +0600 Subject: [PATCH 1/3] feat: implement text analysis utility in core and add corresponding analysis tool page to web app --- apps/web/src/App.tsx | 2 + apps/web/src/components/Layout.tsx | 3 +- apps/web/src/pages/TextAnalyzerPage.tsx | 108 +++++++++++++++++++++ packages/core/dist/data-converter.test.js | 2 +- packages/core/dist/index.d.ts | 1 + packages/core/dist/index.js | 1 + packages/core/dist/text-analyzer.d.ts | 13 +++ packages/core/dist/text-analyzer.js | 36 +++++++ packages/core/dist/text-analyzer.test.d.ts | 1 + packages/core/dist/text-analyzer.test.js | 36 +++++++ packages/core/src/index.ts | 1 + packages/core/src/text-analyzer.test.ts | 42 ++++++++ packages/core/src/text-analyzer.ts | 52 ++++++++++ scratch/test-analysis.ts | 9 ++ 14 files changed, 305 insertions(+), 2 deletions(-) create mode 100644 apps/web/src/pages/TextAnalyzerPage.tsx create mode 100644 packages/core/dist/text-analyzer.d.ts create mode 100644 packages/core/dist/text-analyzer.js create mode 100644 packages/core/dist/text-analyzer.test.d.ts create mode 100644 packages/core/dist/text-analyzer.test.js create mode 100644 packages/core/src/text-analyzer.test.ts create mode 100644 packages/core/src/text-analyzer.ts create mode 100644 scratch/test-analysis.ts diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index 03f5685..6b9706b 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -6,6 +6,7 @@ import JSONParserPage from './pages/JSONParserPage'; import UnitConversionPage from './pages/UnitConversionPage'; import ImageConverterPage from './pages/ImageConverterPage'; import DataConverterPage from './pages/DataConverterPage'; +import TextAnalyzerPage from './pages/TextAnalyzerPage'; function App() { return ( @@ -19,6 +20,7 @@ function App() { } /> } /> } /> + } /> diff --git a/apps/web/src/components/Layout.tsx b/apps/web/src/components/Layout.tsx index 172db17..5d7601e 100644 --- a/apps/web/src/components/Layout.tsx +++ b/apps/web/src/components/Layout.tsx @@ -1,5 +1,5 @@ import { Link, Outlet, useLocation } from 'react-router-dom'; -import { FileJson, ArrowLeftRight, Code2, Braces, Ruler, Image, Database } from 'lucide-react'; +import { FileJson, ArrowLeftRight, Code2, Braces, Ruler, Image, Database, AlignLeft } from 'lucide-react'; export default function Layout() { const location = useLocation(); @@ -11,6 +11,7 @@ export default function Layout() { { path: '/unit-conversion', label: 'Unit Converter', icon: Ruler }, { path: '/image-converter', label: 'Image Converter', icon: Image }, { path: '/data-converter', label: 'Data Converter', icon: Database }, + { path: '/text-analyzer', label: 'Text Analyzer', icon: AlignLeft }, ]; return ( diff --git a/apps/web/src/pages/TextAnalyzerPage.tsx b/apps/web/src/pages/TextAnalyzerPage.tsx new file mode 100644 index 0000000..1b2d133 --- /dev/null +++ b/apps/web/src/pages/TextAnalyzerPage.tsx @@ -0,0 +1,108 @@ +import { useState, useMemo } from 'react'; +import { analyzeText } from '@dev-assistant/core'; +import { Type, Hash, AlignLeft, FileText, Quote, Hash as HashIcon, MousePointer2 } from 'lucide-react'; + +export default function TextAnalyzerPage() { + const [text, setText] = useState(''); + + const stats = useMemo(() => analyzeText(text), [text]); + + const statCards = [ + { + label: 'Characters (with spaces)', + value: stats.totalCharsWithSpaces, + icon: , + description: 'Total character count' + }, + { + label: 'Characters (without spaces)', + value: stats.totalCharsWithoutSpaces, + icon: , + description: 'Excluding whitespace' + }, + { + label: 'Blank Spaces', + value: stats.blankSpaces, + icon: , + description: 'Spaces, tabs, newlines' + }, + { + label: 'Words', + value: stats.words, + icon: , + description: 'Individual words' + }, + { + label: 'Sentences', + value: stats.sentences, + icon: , + description: 'Ending with . ! or ?' + }, + { + label: 'Paragraphs', + value: stats.paragraphs, + icon: , + description: 'Separated by empty lines' + }, + { + label: 'Numbers', + value: stats.numbers, + icon: , + description: 'Count of digits (0-9)' + } + ]; + + return ( +
+
+
+

+ Passage Text Counter +

+

Analyze your text for various metrics in real-time.

+
+
+ +
+
+ +