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.
61 lines (60 loc) • 2.63 kB
JavaScript
import { generateBoolean, generateCdataString, generateCsvOf, generateNumber, generatePlainString, generateRfc822Date, isObject, isPresent, trimArray, trimObject } from "../../common/utils.js";
//#region src/opml/generate/utils.ts
const generateOutline = (outline, options) => {
if (!isObject(outline)) return;
const value = {
"@text": generatePlainString(outline.text),
"@type": generatePlainString(outline.type),
"@isComment": generateBoolean(outline.isComment),
"@isBreakpoint": generateBoolean(outline.isBreakpoint),
"@created": generateRfc822Date(outline.created),
"@category": generatePlainString(outline.category),
"@description": generatePlainString(outline.description),
"@xmlUrl": generatePlainString(outline.xmlUrl),
"@htmlUrl": generatePlainString(outline.htmlUrl),
"@language": generatePlainString(outline.language),
"@title": generatePlainString(outline.title),
"@version": generatePlainString(outline.version),
"@url": generatePlainString(outline.url),
outline: trimArray(outline.outlines, (item) => generateOutline(item, options))
};
if (options?.extraOutlineAttributes) for (const attribute of options.extraOutlineAttributes) {
const attributeKey = `@${attribute}`;
if (!isPresent(outline[attribute])) continue;
value[attributeKey] = generatePlainString(outline[attribute]);
}
return trimObject(value);
};
const generateHead = (head) => {
if (!isObject(head)) return;
return trimObject({
title: generateCdataString(head.title),
dateCreated: generateRfc822Date(head.dateCreated),
dateModified: generateRfc822Date(head.dateModified),
ownerName: generateCdataString(head.ownerName),
ownerEmail: generateCdataString(head.ownerEmail),
ownerId: generateCdataString(head.ownerId),
docs: generateCdataString(head.docs),
expansionState: generateCsvOf(head.expansionState, generateNumber),
vertScrollState: generateNumber(head.vertScrollState),
windowTop: generateNumber(head.windowTop),
windowLeft: generateNumber(head.windowLeft),
windowBottom: generateNumber(head.windowBottom),
windowRight: generateNumber(head.windowRight)
});
};
const generateBody = (body, options) => {
if (!isObject(body)) return;
return trimObject({ outline: trimArray(body.outlines, (item) => generateOutline(item, options)) });
};
const generateDocument = (opml, options) => {
if (!isObject(opml)) return;
const value = trimObject({
"@version": "2.0",
head: generateHead(opml.head),
body: generateBody(opml.body, options)
});
if (value?.body !== void 0) return { opml: value };
};
//#endregion
export { generateBody, generateDocument, generateHead, generateOutline };