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.
89 lines (88 loc) • 4.03 kB
JavaScript
import { isNonEmptyStringOrNumber, isObject, parseArrayOf, parseBoolean, parseDate, parseJsonString, parseNumber, parseSingularOf, trimObject } from "../../../common/utils.js";
//#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 (isObject(value)) {
const get = createCaseInsensitiveGetter(value);
return trimObject({
name: parseSingularOf(get("name"), parseJsonString),
url: parseSingularOf(get("url"), parseJsonString),
avatar: parseSingularOf(get("avatar"), parseJsonString)
});
}
if (isNonEmptyStringOrNumber(value)) return trimObject({ name: parseJsonString(value) });
};
const retrieveAuthors = (value) => {
if (!isObject(value)) return;
const get = createCaseInsensitiveGetter(value);
const parsedAuthors = parseArrayOf(get("authors"), parseAuthor);
const parsedAuthor = parseArrayOf(get("author"), parseAuthor);
return parsedAuthors?.length ? parsedAuthors : parsedAuthor;
};
const parseAttachment = (value) => {
if (!isObject(value)) return;
const get = createCaseInsensitiveGetter(value);
return trimObject({
url: parseSingularOf(get("url"), parseJsonString),
mime_type: parseSingularOf(get("mime_type"), parseJsonString),
title: parseSingularOf(get("title"), parseJsonString),
size_in_bytes: parseSingularOf(get("size_in_bytes"), parseNumber),
duration_in_seconds: parseSingularOf(get("duration_in_seconds"), parseNumber)
});
};
const parseItem = (value) => {
if (!isObject(value)) return;
const get = createCaseInsensitiveGetter(value);
return trimObject({
id: parseSingularOf(get("id"), parseJsonString),
url: parseSingularOf(get("url"), parseJsonString),
external_url: parseSingularOf(get("external_url"), parseJsonString),
title: parseSingularOf(get("title"), parseJsonString),
content_html: parseSingularOf(get("content_html"), parseJsonString),
content_text: parseSingularOf(get("content_text"), parseJsonString),
summary: parseSingularOf(get("summary"), parseJsonString),
image: parseSingularOf(get("image"), parseJsonString),
banner_image: parseSingularOf(get("banner_image"), parseJsonString),
date_published: parseSingularOf(get("date_published"), parseDate),
date_modified: parseSingularOf(get("date_modified"), parseDate),
tags: parseArrayOf(get("tags"), parseJsonString),
authors: retrieveAuthors(value),
language: parseSingularOf(get("language"), parseJsonString),
attachments: parseArrayOf(get("attachments"), parseAttachment)
});
};
const parseHub = (value) => {
if (!isObject(value)) return;
const get = createCaseInsensitiveGetter(value);
return trimObject({
type: parseSingularOf(get("type"), parseJsonString),
url: parseSingularOf(get("url"), parseJsonString)
});
};
const parseFeed = (value, options) => {
if (!isObject(value)) return;
const get = createCaseInsensitiveGetter(value);
return trimObject({
title: parseSingularOf(get("title"), parseJsonString),
home_page_url: parseSingularOf(get("home_page_url"), parseJsonString),
feed_url: parseSingularOf(get("feed_url"), parseJsonString),
description: parseSingularOf(get("description"), parseJsonString),
user_comment: parseSingularOf(get("user_comment"), parseJsonString),
next_url: parseSingularOf(get("next_url"), parseJsonString),
icon: parseSingularOf(get("icon"), parseJsonString),
favicon: parseSingularOf(get("favicon"), parseJsonString),
language: parseSingularOf(get("language"), parseJsonString),
expired: parseSingularOf(get("expired"), parseBoolean),
hubs: parseArrayOf(get("hubs"), parseHub),
authors: retrieveAuthors(value),
items: parseArrayOf(get("items"), parseItem, options?.maxItems)
});
};
//#endregion
export { createCaseInsensitiveGetter, parseAttachment, parseAuthor, parseFeed, parseHub, parseItem, retrieveAuthors };