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.
95 lines (94 loc) • 5.26 kB
JavaScript
const require_utils = require("../../../common/utils.cjs");
//#region src/feeds/json/parse/utils.ts
const createCaseInsensitiveGetter = (value) => {
return (requestedKey) => {
if (requestedKey in value) return value[requestedKey];
const lowerKey = requestedKey.toLowerCase();
for (const key in value) if (key.toLowerCase() === lowerKey) return value[key];
};
};
const parseAuthor = (value) => {
if (require_utils.isObject(value)) {
const get = createCaseInsensitiveGetter(value);
return require_utils.trimObject({
name: require_utils.parseSingularOf(get("name"), require_utils.parseJsonString),
url: require_utils.parseSingularOf(get("url"), require_utils.parseJsonString),
avatar: require_utils.parseSingularOf(get("avatar"), require_utils.parseJsonString)
});
}
if (require_utils.isNonEmptyStringOrNumber(value)) return require_utils.trimObject({ name: require_utils.parseJsonString(value) });
};
const retrieveAuthors = (value) => {
if (!require_utils.isObject(value)) return;
const get = createCaseInsensitiveGetter(value);
const parsedAuthors = require_utils.parseArrayOf(get("authors"), parseAuthor);
const parsedAuthor = require_utils.parseArrayOf(get("author"), parseAuthor);
return parsedAuthors?.length ? parsedAuthors : parsedAuthor;
};
const parseAttachment = (value) => {
if (!require_utils.isObject(value)) return;
const get = createCaseInsensitiveGetter(value);
return require_utils.trimObject({
url: require_utils.parseSingularOf(get("url"), require_utils.parseJsonString),
mime_type: require_utils.parseSingularOf(get("mime_type"), require_utils.parseJsonString),
title: require_utils.parseSingularOf(get("title"), require_utils.parseJsonString),
size_in_bytes: require_utils.parseSingularOf(get("size_in_bytes"), require_utils.parseNumber),
duration_in_seconds: require_utils.parseSingularOf(get("duration_in_seconds"), require_utils.parseNumber)
});
};
const parseItem = (value) => {
if (!require_utils.isObject(value)) return;
const get = createCaseInsensitiveGetter(value);
return require_utils.trimObject({
id: require_utils.parseSingularOf(get("id"), require_utils.parseJsonString),
url: require_utils.parseSingularOf(get("url"), require_utils.parseJsonString),
external_url: require_utils.parseSingularOf(get("external_url"), require_utils.parseJsonString),
title: require_utils.parseSingularOf(get("title"), require_utils.parseJsonString),
content_html: require_utils.parseSingularOf(get("content_html"), require_utils.parseJsonString),
content_text: require_utils.parseSingularOf(get("content_text"), require_utils.parseJsonString),
summary: require_utils.parseSingularOf(get("summary"), require_utils.parseJsonString),
image: require_utils.parseSingularOf(get("image"), require_utils.parseJsonString),
banner_image: require_utils.parseSingularOf(get("banner_image"), require_utils.parseJsonString),
date_published: require_utils.parseSingularOf(get("date_published"), require_utils.parseDate),
date_modified: require_utils.parseSingularOf(get("date_modified"), require_utils.parseDate),
tags: require_utils.parseArrayOf(get("tags"), require_utils.parseJsonString),
authors: retrieveAuthors(value),
language: require_utils.parseSingularOf(get("language"), require_utils.parseJsonString),
attachments: require_utils.parseArrayOf(get("attachments"), parseAttachment)
});
};
const parseHub = (value) => {
if (!require_utils.isObject(value)) return;
const get = createCaseInsensitiveGetter(value);
return require_utils.trimObject({
type: require_utils.parseSingularOf(get("type"), require_utils.parseJsonString),
url: require_utils.parseSingularOf(get("url"), require_utils.parseJsonString)
});
};
const parseFeed = (value, options) => {
if (!require_utils.isObject(value)) return;
const get = createCaseInsensitiveGetter(value);
return require_utils.trimObject({
title: require_utils.parseSingularOf(get("title"), require_utils.parseJsonString),
home_page_url: require_utils.parseSingularOf(get("home_page_url"), require_utils.parseJsonString),
feed_url: require_utils.parseSingularOf(get("feed_url"), require_utils.parseJsonString),
description: require_utils.parseSingularOf(get("description"), require_utils.parseJsonString),
user_comment: require_utils.parseSingularOf(get("user_comment"), require_utils.parseJsonString),
next_url: require_utils.parseSingularOf(get("next_url"), require_utils.parseJsonString),
icon: require_utils.parseSingularOf(get("icon"), require_utils.parseJsonString),
favicon: require_utils.parseSingularOf(get("favicon"), require_utils.parseJsonString),
language: require_utils.parseSingularOf(get("language"), require_utils.parseJsonString),
expired: require_utils.parseSingularOf(get("expired"), require_utils.parseBoolean),
hubs: require_utils.parseArrayOf(get("hubs"), parseHub),
authors: retrieveAuthors(value),
items: require_utils.parseArrayOf(get("items"), parseItem, options?.maxItems)
});
};
//#endregion
exports.createCaseInsensitiveGetter = createCaseInsensitiveGetter;
exports.parseAttachment = parseAttachment;
exports.parseAuthor = parseAuthor;
exports.parseFeed = parseFeed;
exports.parseHub = parseHub;
exports.parseItem = parseItem;
exports.retrieveAuthors = retrieveAuthors;