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.

201 lines (200 loc) 11.9 kB
import { detectNamespaces, isObject, parseArrayOf, parseDate, parseNumber, parseSingularOf, parseString, retrieveText, trimObject } from "../../../common/utils.js"; import { retrieveFeed as retrieveFeed$1 } from "../../../namespaces/admin/parse/utils.js"; import { retrieveEntry } from "../../../namespaces/app/parse/utils.js"; import { retrieveAuthor, retrieveEntry as retrieveEntry$1 } from "../../../namespaces/arxiv/parse/utils.js"; import { retrieveItemOrFeed } from "../../../namespaces/cc/parse/utils.js"; import { retrieveItemOrFeed as retrieveItemOrFeed$1 } from "../../../namespaces/creativecommons/parse/utils.js"; import { retrieveItemOrFeed as retrieveItemOrFeed$2 } from "../../../namespaces/dc/parse/utils.js"; import { retrieveItemOrFeed as retrieveItemOrFeed$3 } from "../../../namespaces/dcterms/parse/utils.js"; import { retrieveItemOrFeed as retrieveItemOrFeed$4 } from "../../../namespaces/geo/parse/utils.js"; import { retrieveItemOrFeed as retrieveItemOrFeed$5 } from "../../../namespaces/georss/parse/utils.js"; import { retrieveFeed as retrieveFeed$2, retrieveItem } from "../../../namespaces/googleplay/parse/utils.js"; import { retrieveFeed as retrieveFeed$3, retrieveItem as retrieveItem$1 } from "../../../namespaces/itunes/parse/utils.js"; import { retrieveItemOrFeed as retrieveItemOrFeed$6 } from "../../../namespaces/media/parse/utils.js"; import { retrieveFeed as retrieveFeed$4 } from "../../../namespaces/opensearch/parse/utils.js"; import { retrieveFeed as retrieveFeed$5, retrieveItem as retrieveItem$2 } from "../../../namespaces/pingback/parse/utils.js"; import { retrieveItem as retrieveItem$3 } from "../../../namespaces/psc/parse/utils.js"; import { retrieveItem as retrieveItem$4 } from "../../../namespaces/slash/parse/utils.js"; import { retrieveFeed as retrieveFeed$6 } from "../../../namespaces/sy/parse/utils.js"; import { retrieveItem as retrieveItem$5, retrieveLink } from "../../../namespaces/thr/parse/utils.js"; import { retrieveItem as retrieveItem$6 } from "../../../namespaces/trackback/parse/utils.js"; import { retrieveItem as retrieveItem$7 } from "../../../namespaces/wfw/parse/utils.js"; import { retrieveFeed as retrieveFeed$7, retrieveItem as retrieveItem$8 } from "../../../namespaces/yt/parse/utils.js"; //#region src/feeds/atom/parse/utils.ts const createNamespaceGetter = (value, prefix) => { if (!prefix) return (key) => value[key]; return (key) => value[prefix + key]; }; const parseLink = (value) => { if (!isObject(value)) return; const namespaces = detectNamespaces(value); return trimObject({ href: parseString(value["@href"]) ?? parseString(retrieveText(value)), rel: parseString(value["@rel"]), type: parseString(value["@type"]), hreflang: parseString(value["@hreflang"]), title: parseString(value["@title"]), length: parseNumber(value["@length"]), thr: namespaces.has("thr") ? retrieveLink(value) : void 0 }); }; const retrievePersonUri = (value, options) => { if (!isObject(value)) return; const get = createNamespaceGetter(value, options?.prefix); const uri = parseSingularOf(get("uri"), (value) => parseString(retrieveText(value))); const url = parseSingularOf(get("url"), (value) => parseString(retrieveText(value))); return uri || url; }; const parsePerson = (value, options) => { if (!isObject(value)) return; const namespaces = options?.asNamespace ? void 0 : detectNamespaces(value); const get = createNamespaceGetter(value, options?.prefix); return trimObject({ name: parseSingularOf(get("name"), (value) => parseString(retrieveText(value))), uri: retrievePersonUri(value, options), email: parseSingularOf(get("email"), (value) => parseString(retrieveText(value))), arxiv: namespaces?.has("arxiv") ? retrieveAuthor(value) : void 0 }); }; const parseCategory = (value) => { if (!isObject(value)) return; return trimObject({ term: parseString(value["@term"]), scheme: parseString(value["@scheme"]), label: parseString(value["@label"]) }); }; const retrieveGeneratorUri = (value) => { if (!isObject(value)) return; const uri = parseString(value["@uri"]); const url = parseString(value["@url"]); return uri || url; }; const parseGenerator = (value) => { return trimObject({ text: parseString(retrieveText(value)), uri: retrieveGeneratorUri(value), version: parseString(value?.["@version"]) }); }; const parseSource = (value, options) => { if (!isObject(value)) return; const get = createNamespaceGetter(value, options?.prefix); return trimObject({ authors: parseArrayOf(get("author"), (value) => parsePerson(value, options)), categories: parseArrayOf(get("category"), (value) => parseCategory(value, options)), contributors: parseArrayOf(get("contributor"), (value) => parsePerson(value, options)), generator: parseSingularOf(get("generator"), (value) => parseGenerator(value, options)), icon: parseSingularOf(get("icon"), (value) => parseString(retrieveText(value))), id: parseSingularOf(get("id"), (value) => parseString(retrieveText(value))), links: parseArrayOf(get("link"), (value) => parseLink(value, options)), logo: parseSingularOf(get("logo"), (value) => parseString(retrieveText(value))), rights: parseSingularOf(get("rights"), (value) => parseString(retrieveText(value))), subtitle: parseSingularOf(get("subtitle"), (value) => parseString(retrieveText(value))), title: parseSingularOf(get("title"), (value) => parseString(retrieveText(value))), updated: retrieveUpdated(value) }); }; const retrievePublished = (value, options) => { if (!isObject(value)) return; const get = createNamespaceGetter(value, options?.prefix); const published = parseSingularOf(get("published"), (value) => parseDate(retrieveText(value))); const issued = parseSingularOf(get("issued"), (value) => parseDate(retrieveText(value))); const created = parseSingularOf(get("created"), (value) => parseDate(retrieveText(value))); return published || issued || created; }; const retrieveUpdated = (value, options) => { if (!isObject(value)) return; const get = createNamespaceGetter(value, options?.prefix); const updated = parseSingularOf(get("updated"), (value) => parseDate(retrieveText(value))); const modified = parseSingularOf(get("modified"), (value) => parseDate(retrieveText(value))); return updated || modified; }; const retrieveSubtitle = (value, options) => { if (!isObject(value)) return; const get = createNamespaceGetter(value, options?.prefix); const subtitle = parseSingularOf(get("subtitle"), (value) => parseString(retrieveText(value))); const tagline = parseSingularOf(get("tagline"), (value) => parseString(retrieveText(value))); return subtitle || tagline; }; const parseEntry = (value, options) => { if (!isObject(value)) return; const namespaces = options?.asNamespace ? void 0 : detectNamespaces(value); const get = createNamespaceGetter(value, options?.prefix); return trimObject({ authors: parseArrayOf(get("author"), (value) => parsePerson(value, options)), categories: parseArrayOf(get("category"), (value) => parseCategory(value, options)), content: parseSingularOf(get("content"), (value) => parseString(retrieveText(value))), contributors: parseArrayOf(get("contributor"), (value) => parsePerson(value, options)), id: parseSingularOf(get("id"), (value) => parseString(retrieveText(value))), links: parseArrayOf(get("link"), (value) => parseLink(value, options)), published: retrievePublished(value, options), rights: parseSingularOf(get("rights"), (value) => parseString(retrieveText(value))), source: parseSingularOf(get("source"), parseSource), summary: parseSingularOf(get("summary"), (value) => parseString(retrieveText(value))), title: parseSingularOf(get("title"), (value) => parseString(retrieveText(value))), updated: retrieveUpdated(value, options), app: namespaces?.has("app") ? retrieveEntry(value) : void 0, arxiv: namespaces?.has("arxiv") ? retrieveEntry$1(value) : void 0, cc: namespaces?.has("cc") ? retrieveItemOrFeed(value) : void 0, dc: namespaces?.has("dc") ? retrieveItemOrFeed$2(value) : void 0, slash: namespaces?.has("slash") ? retrieveItem$4(value) : void 0, itunes: namespaces?.has("itunes") ? retrieveItem$1(value) : void 0, googleplay: namespaces?.has("googleplay") ? retrieveItem(value) : void 0, psc: namespaces?.has("psc") ? retrieveItem$3(value) : void 0, media: namespaces?.has("media") ? retrieveItemOrFeed$6(value) : void 0, georss: namespaces?.has("georss") ? retrieveItemOrFeed$5(value) : void 0, geo: namespaces?.has("geo") ? retrieveItemOrFeed$4(value) : void 0, thr: namespaces?.has("thr") ? retrieveItem$5(value) : void 0, dcterms: namespaces?.has("dcterms") ? retrieveItemOrFeed$3(value) : void 0, creativeCommons: namespaces?.has("creativecommons") ? retrieveItemOrFeed$1(value) : void 0, wfw: namespaces?.has("wfw") ? retrieveItem$7(value) : void 0, yt: namespaces?.has("yt") ? retrieveItem$8(value) : void 0, pingback: namespaces?.has("pingback") ? retrieveItem$2(value) : void 0, trackback: namespaces?.has("trackback") ? retrieveItem$6(value) : void 0 }); }; const parseFeed = (value, options) => { if (!isObject(value)) return; const namespaces = options?.asNamespace ? void 0 : detectNamespaces(value); const get = createNamespaceGetter(value, options?.prefix); return trimObject({ authors: parseArrayOf(get("author"), (value) => parsePerson(value, options)), categories: parseArrayOf(get("category"), (value) => parseCategory(value, options)), contributors: parseArrayOf(get("contributor"), (value) => parsePerson(value, options)), generator: parseSingularOf(get("generator"), (value) => parseGenerator(value, options)), icon: parseSingularOf(get("icon"), (value) => parseString(retrieveText(value))), id: parseSingularOf(get("id"), (value) => parseString(retrieveText(value))), links: parseArrayOf(get("link"), (value) => parseLink(value, options)), logo: parseSingularOf(get("logo"), (value) => parseString(retrieveText(value))), rights: parseSingularOf(get("rights"), (value) => parseString(retrieveText(value))), subtitle: retrieveSubtitle(value, options), title: parseSingularOf(get("title"), (value) => parseString(retrieveText(value))), updated: retrieveUpdated(value, options), entries: parseArrayOf(get("entry"), (value) => parseEntry(value, options), options?.maxItems), cc: namespaces?.has("cc") ? retrieveItemOrFeed(value) : void 0, dc: namespaces?.has("dc") ? retrieveItemOrFeed$2(value) : void 0, sy: namespaces?.has("sy") ? retrieveFeed$6(value) : void 0, itunes: namespaces?.has("itunes") ? retrieveFeed$3(value) : void 0, googleplay: namespaces?.has("googleplay") ? retrieveFeed$2(value) : void 0, media: namespaces?.has("media") ? retrieveItemOrFeed$6(value) : void 0, georss: namespaces?.has("georss") ? retrieveItemOrFeed$5(value) : void 0, geo: namespaces?.has("geo") ? retrieveItemOrFeed$4(value) : void 0, dcterms: namespaces?.has("dcterms") ? retrieveItemOrFeed$3(value) : void 0, creativeCommons: namespaces?.has("creativecommons") ? retrieveItemOrFeed$1(value) : void 0, opensearch: namespaces?.has("opensearch") ? retrieveFeed$4(value) : void 0, yt: namespaces?.has("yt") ? retrieveFeed$7(value) : void 0, admin: namespaces?.has("admin") ? retrieveFeed$1(value) : void 0, pingback: namespaces?.has("pingback") ? retrieveFeed$5(value) : void 0 }); }; const retrieveFeed = (value, options) => { const notNamespaced = parseSingularOf(value?.feed, (value) => parseFeed(value, options)); const namespaced = parseSingularOf(value?.["atom:feed"], (value) => parseFeed(value, { ...options, prefix: "atom:" })); return notNamespaced || namespaced; }; //#endregion export { createNamespaceGetter, parseCategory, parseEntry, parseFeed, parseGenerator, parseLink, parsePerson, parseSource, retrieveFeed, retrieveGeneratorUri, retrievePersonUri, retrievePublished, retrieveSubtitle, retrieveUpdated };