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.
65 lines (64 loc) • 2.72 kB
JavaScript
import { isNonEmptyString, isObject, isPresent, parseArrayOf, parseNumber, parseSingularOf, parseString, retrieveText, trimObject } from "../../../common/utils.js";
//#region src/namespaces/georss/parse/utils.ts
const whitespaceRegex = /\s+/;
const parseLatLngPairs = (value, pairsCount) => {
if (!isNonEmptyString(value)) return;
const rawParts = value.split(whitespaceRegex);
const numericParts = parseArrayOf(rawParts, parseNumber);
if (!numericParts || numericParts.length % 2 !== 0 || rawParts.length !== numericParts.length) return;
const actualPairCount = numericParts.length / 2;
if (pairsCount?.min && actualPairCount < pairsCount?.min || pairsCount?.max && actualPairCount > pairsCount?.max) return;
const points = [];
for (let i = 0; i < numericParts.length; i += 2) {
const lat = numericParts[i];
const lng = numericParts[i + 1];
if (isPresent(lat) && isPresent(lng)) points.push({
lat,
lng
});
}
return points.length > 0 ? points : void 0;
};
const parsePoint = (value) => {
return parseLatLngPairs(retrieveText(value), {
min: 1,
max: 1
})?.[0];
};
const parseLine = (value) => {
const points = parseLatLngPairs(retrieveText(value), { min: 2 });
if (isPresent(points)) return { points };
};
const parsePolygon = (value) => {
const points = parseLatLngPairs(retrieveText(value), { min: 4 });
if (isPresent(points)) return { points };
};
const parseBox = (value) => {
const points = parseLatLngPairs(retrieveText(value), {
min: 2,
max: 2
});
const lowerCorner = points?.[0];
const upperCorner = points?.[1];
if (isPresent(lowerCorner) && isPresent(upperCorner)) return {
lowerCorner,
upperCorner
};
};
const retrieveItemOrFeed = (value) => {
if (!isObject(value)) return;
return trimObject({
point: parseSingularOf(value["georss:point"], parsePoint),
line: parseSingularOf(value["georss:line"], parseLine),
polygon: parseSingularOf(value["georss:polygon"], parsePolygon),
box: parseSingularOf(value["georss:box"], parseBox),
featureTypeTag: parseSingularOf(value["georss:featuretypetag"], (value) => parseString(retrieveText(value))),
relationshipTag: parseSingularOf(value["georss:relationshiptag"], (value) => parseString(retrieveText(value))),
featureName: parseSingularOf(value["georss:featurename"], (value) => parseString(retrieveText(value))),
elev: parseSingularOf(value["georss:elev"], (value) => parseNumber(retrieveText(value))),
floor: parseSingularOf(value["georss:floor"], (value) => parseNumber(retrieveText(value))),
radius: parseSingularOf(value["georss:radius"], (value) => parseNumber(retrieveText(value)))
});
};
//#endregion
export { parseBox, parseLatLngPairs, parseLine, parsePoint, parsePolygon, retrieveItemOrFeed };