webamp/js/regionParser.js
2017-11-16 21:31:39 -08:00

42 lines
1.2 KiB
JavaScript

import { parseIni } from "./utils";
export function pointPairs(arr) {
const pairedValues = [];
for (let i = 0; i < arr.length; i += 2) {
pairedValues.push(`${arr[i]},${arr[i + 1]}`);
}
return pairedValues;
}
export default function regionParser(regionStr) {
const iniData = parseIni(regionStr);
const data = {};
Object.keys(iniData).forEach(section => {
const { numpoints, pointlist } = iniData[section];
if (!numpoints || !pointlist) {
return;
}
const pointCounts = numpoints.split(/\s*,\s*/).filter(val => val !== "");
const points = pointPairs(
// points can be separated by spaces, or by commas
pointlist.split(/\s*[, ]\s*/).filter(val => val !== "")
);
let pointIndex = 0;
const polygons = pointCounts.map(numStr => {
const num = Number(numStr);
const polygon = points.slice(pointIndex, pointIndex + num).join(" ");
if (!polygon.length) {
// It's possible that the skin author specified more polygons than provided points.
return null;
}
pointIndex += num;
return polygon;
});
const validPolygons = polygons.filter(polygon => polygon != null);
if (validPolygons.length) {
data[section] = validPolygons;
}
});
return data;
}