UNPKG

site-metadata-extractor

Version:
652 lines 91.4 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.lazy = void 0; exports.extractFromHtml = extractFromHtml; exports.extractMetadataOnly = extractMetadataOnly; exports.extractLazy = extractLazy; exports.getCleanedDoc = getCleanedDoc; exports.getParsedDoc = getParsedDoc; exports.getParsedDocForText = getParsedDocForText; exports.getTopNode = getTopNode; /* eslint-disable no-unused-vars */ /* eslint-disable @typescript-eslint/no-unused-vars */ const cheerio = __importStar(require("cheerio")); const url_1 = require("url"); const cleaner_1 = __importDefault(require("./cleaner")); const extractor_1 = __importDefault(require("./extractor")); const STRATEGY_VERSION = "2026-05-26.cheerio-v1"; const DEFAULT_MAX_STRING_LENGTH = 4096; const DEFAULT_MAX_CANDIDATES = 25; const DEFAULT_MAX_READABLE_TEXT_LENGTH = 200000; const packageVersion = require("../package.json").version; function getTagName(node) { const element = node.get(0); return (element === null || element === void 0 ? void 0 : element.tagName) || ""; } function getBaseUrl(options) { return options.finalUrl || options.inputUrl || ""; } function getUrlParts(url) { if (!url) { return { normalizedUrl: "", domain: "" }; } try { const urlObj = new url_1.URL(url); urlObj.hash = ""; return { domain: urlObj.hostname, normalizedUrl: urlObj.href, }; } catch (_error) { return { normalizedUrl: url, domain: "" }; } } function resolveHttpUrl(value, baseUrl) { const trimmed = (value || "").trim(); if (!trimmed) { return ""; } try { const resolved = baseUrl ? new url_1.URL(trimmed, baseUrl) : new url_1.URL(trimmed); if (resolved.protocol === "http:" || resolved.protocol === "https:") { return resolved.href; } } catch (_error) { return ""; } return ""; } function toNumber(value) { if (!value) { return undefined; } const parsed = parseInt(value, 10); return Number.isFinite(parsed) ? parsed : undefined; } function cleanBounded(value, field, warnings, maxLength) { const cleaned = (value || "") .replace(/[\r\n\t]/g, " ") .replace(/\s\s+/g, " ") .trim(); if (cleaned.length > maxLength) { warnings.push(`${field} exceeded ${maxLength} characters and was truncated`); return cleaned.slice(0, maxLength); } return cleaned; } function pushUniqueCandidate(candidates, candidate, maxCandidates) { if (candidate.url && candidates.length < maxCandidates && !candidates.some((existing) => existing.url === candidate.url)) { candidates.push(candidate); } } function getRawMeta(doc, warnings, maxLength) { const rawMeta = {}; doc("meta").each((_index, element) => { const meta = doc(element); const key = meta.attr("property") || meta.attr("name") || meta.attr("itemprop") || meta.attr("http-equiv"); const content = meta.attr("content"); if (!key || content === undefined) { return; } const normalizedKey = key.trim().toLowerCase(); const bounded = cleanBounded(content, `rawMeta.${normalizedKey}`, warnings, maxLength); if (!rawMeta[normalizedKey]) { rawMeta[normalizedKey] = []; } rawMeta[normalizedKey].push(bounded); }); return rawMeta; } function firstMetaValue(rawMeta, keys) { var _a; for (const key of keys) { const value = (_a = rawMeta[key]) === null || _a === void 0 ? void 0 : _a[0]; if (value) { return value; } } return ""; } function getDateValue(doc, rawMeta, keys) { const metaValue = firstMetaValue(rawMeta, keys.map((key) => key.toLowerCase())); if (metaValue) { return metaValue; } for (const key of keys) { const itemprop = key.replace(/^article:/, ""); const dateElement = doc(`[itemprop='${itemprop}'], [property='${itemprop}']`) .first(); const datetime = dateElement.attr("datetime"); const content = dateElement.attr("content"); const text = dateElement.text(); const value = cleanBounded(content || datetime || text, key, [], 256); if (value) { return value; } } return ""; } function getFaviconCandidates(doc, baseUrl, maxCandidates) { const candidates = []; doc("link").each((_index, element) => { const link = doc(element); const rel = (link.attr("rel") || "").toLowerCase(); if (!/\b(icon|apple-touch-icon|mask-icon)\b/.test(rel)) { return; } const url = resolveHttpUrl(link.attr("href"), baseUrl); pushUniqueCandidate(candidates, { rel, sizes: link.attr("sizes"), source: "link", type: link.attr("type"), url, }, maxCandidates); }); if (candidates.length === 0) { const fallback = resolveHttpUrl("/favicon.ico", baseUrl); pushUniqueCandidate(candidates, { rel: "icon", source: "default", url: fallback }, maxCandidates); } return candidates; } function getImageCandidates(doc, baseUrl, maxCandidates) { const candidates = []; const metaSelectors = [ "meta[property='og:image']", "meta[property='og:image:url']", "meta[property='og:image:secure_url']", "meta[name='twitter:image']", "meta[name='twitter:image:src']", "meta[itemprop='image']", ]; metaSelectors.forEach((selector) => { doc(selector).each((_index, element) => { const meta = doc(element); const url = resolveHttpUrl(meta.attr("content"), baseUrl); pushUniqueCandidate(candidates, { source: meta.attr("property") || meta.attr("name") || meta.attr("itemprop") || "meta", url, }, maxCandidates); }); }); doc("link[rel='image_src']").each((_index, element) => { const link = doc(element); const url = resolveHttpUrl(link.attr("href"), baseUrl); pushUniqueCandidate(candidates, { rel: "image_src", source: "link", url }, maxCandidates); }); doc("img").each((_index, element) => { const img = doc(element); const url = resolveHttpUrl(img.attr("src") || img.attr("data-src") || img.attr("data-original"), baseUrl); pushUniqueCandidate(candidates, { alt: img.attr("alt"), height: toNumber(img.attr("height")), source: "img", url, width: toNumber(img.attr("width")), }, maxCandidates); }); return candidates; } function parseJsonLd(doc, warnings) { const jsonld = []; doc('script[type="application/ld+json"]').each((index, element) => { const raw = doc(element).html() || ""; const trimmed = raw.trim(); if (!trimmed) { return; } try { const parsed = JSON.parse(trimmed); if (Array.isArray(parsed)) { jsonld.push(...parsed); } else { jsonld.push(parsed); } } catch (_error) { warnings.push(`jsonld block ${index} could not be parsed`); } }); return jsonld; } function getTextStats(text, truncated) { const words = text.match(/\S+/g) || []; const sentences = text.match(/[.!?](\s|$)/g) || []; return { charCount: text.length, sentenceCount: sentences.length, truncated, wordCount: words.length, }; } function protectEscapedTagText(html) { const replacements = []; const protectedHtml = html.replace(/&lt;([^<>]{1,1000}?)&gt;/gi, (_match, inner) => { const placeholder = `SME_ESCAPED_TEXT_${replacements.length}_`; replacements.push(`<${inner}>`); return placeholder; }); return { html: protectedHtml, restore: (text) => replacements.reduce((restored, replacement, index) => restored.replace(new RegExp(`SME_ESCAPED_TEXT_${index}_`, "g"), replacement), text), }; } function getReadableParts(html, lang, baseUrl, maxReadableTextLength, warnings) { try { const protectedText = protectEscapedTagText(html); const doc = cheerio.load(protectedText.html, { xmlMode: false }); (0, cleaner_1.default)(doc); const topNode = extractor_1.default.calculateBestNode(doc, lang); if (!topNode || topNode.length === 0) { return { links: [], readableText: "", textStats: getTextStats("", false), videos: [], }; } const links = getLinks(doc, topNode, baseUrl); const videos = getVideos(doc, topNode, baseUrl); let readableText = protectedText.restore(extractor_1.default.text(doc, topNode, lang)); let truncated = false; if (readableText.length > maxReadableTextLength) { readableText = readableText.slice(0, maxReadableTextLength); truncated = true; warnings.push(`readableText exceeded ${maxReadableTextLength} characters and was truncated`); } return { links, readableText, textStats: getTextStats(readableText, truncated), videos, }; } catch (_error) { warnings.push("readable text extraction failed"); return { links: [], readableText: "", textStats: getTextStats("", false), videos: [], }; } } function getLinks(doc, topNode, baseUrl) { const links = []; topNode.find("a").each((_index, element) => { const anchor = doc(element); const url = resolveHttpUrl(anchor.attr("href"), baseUrl); const text = anchor.text().replace(/\s\s+/g, " ").trim(); if (url && text && !links.some((link) => link.url === url)) { links.push({ rel: anchor.attr("rel"), text, title: anchor.attr("title"), url, }); } }); return links; } function getVideos(doc, topNode, baseUrl) { const videos = []; topNode.find("iframe, embed, object, video, source").each((_index, element) => { const candidate = doc(element); const tag = getTagName(candidate); const src = candidate.attr("src") || candidate.attr("data-src") || candidate.find("param[name='movie']").attr("value"); const url = resolveHttpUrl(src, baseUrl); if (url && !videos.some((video) => video.url === url)) { videos.push({ height: toNumber(candidate.attr("height")), source: tag, type: candidate.attr("type"), url, width: toNumber(candidate.attr("width")), }); } }); return videos; } function buildMetadata(html, options, includeReadable) { const warnings = []; const maxStringLength = options.maxStringLength || DEFAULT_MAX_STRING_LENGTH; const maxCandidates = options.maxCandidates || DEFAULT_MAX_CANDIDATES; const maxReadableTextLength = options.maxReadableTextLength || DEFAULT_MAX_READABLE_TEXT_LENGTH; const inputUrl = options.inputUrl || options.finalUrl || ""; const finalUrl = options.finalUrl || inputUrl; const baseUrl = getBaseUrl(options); const { domain, normalizedUrl } = getUrlParts(finalUrl || inputUrl); const doc = cheerio.load(html, { xmlMode: true }); const docForJsonLd = cheerio.load(html, { decodeEntities: false, xmlMode: true, }); const rawMeta = getRawMeta(doc, warnings, maxStringLength); const language = options.lang || extractor_1.default.lang(doc) || ""; const canonicalCandidate = firstMetaValue(rawMeta, ["og:url"]) || doc("link[rel='canonical']").first().attr("href") || finalUrl || inputUrl; const canonicalUrl = resolveHttpUrl(canonicalCandidate, baseUrl) || canonicalCandidate || ""; const faviconCandidates = getFaviconCandidates(doc, baseUrl, maxCandidates); const imageCandidates = getImageCandidates(doc, baseUrl, maxCandidates); const title = cleanBounded(extractor_1.default.title(doc), "title", warnings, maxStringLength); const softTitle = cleanBounded(extractor_1.default.softTitle(doc), "softTitle", warnings, maxStringLength); const description = cleanBounded(extractor_1.default.description(doc), "description", warnings, maxStringLength); const readableParts = includeReadable ? getReadableParts(html, language || "en", baseUrl, maxReadableTextLength, warnings) : { links: [], readableText: "", textStats: getTextStats("", false), videos: [], }; const confidenceSignals = [ title, description, canonicalUrl, imageCandidates.length > 0 ? "image" : "", readableParts.readableText.length > 0 ? "text" : "", ].filter(Boolean).length; return { author: extractor_1.default .author(doc) .map((author) => cleanBounded(author, "author", warnings, maxStringLength)) .filter(Boolean), canonicalUrl, description, domain, extraction: { confidence: Math.min(1, confidenceSignals / 5), packageVersion, strategyVersion: STRATEGY_VERSION, warnings, }, faviconCandidates, finalUrl, imageCandidates, inputUrl, jsonld: parseJsonLd(docForJsonLd, warnings), lang: language, links: readableParts.links, locale: cleanBounded(extractor_1.default.locale(doc), "locale", warnings, maxStringLength), modifiedAt: getDateValue(doc, rawMeta, [ "article:modified_time", "og:updated_time", "dcterms.modified", "dc.date.modified", "dateModified", ]), normalizedUrl, primaryImage: imageCandidates[0] || null, publishedAt: getDateValue(doc, rawMeta, [ "article:published_time", "date", "dcterms.date", "dc.date", "dc.date.issued", "datePublished", ]), publisher: cleanBounded(extractor_1.default.publisher(doc), "publisher", warnings, maxStringLength), rawMeta, readableText: readableParts.readableText, siteName: cleanBounded(extractor_1.default.siteName(doc), "siteName", warnings, maxStringLength), softTitle, textStats: readableParts.textStats, title, videos: readableParts.videos, }; } function extractFromHtml(html, options = {}) { return buildMetadata(html, options, true); } function extractMetadataOnly(html, options = {}) { return buildMetadata(html, options, false); } function extractLazy(html, options = {}) { let metadataCache = null; let fullCache = null; const metadata = () => { if (!metadataCache) { metadataCache = extractMetadataOnly(html, options); } return metadataCache; }; const extract = () => { if (!fullCache) { fullCache = extractFromHtml(html, options); } return fullCache; }; return { extract, links: () => extract().links, metadata, readableText: () => extract().readableText, videos: () => extract().videos, }; } const siteMetadataExtractor = (markup, resourceUrl, lang = "en") => { const resourceUrlObj = new url_1.URL(resourceUrl); const doc = cheerio.load(markup, { xmlMode: true }); // Separate instance with decodeEntities: false specifically for JSON-LD extraction const docForJsonLd = cheerio.load(markup, { xmlMode: true, decodeEntities: false, }); const docForText = cheerio.load(markup, { xmlMode: false }); const language = lang || extractor_1.default.lang(doc); const pageData = { author: extractor_1.default.author(doc), canonicalLink: extractor_1.default.canonicalLink(doc, resourceUrl), copyright: extractor_1.default.copyright(doc), date: extractor_1.default.date(doc), description: extractor_1.default.description(doc), favicon: extractor_1.default.favicon(doc, resourceUrlObj), image: extractor_1.default.image(doc), jsonld: extractor_1.default.jsonld(docForJsonLd), keywords: extractor_1.default.keywords(doc), lang: language, locale: extractor_1.default.locale(doc), origin: resourceUrlObj.origin, publisher: extractor_1.default.publisher(doc), siteName: extractor_1.default.siteName(doc), softTitle: extractor_1.default.softTitle(doc), tags: extractor_1.default.tags(doc), title: extractor_1.default.title(doc), type: extractor_1.default.type(doc), }; // Step 1: Clean the doc (0, cleaner_1.default)(doc); // Step 2: Find the doc node with the best text const topNode = extractor_1.default.calculateBestNode(docForText, language); // Step 3: Extract text ,videos, images, link pageData.videos = extractor_1.default.videos(doc, topNode); pageData.links = extractor_1.default.links(doc, topNode, language); pageData.text = extractor_1.default.text(doc, topNode, language); return pageData; }; exports.default = siteMetadataExtractor; // Allow access to document properties with lazy evaluation const lazy = (html, resourceUrl, language = "en") => { const resourceUrlObj = new url_1.URL(resourceUrl); global.lazyPageData = global.lazyPageData || {}; return { author: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.author = extractor_1.default.author(doc); return global.lazyPageData.author; }, canonicalLink: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.canonicalLink = extractor_1.default.canonicalLink(doc, resourceUrl); return global.lazyPageData.canonicalLink; }, copyright: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.copyright = extractor_1.default.copyright(doc); return global.lazyPageData.copyright; }, date: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.date = extractor_1.default.date(doc); return global.lazyPageData.date; }, description: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.description = extractor_1.default.description(doc); return global.lazyPageData.description; }, favicon: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.favicon = extractor_1.default.favicon(doc, resourceUrlObj); return global.lazyPageData.favicon; }, image: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.image = extractor_1.default.image(doc); return global.lazyPageData.image; }, jsonld: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.jsonld = extractor_1.default.jsonld(doc); return global.lazyPageData.jsonld; }, keywords: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.keywords = extractor_1.default.keywords(doc); return global.lazyPageData.keywords; }, lang: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.lang = language || extractor_1.default.lang(doc); return global.lazyPageData.lang; }, locale: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.locale = extractor_1.default.locale(doc); return global.lazyPageData.locale; }, links() { let doc = getParsedDocForText.call(global, html); const topNode = getTopNode.call(global, doc, this.lang()); doc = (0, cleaner_1.default)(doc); global.lazyPageData.links = extractor_1.default.links(doc, topNode, this.lang()); return global.lazyPageData.links; }, origin: () => { global.lazyPageData.origin = resourceUrlObj.origin; return global.lazyPageData.origin; }, publisher: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.publisher = extractor_1.default.publisher(doc); return global.lazyPageData.publisher; }, siteName: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.siteName = extractor_1.default.siteName(doc); return global.lazyPageData.siteName; }, softTitle: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.softTitle = extractor_1.default.softTitle(doc); return global.lazyPageData.softTitle; }, tags: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.tags = extractor_1.default.tags(doc); return global.lazyPageData.tags; }, text() { let doc = getParsedDocForText.call(global, html); doc = (0, cleaner_1.default)(doc); const topNode = getTopNode.call(global, doc, this.lang()); const textData = extractor_1.default.text(doc, topNode, this.lang()); global.lazyPageData.text = textData; return textData; }, title: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.title = extractor_1.default.title(doc); return global.lazyPageData.title; }, type: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.type = extractor_1.default.type(doc); return global.lazyPageData.type; }, videos() { let doc = getParsedDocForText.call(global, html); doc = (0, cleaner_1.default)(doc); const topNode = getTopNode.call(global, doc, this.lang()); global.lazyPageData.videos = extractor_1.default.videos(doc, topNode); return global.lazyPageData.videos; }, }; }; exports.lazy = lazy; function getCleanedDoc(html) { if (!global.cleanedDoc) { const doc = getParsedDoc.call(global, html); global.cleanedDoc = (0, cleaner_1.default)(doc); } return global.cleanedDoc; } function getParsedDoc(html) { return (global.doc = cheerio.load(html)); } function getParsedDocForText(html) { return (global.doc = cheerio.load(html, { xmlMode: false })); } function getTopNode(doc, lang) { global.topNode = extractor_1.default.calculateBestNode(doc, lang); return global.topNode; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa3RCQSwwQ0FLQztBQUVELGtEQUtDO0FBRUQsa0NBNEJDO0FBd0xELHNDQU1DO0FBRUQsb0NBRUM7QUFFRCxrREFFQztBQUVELGdDQUdDO0FBdjhCRCxtQ0FBbUM7QUFDbkMsc0RBQXNEO0FBQ3RELGlEQUFtQztBQUluQyw2QkFBMEI7QUFFMUIsd0RBQWdDO0FBQ2hDLDREQUE2RDtBQXVJN0QsTUFBTSxnQkFBZ0IsR0FBRyx1QkFBdUIsQ0FBQztBQUNqRCxNQUFNLHlCQUF5QixHQUFHLElBQUksQ0FBQztBQUN2QyxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUNsQyxNQUFNLGdDQUFnQyxHQUFHLE1BQU0sQ0FBQztBQUVoRCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxPQUFpQixDQUFDO0FBRXBFLFNBQVMsVUFBVSxDQUFDLElBQXNCO0lBQ3hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUF3QixDQUFDO0lBQ25ELE9BQU8sQ0FBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsT0FBTyxLQUFJLEVBQUUsQ0FBQztBQUNoQyxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsT0FBdUI7SUFDekMsT0FBTyxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO0FBQ3BELENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxHQUFXO0lBQzlCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNULE9BQU8sRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gs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