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.
200 lines (199 loc) • 9.36 kB
JavaScript
import { namespaceUris } from "../../../common/config.js";
import { generateBoolean, generateCdataString, generateNamespaceAttrs, generateNumber, generatePlainString, generateRfc822Date, generateTextOrCdataString, isObject, trimArray, trimObject } from "../../../common/utils.js";
import { generateFeed as generateFeed$1 } from "../../../namespaces/admin/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 as generateItem$1 } from "../../../namespaces/googleplay/generate/utils.js";
import { generateFeed as generateFeed$3, generateItem as generateItem$2 } 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$3 } from "../../../namespaces/pingback/generate/utils.js";
import { generateItem as generateItem$4 } from "../../../namespaces/psc/generate/utils.js";
import { generateItem as generateItem$5 } from "../../../namespaces/slash/generate/utils.js";
import { generateFeed as generateFeed$6 } from "../../../namespaces/sy/generate/utils.js";
import { generateItem as generateItem$6 } from "../../../namespaces/thr/generate/utils.js";
import { generateItem as generateItem$7 } from "../../../namespaces/trackback/generate/utils.js";
import { generateItem as generateItem$8 } from "../../../namespaces/wfw/generate/utils.js";
import { generateFeed as generateFeed$7, generateItem as generateItem$9 } from "../../../namespaces/acast/generate/utils.js";
import { generateEntry, generateFeed as generateFeed$8 } from "../../../namespaces/atom/generate/utils.js";
import { generateFeed as generateFeed$9 } from "../../../namespaces/blogchannel/generate/utils.js";
import { generateItem as generateItem$10 } from "../../../namespaces/content/generate/utils.js";
import { generateFeed as generateFeed$10 } from "../../../namespaces/feedpress/generate/utils.js";
import { generateFeed as generateFeed$11, generateItem as generateItem$11 } from "../../../namespaces/podcast/generate/utils.js";
import { generateFeed as generateFeed$12, generateItem as generateItem$12 } from "../../../namespaces/prism/generate/utils.js";
import { generateFeed as generateFeed$13, generateItem as generateItem$13 } from "../../../namespaces/rawvoice/generate/utils.js";
import { generateFeed as generateFeed$14, generateItem as generateItem$14 } from "../../../namespaces/source/generate/utils.js";
import { generateFeed as generateFeed$15, generateItem as generateItem$15 } from "../../../namespaces/spotify/generate/utils.js";
//#region src/feeds/rss/generate/utils.ts
const generatePerson = (person) => {
if (isObject(person)) {
const name = generatePlainString(person.name);
const email = generatePlainString(person.email);
if (email && name) return generateCdataString(`${email} (${name})`);
if (name) return generateCdataString(name);
if (email) return generateCdataString(email);
return;
}
return generateCdataString(person);
};
const generateCategory = (category) => {
if (!isObject(category)) return;
return trimObject({
"@domain": generatePlainString(category.domain),
...generateTextOrCdataString(category.name)
});
};
const generateCloud = (cloud) => {
if (!isObject(cloud)) return;
return trimObject({
"@domain": generatePlainString(cloud.domain),
"@port": generateNumber(cloud.port),
"@path": generatePlainString(cloud.path),
"@registerProcedure": generatePlainString(cloud.registerProcedure),
"@protocol": generatePlainString(cloud.protocol)
});
};
const generateImage = (image) => {
if (!isObject(image)) return;
return trimObject({
url: generateCdataString(image.url),
title: generateCdataString(image.title),
link: generateCdataString(image.link),
description: generateCdataString(image.description),
height: generateNumber(image.height),
width: generateNumber(image.width)
});
};
const generateTextInput = (textInput) => {
if (!isObject(textInput)) return;
return trimObject({
title: generateCdataString(textInput.title),
description: generateCdataString(textInput.description),
name: generateCdataString(textInput.name),
link: generateCdataString(textInput.link)
});
};
const generateEnclosure = (enclosure) => {
if (!isObject(enclosure)) return;
return trimObject({
"@url": generatePlainString(enclosure.url),
"@length": generateNumber(enclosure.length),
"@type": generatePlainString(enclosure.type)
});
};
const generateSkipHours = (skipHours) => {
return trimObject({ hour: trimArray(skipHours, generateNumber) });
};
const generateSkipDays = (skipDays) => {
return trimObject({ day: trimArray(skipDays, generateCdataString) });
};
const generateGuid = (guid) => {
return trimObject({
...generateTextOrCdataString(guid?.value),
"@isPermaLink": generateBoolean(guid?.isPermaLink)
});
};
const generateSource = (source) => {
if (!isObject(source)) return;
return trimObject({
...generateTextOrCdataString(source.title),
"@url": generatePlainString(source.url)
});
};
const generateItem = (item) => {
if (!isObject(item)) return;
return trimObject({
title: generateCdataString(item.title),
link: generateCdataString(item.link),
description: generateCdataString(item.description),
author: trimArray(item.authors, generatePerson),
category: trimArray(item.categories, generateCategory),
comments: generateCdataString(item.comments),
enclosure: trimArray(item.enclosures, generateEnclosure),
guid: generateGuid(item.guid),
pubDate: generateRfc822Date(item.pubDate),
source: generateSource(item.source),
...generateEntry(item.atom),
...generateItemOrFeed(item.cc),
...generateItemOrFeed$2(item.dc),
...generateItem$10(item.content),
...generateItemOrFeed$1(item.creativeCommons),
...generateItem$5(item.slash),
...generateItem$2(item.itunes),
...generateItem$11(item.podcast),
...generateItem$4(item.psc),
...generateItem$1(item.googleplay),
...generateItemOrFeed$6(item.media),
...generateItemOrFeed$5(item.georss),
...generateItemOrFeed$4(item.geo),
...generateItem$6(item.thr),
...generateItemOrFeed$3(item.dcterms),
...generateItem$12(item.prism),
...generateItem$8(item.wfw),
...generateItem$14(item.sourceNs),
...generateItem$13(item.rawvoice),
...generateItem$15(item.spotify),
...generateItem$3(item.pingback),
...generateItem$7(item.trackback),
...generateItem$9(item.acast)
});
};
const generateFeed = (feed) => {
if (!isObject(feed)) return;
const trimmedValue = trimObject({
title: generateCdataString(feed.title),
link: generateCdataString(feed.link),
description: generateCdataString(feed.description),
language: generateCdataString(feed.language),
copyright: generateCdataString(feed.copyright),
managingEditor: generatePerson(feed.managingEditor),
webMaster: generatePerson(feed.webMaster),
pubDate: generateRfc822Date(feed.pubDate),
lastBuildDate: generateRfc822Date(feed.lastBuildDate),
category: trimArray(feed.categories, generateCategory),
generator: generateCdataString(feed.generator),
docs: generateCdataString(feed.docs),
cloud: generateCloud(feed.cloud),
ttl: generateNumber(feed.ttl),
image: generateImage(feed.image),
rating: generateCdataString(feed.rating),
textInput: generateTextInput(feed.textInput),
skipHours: generateSkipHours(feed.skipHours),
skipDays: generateSkipDays(feed.skipDays),
...generateFeed$8(feed.atom),
...generateItemOrFeed(feed.cc),
...generateItemOrFeed$2(feed.dc),
...generateFeed$6(feed.sy),
...generateFeed$3(feed.itunes),
...generateFeed$11(feed.podcast),
...generateFeed$2(feed.googleplay),
...generateItemOrFeed$6(feed.media),
...generateItemOrFeed$5(feed.georss),
...generateItemOrFeed$4(feed.geo),
...generateItemOrFeed$3(feed.dcterms),
...generateFeed$12(feed.prism),
...generateItemOrFeed$1(feed.creativeCommons),
...generateFeed$10(feed.feedpress),
...generateFeed$4(feed.opensearch),
...generateFeed$1(feed.admin),
...generateFeed$14(feed.sourceNs),
...generateFeed$9(feed.blogChannel),
...generateFeed$13(feed.rawvoice),
...generateFeed$15(feed.spotify),
...generateFeed$5(feed.pingback),
...generateFeed$7(feed.acast),
item: trimArray(feed.items, generateItem)
});
if (!trimmedValue) return;
return { rss: {
"@version": "2.0",
...generateNamespaceAttrs(trimmedValue, namespaceUris),
channel: trimmedValue
} };
};
//#endregion
export { generateCategory, generateCloud, generateEnclosure, generateFeed, generateGuid, generateImage, generateItem, generatePerson, generateSkipDays, generateSkipHours, generateSource, generateTextInput };