UNPKG

feedsmith

Version:

Fast, all‑in‑one feed parser and generator for RSS, Atom, RDF, and JSON Feed, with support for Podcast, iTunes, Dublin Core, and OPML files.

98 lines (97 loc) 5.52 kB
import { detectNamespaces, isObject, parseArrayOf, parseSingular, parseSingularOf, parseString, retrieveText, trimArray, trimObject } from "../../../common/utils.js"; import { retrieveFeed as retrieveFeed$1 } from "../../../namespaces/admin/parse/utils.js"; import { retrieveItemOrFeed } from "../../../namespaces/dc/parse/utils.js"; import { retrieveItemOrFeed as retrieveItemOrFeed$1 } from "../../../namespaces/dcterms/parse/utils.js"; import { retrieveItemOrFeed as retrieveItemOrFeed$2 } from "../../../namespaces/georss/parse/utils.js"; import { retrieveItemOrFeed as retrieveItemOrFeed$3 } from "../../../namespaces/media/parse/utils.js"; import { retrieveItem } from "../../../namespaces/slash/parse/utils.js"; import { retrieveFeed as retrieveFeed$2 } from "../../../namespaces/sy/parse/utils.js"; import { retrieveItem as retrieveItem$1 } from "../../../namespaces/wfw/parse/utils.js"; import { retrieveEntry, retrieveFeed as retrieveFeed$3 } from "../../../namespaces/atom/parse/utils.js"; import { retrieveItem as retrieveItem$2 } from "../../../namespaces/content/parse/utils.js"; import { retrieveAbout } from "../../../namespaces/rdf/parse/utils.js"; //#region src/feeds/rdf/parse/utils.ts const retrieveByAbout = (elements, resourceUri) => { if (!resourceUri) return; return (Array.isArray(elements) ? elements : [elements]).find((el) => el?.["@about"] === resourceUri); }; const findByTocReference = (value, property) => { if (!isObject(value)) return; const resourceUri = parseString(parseSingular(parseSingular(value.channel)?.[property])?.["@resource"]); return retrieveByAbout(value[property], resourceUri); }; const parseImage = (value) => { if (!isObject(value)) return; return trimObject({ title: parseSingularOf(value.title, (value) => parseString(retrieveText(value))), link: parseSingularOf(value.link, (value) => parseString(retrieveText(value))), url: parseSingularOf(value.url, (value) => parseString(retrieveText(value))), rdf: retrieveAbout(value) }); }; const retrieveImage = (value) => { return parseImage(findByTocReference(value, "image")) ?? parseSingularOf(value?.image, parseImage); }; const parseTextInput = (value) => { if (!isObject(value)) return; return trimObject({ title: parseSingularOf(value.title, (value) => parseString(retrieveText(value))), description: parseSingularOf(value.description, (value) => parseString(retrieveText(value))), name: parseSingularOf(value.name, (value) => parseString(retrieveText(value))), link: parseSingularOf(value.link, (value) => parseString(retrieveText(value))), rdf: retrieveAbout(value) }); }; const retrieveTextInput = (value) => { return parseTextInput(findByTocReference(value, "textinput")) ?? parseSingularOf(value?.textinput, parseTextInput); }; const parseItem = (value) => { if (!isObject(value)) return; const namespaces = detectNamespaces(value); return trimObject({ title: parseSingularOf(value.title, (value) => parseString(retrieveText(value))), link: parseSingularOf(value.link, (value) => parseString(retrieveText(value))), description: parseSingularOf(value.description, (value) => parseString(retrieveText(value))), rdf: retrieveAbout(value), atom: namespaces.has("atom") ? retrieveEntry(value) : void 0, dc: namespaces.has("dc") ? retrieveItemOrFeed(value) : void 0, content: namespaces.has("content") ? retrieveItem$2(value) : void 0, slash: namespaces.has("slash") ? retrieveItem(value) : void 0, media: namespaces.has("media") ? retrieveItemOrFeed$3(value) : void 0, georss: namespaces.has("georss") ? retrieveItemOrFeed$2(value) : void 0, dcterms: namespaces.has("dcterms") ? retrieveItemOrFeed$1(value) : void 0, wfw: namespaces.has("wfw") ? retrieveItem$1(value) : void 0 }); }; const retrieveItems = (value, options) => { if (!isObject(value)) return; const items = trimArray(parseArrayOf(parseSingular(parseSingular(parseSingular(value.channel)?.items)?.seq)?.li, (li) => parseString(li?.["@resource"]), options?.maxItems)?.map((uri) => retrieveByAbout(value.item, uri)), parseItem); if (items?.length) return items; return parseArrayOf(value?.item, parseItem, options?.maxItems); }; const parseFeed = (value, options) => { if (!isObject(value)) return; const channel = parseSingular(value.channel); const namespaces = detectNamespaces(channel); return trimObject({ title: parseSingularOf(channel?.title, (value) => parseString(retrieveText(value))), link: parseSingularOf(channel?.link, (value) => parseString(retrieveText(value))), description: parseSingularOf(channel?.description, (value) => parseString(retrieveText(value))), image: retrieveImage(value), items: retrieveItems(value, options), textInput: retrieveTextInput(value), rdf: retrieveAbout(channel), atom: namespaces.has("atom") ? retrieveFeed$3(channel) : void 0, dc: namespaces.has("dc") ? retrieveItemOrFeed(channel) : void 0, sy: namespaces.has("sy") ? retrieveFeed$2(channel) : void 0, media: namespaces.has("media") ? retrieveItemOrFeed$3(channel) : void 0, georss: namespaces.has("georss") ? retrieveItemOrFeed$2(channel) : void 0, dcterms: namespaces.has("dcterms") ? retrieveItemOrFeed$1(channel) : void 0, admin: namespaces.has("admin") ? retrieveFeed$1(channel) : void 0 }); }; const retrieveFeed = (value, options) => { return parseSingularOf(value?.rdf, (value) => parseFeed(value, options)); }; //#endregion export { parseFeed, parseImage, parseItem, parseTextInput, retrieveFeed, retrieveImage, retrieveItems, retrieveTextInput };