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.
59 lines (58 loc) • 3.02 kB
JavaScript
import { isObject, isPresent, parseArrayOf, parseBoolean, parseCsvOf, parseDate, parseNumber, parseSingularOf, parseString, retrieveText, trimObject } from "../../common/utils.js";
//#region src/opml/parse/utils.ts
const parseOutline = (value, options) => {
if (!isObject(value)) return;
const outline = {
text: parseString(value["@text"]),
type: parseString(value["@type"]),
isComment: parseBoolean(value["@iscomment"]),
isBreakpoint: parseBoolean(value["@isbreakpoint"]),
created: parseDate(value["@created"]),
category: parseString(value["@category"]),
description: parseString(value["@description"]),
xmlUrl: parseString(value["@xmlurl"]),
htmlUrl: parseString(value["@htmlurl"]),
language: parseString(value["@language"]),
title: parseString(value["@title"]),
version: parseString(value["@version"]),
url: parseString(value["@url"]),
outlines: parseArrayOf(value.outline, (value) => parseOutline(value, options))
};
if (options?.extraOutlineAttributes) for (const attribute of options.extraOutlineAttributes) {
const attributeKey = `@${attribute.toLowerCase()}`;
if (!isPresent(value[attributeKey])) continue;
outline[attribute] = parseString(value[attributeKey]);
}
return trimObject(outline);
};
const parseHead = (value) => {
if (!isObject(value)) return;
return trimObject({
title: parseSingularOf(value.title, (value) => parseString(retrieveText(value))),
dateCreated: parseSingularOf(value.datecreated, (value) => parseDate(retrieveText(value))),
dateModified: parseSingularOf(value.datemodified, (value) => parseDate(retrieveText(value))),
ownerName: parseSingularOf(value.ownername, (value) => parseString(retrieveText(value))),
ownerEmail: parseSingularOf(value.owneremail, (value) => parseString(retrieveText(value))),
ownerId: parseSingularOf(value.ownerid, (value) => parseString(retrieveText(value))),
docs: parseSingularOf(value.docs, (value) => parseString(retrieveText(value))),
expansionState: parseSingularOf(value.expansionstate, (value) => parseCsvOf(retrieveText(value), parseNumber)),
vertScrollState: parseSingularOf(value.vertscrollstate, (value) => parseNumber(retrieveText(value))),
windowTop: parseSingularOf(value.windowtop, (value) => parseNumber(retrieveText(value))),
windowLeft: parseSingularOf(value.windowleft, (value) => parseNumber(retrieveText(value))),
windowBottom: parseSingularOf(value.windowbottom, (value) => parseNumber(retrieveText(value))),
windowRight: parseSingularOf(value.windowright, (value) => parseNumber(retrieveText(value)))
});
};
const parseBody = (value, options) => {
if (!isObject(value)) return;
return trimObject({ outlines: parseArrayOf(value.outline, (value) => parseOutline(value, options), options?.maxItems) });
};
const parseDocument = (value, options) => {
if (!isObject(value?.opml)) return;
return trimObject({
head: parseHead(value.opml.head),
body: parseBody(value.opml.body, options)
});
};
//#endregion
export { parseBody, parseDocument, parseHead, parseOutline };