From ebcdbd2d83c85e547766b860cac0b59e6331f1f5 Mon Sep 17 00:00:00 2001 From: static Date: Thu, 15 Jan 2026 18:25:01 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B0=9C=EC=84=A0=20=EB=B0=8F=20=EB=92=A4?= =?UTF-8?q?=EB=A1=9C=EA=B0=80=EA=B8=B0=EB=A1=9C=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EB=A1=9C=20=EB=8F=8C=EC=95=84?= =?UTF-8?q?=EC=98=A8=20=EA=B2=BD=EC=9A=B0=EC=97=90=20=ED=95=84=ED=84=B0=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B2=80=EC=83=89=20=EA=B2=B0=EA=B3=BC=EA=B0=80=20?= =?UTF-8?q?=EC=9C=A0=EC=A7=80=EB=90=98=EB=8F=84=EB=A1=9D=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + pnpm-lock.yaml | 8 ++++ src/lib/server/db/file.ts | 2 +- src/lib/utils/index.ts | 1 + src/lib/utils/search.ts | 28 ++++++++++++ src/routes/(fullscreen)/search/+page.svelte | 47 ++++++++++++++++++--- src/routes/(fullscreen)/search/service.ts | 2 +- 7 files changed, 82 insertions(+), 7 deletions(-) create mode 100644 src/lib/utils/search.ts diff --git a/package.json b/package.json index 02ed42d..07f8d07 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "autoprefixer": "^10.4.23", "axios": "^1.13.2", "dexie": "^4.2.1", + "es-hangul": "^2.3.8", "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.8", "eslint-plugin-svelte": "^3.14.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ac05c99..fd8be37 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -84,6 +84,9 @@ importers: dexie: specifier: ^4.2.1 version: 4.2.1 + es-hangul: + specifier: ^2.3.8 + version: 2.3.8 eslint: specifier: ^9.39.2 version: 9.39.2(jiti@1.21.7) @@ -989,6 +992,9 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-hangul@2.3.8: + resolution: {integrity: sha512-VrJuqYBC7W04aKYjCnswomuJNXQRc0q33SG1IltVrRofi2YEE6FwVDPlsEJIdKbHwsOpbBL/mk9sUaBxVpbd+w==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -2781,6 +2787,8 @@ snapshots: es-errors@1.3.0: {} + es-hangul@2.3.8: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 diff --git a/src/lib/server/db/file.ts b/src/lib/server/db/file.ts index 1c61cf5..dba77d0 100644 --- a/src/lib/server/db/file.ts +++ b/src/lib/server/db/file.ts @@ -553,7 +553,7 @@ export const searchFiles = async ( : await baseQuery.execute(); return files.map((file) => ({ id: file.id, - parentId: file.parent_id ?? "root", + parentId: file.parent_id ?? ("root" as const), userId: file.user_id, path: file.path, mekVersion: file.master_encryption_key_version, diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 4c576d5..f860017 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -1,4 +1,5 @@ export * from "./concurrency"; export * from "./format"; export * from "./gotoStateful"; +export * from "./search"; export * from "./sort"; diff --git a/src/lib/utils/search.ts b/src/lib/utils/search.ts new file mode 100644 index 0000000..c6e3d8c --- /dev/null +++ b/src/lib/utils/search.ts @@ -0,0 +1,28 @@ +import { disassemble, getChoseong } from "es-hangul"; + +const normalize = (s: string) => { + return s.normalize("NFC").toLowerCase().replace(/\s/g, ""); +}; + +const extractHangul = (s: string) => { + return s.replace(/[^가-힣ㄱ-ㅎㅏ-ㅣ]/g, ""); +}; + +const hangulSearch = (original: string, query: string) => { + original = extractHangul(original); + query = extractHangul(query); + if (!original || !query) return false; + + return ( + disassemble(original).includes(disassemble(query)) || + getChoseong(original).includes(getChoseong(query)) + ); +}; + +export const searchString = (original: string, query: string) => { + original = normalize(original); + query = normalize(query); + if (!original || !query) return false; + + return original.includes(query) || hangulSearch(original, query); +}; diff --git a/src/routes/(fullscreen)/search/+page.svelte b/src/routes/(fullscreen)/search/+page.svelte index 08315cf..fdaa3ed 100644 --- a/src/routes/(fullscreen)/search/+page.svelte +++ b/src/routes/(fullscreen)/search/+page.svelte @@ -1,4 +1,7 @@