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