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.

65 lines (64 loc) 2.72 kB
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 };