From bfc8f08802d1e555ebd1d63e6e249677ae2ba51b Mon Sep 17 00:00:00 2001 From: alikia2x Date: Sat, 29 Jun 2024 18:37:52 +0800 Subject: [PATCH] feature: backend, and onesearch in frontend --- .eslintrc.cjs | 18 -- bun.lockb | Bin 123151 -> 290125 bytes components/engineSelector.tsx | 77 +++++++ components/onesearch/handleEnter.ts | 26 +++ components/onesearch/handleNLUResult.ts | 42 ++++ components/onesearch/link.tsx | 30 +++ components/onesearch/onesearch.tsx | 178 ++++++++++++++ components/onesearch/plainSearch.tsx | 35 +++ components/onesearch/plainText.tsx | 21 ++ components/onesearch/suggestion.tsx | 6 + components/onesearch/suggestionBox.tsx | 9 + components/time.tsx | 2 +- i18n/en.json | 35 ++- lib/nlp/data/en.json | 134 +++++++++++ lib/nlp/data/zh.json | 124 ++++++++++ lib/nlp/load.ts | 55 +++++ lib/nlp/train.ts | 76 ++++++ lib/onesearch/getSearchEngineName.ts | 17 ++ lib/onesearch/handleEnter.ts | 2 +- lib/onesearch/translatedEngineList.ts | 1 + lib/telemetering/sendError.ts | 21 ++ lib/url/tldList.ts | 1 + lib/url/validLink.ts | 33 +++ lib/weather/getCurrentWeather.ts | 39 ++++ lib/weather/getLocation.ts | 17 ++ lib/weather/getWeather.ts | 23 ++ lib/weather/wmocode.ts | 294 ++++++++++++++++++++++++ package.json | 93 ++++---- pages/index.tsx | 8 +- public/model | Bin 0 -> 27776 bytes server.ts | 87 +++++++ src/app.tsx | 36 +-- tailwind.config.ts | 7 +- 33 files changed, 1463 insertions(+), 84 deletions(-) delete mode 100644 .eslintrc.cjs create mode 100644 components/engineSelector.tsx create mode 100644 components/onesearch/handleEnter.ts create mode 100644 components/onesearch/handleNLUResult.ts create mode 100644 components/onesearch/link.tsx create mode 100644 components/onesearch/onesearch.tsx create mode 100644 components/onesearch/plainSearch.tsx create mode 100644 components/onesearch/plainText.tsx create mode 100644 components/onesearch/suggestion.tsx create mode 100644 components/onesearch/suggestionBox.tsx create mode 100644 lib/nlp/data/en.json create mode 100644 lib/nlp/data/zh.json create mode 100644 lib/nlp/load.ts create mode 100644 lib/nlp/train.ts create mode 100644 lib/onesearch/getSearchEngineName.ts create mode 100644 lib/onesearch/translatedEngineList.ts create mode 100644 lib/telemetering/sendError.ts create mode 100644 lib/url/tldList.ts create mode 100644 lib/url/validLink.ts create mode 100644 lib/weather/getCurrentWeather.ts create mode 100644 lib/weather/getLocation.ts create mode 100644 lib/weather/getWeather.ts create mode 100644 lib/weather/wmocode.ts create mode 100644 public/model create mode 100644 server.ts diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index d6c9537..0000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - root: true, - env: { browser: true, es2020: true }, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:react-hooks/recommended', - ], - ignorePatterns: ['dist', '.eslintrc.cjs'], - parser: '@typescript-eslint/parser', - plugins: ['react-refresh'], - rules: { - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, -} diff --git a/bun.lockb b/bun.lockb index 6ab783a484085fab947a0c732c5bd2bd14c02598..66f3594db93725cdfddf94ebdbf214da43a00734 100755 GIT binary patch literal 290125 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þ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 quc=d2Ux$f)yWhhVD|aruGrdh#W=?))fjL>B Array.from(selectedKeys).join(", "), [selectedKeys]); + const setSettings = useSetAtom(settingsAtom); + + + + function getName(engineKey: string) { + return engineTranslation.includes(engineKey) ? t(`engine.${engineKey}`) : engineKey; + } + + useEffect(() => { + function setEngine(engine: string) { + setSettings((oldSettings: settingsType) => { + return { + ...oldSettings, + currentSearchEngine: engine + }; + }); + } + if (selectedValue !== currentEngine) { + setEngine(selectedValue); + } + }, [currentEngine, selectedValue, setSettings]); + + const [isClient, setIsClient] = useState(false); + + useEffect(() => { + setIsClient(true); + }, []); + + return ( +

+ { + isClient && + ( + + + + + + {Object.keys(items).map((item) => ( + + {getName(item)} + + ))} + + + )} +
+ ); +} \ No newline at end of file diff --git a/components/onesearch/handleEnter.ts b/components/onesearch/handleEnter.ts new file mode 100644 index 0000000..f3d6fdd --- /dev/null +++ b/components/onesearch/handleEnter.ts @@ -0,0 +1,26 @@ +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[], + query: string, + settings: settingsType, + searchBoxRef: React.RefObject +) { + const selected = suggestion[index]; + const engine = settings.searchEngines[settings.currentSearchEngine]; + const newTab = settings.searchInNewTab; + let clipboard: any; + if (selected.type === "QUERY" || selected.type === "default") { + search(selected.suggestion, engine, newTab); + } else if (selected.type === "NAVIGATION" || selected.type === "default-link") { + window.open(normalizeURL(selected.suggestion)); + } else if (selected.type === "text") { + console.log("????"); + copyToClipboard(selected.suggestion); + searchBoxRef.current?.focus(); + } +} diff --git a/components/onesearch/handleNLUResult.ts b/components/onesearch/handleNLUResult.ts new file mode 100644 index 0000000..6bddeaa --- /dev/null +++ b/components/onesearch/handleNLUResult.ts @@ -0,0 +1,42 @@ +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; + +export function handleNLUResult(result: any, updateSuggestion: UpdateSuggestionFunction){ + if (result.intent == "weather.summary") { + getLocationNative((data: GeolocationCoordinates | GeolocationPositionError) => { + console.log(data); + if (data instanceof GeolocationCoordinates) { + getWeather(data.latitude, data.longitude).then((weather) => { + console.log(weather["hourly"]); + let hourIndex = findClosestDateIndex( + weather["hourly"]["time"], + weather["utc_offset_seconds"] + ); + let temp = weather["hourly"]["apparent_temperature"][hourIndex]; + let weatherCode = weather["hourly"]["weather_code"][hourIndex]; + console.log(temp, weatherCode, hourIndex); + updateSuggestion([ + { + type: "text", + suggestion: `Weather: ${temp}${weather["hourly_units"]["apparent_temperature"]}, ${WMOCodeTable[weatherCode]["day"].description}`, + relevance: 3000 * result.score + } + ]); + }); + } + }); + } else if (result.intent !== "None") { + updateSuggestion([ + { + type: "text", + suggestion: result.intent, + relevance: 2200 * result.score + } + ]); + } +} \ No newline at end of file diff --git a/components/onesearch/link.tsx b/components/onesearch/link.tsx new file mode 100644 index 0000000..888e98d --- /dev/null +++ b/components/onesearch/link.tsx @@ -0,0 +1,30 @@ +import { normalizeURL } from "lib/normalizeURL"; + +export default function Link(props: { children: React.ReactNode; query: string; selected: boolean }) { + if (props.selected) { + return ( +
{ + window.open(normalizeURL(props.query)); + }} + > + {props.children} +
+ ); + } + else { + return ( +
{ + window.open(normalizeURL(props.query)); + }} + > + {props.children} +
+ ); + } +} diff --git a/components/onesearch/onesearch.tsx b/components/onesearch/onesearch.tsx new file mode 100644 index 0000000..7f686f7 --- /dev/null +++ b/components/onesearch/onesearch.tsx @@ -0,0 +1,178 @@ +import { useEffect, useRef, useState } from "react"; +import SuggestionBox from "./suggestionBox"; +import { queryAtom } from "lib/state/query"; +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 Link from "./link"; +import { selectedSuggestionAtom } from "lib/state/suggestionSelection"; +import { settingsAtom } from "lib/state/settings"; +import PlainText from "./plainText"; +import { sendError } from "lib/telemetering/sendError"; +import { NLU } from "lib/nlp/load"; +import { handleNLUResult } from "./handleNLUResult"; +import { useAtom, useAtomValue } from "jotai"; +import i18next from "i18next"; +import { useTranslation } from "react-i18next"; + +export default function OneSearch() { + const [suggestion, setFinalSuggetsion] = useAtom(suggestionAtom); + const [manager, setManager] = useState(null); + const lastRequestTimeRef = useRef(0); + const selected = useAtomValue(selectedSuggestionAtom); + const settings = useAtomValue(settingsAtom); + const devMode = true; + const query = useAtomValue(queryAtom); + const engineName = getSearchEngineName(); + const engine = settings.currentSearchEngine; + const { t } = useTranslation("Search"); + const lang = i18next.language; + + useEffect(() => { + const time = new Date().getTime().toString(); + if (query.trim() === "" || query.length > 120) { + cleanSuggestion("QUERY", "NAVIGATION"); + return; + } + fetch(`/api/suggestion?q=${query}&l=${lang}&t=${time}&engine=${engine}`) + .then((res) => res.json()) + .then((data: suggestionsResponse) => { + try { + const suggestionToUpdate: suggestionItem[] = data.suggestions; + if (data.time > lastRequestTimeRef.current) { + cleanSuggestion("NAVIGATION", "QUERY"); + lastRequestTimeRef.current = data.time; + updateSuggestion(suggestionToUpdate); + } + } catch (error: Error | unknown) { + if (error instanceof Error) { + sendError(error); + } + } + }) + .catch((error) => { + // Handle fetch error + sendError(error); + }); + }, [query]); + + function updateSuggestion(data: suggestionItem[]) { + setFinalSuggetsion((cur: suggestionItem[]) => { + const types: string[] = []; + for (const sug of data) { + if (!types.includes(sug.type)) types.push(sug.type); + } + for (const type of types) { + cur = cur.filter((item) => { + return item.type !== type; + }); + } + return cur.concat(data).sort((a, b) => { + return b.relevance - a.relevance; + }); + }); + } + + function cleanSuggestion(...types: string[]) { + setFinalSuggetsion((suggestion: suggestionItem[]) => { + return suggestion.filter((item) => { + return !types.includes(item.type); + }); + }); + } + + const NLUModel = new NLU(); + + useEffect(() => { + NLUModel.init().then((nlu) => { + setManager(nlu.manager); + console.log(nlu.manager); + }); + }, []); + + useEffect(() => { + cleanSuggestion("default-link", "default", "text"); + if (validLink(query)) { + updateSuggestion([ + { type: "default-link", suggestion: query, relevance: 3000, prompt: Go to: }, + { type: "default", suggestion: query, relevance: 1600 } + ]); + } else { + updateSuggestion([ + { + type: "default", + suggestion: query, + relevance: 2000 + } + ]); + } + + if (manager != null) { + // @ts-ignore + manager.process(query).then((result) => { + console.log(result); + handleNLUResult(result, updateSuggestion); + }); + } + }, [query, engineName]); + + return ( + + {suggestion.map((s, i) => { + if (s.suggestion.trim() === "") return; + if (s.type === "default") { + return ( + + {s.suggestion}  + + {t("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") { + 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> + ); + } + })} + </SuggestionBox> + ); +} diff --git a/components/onesearch/plainSearch.tsx b/components/onesearch/plainSearch.tsx new file mode 100644 index 0000000..c0e7c8c --- /dev/null +++ b/components/onesearch/plainSearch.tsx @@ -0,0 +1,35 @@ +import { useAtomValue } from "jotai"; +import search from "lib/search"; +import { settingsAtom } from "lib/state/settings"; + +export default function PlainSearch(props: { children: React.ReactNode; query: string; selected: boolean }) { + const settings = useAtomValue(settingsAtom); + const engine = settings.searchEngines[settings.currentSearchEngine]; + const newTab = settings.searchInNewTab; + if (props.selected) { + return ( + <div + className={`relative w-full h-10 leading-10 bg-zinc-300 dark:bg-zinc-700 + px-5 z-10 cursor-pointer duration-100 truncate`} + onClick={() => { + search(props.query, engine, newTab); + }} + > + {props.children} + </div> + ); + } + else { + return ( + <div + className={`relative w-full h-10 leading-10 bg-zinc-100 hover:bg-zinc-300 + dark:bg-zinc-800 hover:dark:bg-zinc-700 px-5 z-10 cursor-pointer duration-100 truncate`} + onClick={() => { + search(props.query, engine, newTab); + }} + > + {props.children} + </div> + ); + } +} diff --git a/components/onesearch/plainText.tsx b/components/onesearch/plainText.tsx new file mode 100644 index 0000000..71cbe48 --- /dev/null +++ b/components/onesearch/plainText.tsx @@ -0,0 +1,21 @@ +export default function PlainText(props: { children: React.ReactNode; selected: boolean }) { + if (props.selected) { + return ( + <div + className={`relative w-full h-auto leading-6 break-all py-[0.6rem] bg-zinc-300 dark:bg-zinc-700 + px-5 z-10 cursor-pointer duration-100`} + > + {props.children} + </div> + ); + } else { + return ( + <div + className={`relative w-full h-auto leading-6 break-all py-[0.6rem] bg-zinc-100 hover:bg-zinc-300 + dark:bg-zinc-800 hover:dark:bg-zinc-700 px-5 z-10 cursor-pointer duration-100`} + > + {props.children} + </div> + ); + } +} diff --git a/components/onesearch/suggestion.tsx b/components/onesearch/suggestion.tsx new file mode 100644 index 0000000..c10b878 --- /dev/null +++ b/components/onesearch/suggestion.tsx @@ -0,0 +1,6 @@ +export default function Suggestion(props: { children: React.ReactNode }) { + return ( + <div dangerouslySetInnerHTML={{ __html: `<p>${props.children}</p>` as string }} className={`relative w-full h-10 leading-10 bg-zinc-100 hover:bg-zinc-300 dark:bg-zinc-800 hover:dark:bg-zinc-700 px-5 z-10 cursor-pointer duration-100`}> + </div> + ); +} \ No newline at end of file diff --git a/components/onesearch/suggestionBox.tsx b/components/onesearch/suggestionBox.tsx new file mode 100644 index 0000000..70637a5 --- /dev/null +++ b/components/onesearch/suggestionBox.tsx @@ -0,0 +1,9 @@ +export default function SuggestionBox(props: { children?: React.ReactNode }) { + return ( + <div className={`relative bg-zinc-100 dark:bg-zinc-800 w-11/12 sm:w-[700px] h-auto max-h-[calc(100vh-20rem)] + overflow-y-auto left-1/2 translate-x-[-50%] top-72 z-20 rounded-md overflow-hidden duration-250 + ${props.children ? "opacity-100" : "opacity-0"}`}> + {props.children} + </div> + ); +} diff --git a/components/time.tsx b/components/time.tsx index c33a6b1..32831c9 100644 --- a/components/time.tsx +++ b/components/time.tsx @@ -33,7 +33,7 @@ export default function Time(props: { <div className="absolute top-20 lg:top-44 short:top-0 translate-x-[-50%] left-1/2 w-11/12 sm:w-[700px] text:black - dark:text-white text-3xl text-left text-shadow-lg z-10" + dark:text-white text-3xl text-left text-shadow-lg" > {formatTime()}{" "} <span className="text-lg leading-9 relative"> diff --git a/i18n/en.json b/i18n/en.json index b03c753..35caf64 100755 --- a/i18n/en.json +++ b/i18n/en.json @@ -1,5 +1,32 @@ { - "search" : { - "placeholder" : "Search or type a URL" - } -} \ No newline at end of file + "Search": { + "placeholder": "Search or type a URL", + "engine-aria": "Switch search engine", + "engine": { + "google": "Google", + "baidu": "Baidu", + "bing": "Bing", + "duckduckgo": "DuckDuckGo", + "yandex": "Yandex", + "yahoo": "Yahoo", + "ecosia": "Ecosia" + }, + "search-help-text": "Search {engine}" + }, + "404": { + "title": "Page Not Found" + }, + "About": { + "title": "SparkHome" + }, + "tools": { + "base64": { + "title": "Base64 tools - LuminaraUtils", + "decode": "Decode", + "encode": "Encode", + "result": "Result: ", + "copy": "Copy", + "copied": "Copied" + } + } +} diff --git a/lib/nlp/data/en.json b/lib/nlp/data/en.json new file mode 100644 index 0000000..98e17dc --- /dev/null +++ b/lib/nlp/data/en.json @@ -0,0 +1,134 @@ +{ + "weather.summary": [ + "how's the weather", + "What's going on with the weather?", + "Can you give me an update on the weather?", + "How's the forecast looking today?", + "Give me a summary of the current weather.", + "Can you tell me the current weather?", + "What is the weather situation at the moment?", + "Could you provide a quick weather update?", + "Is it raining or sunny outside?", + "What's the weather like right now?", + "Tell me the current weather conditions.", + "How about the weather today?", + "Is it a good day to be outside?", + "What should I expect in terms of weather today?", + "Is there any severe weather to be aware of?", + "Can you summarize today's weather forecast?", + "What's the weather looking like for the next few hours?", + "Is it going to stay this way all day?", + "Could you give me a brief overview of the weather?", + "What's the general weather situation in our area?", + "Is it cloudy or clear outside?", + "Any weather alerts I should know about?", + "How's the weather looking for outdoor activities?", + "What's the forecast saying for today's weather?", + "Is it going to be a warm day?", + "Are we expecting any storms today?", + "What's the weather condition outside my window?", + "Is it a typical day for this season in terms of weather?", + "how's the weather now?" + ], + + "weather.temp": [ + "What's the temperature like right now?", + "Can you tell me the current temperature?", + "How hot is it outside?", + "What's the temperature supposed to be today?", + "What is the current temp outside?", + "Could you tell me the outdoor temperature?", + "Is it cold or warm outside?", + "What's the high temperature for today?", + "What's the low temperature expected tonight?", + "How does the temperature feel outside?", + "Is it going to get warmer or cooler today?", + "What's the temperature in the shade?", + "Can you provide the current temp in Celsius?", + "What's the temperature in Fahrenheit right now?", + "Is it too hot to be outside?", + "What's the temperature like in the morning?", + "How about the temperature in the evening?", + "Is it warm enough to go swimming?", + "What's the temperature in the city center?", + "Can you tell me the temp in the nearby area?", + "Is it below freezing outside?", + "What's the average temperature for today?", + "Is the temperature dropping or rising?", + "What should I wear considering the temperature?" + ], + + "base64.encode": [ + "Please encode this data with base64: %s", + "I need to encode the following data in base64: %s", + "Could you encode this string using base64? %s", + "Convert this data to b64 encoding: %s", + "I want to encode this information with base64: %s", + "Help me encode this in base64: %s", + "Can you encode this data to base64 format? %s", + "b64 encode", + "base64 encode", + "encode base64 %s" + ], + + "base64.decode": [ + "Please decode this base64 data: %s", + "I have a base64 encoded string that needs decoding: %s", + "Could you decode this base64 string for me? %s", + "Convert this base64 encoded data back to its original form: %s", + "I need to decode this base64 information: %s", + "Help me decode this base64 data: %s", + "Can you translate this base64 back to normal text? %s", + "b64 decode", + "base64 decode", + "decode base64 %s" + ], + + "url.encode": [ + "Please encode this URL: %s", + "I need to encode this URL component: %s", + "Could you encode this part of the URL? %s", + "Convert this URL to its encoded form: %s", + "I want to encode this URL for safe transmission: %s", + "Help me encode this URL segment: %s", + "Can you encode this URL data? %s" + ], + + "url.decode": [ + "Please decode this URL: %s", + "I have an encoded URL that needs decoding: %s", + "Could you decode this URL for me? %s", + "Convert this encoded URL back to its original form: %s", + "I need to decode this URL component: %s", + "Help me decode this URL segment: %s", + "Can you translate this encoded URL back to normal? %s" + ], + + "html.encode": [ + "Please encode this HTML entity: %s", + "I need to encode this text to HTML entity: %s", + "Could you encode this as an HTML entity? %s", + "Convert this text to HTML entity encoding: %s", + "I want to encode this to prevent HTML interpretation: %s", + "Help me encode this into HTML entity: %s", + "Can you encode this for HTML usage? %s" + ], + + "html.decode": [ + "Please decode this HTML entity: %s", + "I have an HTML entity that needs decoding: %s", + "Could you decode this HTML entity for me? %s", + "Convert this HTML entity back to its original text: %s", + "I need to decode this HTML entity to plain text: %s", + "Help me decode this HTML entity: %s", + "Can you translate this HTML entity back to normal text? %s" + ], + + "None": [ + "free weather api", + "js get timezone", + "how", + "how's", + "how's the" + ] +} diff --git a/lib/nlp/data/zh.json b/lib/nlp/data/zh.json new file mode 100644 index 0000000..09cdf11 --- /dev/null +++ b/lib/nlp/data/zh.json @@ -0,0 +1,124 @@ +{ + "weather.summary": [ + "天气如何", + "现在的天气", + "今天的天气预报", + "现在的天气状况", + "今天天气怎么样", + "目前是什么天气", + "今天的天气概述", + "当前天气状况如何", + "今天会下雨吗", + "今天会下雪吗", + "今天晴天吗", + "今天的天气状况如何", + "现在外面是什么天气", + "今天天气好么", + "今天适合外出吗", + "今天的天气适宜做什么", + "今天有没有雾霾", + "今天的空气质量如何", + "今天的紫外线指数是多少", + "今天有没有大风", + "今天会不会很冷", + "今天的天气会变化吗", + "今天晚上的天气如何", + "今天夜里会下雨吗", + "今天的天气对出行有影响吗", + "今天的天气对运动有影响吗", + "今天的天气对工作有影响吗", + "今天的天气对旅游有影响吗", + "今天的天气对健康有影响吗" + ], + "weather.temp": [ + "现在的温度", + "现在多少度", + "外面有多热", + "明天热不热?", + "现在的气温是多少", + "今天最高温度是多少", + "今天最低温度是多少", + "现在外面感觉冷吗", + "现在需要穿外套吗", + "现在适合穿短袖吗", + "现在的温度适合外出吗", + "现在的温度适合运动吗", + "现在的温度适合睡觉吗", + "明天会比今天热吗", + "明天会比今天冷吗", + "今天的温度变化大吗", + "现在的温度适合开空调吗", + "现在的温度适合开暖气吗", + "室外的温度是多少", + "室内的温度是多少", + "现在的温度适合种植吗", + "现在的温度适合养宠物吗", + "现在的温度对健康有影响吗", + "现在的温度是否舒适", + "现在的温度是否适合工作" + ], + "base64.encode": [ + "请将数据使用base64编码:%s", + "需要将以下数据base64编码:%s", + "请将此字符串转为base64:%s", + "将数据转为base64编码:%s", + "信息base64编码:%s", + "请帮忙编码base64:%s", + "将数据编码为base64:%s" + ], + + "base64.decode": [ + "请解码这个base64数据:%s", + "有base64编码字符串需要解码:%s", + "帮忙解码base64:%s", + "将base64编码转回原数据:%s", + "解码base64信息:%s", + "解码这个base64:%s", + "将base64转文本:%s" + ], + + "url.encode": [ + "请编码这个URL:%s", + "URL部分需要编码:%s", + "请将URL部分编码:%s", + "URL编码转换:%s", + "安全传输需编码URL:%s", + "编码URL段:%s", + "URL数据编码:%s" + ], + + "url.decode": [ + "请解码这个URL:%s", + "有URL编码需要解码:%s", + "解码这个URL:%s", + "URL编码转回原URL:%s", + "解码URL部分:%s", + "解码URL段:%s", + "URL编码转文本:%s" + ], + + "html.encode": [ + "请编码HTML实体:%s", + "文本转为HTML实体:%s", + "编码为HTML实体:%s", + "文本HTML实体编码:%s", + "预防HTML解析编码:%s", + "HTML实体编码:%s", + "文本HTML使用编码:%s" + ], + + "html.decode": [ + "请解码HTML实体:%s", + "HTML实体需要解码:%s", + "解码HTML实体:%s", + "HTML实体转回文本:%s", + "HTML实体解码:%s", + "解码HTML实体:%s", + "HTML实体转文本:%s" + ], + + "None": [ + "你好", + "为什么计算机使用二进制" + ] +} diff --git a/lib/nlp/load.ts b/lib/nlp/load.ts new file mode 100644 index 0000000..63d0517 --- /dev/null +++ b/lib/nlp/load.ts @@ -0,0 +1,55 @@ +// @ts-ignore +import { containerBootstrap } from "@nlpjs/core"; +// @ts-ignore +import { Nlp } from "@nlpjs/nlp"; +// @ts-ignore +import { NluManager, NluNeural } from "@nlpjs/nlu"; +// @ts-ignore +import { LangEn } from "@nlpjs/lang-en-min"; +// @ts-ignore +import { LangZh } from "@nlpjs/lang-zh"; +import * as fflate from 'fflate'; + +let zh: TrainData = {}; +let en: TrainData = {}; + +type TrainData = { + [key: string]: string[]; +}; + +export class NLU { + manager: any; + inited: boolean = false; + async loadIntentionModel() { + const container = await containerBootstrap(); + container.use(Nlp); + container.use(LangEn); + container.use(LangZh); + container.use(NluNeural); + const manager = new NluManager({ + container, + locales: ["en", "zh"], + nlu: { + useNoneFeature: true + } + }); + const response = await fetch("/model"); + + const responseBuf = await response.arrayBuffer(); + const compressed = new Uint8Array(responseBuf); + const decompressed = fflate.decompressSync(compressed); + const modelText = fflate.strFromU8(decompressed); + manager.fromJSON(JSON.parse(modelText)); + this.manager = manager; + // console.log(this.manager); + } + async init() { + await this.loadIntentionModel(); + this.inited = true; + return this; + } + async process(lang: string, text: string): Promise<any> { + const actual = await this.manager.process(lang, text); + return actual; + } +} \ No newline at end of file diff --git a/lib/nlp/train.ts b/lib/nlp/train.ts new file mode 100644 index 0000000..21f6972 --- /dev/null +++ b/lib/nlp/train.ts @@ -0,0 +1,76 @@ +// @ts-ignore +import { containerBootstrap } from "@nlpjs/core"; +// @ts-ignore +import { Nlp } from "@nlpjs/nlp"; +// @ts-ignore +import { NluManager, NluNeural } from "@nlpjs/nlu"; +// @ts-ignore +import { LangEn } from "@nlpjs/lang-en-min"; +// @ts-ignore +import { LangZh } from "@nlpjs/lang-zh"; +import fs from "node:fs"; +import * as fflate from 'fflate'; + +let zh: TrainData = {}; +let en: TrainData = {}; + +type TrainData = { + [key: string]: string[]; +}; + +export async function trainIntentionModel() { + try { + const dataZH = fs.readFileSync("./lib/nlp/data/zh.json", "utf8"); + const dataEN = fs.readFileSync("./lib/nlp/data/en.json", "utf8"); + zh = JSON.parse(dataZH); + en = JSON.parse(dataEN); + } catch (err) { + console.error(err); + } + + const container = await containerBootstrap(); + container.use(Nlp); + container.use(LangEn); + container.use(LangZh); + container.use(NluNeural); + const manager = new NluManager({ + container, + locales: ["en", "zh"], + nlu: { + useNoneFeature: true + } + }); + // Adds the utterances and intents for the NLP + + for (const key in zh) { + for (const value of zh[key]) { + manager.add("zh", value, key); + } + } + + for (const key in en) { + for (const value of en[key]) { + manager.add("en", value, key); + } + } + + await manager.train(); + + // let actual = await manager.process("en", "base64 decode bilibili"); + // console.log(actual); + // let actualZH = await manager.process("zh", "去除百分号"); + // console.log(actualZH); + + const resultModel = manager.toJSON(); + + const buf = fflate.strToU8(JSON.stringify(resultModel)); + + const gzipped = fflate.gzipSync(buf, { + filename: 'model.json', + mtime: new Date().getTime() + }); + + fs.writeFileSync("./public/model", Buffer.from(gzipped)); +} + +trainIntentionModel(); diff --git a/lib/onesearch/getSearchEngineName.ts b/lib/onesearch/getSearchEngineName.ts new file mode 100644 index 0000000..4d6eac6 --- /dev/null +++ b/lib/onesearch/getSearchEngineName.ts @@ -0,0 +1,17 @@ +import { engineTranslation } from "lib/onesearch/translatedEngineList"; +import { settingsAtom } from "lib/state/settings"; +import { settingsType } from "global"; +import { useAtomValue } from "jotai"; +import { useTranslation } from "react-i18next"; + +export default function(){ + const settings: settingsType = useAtomValue(settingsAtom); + const currentEngine = settings.currentSearchEngine; + const displayEngine = getName(currentEngine); + return displayEngine; +} + +function getName(engineKey: string) { + const { t } = useTranslation("Search"); + return engineTranslation.includes(engineKey) ? t(`engine.${engineKey}`) : engineKey; +} \ No newline at end of file diff --git a/lib/onesearch/handleEnter.ts b/lib/onesearch/handleEnter.ts index 7a49360..e604bb5 100644 --- a/lib/onesearch/handleEnter.ts +++ b/lib/onesearch/handleEnter.ts @@ -6,7 +6,7 @@ import search from "lib/search"; export default function ( index: number, suggestion: suggestionItem[], - query: string, + _query: string, settings: settingsType, searchBoxRef: React.RefObject<HTMLInputElement> ) { diff --git a/lib/onesearch/translatedEngineList.ts b/lib/onesearch/translatedEngineList.ts new file mode 100644 index 0000000..d486591 --- /dev/null +++ b/lib/onesearch/translatedEngineList.ts @@ -0,0 +1 @@ +export const engineTranslation = ["google", "bing", "baidu", "duckduckgo", "yandex", "ecosia", "yahoo"]; \ No newline at end of file diff --git a/lib/telemetering/sendError.ts b/lib/telemetering/sendError.ts new file mode 100644 index 0000000..aa558c1 --- /dev/null +++ b/lib/telemetering/sendError.ts @@ -0,0 +1,21 @@ +import pjson from "package.json" + +const CLIENT_VERSION = pjson.version; + +export function sendError(error: Error) { + fetch("/api/error", { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify({ + message: error.message, + name: error.name, + time: new Date().getTime()/1000, + version: CLIENT_VERSION, + ua: navigator.userAgent, + cause: error.cause, + stack: error.stack + }) + }) +} \ No newline at end of file diff --git a/lib/url/tldList.ts b/lib/url/tldList.ts new file mode 100644 index 0000000..927e0e5 --- /dev/null +++ b/lib/url/tldList.ts @@ -0,0 +1 @@ +export const tldList = ["aaa", "aarp", "abb", "abbott", "abbvie", "abc", "able", "abogado", "abudhabi", "ac", "academy", "accenture", "accountant", "accountants", "aco", "actor", "ad", "ads", "adult", "ae", "aeg", "aero", "aetna", "af", "afl", "africa", "ag", "agakhan", "agency", "ai", "aig", "airbus", "airforce", "airtel", "akdn", "al", "alibaba", "alipay", "allfinanz", "allstate", "ally", "alsace", "alstom", "am", "amazon", "americanexpress", "americanfamily", "amex", "amfam", "amica", "amsterdam", "analytics", "android", "anquan", "anz", "ao", "aol", "apartments", "app", "apple", "aq", "aquarelle", "ar", "arab", "aramco", "archi", "army", "arpa", "art", "arte", "as", "asda", "asia", "associates", "at", "athleta", "attorney", "au", "auction", "audi", "audible", "audio", "auspost", "author", "auto", "autos", "aw", "aws", "ax", "axa", "az", "azure", "ba", "baby", "baidu", "banamex", "band", "bank", "bar", "barcelona", "barclaycard", "barclays", "barefoot", "bargains", "baseball", "basketball", "bauhaus", "bayern", "bb", "bbc", "bbt", "bbva", "bcg", "bcn", "bd", "be", "beats", "beauty", "beer", "bentley", "berlin", "best", "bestbuy", "bet", "bf", "bg", "bh", "bharti", "bi", "bible", "bid", "bike", "bing", "bingo", "bio", "biz", "bj", "black", "blackfriday", "blockbuster", "blog", "bloomberg", "blue", "bm", "bms", "bmw", "bn", "bnpparibas", "bo", "boats", "boehringer", "bofa", "bom", "bond", "boo", "book", "booking", "bosch", "bostik", "boston", "bot", "boutique", "box", "br", "bradesco", "bridgestone", "broadway", "broker", "brother", "brussels", "bs", "bt", "build", "builders", "business", "buy", "buzz", "bv", "bw", "by", "bz", "bzh", "ca", "cab", "cafe", "cal", "call", "calvinklein", "cam", "camera", "camp", "canon", "capetown", "capital", "capitalone", "car", "caravan", "cards", "care", "career", "careers", "cars", "casa", "case", "cash", "casino", "cat", "catering", "catholic", "cba", "cbn", "cbre", "cc", "cd", "center", "ceo", "cern", "cf", "cfa", "cfd", "cg", "ch", "chanel", "channel", "charity", "chase", "chat", "cheap", "chintai", "christmas", "chrome", "church", "ci", "cipriani", "circle", "cisco", "citadel", "citi", "citic", "city", "ck", "cl", "claims", "cleaning", "click", "clinic", "clinique", "clothing", "cloud", "club", "clubmed", "cm", "cn", "co", "coach", "codes", "coffee", "college", "cologne", "com", "commbank", "community", "company", "compare", "computer", "comsec", "condos", "construction", "consulting", "contact", "contractors", "cooking", "cool", "coop", "corsica", "country", "coupon", "coupons", "courses", "cpa", "cr", "credit", "creditcard", "creditunion", "cricket", "crown", "crs", "cruise", "cruises", "cu", "cuisinella", "cv", "cw", "cx", "cy", "cymru", "cyou", "cz", "dabur", "dad", "dance", "data", "date", "dating", "datsun", "day", "dclk", "dds", "de", "deal", "dealer", "deals", "degree", "delivery", "dell", "deloitte", "delta", "democrat", "dental", "dentist", "desi", "design", "dev", "dhl", "diamonds", "diet", "digital", "direct", "directory", "discount", "discover", "dish", "diy", "dj", "dk", "dm", "dnp", "do", "docs", "doctor", "dog", "domains", "dot", "download", "drive", "dtv", "dubai", "dunlop", "dupont", "durban", "dvag", "dvr", "dz", "earth", "eat", "ec", "eco", "edeka", "edu", "education", "ee", "eg", "email", "emerck", "energy", "engineer", "engineering", "enterprises", "epson", "equipment", "er", "ericsson", "erni", "es", "esq", "estate", "et", "eu", "eurovision", "eus", "events", "exchange", "expert", "exposed", "express", "extraspace", "fage", "fail", "fairwinds", "faith", "family", "fan", "fans", "farm", "farmers", "fashion", "fast", "fedex", "feedback", "ferrari", "ferrero", "fi", "fidelity", "fido", "film", "final", "finance", "financial", "fire", "firestone", "firmdale", "fish", "fishing", "fit", "fitness", "fj", "fk", "flickr", "flights", "flir", "florist", "flowers", "fly", "fm", "fo", "foo", "food", "football", "ford", "forex", "forsale", "forum", "foundation", "fox", "fr", "free", "fresenius", "frl", "frogans", "frontier", "ftr", "fujitsu", "fun", "fund", "furniture", "futbol", "fyi", "ga", "gal", "gallery", "gallo", "gallup", "game", "games", "gap", "garden", "gay", "gb", "gbiz", "gd", "gdn", "ge", "gea", "gent", "genting", "george", "gf", "gg", "ggee", "gh", "gi", "gift", "gifts", "gives", "giving", "gl", "glass", "gle", "global", "globo", "gm", "gmail", "gmbh", "gmo", "gmx", "gn", "godaddy", "gold", "goldpoint", "golf", "goo", "goodyear", "goog", "google", "gop", "got", "gov", "gp", "gq", "gr", "grainger", "graphics", "gratis", "green", "gripe", "grocery", "group", "gs", "gt", "gu", "gucci", "guge", "guide", "guitars", "guru", "gw", "gy", "hair", "hamburg", "hangout", "haus", "hbo", "hdfc", "hdfcbank", "health", "healthcare", "help", "helsinki", "here", "hermes", "hiphop", "hisamitsu", "hitachi", "hiv", "hk", "hkt", "hm", "hn", "hockey", "holdings", "holiday", "homedepot", "homegoods", "homes", "homesense", "honda", "horse", "hospital", "host", "hosting", "hot", "hotels", "hotmail", "house", "how", "hr", "hsbc", "ht", "hu", "hughes", "hyatt", "hyundai", "ibm", "icbc", "ice", "icu", "id", "ie", "ieee", "ifm", "ikano", "il", "im", "imamat", "imdb", "immo", "immobilien", "in", "inc", "industries", "infiniti", "info", "ing", "ink", "institute", "insurance", "insure", "int", "international", "intuit", "investments", "io", "ipiranga", "iq", "ir", "irish", "is", "ismaili", "ist", "istanbul", "it", "itau", "itv", "jaguar", "java", "jcb", "je", "jeep", "jetzt", "jewelry", "jio", "jll", "jm", "jmp", "jnj", "jo", "jobs", "joburg", "jot", "joy", "jp", "jpmorgan", "jprs", "juegos", "juniper", "kaufen", "kddi", "ke", "kerryhotels", "kerrylogistics", "kerryproperties", "kfh", "kg", "kh", "ki", "kia", "kids", "kim", "kindle", "kitchen", "kiwi", "km", "kn", "koeln", "komatsu", "kosher", "kp", "kpmg", "kpn", "kr", "krd", "kred", "kuokgroup", "kw", "ky", "kyoto", "kz", "la", "lacaixa", "lamborghini", "lamer", "lancaster", "land", "landrover", "lanxess", "lasalle", "lat", "latino", "latrobe", "law", "lawyer", "lb", "lc", "lds", "lease", "leclerc", "lefrak", "legal", "lego", "lexus", "lgbt", "li", "lidl", "life", "lifeinsurance", "lifestyle", "lighting", "like", "lilly", "limited", "limo", "lincoln", "link", "lipsy", "live", "living", "lk", "llc", "llp", "loan", "loans", "locker", "locus", "lol", "london", "lotte", "lotto", "love", "lpl", "lplfinancial", "lr", "ls", "lt", "ltd", "ltda", "lu", "lundbeck", "luxe", "luxury", "lv", "ly", "ma", "madrid", "maif", "maison", "makeup", "man", "management", "mango", "map", "market", "marketing", "markets", "marriott", "marshalls", "mattel", "mba", "mc", "mckinsey", "md", "me", "med", "media", "meet", "melbourne", "meme", "memorial", "men", "menu", "merckmsd", "mg", "mh", "miami", "microsoft", "mil", "mini", "mint", "mit", "mitsubishi", "mk", "ml", "mlb", "mls", "mm", "mma", "mn", "mo", "mobi", "mobile", "moda", "moe", "moi", "mom", "monash", "money", "monster", "mormon", "mortgage", "moscow", "moto", "motorcycles", "mov", "movie", "mp", "mq", "mr", "ms", "msd", "mt", "mtn", "mtr", "mu", "museum", "music", "mv", "mw", "mx", "my", "mz", "na", "nab", "nagoya", "name", "natura", "navy", "nba", "nc", "ne", "nec", "net", "netbank", "netflix", "network", "neustar", "new", "news", "next", "nextdirect", "nexus", "nf", "nfl", "ng", "ngo", "nhk", "ni", "nico", "nike", "nikon", "ninja", "nissan", "nissay", "nl", "no", "nokia", "norton", "now", "nowruz", "nowtv", "np", "nr", "nra", "nrw", "ntt", "nu", "nyc", "nz", "obi", "observer", "office", "okinawa", "olayan", "olayangroup", "ollo", "om", "omega", "one", "ong", "onl", "online", "ooo", "open", "oracle", "orange", "org", "organic", "origins", "osaka", "otsuka", "ott", "ovh", "pa", "page", "panasonic", "paris", "pars", "partners", "parts", "party", "pay", "pccw", "pe", "pet", "pf", "pfizer", "pg", "ph", "pharmacy", "phd", "philips", "phone", "photo", "photography", "photos", "physio", "pics", "pictet", "pictures", "pid", "pin", "ping", "pink", "pioneer", "pizza", "pk", "pl", "place", "play", "playstation", "plumbing", "plus", "pm", "pn", "pnc", "pohl", "poker", "politie", "porn", "post", "pr", "pramerica", "praxi", "press", "prime", "pro", "prod", "productions", "prof", "progressive", "promo", "properties", "property", "protection", "pru", "prudential", "ps", "pt", "pub", "pw", "pwc", "py", "qa", "qpon", "quebec", "quest", "racing", "radio", "re", "read", "realestate", "realtor", "realty", "recipes", "red", "redstone", "redumbrella", "rehab", "reise", "reisen", "reit", "reliance", "ren", "rent", "rentals", "repair", "report", "republican", "rest", "restaurant", "review", "reviews", "rexroth", "rich", "richardli", "ricoh", "ril", "rio", "rip", "ro", "rocks", "rodeo", "rogers", "room", "rs", "rsvp", "ru", "rugby", "ruhr", "run", "rw", "rwe", "ryukyu", "sa", "saarland", "safe", "safety", "sakura", "sale", "salon", "samsclub", "samsung", "sandvik", "sandvikcoromant", "sanofi", "sap", "sarl", "sas", "save", "saxo", "sb", "sbi", "sbs", "sc", "scb", "schaeffler", "schmidt", "scholarships", "school", "schule", "schwarz", "science", "scot", "sd", "se", "search", "seat", "secure", "security", "seek", "select", "sener", "services", "seven", "sew", "sex", "sexy", "sfr", "sg", "sh", "shangrila", "sharp", "shaw", "shell", "shia", "shiksha", "shoes", "shop", "shopping", "shouji", "show", "si", "silk", "sina", "singles", "site", "sj", "sk", "ski", "skin", "sky", "skype", "sl", "sling", "sm", "smart", "smile", "sn", "sncf", "so", "soccer", "social", "softbank", "software", "sohu", "solar", "solutions", "song", "sony", "soy", "spa", "space", "sport", "spot", "sr", "srl", "ss", "st", "stada", "staples", "star", "statebank", "statefarm", "stc", "stcgroup", "stockholm", "storage", "store", "stream", "studio", "study", "style", "su", "sucks", "supplies", "supply", "support", "surf", "surgery", "suzuki", "sv", "swatch", "swiss", "sx", "sy", "sydney", "systems", "sz", "tab", "taipei", "talk", "taobao", "target", "tatamotors", "tatar", "tattoo", "tax", "taxi", "tc", "tci", "td", "tdk", "team", "tech", "technology", "tel", "temasek", "tennis", "teva", "tf", "tg", "th", "thd", "theater", "theatre", "tiaa", "tickets", "tienda", "tips", "tires", "tirol", "tj", "tjmaxx", "tjx", "tk", "tkmaxx", "tl", "tm", "tmall", "tn", "to", "today", "tokyo", "tools", "top", "toray", "toshiba", "total", "tours", "town", "toyota", "toys", "tr", "trade", "trading", "training", "travel", "travelers", "travelersinsurance", "trust", "trv", "tt", "tube", "tui", "tunes", "tushu", "tv", "tvs", "tw", "tz", "ua", "ubank", "ubs", "ug", "uk", "unicom", "university", "uno", "uol", "ups", "us", "uy", "uz", "va", "vacations", "vana", "vanguard", "vc", "ve", "vegas", "ventures", "verisign", "versicherung", "vet", "vg", "vi", "viajes", "video", "vig", "viking", "villas", "vin", "vip", "virgin", "visa", "vision", "viva", "vivo", "vlaanderen", "vn", "vodka", "volvo", "vote", "voting", "voto", "voyage", "vu", "wales", "walmart", "walter", "wang", "wanggou", "watch", "watches", "weather", "weatherchannel", "webcam", "weber", "website", "wed", "wedding", "weibo", "weir", "wf", "whoswho", "wien", "wiki", "williamhill", "win", "windows", "wine", "winners", "wme", "wolterskluwer", "woodside", "work", "works", "world", "wow", "ws", "wtc", "wtf", "xbox", "xerox", "xihuan", "xin", "कॉम", "セール", "佛山", "ಭಾರತ", "慈善", "集团", "在线", "한국", "ଭାରତ", "点看", "คอม", "ভাৰত", "ভারত", "八卦", "ישראל", "موقع", "বাংলা", "公益", "公司", "香格里拉", "网站", "移动", "我爱你", "москва", "қаз", "католик", "онлайн", "сайт", "联通", "срб", "бг", "бел", "קום", "时尚", "微博", "淡马锡", "ファッション", "орг", "नेट", "ストア", "アマゾン", "삼성", "சிங்கப்பூர்", "商标", "商店", "商城", "дети", "мкд", "ею", "ポイント", "新闻", "家電", "كوم", "中文网", "中信", "中国", "中國", "娱乐", "谷歌", "భారత్", "ලංකා", "電訊盈科", "购物", "クラウド", "ભારત", "通販", "भारतम्", "भारत", "भारोत", "网店", "संगठन", "餐厅", "网络", "ком", "укр", "香港", "亚马逊", "食品", "飞利浦", "台湾", "台灣", "手机", "мон", "الجزائر", "عمان", "ارامكو", "ایران", "العليان", "امارات", "بازار", "موريتانيا", "پاکستان", "الاردن", "بارت", "بھارت", "المغرب", "ابوظبي", "البحرين", "السعودية", "ڀارت", "كاثوليك", "سودان", "همراه", "عراق", "مليسيا", "澳門", "닷컴", "政府", "شبكة", "بيتك", "عرب", "გე", "机构", "组织机构", "健康", "ไทย", "سورية", "招聘", "рус", "рф", "РФ", "تونس", "大拿", "ລາວ", "みんな", "グーグル", "ευ", "ελ", "世界", "書籍", "ഭാരതം", "ਭਾਰਤ", "网址", "닷넷", "コム", "天主教", "游戏", "vermögensberater", "vermögensberatung", "企业", "信息", "嘉里大酒店", "嘉里", "مصر", "قطر", "广东", "இலங்கை", "இந்தியா", "հայ", "新加坡", "فلسطين", "政务", "xxx", "xyz", "yachts", "yahoo", "yamaxun", "yandex", "ye", "yodobashi", "yoga", "yokohama", "you", "youtube", "yt", "yun", "za", "zappos", "zara", "zero", "zip", "zm", "zone", "zuerich", "zw"]; \ No newline at end of file diff --git a/lib/url/validLink.ts b/lib/url/validLink.ts new file mode 100644 index 0000000..04026eb --- /dev/null +++ b/lib/url/validLink.ts @@ -0,0 +1,33 @@ +import punycode from "punycode/"; +import { tldList } from "./tldList"; + +export default function validLink(link: string) { + let finalURL = ''; + try { + const url = new URL(link); + finalURL = url.origin; + return true; + } catch (error) { + // if the URL is invalid, try to add the protocol + try { + const urlWithHTTP = new URL("http://" + link); + finalURL = urlWithHTTP.origin; + } catch (error) { + return false; + } + } + if (validTLD(finalURL)) { + return true; + } else { + return false; + } +} + +export function validTLD(domain: string): boolean { + const tld = punycode.toUnicode(domain.split(".").reverse()[0]); + if (tldList.includes(tld)) { + return true; + } else { + return false; + } +} diff --git a/lib/weather/getCurrentWeather.ts b/lib/weather/getCurrentWeather.ts new file mode 100644 index 0000000..b762862 --- /dev/null +++ b/lib/weather/getCurrentWeather.ts @@ -0,0 +1,39 @@ +export function getClosestHourTimestamp(): string { + const now = new Date(); + now.setMinutes(0, 0, 0); // 设置分钟、秒和毫秒为0 + + // 获取本地时间的年份、月份、日期、小时 + const year = now.getFullYear(); + const month = String(now.getMonth() + 1).padStart(2, '0'); // 月份从0开始 + const day = String(now.getDate()).padStart(2, '0'); + const hour = String(now.getHours()).padStart(2, '0'); + + // 拼接成所需的格式 + const localHourTimestamp = `${year}-${month}-${day}T${hour}:00`; + + return localHourTimestamp; +} + +export function findClosestDateIndex(dates: string[], utc_offset_seconds: number): number { + const now = new Date(); + const nowTimestamp = now.getTime(); + const offsetMilliseconds = utc_offset_seconds * 1000; + + let closestIndex = -1; + let closestDiff = Infinity; + + for (let i = 0; i < dates.length; i++) { + const date = new Date(dates[i]); + const adjustedTimestamp = date.getTime(); + + if (adjustedTimestamp <= nowTimestamp) { + const diff = nowTimestamp - adjustedTimestamp; + if (diff < closestDiff) { + closestDiff = diff; + closestIndex = i; + } + } + } + + return closestIndex; +} \ No newline at end of file diff --git a/lib/weather/getLocation.ts b/lib/weather/getLocation.ts new file mode 100644 index 0000000..93774cc --- /dev/null +++ b/lib/weather/getLocation.ts @@ -0,0 +1,17 @@ +const options = { + enableHighAccuracy: true, + timeout: 10000, + maximumAge: 3600 +}; + +export function getLocationNative(callback: Function) { + navigator.geolocation.getCurrentPosition( + (pos: GeolocationPosition) => { + callback(pos.coords); + }, + (err: GeolocationPositionError) => { + callback(err); + }, + options + ); +} diff --git a/lib/weather/getWeather.ts b/lib/weather/getWeather.ts new file mode 100644 index 0000000..b9cc28c --- /dev/null +++ b/lib/weather/getWeather.ts @@ -0,0 +1,23 @@ +export async function getWeather(lat: number, lon: number) { + const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; + const cacheKey = `weather-cache-${lat.toFixed(2)}-${lon.toFixed(2)}-${timezone}`; + const localData = localStorage.getItem(cacheKey); + if (localData != null) { + console.log('Using cache'); + const parsedLocalData = JSON.parse(localData); + if (parsedLocalData["hourly"]["time"][0] != undefined && + new Date().getTime() - new Date(parsedLocalData["hourly"]["time"][0]).getTime() < 86400 * 1000 + ) { + return parsedLocalData; + } + else { + console.log('Cache expired'); + localStorage.removeItem(cacheKey); + } + } + const url = `https://api.open-meteo.com/v1/cma?latitude=${lat.toString()}&longitude=${lon.toString()}&hourly=apparent_temperature,precipitation,weather_code&timezone=${encodeURIComponent(timezone)}&forecast_days=1`; + const response = await fetch(url); + const responseJson = await response.json(); + localStorage.setItem(cacheKey, JSON.stringify(responseJson)); + return responseJson; +} \ No newline at end of file diff --git a/lib/weather/wmocode.ts b/lib/weather/wmocode.ts new file mode 100644 index 0000000..d852747 --- /dev/null +++ b/lib/weather/wmocode.ts @@ -0,0 +1,294 @@ +type WeatherInfo = { + description: string; + image: string; +}; + +type WMOCodeTable = { + [key: string]: { + day: WeatherInfo; + night: WeatherInfo; + }; +}; + +export let WMOCodeTable: WMOCodeTable = { + "0": { + day: { + description: "Sunny", + image: "http://openweathermap.org/img/wn/01d@2x.png" + }, + night: { + description: "Clear", + image: "http://openweathermap.org/img/wn/01n@2x.png" + } + }, + "1": { + day: { + description: "Mainly Sunny", + image: "http://openweathermap.org/img/wn/01d@2x.png" + }, + night: { + description: "Mainly Clear", + image: "http://openweathermap.org/img/wn/01n@2x.png" + } + }, + "2": { + day: { + description: "Partly Cloudy", + image: "http://openweathermap.org/img/wn/02d@2x.png" + }, + night: { + description: "Partly Cloudy", + image: "http://openweathermap.org/img/wn/02n@2x.png" + } + }, + "3": { + day: { + description: "Cloudy", + image: "http://openweathermap.org/img/wn/03d@2x.png" + }, + night: { + description: "Cloudy", + image: "http://openweathermap.org/img/wn/03n@2x.png" + } + }, + "45": { + day: { + description: "Foggy", + image: "http://openweathermap.org/img/wn/50d@2x.png" + }, + night: { + description: "Foggy", + image: "http://openweathermap.org/img/wn/50n@2x.png" + } + }, + "48": { + day: { + description: "Rime Fog", + image: "http://openweathermap.org/img/wn/50d@2x.png" + }, + night: { + description: "Rime Fog", + image: "http://openweathermap.org/img/wn/50n@2x.png" + } + }, + "51": { + day: { + description: "Light Drizzle", + image: "http://openweathermap.org/img/wn/09d@2x.png" + }, + night: { + description: "Light Drizzle", + image: "http://openweathermap.org/img/wn/09n@2x.png" + } + }, + "53": { + day: { + description: "Drizzle", + image: "http://openweathermap.org/img/wn/09d@2x.png" + }, + night: { + description: "Drizzle", + image: "http://openweathermap.org/img/wn/09n@2x.png" + } + }, + "55": { + day: { + description: "Heavy Drizzle", + image: "http://openweathermap.org/img/wn/09d@2x.png" + }, + night: { + description: "Heavy Drizzle", + image: "http://openweathermap.org/img/wn/09n@2x.png" + } + }, + "56": { + day: { + description: "Light Freezing Drizzle", + image: "http://openweathermap.org/img/wn/09d@2x.png" + }, + night: { + description: "Light Freezing Drizzle", + image: "http://openweathermap.org/img/wn/09n@2x.png" + } + }, + "57": { + day: { + description: "Freezing Drizzle", + image: "http://openweathermap.org/img/wn/09d@2x.png" + }, + night: { + description: "Freezing Drizzle", + image: "http://openweathermap.org/img/wn/09n@2x.png" + } + }, + "61": { + day: { + description: "Light Rain", + image: "http://openweathermap.org/img/wn/10d@2x.png" + }, + night: { + description: "Light Rain", + image: "http://openweathermap.org/img/wn/10n@2x.png" + } + }, + "63": { + day: { + description: "Rain", + image: "http://openweathermap.org/img/wn/10d@2x.png" + }, + night: { + description: "Rain", + image: "http://openweathermap.org/img/wn/10n@2x.png" + } + }, + "65": { + day: { + description: "Heavy Rain", + image: "http://openweathermap.org/img/wn/10d@2x.png" + }, + night: { + description: "Heavy Rain", + image: "http://openweathermap.org/img/wn/10n@2x.png" + } + }, + "66": { + day: { + description: "Light Freezing Rain", + image: "http://openweathermap.org/img/wn/10d@2x.png" + }, + night: { + description: "Light Freezing Rain", + image: "http://openweathermap.org/img/wn/10n@2x.png" + } + }, + "67": { + day: { + description: "Freezing Rain", + image: "http://openweathermap.org/img/wn/10d@2x.png" + }, + night: { + description: "Freezing Rain", + image: "http://openweathermap.org/img/wn/10n@2x.png" + } + }, + "71": { + day: { + description: "Light Snow", + image: "http://openweathermap.org/img/wn/13d@2x.png" + }, + night: { + description: "Light Snow", + image: "http://openweathermap.org/img/wn/13n@2x.png" + } + }, + "73": { + day: { + description: "Snow", + image: "http://openweathermap.org/img/wn/13d@2x.png" + }, + night: { + description: "Snow", + image: "http://openweathermap.org/img/wn/13n@2x.png" + } + }, + "75": { + day: { + description: "Heavy Snow", + image: "http://openweathermap.org/img/wn/13d@2x.png" + }, + night: { + description: "Heavy Snow", + image: "http://openweathermap.org/img/wn/13n@2x.png" + } + }, + "77": { + day: { + description: "Snow Grains", + image: "http://openweathermap.org/img/wn/13d@2x.png" + }, + night: { + description: "Snow Grains", + image: "http://openweathermap.org/img/wn/13n@2x.png" + } + }, + "80": { + day: { + description: "Light Showers", + image: "http://openweathermap.org/img/wn/09d@2x.png" + }, + night: { + description: "Light Showers", + image: "http://openweathermap.org/img/wn/09n@2x.png" + } + }, + "81": { + day: { + description: "Showers", + image: "http://openweathermap.org/img/wn/09d@2x.png" + }, + night: { + description: "Showers", + image: "http://openweathermap.org/img/wn/09n@2x.png" + } + }, + "82": { + day: { + description: "Heavy Showers", + image: "http://openweathermap.org/img/wn/09d@2x.png" + }, + night: { + description: "Heavy Showers", + image: "http://openweathermap.org/img/wn/09n@2x.png" + } + }, + "85": { + day: { + description: "Light Snow Showers", + image: "http://openweathermap.org/img/wn/13d@2x.png" + }, + night: { + description: "Light Snow Showers", + image: "http://openweathermap.org/img/wn/13n@2x.png" + } + }, + "86": { + day: { + description: "Snow Showers", + image: "http://openweathermap.org/img/wn/13d@2x.png" + }, + night: { + description: "Snow Showers", + image: "http://openweathermap.org/img/wn/13n@2x.png" + } + }, + "95": { + day: { + description: "Thunderstorm", + image: "http://openweathermap.org/img/wn/11d@2x.png" + }, + night: { + description: "Thunderstorm", + image: "http://openweathermap.org/img/wn/11n@2x.png" + } + }, + "96": { + day: { + description: "Light Thunderstorms With Hail", + image: "http://openweathermap.org/img/wn/11d@2x.png" + }, + night: { + description: "Light Thunderstorms With Hail", + image: "http://openweathermap.org/img/wn/11n@2x.png" + } + }, + "99": { + day: { + description: "Thunderstorm With Hail", + image: "http://openweathermap.org/img/wn/11d@2x.png" + }, + night: { + description: "Thunderstorm With Hail", + image: "http://openweathermap.org/img/wn/11n@2x.png" + } + } +}; diff --git a/package.json b/package.json index 1c563b5..4acdd13 100644 --- a/package.json +++ b/package.json @@ -1,44 +1,53 @@ { - "name": "sparkhome", - "private": false, - "version": "5.2.0", - "type": "module", - "scripts": { - "dev": "bunx --bun vite", - "build": "tsc -b && vite build", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" - }, - "dependencies": { - "i18next": "^23.11.5", - "i18next-browser-languagedetector": "^8.0.0", - "i18next-icu": "^2.3.0", - "jotai": "^2.8.3", - "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", - "search-engine-autocomplete": "^0.4.3", - "valid-url": "^1.0.9", - "validate-color": "^2.2.4" - }, - "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", - "tailwindcss": "^3.4.4", - "typescript": "^5.2.2", - "vite": "^5.3.1", - "vite-plugin-pages": "^0.32.2", - "vite-tsconfig-paths": "^4.3.2" - } + "name": "sparkhome", + "private": false, + "version": "5.2.0", + "type": "module", + "scripts": { + "dev": "bun server.ts", + "build": "tsc -b && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "NODE_ENV=production bun server.ts" + }, + "dependencies": { + "@nextui-org/react": "^2.4.2", + "@types/express": "^4.17.21", + "cac": "^6.7.14", + "chalk": "^5.3.0", + "express": "^4.19.2", + "fflate": "^0.8.2", + "framer-motion": "^11.2.12", + "i18next": "^23.11.5", + "i18next-browser-languagedetector": "^8.0.0", + "i18next-icu": "^2.3.0", + "jotai": "^2.8.3", + "node-nlp": "^4.27.0", + "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", + "search-engine-autocomplete": "^0.4.3", + "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", + "tailwindcss": "^3.4.4", + "typescript": "^5.2.2", + "vite": "^5.3.1", + "vite-plugin-pages": "^0.32.2", + "vite-tsconfig-paths": "^4.3.2" + } } diff --git a/pages/index.tsx b/pages/index.tsx index 060bd98..b57b625 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -4,16 +4,22 @@ import { useAtomValue, useSetAtom } from "jotai"; import Search from "components/search"; import { settingsAtom } from "lib/state/settings"; import { bgFocusAtom } from "lib/state/background"; +import EngineSelector from "components/engineSelector"; +import OneSearch from "components/onesearch/onesearch"; export default function Homepage() { const settings = useAtomValue(settingsAtom); const setBgFocus = useSetAtom(bgFocusAtom); return ( - <div> + <div className="h-full fixed overflow-hidden w-full bg-black"> <Background /> + <EngineSelector className="absolute top-20 lg:top-44 short:top-0 translate-x-[-50%] translate-y-[-0.2rem] + left-1/2 w-11/12 sm:w-[700px] text:black text-right + dark:text-white text-3xl text-shadow-lg z-10"/> <Search onFocus={() => setBgFocus(true)} /> <Time showSecond={settings.timeShowSecond} /> + <OneSearch /> </div> ); } diff --git a/public/model b/public/model new file mode 100644 index 0000000000000000000000000000000000000000..5c0b6b7721e0ac443bf35ddf9bfa3a6bbd3a71bf GIT binary patch literal 27776 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 X!d`S(2^N2cT#5e$zsAq`>!Sex=d9;< literal 0 HcmV?d00001 diff --git a/server.ts b/server.ts new file mode 100644 index 0000000..46e9c34 --- /dev/null +++ b/server.ts @@ -0,0 +1,87 @@ +import chalk from "chalk"; +import express from "express"; +import ViteExpress from "vite-express"; +import pjson from "./package.json"; +import { networkInterfaces } from "os"; +import cac from "cac"; +const start = new Date(); + +const cli = cac(); +const nets = networkInterfaces(); +const ips: string[] = []; +for (const name of Object.keys(nets)) { + if (nets[name] === undefined) { + continue; + } + for (const net of nets[name]) { + // Skip over non-IPv4 and internal (i.e. 127.0.0.1) addresses + // 'IPv4' is in Node <= 17, from 18 it's a number 4 or 6 + const familyV4Value = typeof net.family === "string" ? "IPv4" : 4; + if (net.family === familyV4Value && !net.internal) { + ips.push(net.address); + } + } +} + +const app = express(); +const port = 3000; +let host = "localhost"; + +cli.option("--host [host]", "Sepcify host name") +cli.help() +cli.version(pjson.version); +const parsed = cli.parse(); +if (parsed.options.host!==undefined && typeof parsed.options.host == "boolean" && parsed.options.host) { + host = "0.0.0.0"; +} + +app.get("/message", (_, res) => res.send("Hello from express!")); + +async function helloMessage() { + const { base } = await ViteExpress.getViteConfig(); + //console.clear(); + const timeCost = new Date().getTime() - start.getTime(); + console.log(""); + console.log( + " ", + chalk.redBright("SparkHome"), + chalk.redBright("v" + pjson.version), + chalk.whiteBright(" ready in"), + `${Math.round(timeCost)} ms` + ); + console.log(""); + console.log(" ", chalk.redBright("➜ "), "Local:\t", chalk.cyan(`http://${host}:${port}${base}`)); + if (host !== "localhost") { + for (const ip of ips) { + console.log(" ", chalk.redBright("➜ "), "Network:\t", chalk.cyan(`http://${ip}:${port}${base}`)); + } + } + console.log(" ", chalk.red("➜ "), chalk.whiteBright("press"), "h + enter", chalk.whiteBright("to show help")) +} + +const server = app.listen(port, host); + +ViteExpress.bind(app, server, helloMessage); + +async function a() { + for await (const line of console) { + switch (line) { + case "h": + console.log(" Shortcuts"); + console.log(" ", chalk.whiteBright("press"), "c + enter ", chalk.whiteBright("to clear console")); + console.log(" ", chalk.whiteBright("press"), "q + enter ", chalk.whiteBright("to quit")); + break; + case "c": + console.clear(); + break; + case "q": + server.on("vite:close", ()=>{}); + server.close(); + return; + default: + break; + } + } +} + +a(); \ No newline at end of file diff --git a/src/app.tsx b/src/app.tsx index ce118cb..a432ff6 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -3,19 +3,20 @@ import { useRoutes } from "react-router-dom"; import routes from "~react-pages"; import i18n from "i18next"; import { initReactI18next } from "react-i18next"; -import LanguageDetector from 'i18next-browser-languagedetector'; -import ICU from 'i18next-icu'; -import * as en from "i18n/en.json" -import * as zh from "i18n/zh.json" -import * as ja from "i18n/ja.json" -import * as ar from "i18n/ar.json" -import * as de from "i18n/de.json" -import * as es from "i18n/es.json" -import * as fr from "i18n/fr.json" -import * as it from "i18n/it.json" -import * as ko from "i18n/ko.json" -import * as pt from "i18n/pt.json" -import * as ru from "i18n/ru.json" +import LanguageDetector from "i18next-browser-languagedetector"; +import ICU from "i18next-icu"; +import * as en from "i18n/en.json"; +import * as zh from "i18n/zh.json"; +import * as ja from "i18n/ja.json"; +import * as ar from "i18n/ar.json"; +import * as de from "i18n/de.json"; +import * as es from "i18n/es.json"; +import * as fr from "i18n/fr.json"; +import * as it from "i18n/it.json"; +import * as ko from "i18n/ko.json"; +import * as pt from "i18n/pt.json"; +import * as ru from "i18n/ru.json"; +import { NextUIProvider } from "@nextui-org/react"; i18n.use(initReactI18next) // passes i18n down to react-i18next .use(LanguageDetector) @@ -63,12 +64,15 @@ i18n.use(initReactI18next) // passes i18n down to react-i18next }, detection: { - order: ['navigator'], + order: ["navigator"], caches: [] } }); - export function App() { - return <Suspense fallback={<p>Loading...</p>}>{useRoutes(routes)}</Suspense>; + return ( + <NextUIProvider> + <Suspense fallback={<p>Loading...</p>}>{useRoutes(routes)}</Suspense> + </NextUIProvider> + ); } diff --git a/tailwind.config.ts b/tailwind.config.ts index b52deb2..ca7c3e9 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -1,9 +1,12 @@ import type { Config } from "tailwindcss"; +import { nextui } from "@nextui-org/react"; + const config: Config = { content: [ "./pages/**/*.{js,ts,jsx,tsx,mdx}", "./components/**/*.{js,ts,jsx,tsx,mdx}", + "./node_modules/@nextui-org/theme/dist/**/*.{js,ts,jsx,tsx}", "./node_modules/@nextui-org/theme/dist/**/*.{js,ts,jsx,tsx}" ], theme: { @@ -13,6 +16,8 @@ const config: Config = { "gradient-conic": "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))" } } - } + }, + darkMode: "class", + plugins: [nextui()], }; export default config;