2023-07-20 19:04:31 +02:00
|
|
|
import searchQueries from './searchQueries.json';
|
2022-03-25 14:28:40 +01:00
|
|
|
import { SearchResult } from '../interfaces';
|
2021-10-06 14:15:05 +02:00
|
|
|
import { store } from '../store/store';
|
2021-11-10 11:42:00 +01:00
|
|
|
import { isUrlOrIp } from '.';
|
2021-06-24 12:53:45 +02:00
|
|
|
|
2021-09-06 12:24:01 +02:00
|
|
|
export const searchParser = (searchQuery: string): SearchResult => {
|
2023-07-20 19:04:31 +02:00
|
|
|
const queries = searchQueries.queries;
|
|
|
|
|
2021-09-06 12:24:01 +02:00
|
|
|
const result: SearchResult = {
|
|
|
|
isLocal: false,
|
2021-10-06 12:01:07 +02:00
|
|
|
isURL: false,
|
2021-09-06 12:47:17 +02:00
|
|
|
sameTab: false,
|
2022-03-25 14:28:40 +01:00
|
|
|
encodedURL: '',
|
|
|
|
primarySearch: {
|
|
|
|
name: '',
|
|
|
|
prefix: '',
|
|
|
|
template: '',
|
|
|
|
},
|
|
|
|
secondarySearch: {
|
2021-09-06 12:47:17 +02:00
|
|
|
name: '',
|
|
|
|
prefix: '',
|
|
|
|
template: '',
|
|
|
|
},
|
2022-03-25 13:37:53 +01:00
|
|
|
rawQuery: searchQuery,
|
2021-09-06 12:24:01 +02:00
|
|
|
};
|
|
|
|
|
2021-10-22 13:31:02 +02:00
|
|
|
const { customQueries, config } = store.getState().config;
|
2021-10-06 14:15:05 +02:00
|
|
|
|
2021-10-06 12:01:07 +02:00
|
|
|
// Check if url or ip was passed
|
2021-11-10 11:42:00 +01:00
|
|
|
result.isURL = isUrlOrIp(searchQuery);
|
2021-10-06 12:01:07 +02:00
|
|
|
|
|
|
|
// Match prefix and query
|
2021-07-05 23:04:03 -05:00
|
|
|
const splitQuery = searchQuery.match(/^\/([a-z]+)[ ](.+)$/i);
|
2021-09-06 12:24:01 +02:00
|
|
|
|
2022-03-25 14:28:40 +01:00
|
|
|
// Extract prefix
|
2021-10-22 13:31:02 +02:00
|
|
|
const prefix = splitQuery ? splitQuery[1] : config.defaultSearchProvider;
|
2021-09-06 12:24:01 +02:00
|
|
|
|
2022-03-25 14:28:40 +01:00
|
|
|
// Encode url
|
|
|
|
const encodedURL = splitQuery
|
2021-09-06 12:24:01 +02:00
|
|
|
? encodeURIComponent(splitQuery[2])
|
|
|
|
: encodeURIComponent(searchQuery);
|
2021-06-24 12:53:45 +02:00
|
|
|
|
2022-03-25 14:28:40 +01:00
|
|
|
// Find primary search engine template
|
|
|
|
const findProvider = (prefix: string) => {
|
|
|
|
return [...queries, ...customQueries].find((q) => q.prefix === prefix);
|
|
|
|
};
|
|
|
|
|
|
|
|
const primarySearch = findProvider(prefix);
|
|
|
|
const secondarySearch = findProvider(config.secondarySearchProvider);
|
2021-06-24 12:53:45 +02:00
|
|
|
|
2022-03-25 14:28:40 +01:00
|
|
|
// If search providers were found
|
|
|
|
if (primarySearch) {
|
|
|
|
result.primarySearch = primarySearch;
|
|
|
|
result.encodedURL = encodedURL;
|
2021-06-24 12:53:45 +02:00
|
|
|
|
2021-09-06 12:24:01 +02:00
|
|
|
if (prefix === 'l') {
|
|
|
|
result.isLocal = true;
|
2021-06-24 12:53:45 +02:00
|
|
|
} else {
|
2021-10-22 13:31:02 +02:00
|
|
|
result.sameTab = config.searchSameTab;
|
2021-06-24 12:53:45 +02:00
|
|
|
}
|
2021-06-25 10:42:44 +02:00
|
|
|
|
2022-03-25 14:28:40 +01:00
|
|
|
if (secondarySearch) {
|
|
|
|
result.secondarySearch = secondarySearch;
|
|
|
|
}
|
|
|
|
|
2021-09-06 12:24:01 +02:00
|
|
|
return result;
|
2021-06-24 12:53:45 +02:00
|
|
|
}
|
2021-06-25 10:42:44 +02:00
|
|
|
|
2021-09-06 12:24:01 +02:00
|
|
|
return result;
|
|
|
|
};
|