rechnik
Version:
60 lines (47 loc) • 1.5 kB
text/typescript
import axios from 'axios';
import chalk from 'chalk';
import cheerio from 'cheerio';
import { cleanString } from '../utils';
axios.defaults.baseURL = 'https://makedonski.gov.mk';
export interface SearchResults {
words: {
value: string;
desc: string;
}[];
pages: [curr: number, max: number];
}
export type SearchFunction = (
query: string,
page?: number
) => Promise<SearchResults>;
const commonSearch = async (
endpoint: string,
query: string,
page: number
): Promise<SearchResults> => {
const { data } = await axios.get(
`/${endpoint}?q=${encodeURIComponent(query)}&page=${page}`
);
const $ = cheerio.load(data);
const words = $('#main-content .row .content')
.toArray()
.map((el) => ({
value: cleanString($(el).find('h2').text()),
desc: cleanString($(el).find('p').text()),
}));
let pages: SearchResults['pages'] = (cleanString(
$(
'#main-content > div > div:nth-child(3) > nav > ul > li.disabled > a'
).text()
)
.match(/\d+/g)
?.map((p) => +p) as SearchResults['pages']) || [1, 1];
const results: SearchResults = { words, pages };
return results;
};
export const searchCorpus: SearchFunction = async (query, page?) =>
commonSearch('s', query, page || 1);
export const searchGeo: SearchFunction = async (query, page?) =>
commonSearch('geo', query, page || 1);
export const searchAbbreviations: SearchFunction = async (query, page?) =>
commonSearch('kratenki', query, page || 1);