src / extractors / openGraphExtractor.ts
export interface ExtractedOpenGraph {
title?: string;
description?: string;
publishedDate?: string;
author?: string;
siteName?: string;
}
/**
* Internal helper to query meta content by property or name attribute.
*/
function getMetaContent(doc: Document, selectors: string[]): string | undefined {
for (const selector of selectors) {
const element = doc.querySelector(selector);
if (element) {
const content = element.getAttribute("content");
if (content && content.trim()) {
return content.trim();
}
}
}
return undefined;
}
/**
* Extracts Open Graph, Twitter, and standard HTML meta tags from the document.
*/
export function extractOpenGraph(doc: Document): ExtractedOpenGraph {
const title = getMetaContent(doc, [
'meta[property="og:title"]',
'meta[name="twitter:title"]',
'meta[name="title"]',
]);
const description = getMetaContent(doc, [
'meta[property="og:description"]',
'meta[name="twitter:description"]',
'meta[name="description"]',
]);
const publishedDate = getMetaContent(doc, [
'meta[property="article:published_time"]',
'meta[property="og:article:published_time"]',
'meta[property="article:modified_time"]',
'meta[name="pubdate"]',
'meta[name="dc.date"]',
'meta[name="date"]',
]);
const author = getMetaContent(doc, [
'meta[name="author"]',
'meta[property="article:author"]',
'meta[property="og:article:author"]',
'meta[name="twitter:creator"]',
]);
const siteName = getMetaContent(doc, [
'meta[property="og:site_name"]',
'meta[name="application-name"]',
]);
return {
title,
description,
publishedDate,
author,
siteName,
};
}
src / extractors / openGraphExtractor.ts
export interface ExtractedOpenGraph {
title?: string;
description?: string;
publishedDate?: string;
author?: string;
siteName?: string;
}
/**
* Internal helper to query meta content by property or name attribute.
*/
function getMetaContent(doc: Document, selectors: string[]): string | undefined {
for (const selector of selectors) {
const element = doc.querySelector(selector);
if (element) {
const content = element.getAttribute("content");
if (content && content.trim()) {
return content.trim();
}
}
}
return undefined;
}
/**
* Extracts Open Graph, Twitter, and standard HTML meta tags from the document.
*/
export function extractOpenGraph(doc: Document): ExtractedOpenGraph {
const title = getMetaContent(doc, [
'meta[property="og:title"]',
'meta[name="twitter:title"]',
'meta[name="title"]',
]);
const description = getMetaContent(doc, [
'meta[property="og:description"]',
'meta[name="twitter:description"]',
'meta[name="description"]',
]);
const publishedDate = getMetaContent(doc, [
'meta[property="article:published_time"]',
'meta[property="og:article:published_time"]',
'meta[property="article:modified_time"]',
'meta[name="pubdate"]',
'meta[name="dc.date"]',
'meta[name="date"]',
]);
const author = getMetaContent(doc, [
'meta[name="author"]',
'meta[property="article:author"]',
'meta[property="og:article:author"]',
'meta[name="twitter:creator"]',
]);
const siteName = getMetaContent(doc, [
'meta[property="og:site_name"]',
'meta[name="application-name"]',
]);
return {
title,
description,
publishedDate,
author,
siteName,
};
}