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
JavaScript
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 };