UNPKG

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