diff options
Diffstat (limited to 'packages/shared/searchQueryParser.ts')
| -rw-r--r-- | packages/shared/searchQueryParser.ts | 20 |
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 { |
