Bluesky app fork with some witchin' additions 馃挮
at main 44 lines 1.1 kB view raw
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}