aboutsummaryrefslogtreecommitdiffstats
path: root/packages/shared/searchQueryParser.ts
diff options
context:
space:
mode:
authorBrandon Wong <29965003+brandonw3612@users.noreply.github.com>2025-04-13 22:50:45 +0200
committerGitHub <noreply@github.com>2025-04-13 21:50:45 +0100
commit95f504c0bc0b9ec0930b6c6facefc1a8ea093192 (patch)
tree967221d7f4f5b716cc8fd3d92b5869bacf1d6089 /packages/shared/searchQueryParser.ts
parent5bdb2d944a08f63772497e203f47533ffb640d82 (diff)
downloadkarakeep-95f504c0bc0b9ec0930b6c6facefc1a8ea093192.tar.zst
feat: add support for filtering by bookmark age (#1228)
Diffstat (limited to 'packages/shared/searchQueryParser.ts')
-rw-r--r--packages/shared/searchQueryParser.ts20
1 files changed, 19 insertions, 1 deletions
diff --git a/packages/shared/searchQueryParser.ts b/packages/shared/searchQueryParser.ts
index d4e2bf2b..80f033b0 100644
--- a/packages/shared/searchQueryParser.ts
+++ b/packages/shared/searchQueryParser.ts
@@ -18,6 +18,7 @@ import { z } from "zod";
import { BookmarkTypes } from "./types/bookmarks";
import { Matcher } from "./types/search";
+import { parseRelativeDate } from "./utils/relativeDateUtils";
enum TokenType {
And = "AND",
@@ -40,7 +41,7 @@ const lexerRules: [RegExp, TokenType][] = [
[/^\s+or/i, TokenType.Or],
[/^#/, TokenType.Hash],
- [/^(is|url|list|after|before|feed):/, TokenType.Qualifier],
+ [/^(is|url|list|after|before|age|feed):/, TokenType.Qualifier],
[/^"([^"]+)"/, TokenType.StringLiteral],
@@ -247,6 +248,23 @@ MATCHER.setPattern(
matcher: undefined,
};
}
+ case "age:":
+ try {
+ const { direction, amount, unit } = parseRelativeDate(ident);
+ return {
+ text: "",
+ matcher: {
+ type: "age",
+ relativeDate: { direction, amount, unit },
+ },
+ };
+ } catch (e) {
+ return {
+ // If parsing the relative time fails, emit it as pure text
+ text: (minus?.text ?? "") + qualifier.text + ident,
+ matcher: undefined,
+ };
+ }
default:
// If the token is not known, emit it as pure text
return {