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.

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