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.

177 lines (176 loc) 8.61 kB
import { namespaceUris } from "../../../common/config.js"; import { generateCdataString, generateNamespaceAttrs, generateNumber, generatePlainString, generateRfc3339Date, generateTextOrCdataString, isObject, trimArray, trimObject } from "../../../common/utils.js"; import { generateFeed as generateFeed$1 } from "../../../namespaces/admin/generate/utils.js"; import { generateEntry as generateEntry$1 } from "../../../namespaces/app/generate/utils.js"; import { generateAuthor, generateEntry as generateEntry$2 } from "../../../namespaces/arxiv/generate/utils.js"; import { generateItemOrFeed } from "../../../namespaces/cc/generate/utils.js"; import { generateItemOrFeed as generateItemOrFeed$1 } from "../../../namespaces/creativecommons/generate/utils.js"; import { generateItemOrFeed as generateItemOrFeed$2 } from "../../../namespaces/dc/generate/utils.js"; import { generateItemOrFeed as generateItemOrFeed$3 } from "../../../namespaces/dcterms/generate/utils.js"; import { generateItemOrFeed as generateItemOrFeed$4 } from "../../../namespaces/geo/generate/utils.js"; import { generateItemOrFeed as generateItemOrFeed$5 } from "../../../namespaces/georss/generate/utils.js"; import { generateFeed as generateFeed$2, generateItem } from "../../../namespaces/googleplay/generate/utils.js"; import { generateFeed as generateFeed$3, generateItem as generateItem$1 } from "../../../namespaces/itunes/generate/utils.js"; import { generateItemOrFeed as generateItemOrFeed$6 } from "../../../namespaces/media/generate/utils.js"; import { generateFeed as generateFeed$4 } from "../../../namespaces/opensearch/generate/utils.js"; import { generateFeed as generateFeed$5, generateItem as generateItem$2 } from "../../../namespaces/pingback/generate/utils.js"; import { generateItem as generateItem$3 } from "../../../namespaces/psc/generate/utils.js"; import { generateItem as generateItem$4 } from "../../../namespaces/slash/generate/utils.js"; import { generateFeed as generateFeed$6 } from "../../../namespaces/sy/generate/utils.js"; import { generateItem as generateItem$5, generateLink as generateLink$1 } from "../../../namespaces/thr/generate/utils.js"; import { generateItem as generateItem$6 } from "../../../namespaces/trackback/generate/utils.js"; import { generateItem as generateItem$7 } from "../../../namespaces/wfw/generate/utils.js"; import { generateFeed as generateFeed$7, generateItem as generateItem$8 } from "../../../namespaces/yt/generate/utils.js"; //#region src/feeds/atom/generate/utils.ts const createNamespaceSetter = (prefix) => { return (key) => prefix ? `${prefix}${key}` : key; }; const generateText = (text) => { return generateCdataString(text); }; const generateLink = (link) => { if (!isObject(link)) return; return trimObject({ "@href": generatePlainString(link.href), "@rel": generatePlainString(link.rel), "@type": generatePlainString(link.type), "@hreflang": generatePlainString(link.hreflang), "@title": generatePlainString(link.title), "@length": generateNumber(link.length), ...generateLink$1(link.thr) }); }; const generatePerson = (person, options) => { if (!isObject(person)) return; const key = createNamespaceSetter(options?.prefix); return trimObject({ [key("name")]: generateCdataString(person.name), [key("uri")]: generateCdataString(person.uri), [key("email")]: generateCdataString(person.email), ...generateAuthor(person.arxiv) }); }; const generateCategory = (category) => { if (!isObject(category)) return; return trimObject({ "@term": generatePlainString(category.term), "@scheme": generatePlainString(category.scheme), "@label": generatePlainString(category.label) }); }; const generateGenerator = (generator) => { if (!isObject(generator)) return; return trimObject({ ...generateTextOrCdataString(generator.text), "@uri": generatePlainString(generator.uri), "@version": generatePlainString(generator.version) }); }; const generateSource = (source, options) => { if (!isObject(source)) return; const key = createNamespaceSetter(options?.prefix); return trimObject({ [key("author")]: trimArray(source.authors, (author) => generatePerson(author, options)), [key("category")]: trimArray(source.categories, (category) => generateCategory(category, options)), [key("contributor")]: trimArray(source.contributors, (contributor) => generatePerson(contributor, options)), [key("generator")]: generateGenerator(source.generator), [key("icon")]: generateCdataString(source.icon), [key("id")]: generateCdataString(source.id), [key("link")]: trimArray(source.links, (link) => generateLink(link, options)), [key("logo")]: generateCdataString(source.logo), [key("rights")]: generateText(source.rights), [key("subtitle")]: generateText(source.subtitle), [key("title")]: generateText(source.title), [key("updated")]: generateRfc3339Date(source.updated) }); }; const generateEntry = (entry, options) => { if (!isObject(entry)) return; const key = createNamespaceSetter(options?.prefix); const trimmedValue = trimObject({ [key("author")]: trimArray(entry.authors, generatePerson), [key("category")]: trimArray(entry.categories, generateCategory), [key("content")]: generateText(entry.content), [key("contributor")]: trimArray(entry.contributors, (contributor) => generatePerson(contributor, options)), [key("id")]: generateCdataString(entry.id), [key("link")]: trimArray(entry.links, (link) => generateLink(link, options)), [key("published")]: generateRfc3339Date(entry.published), [key("rights")]: generateText(entry.rights), [key("source")]: generateSource(entry.source), [key("summary")]: generateText(entry.summary), [key("title")]: generateText(entry.title), [key("updated")]: generateRfc3339Date(entry.updated) }); if (!trimmedValue) return; if (options?.asNamespace) return trimmedValue; return { ...trimmedValue, ...generateEntry$1(entry.app), ...generateEntry$2(entry.arxiv), ...generateItemOrFeed(entry.cc), ...generateItemOrFeed$2(entry.dc), ...generateItem$4(entry.slash), ...generateItem$1(entry.itunes), ...generateItem(entry.googleplay), ...generateItem$3(entry.psc), ...generateItemOrFeed$6(entry.media), ...generateItemOrFeed$5(entry.georss), ...generateItemOrFeed$4(entry.geo), ...generateItem$5(entry.thr), ...generateItemOrFeed$3(entry.dcterms), ...generateItemOrFeed$1(entry.creativeCommons), ...generateItem$7(entry.wfw), ...generateItem$8(entry.yt), ...generateItem$2(entry.pingback), ...generateItem$6(entry.trackback) }; }; const generateFeed = (feed, options) => { if (!isObject(feed)) return; const key = createNamespaceSetter(options?.prefix); const valueFeed = trimObject({ [key("author")]: trimArray(feed.authors, (author) => generatePerson(author, options)), [key("category")]: trimArray(feed.categories, (category) => generateCategory(category, options)), [key("contributor")]: trimArray(feed.contributors, (contributor) => generatePerson(contributor, options)), [key("generator")]: generateGenerator(feed.generator), [key("icon")]: generateCdataString(feed.icon), [key("id")]: generateCdataString(feed.id), [key("link")]: trimArray(feed.links, (link) => generateLink(link, options)), [key("logo")]: generateCdataString(feed.logo), [key("rights")]: generateText(feed.rights), [key("subtitle")]: generateText(feed.subtitle), [key("title")]: generateText(feed.title), [key("updated")]: generateRfc3339Date(feed.updated) }); const valueEntries = trimObject({ [key("entry")]: trimArray(feed.entries, (entry) => generateEntry(entry, options)) }); if (!valueFeed && !valueEntries) return; if (options?.asNamespace) return { feed: { ...valueFeed, ...valueEntries } }; const valueFull = { ...valueFeed, ...generateItemOrFeed(feed.cc), ...generateItemOrFeed$2(feed.dc), ...generateFeed$6(feed.sy), ...generateFeed$3(feed.itunes), ...generateFeed$2(feed.googleplay), ...generateItemOrFeed$6(feed.media), ...generateItemOrFeed$5(feed.georss), ...generateItemOrFeed$4(feed.geo), ...generateItemOrFeed$3(feed.dcterms), ...generateItemOrFeed$1(feed.creativeCommons), ...generateFeed$4(feed.opensearch), ...generateFeed$7(feed.yt), ...generateFeed$1(feed.admin), ...generateFeed$5(feed.pingback), ...valueEntries }; return { feed: { "@xmlns": "http://www.w3.org/2005/Atom", ...generateNamespaceAttrs({ value: valueFull }, namespaceUris), ...valueFull } }; }; //#endregion export { createNamespaceSetter, generateCategory, generateEntry, generateFeed, generateGenerator, generateLink, generatePerson, generateSource, generateText };