From 5b062efae6920144066d8e170dd33a677ee2aafa Mon Sep 17 00:00:00 2001 From: hy Date: Fri, 9 Jan 2026 15:11:35 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=96=87=E6=9C=AC?= =?UTF-8?q?=E9=AB=98=E4=BA=AE=E5=8A=9F=E8=83=BD=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?UI=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增TextHighlighter组件实现关键词高亮功能 - 清理未使用的导入和组件 - 更新品牌图标引用方式 - 优化搜索页面布局和样式 --- package.json | 1 + pnpm-lock.yaml | 8 +++ src/renderer/src/App.tsx | 47 +++---------- src/renderer/src/assets/icon.png | Bin 0 -> 101188 bytes .../src/components/TextHighlighter.tsx | 28 ++++++++ src/renderer/src/pages/ImportPage.tsx | 4 +- src/renderer/src/pages/SearchPage.tsx | 63 +++++------------- src/renderer/src/pages/TestPage.tsx | 2 +- src/renderer/src/types/markjs.d.ts | 1 + 9 files changed, 64 insertions(+), 90 deletions(-) create mode 100644 src/renderer/src/assets/icon.png create mode 100644 src/renderer/src/components/TextHighlighter.tsx create mode 100644 src/renderer/src/types/markjs.d.ts diff --git a/package.json b/package.json index 56384907..aa74c267 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "apache-arrow": "^17.0.0", "electron-updater": "^6.3.9", "mammoth": "^1.11.0", + "mark.js": "^8.11.1", "pdf-parse": "^2.4.5", "react-doc-viewer": "^0.1.15", "react-pdf": "^10.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a564bf69..a85c1a62 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,6 +50,9 @@ importers: mammoth: specifier: ^1.11.0 version: 1.11.0 + mark.js: + specifier: ^8.11.1 + version: 8.11.1 pdf-parse: specifier: ^2.4.5 version: 2.4.5 @@ -3633,6 +3636,9 @@ packages: engines: {node: '>=12.0.0'} hasBin: true + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + matcher@3.0.0: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} engines: {node: '>=10'} @@ -8590,6 +8596,8 @@ snapshots: underscore: 1.13.7 xmlbuilder: 10.1.1 + mark.js@8.11.1: {} + matcher@3.0.0: dependencies: escape-string-regexp: 4.0.0 diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx index 77d00a42..83204f23 100644 --- a/src/renderer/src/App.tsx +++ b/src/renderer/src/App.tsx @@ -1,15 +1,13 @@ import React from 'react' import { HashRouter, Routes, Route, useLocation, useNavigate } from 'react-router-dom' -import { Layout, ConfigProvider, theme, Button, Segmented, Avatar } from 'antd' +import { Layout, ConfigProvider, theme, Button } from 'antd' import { ArrowLeftOutlined, - SettingOutlined, - TranslationOutlined, - SearchOutlined, - MessageOutlined + SettingOutlined } from '@ant-design/icons' import SearchPage from './pages/SearchPage' import ImportPage from './pages/ImportPage' +import brandIcon from '../../../resources/icon.png' const { Header, Content } = Layout @@ -28,11 +26,7 @@ function App(): React.JSX.Element { Button: { primaryShadow: 'none' }, - Segmented: { - itemSelectedBg: '#404040', - itemSelectedColor: '#ffffff', - trackBg: '#f5f5f5' - } + } }} > @@ -49,12 +43,12 @@ const MainLayout: React.FC = () => { const isSearchPage = location.pathname === '/' return ( - -
+ +
navigate('/')}>
- N {e.currentTarget.style.display='none'; e.currentTarget.parentElement!.innerText='N'}} /> + N
NCurator
@@ -69,38 +63,15 @@ const MainLayout: React.FC = () => { )}
- {isSearchPage && ( -
- }, - { label: '聊天', value: 'chat', icon: } - ]} - defaultValue="search" - className="bg-gray-100" - /> -
- )} - +
-
- zh-CN - -
- + } /> } /> diff --git a/src/renderer/src/assets/icon.png b/src/renderer/src/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..09bda82aa9104dd5717011b1da9866218b2cbbf3 GIT binary patch literal 101188 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 { + const contentRef = useRef(null) + + useEffect(() => { + if (!contentRef.current || keywords.length === 0) return + const mark = new Mark(contentRef.current) + mark.mark(keywords, { + separateWordSearch: false, + }) + + return () => { + mark.unmark() + } + }, [keywords, text]) + + return ( +

{text}

+ ) +} + +export default TextHighlighter diff --git a/src/renderer/src/pages/ImportPage.tsx b/src/renderer/src/pages/ImportPage.tsx index 03fc2edb..f3b5f89b 100644 --- a/src/renderer/src/pages/ImportPage.tsx +++ b/src/renderer/src/pages/ImportPage.tsx @@ -1,14 +1,12 @@ import React, { useState, useEffect } from 'react' -import { Upload, Button, message, Card, Typography, List, Collapse, Input, Table, Modal, Tag, Space } from 'antd' +import { Upload, Button, message, Typography, Collapse, Input, Table, Modal } from 'antd' import { InboxOutlined, - CheckCircleOutlined, PlusOutlined, DeleteOutlined, SettingOutlined, ReloadOutlined, SearchOutlined, - ReadOutlined, FileTextOutlined, FilePdfOutlined, BookOutlined diff --git a/src/renderer/src/pages/SearchPage.tsx b/src/renderer/src/pages/SearchPage.tsx index 5e28e54b..778095c3 100644 --- a/src/renderer/src/pages/SearchPage.tsx +++ b/src/renderer/src/pages/SearchPage.tsx @@ -1,11 +1,13 @@ import React, { useState } from 'react' -import { Input, List, Card, Modal, Empty, Typography, Tag, Button, Switch, Dropdown, Space } from 'antd' -import { FileTextOutlined, FilePdfOutlined, SendOutlined, DownOutlined } from '@ant-design/icons' +import { Input, List, Card, Modal, Empty, Typography, Tag, Button, Switch } from 'antd' +import { SendOutlined } from '@ant-design/icons' import { Document, Page, pdfjs } from 'react-pdf' import DocViewer, { DocViewerRenderers } from 'react-doc-viewer' import 'react-pdf/dist/Page/AnnotationLayer.css' import 'react-pdf/dist/Page/TextLayer.css' import type { SearchResult } from '../../../shared/types' +import TextHighlighter from '../components/TextHighlighter' +import brandIcon from '../../../../resources/icon.png' // Configure PDF worker pdfjs.GlobalWorkerOptions.workerSrc = new URL( @@ -14,7 +16,7 @@ pdfjs.GlobalWorkerOptions.workerSrc = new URL( ).toString() const { TextArea } = Input -const { Title, Paragraph } = Typography +const { Title } = Typography const SearchPage: React.FC = () => { const [loading, setLoading] = useState(false) @@ -39,31 +41,7 @@ const SearchPage: React.FC = () => { } } - const highlightText = (text: string, tokens: string[]) => { - if (!tokens.length) return text - - // Create a regex from tokens, sorting by length descending to match longest first - const sortedTokens = [...tokens].sort((a, b) => b.length - a.length) - // Escape special regex chars in tokens - const escapedTokens = sortedTokens.map(t => t.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')) - const regex = new RegExp(`(${escapedTokens.join('|')})`, 'gi') - - const parts = text.split(regex) - - return ( - - {parts.map((part, i) => - regex.test(part) ? ( - - {part} - - ) : ( - part - ) - )} - - ) - } + const openPreview = (item: SearchResult) => { setCurrentDoc(item) @@ -110,15 +88,15 @@ const SearchPage: React.FC = () => { } return ( -
+
{/* Search Box */} -
+