From 42cc96a0e3ea74065c3adbbc25762daa69d8af84 Mon Sep 17 00:00:00 2001 From: alikia2x Date: Mon, 20 Jan 2025 04:31:10 +0800 Subject: [PATCH] ref: remove NLP improve: about page --- .../Text Classification-checkpoint.ipynb | 33 ---- backend/nlp/Text Classification.ipynb | 87 -------- bun.lockb | Bin 458371 -> 460785 bytes components/onesearch/SuggestionItem.tsx | 87 ++++++++ components/onesearch/handleEnter.ts | 4 +- components/onesearch/handleNLUResult.ts | 4 +- components/onesearch/onesearch.tsx | 187 +++--------------- global.d.ts | 6 +- i18n/en.json | 21 +- i18n/zh.json | 93 +++++---- index.html | 6 +- lib/onesearch/handleEnter.ts | 6 +- lib/onesearch/keywordSuggestion.ts | 6 +- lib/state/suggestion.ts | 4 +- lib/url/tldList.ts | 2 +- lib/url/tlds.txt | 5 +- lib/url/validLink.ts | 30 +-- lib/version.ts | 5 +- package.json | 128 ++++++------ pages/about/index.tsx | 66 +++++-- pages/about/layout.tsx | 8 + pages/about/license/{index.tsx => OSS.tsx} | 11 +- pages/about/license/ThisProject.tsx | 22 +++ pages/index.tsx | 1 + src/app.tsx | 19 +- test/bytesToUnicode.test.ts | 6 - test/getEmbeddings.test.ts | 0 test/unicodeToBytes.test.ts | 6 - test/validLink.test.ts | 1 + 29 files changed, 380 insertions(+), 474 deletions(-) delete mode 100644 backend/nlp/.ipynb_checkpoints/Text Classification-checkpoint.ipynb delete mode 100644 backend/nlp/Text Classification.ipynb create mode 100644 components/onesearch/SuggestionItem.tsx rename pages/about/license/{index.tsx => OSS.tsx} (51%) create mode 100644 pages/about/license/ThisProject.tsx delete mode 100644 test/bytesToUnicode.test.ts delete mode 100644 test/getEmbeddings.test.ts delete mode 100644 test/unicodeToBytes.test.ts diff --git a/backend/nlp/.ipynb_checkpoints/Text Classification-checkpoint.ipynb b/backend/nlp/.ipynb_checkpoints/Text Classification-checkpoint.ipynb deleted file mode 100644 index 8bf44f5..0000000 --- a/backend/nlp/.ipynb_checkpoints/Text Classification-checkpoint.ipynb +++ /dev/null @@ -1,33 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "0fbcb787-a093-4c31-96a0-22f65a3ee25b", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.2" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/backend/nlp/Text Classification.ipynb b/backend/nlp/Text Classification.ipynb deleted file mode 100644 index 9820743..0000000 --- a/backend/nlp/Text Classification.ipynb +++ /dev/null @@ -1,87 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 14, - "id": "0fbcb787-a093-4c31-96a0-22f65a3ee25b", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[33mWARNING: Skipping /opt/homebrew/lib/python3.11/site-packages/packaging-24.0.dist-info due to invalid metadata entry 'name'\u001b[0m\u001b[33m\n", - "\u001b[0m\u001b[33mWARNING: Skipping /opt/homebrew/lib/python3.11/site-packages/packaging-24.0.dist-info due to invalid metadata entry 'name'\u001b[0m\u001b[33m\n", - "\u001b[0m\u001b[33mWARNING: Skipping /opt/homebrew/lib/python3.11/site-packages/numpy-1.26.4.dist-info due to invalid metadata entry 'name'\u001b[0m\u001b[33m\n", - "\u001b[0m\u001b[33mWARNING: Skipping /opt/homebrew/lib/python3.11/site-packages/certifi-2024.2.2.dist-info due to invalid metadata entry 'name'\u001b[0m\u001b[33m\n", - "\u001b[0mRequirement already satisfied: huggingface_hub in /opt/homebrew/lib/python3.11/site-packages (0.20.3)\n", - "Requirement already satisfied: filelock in /opt/homebrew/lib/python3.11/site-packages (from huggingface_hub) (3.13.1)\n", - "Requirement already satisfied: fsspec>=2023.5.0 in /opt/homebrew/lib/python3.11/site-packages (from huggingface_hub) (2023.10.0)\n", - "Requirement already satisfied: requests in /opt/homebrew/lib/python3.11/site-packages (from huggingface_hub) (2.31.0)\n", - "Requirement already satisfied: tqdm>=4.42.1 in /opt/homebrew/lib/python3.11/site-packages (from huggingface_hub) (4.66.2)\n", - "Requirement already satisfied: pyyaml>=5.1 in /opt/homebrew/lib/python3.11/site-packages (from huggingface_hub) (6.0.1)\n", - "Requirement already satisfied: typing-extensions>=3.7.4.3 in /opt/homebrew/lib/python3.11/site-packages (from huggingface_hub) (4.8.0)\n", - "Requirement already satisfied: packaging>=20.9 in /opt/homebrew/lib/python3.11/site-packages (from huggingface_hub) (23.2)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /opt/homebrew/lib/python3.11/site-packages (from requests->huggingface_hub) (3.3.2)\n", - "Requirement already satisfied: idna<4,>=2.5 in /opt/homebrew/lib/python3.11/site-packages (from requests->huggingface_hub) (3.6)\n", - "Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/homebrew/lib/python3.11/site-packages (from requests->huggingface_hub) (2.1.0)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /opt/homebrew/lib/python3.11/site-packages (from requests->huggingface_hub) (2023.11.17)\n", - "\u001b[33mWARNING: Skipping /opt/homebrew/lib/python3.11/site-packages/packaging-24.0.dist-info due to invalid metadata entry 'name'\u001b[0m\u001b[33m\n", - "\u001b[0m\u001b[33mWARNING: Skipping /opt/homebrew/lib/python3.11/site-packages/numpy-1.26.4.dist-info due to invalid metadata entry 'name'\u001b[0m\u001b[33m\n", - "\u001b[0m\u001b[33mWARNING: Skipping /opt/homebrew/lib/python3.11/site-packages/certifi-2024.2.2.dist-info due to invalid metadata entry 'name'\u001b[0m\u001b[33m\n", - "\u001b[0m\u001b[33mWARNING: Skipping /opt/homebrew/lib/python3.11/site-packages/packaging-24.0.dist-info due to invalid metadata entry 'name'\u001b[0m\u001b[33m\n", - "\u001b[0m\u001b[33mWARNING: Skipping /opt/homebrew/lib/python3.11/site-packages/packaging-24.0.dist-info due to invalid metadata entry 'name'\u001b[0m\u001b[33m\n", - "\u001b[0m\u001b[33mWARNING: Skipping /opt/homebrew/lib/python3.11/site-packages/packaging-24.0.dist-info due to invalid metadata entry 'name'\u001b[0m\u001b[33m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "!pip install huggingface_hub" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "e82bbe25-4b14-4aca-8761-bad2a63fccd2", - "metadata": {}, - "outputs": [ - { - "ename": "ModuleNotFoundError", - "evalue": "No module named 'huggingface_hub'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mhuggingface_hub\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m notebook_login\n", - "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'huggingface_hub'" - ] - } - ], - "source": [ - "from huggingface_hub import notebook_login" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.2" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/bun.lockb b/bun.lockb index 823f6fbcac1bd5d03307f2b2fcfaf1fbd82a96b6..56264ed567a63e019d3b76c16714daab87ccf8cc 100755 GIT binary patch delta 98132 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 + {s.suggestion}  + + {t("search.search-help-text", { engine: engineName })} + + {devMode && ( + + {s.relevance} + + )} + + ); + } else if (s.type === "QUERY") { + return ( + + {s.suggestion} + {devMode && ( + + {s.relevance} + + )} + + ); + } else if (s.type === "NAVIGATION" || s.type === "default-link" || s.type === "link") { + return ( + + {s.prompt && {s.prompt}} + {s.suggestion} + {devMode && ( + + {s.relevance} + + )} + + ); + } else if (s.type === "text") { + return ( + + {s.prompt && <span className="text-zinc-700 dark:text-zinc-400">{s.prompt}</span>} + <p>{s.suggestion}</p> + {devMode && ( + <span className="bottom-0 absolute text-zinc-700 dark:text-zinc-400 text-sm leading-10 h-10 right-2"> + {s.relevance} + </span> + )} + </PlainText> + ); + } else if (s.type === "inpage-link") { + return ( + <LinkSuggestion key={i} query={s.suggestion} selected={i == selected} inPage={true}> + {s.prompt && <span className="text-zinc-700 dark:text-zinc-400">{s.prompt}</span>} + {s.suggestion} + {devMode && ( + <span className="absolute text-zinc-700 dark:text-zinc-400 text-sm leading-10 h-10 right-2"> + {s.relevance} + </span> + )} + </LinkSuggestion> + ); + } + + return null; +} \ No newline at end of file diff --git a/components/onesearch/handleEnter.ts b/components/onesearch/handleEnter.ts index aaa799e..ec61000 100644 --- a/components/onesearch/handleEnter.ts +++ b/components/onesearch/handleEnter.ts @@ -1,11 +1,11 @@ -import { settingsType, suggestionItem } from "global"; +import { settingsType, SuggestionItem } from "global"; import copyToClipboard from "lib/copy"; import { normalizeURL } from "lib/normalizeURL"; import search from "lib/search"; export default function ( index: number, - suggestion: suggestionItem[], + suggestion: SuggestionItem[], _query: string, settings: settingsType, searchBoxRef: React.RefObject<HTMLInputElement> diff --git a/components/onesearch/handleNLUResult.ts b/components/onesearch/handleNLUResult.ts index fa210dd..c90543b 100644 --- a/components/onesearch/handleNLUResult.ts +++ b/components/onesearch/handleNLUResult.ts @@ -1,10 +1,10 @@ -import { suggestionItem } from "global"; +import { SuggestionItem } from "global"; import { findClosestDateIndex } from "lib/weather/getCurrentWeather"; import { getLocationNative } from "lib/weather/getLocation"; import { getWeather } from "lib/weather/getWeather"; import { WMOCodeTable } from "lib/weather/wmocode"; -type UpdateSuggestionFunction = (data: suggestionItem[]) => void; +type UpdateSuggestionFunction = (data: SuggestionItem[]) => void; export function handleNLUResult(result: any, updateSuggestion: UpdateSuggestionFunction) { if (result.intent == "weather.summary") { diff --git a/components/onesearch/onesearch.tsx b/components/onesearch/onesearch.tsx index 6f85277..cb314da 100644 --- a/components/onesearch/onesearch.tsx +++ b/components/onesearch/onesearch.tsx @@ -1,39 +1,22 @@ -import { useEffect, useRef, useState } from "react"; +import { useEffect, useRef } from "react"; import SuggestionBox from "./suggestionBox"; import { queryAtom } from "lib/state/query"; -import { suggestionItem, suggestionsResponse } from "global"; +import { SuggestionItem, SuggestionsResponse } from "global"; import getSearchEngineName from "lib/onesearch/getSearchEngineName"; -import PlainSearch from "./plainSearch"; import { suggestionAtom } from "lib/state/suggestion"; import validLink from "lib/url/validLink"; -import LinkSuggestion from "./link"; import { selectedSuggestionAtom } from "lib/state/suggestionSelection"; import { settingsAtom } from "lib/state/settings"; -import PlainText from "./plainText"; import { sendError } from "lib/feedback/sendError"; -import { handleNLUResult } from "./handleNLUResult"; -import * as ort from "onnxruntime-web"; import { useAtom, useAtomValue } from "jotai"; import i18next from "i18next"; import { useTranslation } from "react-i18next"; import { keywordSuggestion } from "lib/onesearch/keywordSuggestion"; -import tokenize from "lib/nlp/tokenize/tokenizer"; -import { getEmbedding, getEmbeddingLayer } from "lib/nlp/getEmbedding"; -import { loadVocab } from "lib/nlp/tokenize/loadVocab"; -import BPETokenizer from "lib/nlp/tokenize/BPEtokenizer"; -import energyScore from "lib/nlp/energyScore"; -import bytesToUnicode from "lib/nlp/tokenize/bytesToUnicode"; -import { searchboxLastInputAtom } from "lib/state/searchboxLastInput"; - -interface EmbeddingLayer { - [key: number]: Float32Array<ArrayBufferLike>; -} +import { searchboxLastInputAtom } from "lib/state/searchboxLastInput" +import SuggestionComponent from "./SuggestionItem.tsx"; export default function OneSearch() { - const [suggestion, setFinalSuggetsion] = useAtom(suggestionAtom); - const [embeddingLayer, setEmbeddingLayer] = useState<EmbeddingLayer | null>(null); - const [NLUsession, setNLUsession] = useState<ort.InferenceSession | null>(null); - const [tokenizer, setTokenizer] = useState<BPETokenizer | null>(null); + const [suggestion, setFinalSuggestion] = useAtom(suggestionAtom); const lastInput = useAtomValue(searchboxLastInputAtom); const lastRequestTimeRef = useRef(0); const selected = useAtomValue(selectedSuggestionAtom); @@ -53,9 +36,9 @@ export default function OneSearch() { } fetch(`/api/v1/suggestion?q=${query}&l=${lang}&t=${time}&engine=${engine}`) .then((res) => res.json()) - .then((data: suggestionsResponse) => { + .then((data: SuggestionsResponse) => { try { - const suggestionToUpdate: suggestionItem[] = data.suggestions; + const suggestionToUpdate: SuggestionItem[] = data.suggestions; if (data.time > lastRequestTimeRef.current) { cleanSuggestion("NAVIGATION", "QUERY"); lastRequestTimeRef.current = data.time; @@ -73,8 +56,8 @@ export default function OneSearch() { }); }, [lastInput]); - function updateSuggestion(data: suggestionItem[]) { - setFinalSuggetsion((cur: suggestionItem[]) => { + function updateSuggestion(data: SuggestionItem[]) { + setFinalSuggestion((cur: SuggestionItem[]) => { const types: string[] = []; for (const sug of data) { if (!types.includes(sug.type)) types.push(sug.type); @@ -91,7 +74,7 @@ export default function OneSearch() { } function cleanSuggestion(...types: string[]) { - setFinalSuggetsion((suggestion: suggestionItem[]) => { + setFinalSuggestion((suggestion: SuggestionItem[]) => { return suggestion.filter((item) => { return !types.includes(item.type); }); @@ -99,52 +82,7 @@ export default function OneSearch() { } useEffect(() => { - if (embeddingLayer !== null) return; - const embedding_file = "/model/token_embeddings.bin"; - (async function () { - const result = await fetch(embedding_file); - const arrBuf = await result.arrayBuffer(); - const embeddingDict = getEmbeddingLayer(arrBuf); - setEmbeddingLayer(embeddingDict); - - await loadModel("/model/NLU.onnx"); - // if (!modelLoaded) { - // console.error("NLU model was not correctly loaded.") - // } - })(); - }, []); - - useEffect(() => { - if (tokenizer !== null) return; - (async function () { - await loadTokenizer(); - })(); - }, []); - - async function loadModel(modelPath: string) { - ort.env.wasm.wasmPaths = "/onnx/"; - const session = await ort.InferenceSession.create(modelPath); - setNLUsession(session); - } - - async function loadTokenizer() { - const vocab = await loadVocab(); - const tokenizer = new BPETokenizer(vocab); - setTokenizer(tokenizer); - } - - async function getNLUResult(query: string) { - if (embeddingLayer === null || NLUsession === null || tokenizer == null) return; - const tokenIds = await tokenize(bytesToUnicode(query), tokenizer); - const embeddings = getEmbedding(tokenIds, embeddingLayer, 64); - const inputTensor = new ort.Tensor("float32", embeddings, [1, 64, 96]); - const feeds = { input: inputTensor }; - const results = await NLUsession.run(feeds); - return results; - } - - useEffect(() => { - cleanSuggestion("default-link", "default", "text", "link"); + cleanSuggestion("default-link", "default", "text", "link", "inpage-link"); if (validLink(query)) { updateSuggestion([ { @@ -164,105 +102,24 @@ export default function OneSearch() { } ]); } - if (keywordSuggestion(query) !== null) { updateSuggestion([keywordSuggestion(query)!]); } - - (async function () { - const result = await getNLUResult(query); - if (result === undefined) return; - const rawData = result.output.data; - const data: number[] = []; - for (let i=0;i<rawData.length;i++){ - data.push(rawData[i] as number); - } - console.log(data, energyScore(data)); - })(); }, [lastInput, engineName]); return ( <SuggestionBox> - {suggestion.map((s, i) => { - if (s.suggestion.trim() === "") return; - if (s.type === "default") { - return ( - <PlainSearch key={i} query={s.suggestion} selected={i == selected}> - {s.suggestion}&nbsp; - <span className="text-zinc-700 dark:text-zinc-400 text-sm"> - {t("search.search-help-text", { engine: engineName })} - </span> - {devMode && ( - <span className="absolute text-zinc-700 dark:text-zinc-400 text-sm leading-10 h-10 right-2"> - {s.relevance} - </span> - )} - </PlainSearch> - ); - } else if (s.type === "QUERY") { - return ( - <PlainSearch key={i} query={s.suggestion} selected={i == selected}> - {s.suggestion} - {devMode && ( - <span className="absolute text-zinc-700 dark:text-zinc-400 text-sm leading-10 h-10 right-2"> - {s.relevance} - </span> - )} - </PlainSearch> - ); - } else if ( - s.type === "NAVIGATION" || - s.type === "default-link" || - s.type === "link" - ) { - return ( - <LinkSuggestion key={i} query={s.suggestion} selected={i == selected}> - {s.prompt && ( - <span className="text-zinc-700 dark:text-zinc-400">{s.prompt}</span> - )} - {s.suggestion} - {devMode && ( - <span className="absolute text-zinc-700 dark:text-zinc-400 text-sm leading-10 h-10 right-2"> - {s.relevance} - </span> - )} - </LinkSuggestion> - ); - } else if (s.type === "text") { - return ( - <PlainText key={i} selected={i == selected}> - {s.prompt && ( - <span className="text-zinc-700 dark:text-zinc-400">{s.prompt}</span> - )} - <p>{s.suggestion}</p> - {devMode && ( - <span className="bottom-0 absolute text-zinc-700 dark:text-zinc-400 text-sm leading-10 h-10 right-2"> - {s.relevance} - </span> - )} - </PlainText> - ); - } else if (s.type === "inpage-link") { - return ( - <LinkSuggestion - key={i} - query={s.suggestion} - selected={i == selected} - inPage={true} - > - {s.prompt && ( - <span className="text-zinc-700 dark:text-zinc-400">{s.prompt}</span> - )} - {s.suggestion} - {devMode && ( - <span className="absolute text-zinc-700 dark:text-zinc-400 text-sm leading-10 h-10 right-2"> - {s.relevance} - </span> - )} - </LinkSuggestion> - ); - } - })} + {suggestion.map((s, i) => ( + <SuggestionComponent + key={i} + s={s} + i={i} + selected={selected} + devMode={devMode} + engineName={engineName} + t={t} + /> + ))} </SuggestionBox> ); } diff --git a/global.d.ts b/global.d.ts index 115aa9a..6a5ccf5 100644 --- a/global.d.ts +++ b/global.d.ts @@ -1,4 +1,4 @@ -import { Suggestion } from "search-engine-autocomplete"; +import React from "react"; interface settingsType extends object { version: number; @@ -12,14 +12,14 @@ interface settingsType extends object { }; } -interface suggestionsResponse extends object { +interface SuggestionsResponse extends object { suggestions: Suggestion[]; query: string; verbatimRelevance: number; time: number; } -type suggestionItem = { +interface SuggestionItem { suggestion: string; type: string; relativeRelevance?: number; diff --git a/i18n/en.json b/i18n/en.json index 2206878..0362f21 100755 --- a/i18n/en.json +++ b/i18n/en.json @@ -33,7 +33,26 @@ "about": { "title": "About sparkast", "license": { - "view": "→ view" + "title": "License", + "view": "→ view", + "text": "GPL 3.0" + }, + "presented-by": "Presented By", + "backend-api-version": "Backend API Version", + "client-version": "Client API Version", + "oss": { + "title": "OSS Statement", + "view": "→ View" } + }, + "license": { + "title": "License - sparkast", + "desc": "sparkast is open source software. It is licensed under the GPL 3.0 license. You can view the full license text below.", + "page-title": "License" + }, + "oss_license": { + "title": "OSS Licenses - sparkast", + "desc": "This birth of this project would not have been possible without the following open source software. This page shows the licenses of the open source software used in sparkast.", + "page-title": "OSS Licenses" } } diff --git a/i18n/zh.json b/i18n/zh.json index 19c32d7..6f75279 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -1,39 +1,58 @@ { - "404": { - "title": "页面未找到" - }, - "search": { - "placeholder": "搜索或输入网址", - "engine-aria": "切换搜索引擎", - "engine": { - "google": "谷歌", - "baidu": "百度", - "bing": "必应", - "duckduckgo": "DuckDuckGo", - "yandex": "Yandex", - "yahoo": "雅虎", - "ecosia": "Ecosia" - }, - "search-help-text": "用 {engine} 搜索" - }, - "tools": { - "base64": { - "title": "Base64 工具", - "decode": "解码", - "encode": "编码", - "result": "结果: ", - "copy": "复制", - "copied": "已复制" - } - }, - "notfound": { - "desc": "请检查网址是否出错。 <br/>如果你从星火主页跳转到这里,<br/> 请 <a style=\"text-decoration:underline;\" href=\"mailto:contact@alikia2x.com\">联系我们</a>", - "title": "网页不存在" - }, - "about": { - "title": "关于 sparkast", - "license": { - "view": "→ 查看" - } - } + "404": { + "title": "页面未找到" + }, + "search": { + "placeholder": "搜索或输入网址", + "engine-aria": "切换搜索引擎", + "engine": { + "google": "谷歌", + "baidu": "百度", + "bing": "必应", + "duckduckgo": "DuckDuckGo", + "yandex": "Yandex", + "yahoo": "雅虎", + "ecosia": "Ecosia" + }, + "search-help-text": "用 {engine} 搜索" + }, + "tools": { + "base64": { + "title": "Base64 工具", + "decode": "解码", + "encode": "编码", + "result": "结果: ", + "copy": "复制", + "copied": "已复制" + } + }, + "notfound": { + "desc": "请检查网址是否出错。 <br/>如果你从星火主页跳转到这里,<br/> 请 <a style=\"text-decoration:underline;\" href=\"mailto:contact@alikia2x.com\">联系我们</a>", + "title": "网页不存在" + }, + "about": { + "title": "关于 sparkast", + "oss": { + "title": "开源软件声明", + "view": "→ 查看" + }, + "license": { + "title": "许可证", + "text": "GPL 3.0", + "view": "→ 查看" + }, + "presented-by": "出品", + "backend-api-version": "后端 API 版本", + "client-version": "客户端 API 版本" + }, + "license": { + "title": "开源许可证 - sparkast", + "page-title": "开源许可证", + "desc": "sparkast 是开源软件。它根据 GPL 3.0 许可证获得许可。您可以在下面查看完整的许可文本。" + }, + "oss_license": { + "title": "开源软件声明 - sparkast", + "page-title": "开源软件声明", + "desc": "本项目的诞生离不开开源软件。此页面显示 sparkast 中使用的开源软件的许可证。" + } } diff --git a/index.html b/index.html index af9602f..80f1bd1 100644 --- a/index.html +++ b/index.html @@ -1,10 +1,12 @@ <!doctype html> -<html> +<html lang="en"> <head> <meta charset="UTF-8" /> <link rel="icon" href="/favicon.ico" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <title>SparkHome</title> + <meta property="og:title" content="sparkast"> + <meta property="og:description" content="Your ultimate productivity tool that gives you the answer to all within a single search box."> + <title>sparkast</title> </head> <body> <div id="root"></div> diff --git a/lib/onesearch/handleEnter.ts b/lib/onesearch/handleEnter.ts index 1dbc8e4..949d24a 100644 --- a/lib/onesearch/handleEnter.ts +++ b/lib/onesearch/handleEnter.ts @@ -1,11 +1,11 @@ -import { settingsType, suggestionItem } from "global"; +import { settingsType, SuggestionItem } from "global"; import copyToClipboard from "lib/copy"; import { normalizeURL } from "lib/normalizeURL"; import search from "lib/search"; export default function ( index: number, - suggestion: suggestionItem[], + suggestion: SuggestionItem[], _query: string, settings: settingsType, searchBoxRef: React.RefObject<HTMLInputElement> @@ -23,6 +23,6 @@ export default function ( } else if (selected.type === "link") { window.open(normalizeURL(selected.suggestion)); } else if (selected.type === "inpage-link") { - location.href = normalizeURL(selected.suggestion); + location.href = normalizeURL(selected.suggestion, false); } } diff --git a/lib/onesearch/keywordSuggestion.ts b/lib/onesearch/keywordSuggestion.ts index c13cfc0..7c11e38 100644 --- a/lib/onesearch/keywordSuggestion.ts +++ b/lib/onesearch/keywordSuggestion.ts @@ -1,4 +1,4 @@ -import { suggestionItem } from "global"; +import { SuggestionItem } from "global"; interface keywordLinkDict { [key: string]: string; @@ -15,7 +15,7 @@ const dict_cn: keywordLinkDict = { export function keywordSuggestion(query: string) { for (const keyword in dict_cn) { if (query.includes(keyword)) { - const result: suggestionItem = { + const result: SuggestionItem = { type: "inpage-link", suggestion: dict_cn[keyword], prompt: keyword, @@ -26,7 +26,7 @@ export function keywordSuggestion(query: string) { } for (const keyword in dict_en) { if (query.includes(keyword)) { - const result: suggestionItem = { + const result: SuggestionItem = { type: "inpage-link", suggestion: dict_en[keyword], prompt: keyword, diff --git a/lib/state/suggestion.ts b/lib/state/suggestion.ts index df90be4..7fccb90 100644 --- a/lib/state/suggestion.ts +++ b/lib/state/suggestion.ts @@ -1,6 +1,6 @@ -import { suggestionItem } from "global"; +import { SuggestionItem } from "global"; import { atom } from "jotai"; -const suggestionAtom = atom([] as suggestionItem[]); +const suggestionAtom = atom([] as SuggestionItem[]); export { suggestionAtom }; diff --git a/lib/url/tldList.ts b/lib/url/tldList.ts index 950ae99..8fc1f8d 100644 --- a/lib/url/tldList.ts +++ b/lib/url/tldList.ts @@ -1,4 +1,4 @@ -import TLDtxt from "./tlds.txt?raw"; +import TLDtxt from "./tlds.txt"; export function getTLD() { return TLDtxt.split("\r\n").filter((line) => line[0] !== "#"); diff --git a/lib/url/tlds.txt b/lib/url/tlds.txt index 143dcdc..d28a03d 100644 --- a/lib/url/tlds.txt +++ b/lib/url/tlds.txt @@ -1,4 +1,4 @@ -# Version 2024071300, Last Updated Sat Jul 13 07:07:01 2024 UTC +# Version 2025011900, Last Updated Sun Jan 19 07:07:01 2025 UTC AAA AARP ABB @@ -297,7 +297,6 @@ CY CYMRU CYOU CZ -DABUR DAD DANCE DATA @@ -1444,4 +1443,4 @@ ZIP ZM ZONE ZUERICH -ZW +ZW \ No newline at end of file diff --git a/lib/url/validLink.ts b/lib/url/validLink.ts index 851d676..b1e1afa 100644 --- a/lib/url/validLink.ts +++ b/lib/url/validLink.ts @@ -1,41 +1,33 @@ import { toASCII } from "tr46"; import { getTLD } from "./tldList"; +console.log(getTLD()); + export default function validLink(link: string) { let finalURL; try { - const url = new URL(link); - finalURL = url; + new URL(link); return true; } catch (error) { // if the URL is invalid, try to add the protocol try { - const urlWithHTTP = new URL("http://" + link); - finalURL = urlWithHTTP; + finalURL = new URL("http://" + link); } catch (error) { return false; } } if (finalURL.host.endsWith(".")) return false; - if ( - validTLD(finalURL.host) || + return validTLD(finalURL.host) || isValidIPv6(link.slice(1, finalURL.host.length - 1)) || - isValidIPv4(link) - ) { - return true; - } - return false; + isValidIPv4(link); + } export function validTLD(domain: string): boolean { if (!domain.includes(".")) return false; const tld = toASCII(domain.split(".").reverse()[0]); const tldList = getTLD(); - if (tldList.includes(tld.toUpperCase())) { - return true; - } else { - return false; - } + return !!tldList.includes(tld.toUpperCase()); } export function isValidIPv6(ip: string): boolean { @@ -69,10 +61,8 @@ export function isValidIPv6(ip: string): boolean { return false; } } - if (doubleColonCount === 0 && groups !== 8) { - return false; - } - return true; + return !(doubleColonCount === 0 && groups !== 8); + } export function isValidIPv4(ip: string): boolean { diff --git a/lib/version.ts b/lib/version.ts index 663e101..915fc20 100644 --- a/lib/version.ts +++ b/lib/version.ts @@ -1,8 +1,5 @@ import * as pjson from "package.json"; -export default function getVersion() { - return pjson.version; -} +export const clientVersion = pjson.version; -export const clientNLUVersion = 4; export const apiVersion = 1; diff --git a/package.json b/package.json index 194d1e8..d5fe039 100644 --- a/package.json +++ b/package.json @@ -1,65 +1,67 @@ { - "name": "sparkast", - "private": false, - "version": "5.8.1", - "type": "module", - "scripts": { - "dev": "bun server.ts", - "build": "bun license-gen && tsc -b && vite build", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "NODE_ENV=production bun server.ts", - "license-gen": "bunx generate-license-file --input package.json --output lib/license.txt --overwrite", - "format": "prettier --write ." - }, - "dependencies": { - "@alikia/search-complete": "^0.4.4", - "@iconify/react": "^5.0.1", - "@nextui-org/react": "^2.4.2", - "@types/bun": "^1.1.6", - "@types/express": "^4.17.21", - "@types/tr46": "^5.0.0", - "@xenova/transformers": "^2.17.2", - "cac": "^6.7.14", - "chalk": "^5.3.0", - "express": "^4.19.2", - "fflate": "^0.8.2", - "framer-motion": "^11.2.12", - "generate-license-file": "^3.5.1", - "i18next": "^23.11.5", - "i18next-browser-languagedetector": "^8.0.0", - "i18next-icu": "^2.3.0", - "jest": "^29.7.0", - "jotai": "^2.8.3", - "node-nlp": "^4.27.0", - "onnxruntime-web": "^1.20.0-dev.20240925-a47254eaef", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-i18next": "^14.1.2", - "react-router": "^6.23.1", - "react-router-dom": "^6.23.1", - "tr46": "^5.0.0", - "valid-url": "^1.0.9", - "validate-color": "^2.2.4", - "vite-express": "^0.17.0" - }, - "devDependencies": { - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", - "@types/valid-url": "^1.0.7", - "@typescript-eslint/eslint-plugin": "^7.13.1", - "@typescript-eslint/parser": "^7.13.1", - "@vitejs/plugin-react-swc": "^3.5.0", - "autoprefixer": "^10.4.19", - "eslint": "^8.57.0", - "eslint-plugin-react-hooks": "^4.6.2", - "eslint-plugin-react-refresh": "^0.4.7", - "postcss": "^8.4.38", - "prettier": "^3.3.3", - "tailwindcss": "^3.4.4", - "typescript": "^5.2.2", - "vite": "^5.3.1", - "vite-plugin-chunk-split": "^0.5.0", - "vite-plugin-pages": "^0.32.2", - "vite-tsconfig-paths": "^4.3.2" - } + "name": "sparkast", + "private": false, + "version": "5.8.1", + "type": "module", + "scripts": { + "dev": "bun server.ts", + "build": "bun license-gen && tsc -b && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "NODE_ENV=production bun server.ts", + "license-gen": "bunx generate-license-file --input package.json --output lib/license.txt --overwrite", + "format": "prettier --write ." + }, + "dependencies": { + "@alikia/search-complete": "^0.4.4", + "@iconify/react": "^5.0.1", + "@nextui-org/react": "^2.4.2", + "@types/bun": "^1.1.6", + "@types/express": "^4.17.21", + "@types/tr46": "^5.0.0", + "@xenova/transformers": "^2.17.2", + "cac": "^6.7.14", + "chalk": "^5.3.0", + "express": "^4.19.2", + "fflate": "^0.8.2", + "framer-motion": "^11.2.12", + "generate-license-file": "^3.5.1", + "i18next": "^23.11.5", + "i18next-browser-languagedetector": "^8.0.0", + "i18next-icu": "^2.3.0", + "jest": "^29.7.0", + "jotai": "^2.8.3", + "node-nlp": "^4.27.0", + "onnxruntime-web": "^1.20.0-dev.20240925-a47254eaef", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-helmet": "^6.1.0", + "react-i18next": "^14.1.2", + "react-router": "^6.23.1", + "react-router-dom": "^6.23.1", + "tr46": "^5.0.0", + "valid-url": "^1.0.9", + "validate-color": "^2.2.4", + "vite-express": "^0.17.0" + }, + "devDependencies": { + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@types/react-helmet": "^6.1.11", + "@types/valid-url": "^1.0.7", + "@typescript-eslint/eslint-plugin": "^7.13.1", + "@typescript-eslint/parser": "^7.13.1", + "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10.4.19", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-refresh": "^0.4.7", + "postcss": "^8.4.38", + "prettier": "^3.3.3", + "tailwindcss": "^3.4.4", + "typescript": "^5.2.2", + "vite": "^5.3.1", + "vite-plugin-chunk-split": "^0.5.0", + "vite-plugin-pages": "^0.32.2", + "vite-tsconfig-paths": "^4.3.2" + } } diff --git a/pages/about/index.tsx b/pages/about/index.tsx index 1ba9687..974522e 100644 --- a/pages/about/index.tsx +++ b/pages/about/index.tsx @@ -1,8 +1,38 @@ import useDarkMode from "lib/darkModeHook"; -import getVersion, { apiVersion, clientNLUVersion } from "lib/version"; +import { apiVersion, clientVersion } from "lib/version"; import AboutLayout from "./layout"; import { useTranslation } from "react-i18next"; +function License() { + const { t } = useTranslation(); + return ( + <> + <p className="flex items-center my-4"> + <span className="font-medium text-2xl md:text-2xl mr-4 w-[36rem]"> + {t("about.oss.title")} + </span> + <span + className="relative font-bold px-2 py-1 rounded-md text-nowrap underline + bg-green-600 text-white" + > + <a href="/about/oss-licenses">{t("about.oss.view")}</a> + </span> + </p> + <p className="flex items-center my-4"> + <span className="font-medium text-2xl md:text-2xl mr-4 w-[36rem]"> + {t("about.license.title")} + </span> + <span + className="relative font-bold px-2 py-1 rounded-md text-nowrap underline + bg-red-500 text-white" + > + <a href="/about/license">{t("about.license.text")}</a> + </span> + </p> + </> + ); +} + export default function AboutPage() { const darkMode = useDarkMode(); const { t } = useTranslation(); @@ -26,47 +56,41 @@ export default function AboutPage() { </div> </div> - <Version title="Frontend Version" version={getVersion()} versionClass="bg-red-500" /> <Version - title="Browser NLU Model Version" - version={"Build " + clientNLUVersion} + title={t("about.backend-api-version")} + version={"/api/v" + apiVersion} versionClass="bg-purple-500" /> + <Version - title="Backend API Version" - version={"/api/v" + apiVersion} + title={t("about.client-version")} + version={clientVersion} versionClass="bg-orange-500" /> - <p className="flex items-center my-3"> - <span className="font-bold text-xl md:text-2xl mr-4 w-[36rem]">License</span> - <span - className="relative px-2 py-1 text-sm font-bold rounded-md text-nowrap underline - bg-green-600 text-white" - > - <a href="/about/license">{t("about.license.view")}</a> - </span> - </p> - <p className="relative font-bold text-2xl mt-12">Presented By</p> + <License /> + + <p className="relative font-bold text-2xl mt-12">{t("about.presented-by")}</p> {!darkMode && ( <img src="/assets/img/LuminaraStudio.png" className="relative md:h-64 mt-6" /> )} {darkMode && ( - <img src="/assets/img/LuminaraStudioDark.png" className="relative md:h-56 mt-6" /> + <img src="/assets/img/LuminaraStudioDark.png" className="relative md:h-64 mt-6" /> )} </AboutLayout> ); } function Version(props: { title: string; version: string; versionClass?: string }) { - document.title = "About SparkHome"; const { t } = useTranslation(); return ( - <p className="flex items-center my-3"> - <span className="font-bold text-xl md:text-2xl mr-4 w-[36rem]">{t(props.title)}</span> + <p className="flex items-center my-4"> + <span className="font-medium text-2xl md:text-2xl mr-4 w-[36rem]"> + {t(props.title)} + </span> <span className={ - "relative px-2 py-1 text-sm font-bold rounded-md text-nowrap text-white " + + "relative px-2 py-1 font-bold rounded-md text-nowrap text-white " + props.versionClass || "" } > diff --git a/pages/about/layout.tsx b/pages/about/layout.tsx index 1a697bb..09aa4c9 100644 --- a/pages/about/layout.tsx +++ b/pages/about/layout.tsx @@ -1,6 +1,14 @@ +import React from "react"; +import { useTranslation } from "react-i18next"; +import { Helmet } from "react-helmet"; + export default function AboutLayout({ children }: { children: React.ReactNode }) { + const { t } = useTranslation(); return ( <div className="h-screen w-screen overflow-x-hidden bg-white dark:bg-[rgb(23,25,29)]"> + <Helmet> + <title>{t('about.title')}</title> + </Helmet> <main className="relative h-full w-full md:w-3/4 lg:w-1/2 left-0 md:left-[12.5%] lg:left-1/4 pt-12 px-3 md:px-0" diff --git a/pages/about/license/index.tsx b/pages/about/license/OSS.tsx similarity index 51% rename from pages/about/license/index.tsx rename to pages/about/license/OSS.tsx index 7385ebe..b891635 100644 --- a/pages/about/license/index.tsx +++ b/pages/about/license/OSS.tsx @@ -1,13 +1,20 @@ import LICENSE from "lib/license.txt?raw"; +import { Helmet } from "react-helmet"; +import { useTranslation } from "react-i18next"; -export default function LicensePage() { +export default function OSSLicensesPage() { + const { t } = useTranslation(); return ( <div className="dark:bg-[rgb(23,25,29)] dark:text-white min-h-screen w-screen overflow-x-hidden"> + <Helmet> + <title>{t("oss_license.title")}</title> + </Helmet> <main className="relative h-full w-full md:w-3/4 lg:w-1/2 left-0 md:left-[12.5%] lg:left-1/4 pt-12" > - <h1 className="text-4xl font-bold mb-6">LICENSE</h1> + <h1 className="text-4xl font-bold mb-6">{t('oss_license.page-title')}</h1> + <p className="text-lg mb-8">{t('oss_license.desc')}</p> <div className="font-mono text-justify whitespace-break-spaces">{LICENSE}</div> </main> </div> diff --git a/pages/about/license/ThisProject.tsx b/pages/about/license/ThisProject.tsx new file mode 100644 index 0000000..fc45951 --- /dev/null +++ b/pages/about/license/ThisProject.tsx @@ -0,0 +1,22 @@ +import LICENSE from "LICENSE?raw"; +import { useTranslation } from "react-i18next"; +import { Helmet } from "react-helmet"; + +export default function ThisProjectLicensePage() { + const { t } = useTranslation(); + return ( + <div className="dark:bg-[rgb(23,25,29)] dark:text-white min-h-screen w-screen overflow-x-hidden"> + <Helmet> + <title>{t("license.title")}</title> + </Helmet> + <main + className="relative h-full w-full md:w-3/4 lg:w-1/2 left-0 md:left-[12.5%] lg:left-1/4 + pt-12" + > + <h1 className="text-4xl font-bold mb-6">{t('license.page-title')}</h1> + <p className="text-lg mb-8">{t('license.desc')}</p> + <div className="font-mono text-justify whitespace-break-spaces">{LICENSE}</div> + </main> + </div> + ); +} diff --git a/pages/index.tsx b/pages/index.tsx index a7e8bfe..3303ff0 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -13,6 +13,7 @@ export default function Homepage() { return ( <div className="h-screen w-screen overflow-x-hidden bg-white dark:bg-[rgb(23,25,29)]"> + <title>sparkast</title> <Background /> <EngineSelector diff --git a/src/app.tsx b/src/app.tsx index 9bb0659..9c11ef3 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -3,7 +3,8 @@ import { createBrowserRouter, RouterProvider } from "react-router-dom"; import "./i18n"; import Homepage from "pages"; import AboutPage from "pages/about"; -import LicensePage from "pages/about/license"; +import OSSLicensesPage from "pages/about/license/OSS"; +import ThisProjectLicensePage from "../pages/about/license/ThisProject.tsx"; const router = createBrowserRouter([ { @@ -11,14 +12,16 @@ const router = createBrowserRouter([ element: <Homepage /> }, { - path: "about", + path: "/about", element: <AboutPage />, - children: [ - { - path: "license", - element: <LicensePage /> - } - ] + }, + { + path: "/about/oss-licenses", + element: <OSSLicensesPage /> + }, + { + path: "/about/license", + element: <ThisProjectLicensePage /> } ]); diff --git a/test/bytesToUnicode.test.ts b/test/bytesToUnicode.test.ts deleted file mode 100644 index 18bfa8f..0000000 --- a/test/bytesToUnicode.test.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { expect, test } from "bun:test"; -import bytesToUnicodes from "../lib/nlp/tokenize/bytesToUnicode"; - -test("bytesToUnicode: test", () => { - expect(bytesToUnicodes("Hello 你好")).toEqual("HelloĠä½łå¥½"); -}); diff --git a/test/getEmbeddings.test.ts b/test/getEmbeddings.test.ts deleted file mode 100644 index e69de29..0000000 diff --git a/test/unicodeToBytes.test.ts b/test/unicodeToBytes.test.ts deleted file mode 100644 index ab5be6f..0000000 --- a/test/unicodeToBytes.test.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { expect, test } from "bun:test"; -import unicodeToBytes from "../lib/nlp/tokenize/unicodeToBytes"; - -test("unicodeToBytes: test", () => { - expect(unicodeToBytes("HelloĠä½łå¥½")).toEqual("Hello 你好"); -}); diff --git a/test/validLink.test.ts b/test/validLink.test.ts index 58e1aa1..a028f6b 100644 --- a/test/validLink.test.ts +++ b/test/validLink.test.ts @@ -60,6 +60,7 @@ describe("Check if the given TLD exist and assigned.", () => { expect(validTLD("example.foo")).toBe(true); expect(validTLD("example.bar")).toBe(true); expect(validTLD("example.zip")).toBe(true); + expect(validTLD("xn--s8w913fdga.chn.moe")).toBe(true); }); test("Exist but not assigned TLD", () => { expect(validTLD("example.active")).toBe(false);