109 lines
4.1 KiB
TypeScript
109 lines
4.1 KiB
TypeScript
import { load } from 'cheerio';
|
|
|
|
import type { DataItem } from '@/types';
|
|
import cache from '@/utils/cache';
|
|
import ofetch from '@/utils/ofetch';
|
|
import { parseDate } from '@/utils/parse-date';
|
|
|
|
import { renderDescription } from './templates/description';
|
|
import { renderDescriptionSub } from './templates/description-sub';
|
|
|
|
export const baseUrl = 'https://visionias.in';
|
|
|
|
export async function extractNews(item, selector) {
|
|
if (item.link === '') {
|
|
return item;
|
|
}
|
|
return await cache.tryGet(item.link, async () => {
|
|
const response = await ofetch(item.link || '');
|
|
const $$ = load(response);
|
|
const postedDate = String($$('meta[property="article:published_time"]').attr('content'));
|
|
const updatedDate = String($$('meta[property="article:modified_time"]').attr('content'));
|
|
const tags = $$('meta[property="article:tag"]')
|
|
.toArray()
|
|
.map((tag) => $$(tag).attr('content'));
|
|
const content = $$(selector);
|
|
const heading = content.find('div.space-y-4 > h1').text();
|
|
const mainGroup = content.find('div.flex > div.w-full');
|
|
|
|
const shortArticles = mainGroup.find('[x-data^="{isShortArticleOpen"]');
|
|
if (shortArticles.length !== 0) {
|
|
const items = shortArticles.toArray().map((element) => {
|
|
const mainDiv = $$(element);
|
|
const title = mainDiv.find('a > div > h2').text().trim();
|
|
const id = mainDiv.find('a').attr('href');
|
|
const htmlContent = extractArticle(mainDiv.html());
|
|
const innerTags = mainDiv
|
|
.find('ul > li:contains("Tags :")')
|
|
?.nextAll('li')
|
|
.toArray()
|
|
.map((tag) => $$(tag).text());
|
|
const description = renderDescription({
|
|
heading: title,
|
|
articleContent: htmlContent,
|
|
});
|
|
return {
|
|
title: `${title} | ${heading}`,
|
|
pubDate: parseDate(postedDate),
|
|
category: innerTags,
|
|
description,
|
|
link: `${item.link}${id}`,
|
|
author: 'Vision IAS',
|
|
} as DataItem;
|
|
});
|
|
return items;
|
|
}
|
|
const sections = mainGroup.find('[x-data^="{isSectionOpen"]');
|
|
if (sections.length === 0) {
|
|
const htmlContent = extractArticle(mainGroup.html());
|
|
const description = renderDescription({
|
|
heading,
|
|
articleContent: htmlContent,
|
|
});
|
|
return {
|
|
title: item.title,
|
|
pubDate: parseDate(postedDate),
|
|
category: tags,
|
|
description,
|
|
link: item.link,
|
|
updated: updatedDate ? parseDate(updatedDate) : null,
|
|
author: 'Vision IAS',
|
|
} as DataItem;
|
|
}
|
|
const items = sections.toArray().map((element) => {
|
|
const mainDiv = $$(element);
|
|
const title = mainDiv.find('a > div > h2').text().trim();
|
|
const htmlContent = extractArticle(mainDiv.html(), 'div.ck-content');
|
|
const description = renderDescriptionSub({
|
|
heading: title,
|
|
articleContent: htmlContent,
|
|
});
|
|
return { description };
|
|
});
|
|
const description = renderDescription({
|
|
heading,
|
|
subItems: items,
|
|
});
|
|
return {
|
|
title: heading,
|
|
pubDate: parseDate(postedDate),
|
|
category: tags,
|
|
description,
|
|
link: item.link,
|
|
updated: updatedDate ? parseDate(updatedDate) : null,
|
|
author: 'Vision IAS',
|
|
} as DataItem;
|
|
});
|
|
}
|
|
|
|
function extractArticle(articleDiv, selectorString: string = 'div.ck-content') {
|
|
const $ = load(articleDiv, null, false);
|
|
const articleDiv$ = $(articleDiv);
|
|
const articleContent = articleDiv$.find(selectorString);
|
|
articleContent.find('figure').each((_, element) => {
|
|
$(element).css('width', '');
|
|
});
|
|
const htmlContent = articleContent.html();
|
|
return htmlContent;
|
|
}
|