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