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