forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
1export type Params = Record<string, string>
2
3export function parseSearchQuery(rawQuery: string) {
4 let base = rawQuery
5 const rawLiterals = rawQuery.match(/[^:\w\d]".+?"/gi) || []
6
7 // remove literals from base
8 for (const literal of rawLiterals) {
9 base = base.replace(literal.trim(), '')
10 }
11
12 // find remaining params in base
13 const rawParams = base.match(/[a-z]+:[a-z-\.@\d:"]+/gi) || []
14
15 for (const param of rawParams) {
16 base = base.replace(param, '')
17 }
18
19 base = base.trim()
20
21 const params = rawParams.reduce((params, param) => {
22 const [name, ...value] = param.split(/:/)
23 params[name] = value.join(':').replace(/"/g, '') // dates can contain additional colons
24 return params
25 }, {} as Params)
26 const literals = rawLiterals.map(l => String(l).trim())
27
28 return {
29 query: [base, literals.join(' ')].filter(Boolean).join(' '),
30 params,
31 }
32}
33
34export function makeSearchQuery(query: string, params: Params) {
35 return [
36 query,
37 Object.entries(params)
38 .filter(([_, value]) => value)
39 .map(([name, value]) => `${name}:${value}`)
40 .join(' '),
41 ]
42 .filter(Boolean)
43 .join(' ')
44}