UNPKG

gpml2pvjson

Version:
174 lines (173 loc) 14 kB
import { assign, curry, fromPairs, isArray, isPlainObject, isFinite, toPairs } from "lodash/fp"; import { isPvjsonEdge, isPvjsonSingleFreeNode, unionLSV } from "./gpml-utilities"; import * as GPML2013aGroupMappingsByStyle from "./2013a/GroupMappingsByStyle.json"; export function getGroupDimensions(padding, strokeWidth, containedEntities) { if (containedEntities.length === 0) { console.warn(`Warning: Empty group observed.`); return { x: 0, y: 0, width: 0, height: 0, zIndex: 0 }; } else if (!isFinite(padding)) { throw new Error("Invalid padding value: ${padding}"); } else if (!isFinite(strokeWidth)) { throw new Error("Invalid strokeWidth value: ${strokeWidth}"); } const dimensions = containedEntities .filter(entity => isPvjsonSingleFreeNode(entity) || isPvjsonEdge(entity)) .reduce(function ({ runningDimensions, topLeftCorner, bottomRightCorner }, entity) { const { zIndex } = entity; const zIndexIsFinite = isFinite(zIndex); const runningDimensionsZIndexIsFinite = isFinite(runningDimensions.zIndex); if (zIndexIsFinite && runningDimensionsZIndexIsFinite) { runningDimensions.zIndex = Math.min(zIndex, runningDimensions.zIndex); } else if (zIndexIsFinite) { runningDimensions.zIndex = zIndex; } if (isPvjsonEdge(entity)) { const points = entity.points; // If entity is an edge const firstPoint = points[0]; const firstPointX = firstPoint.x; const firstPointY = firstPoint.y; const lastPoint = points[points.length - 1]; const lastPointX = lastPoint.x; const lastPointY = lastPoint.y; topLeftCorner.x = Math.min(topLeftCorner.x, firstPointX, lastPointX); topLeftCorner.y = Math.min(topLeftCorner.y, firstPointY, lastPointY); bottomRightCorner.x = Math.max(bottomRightCorner.x, firstPointX, lastPointX); bottomRightCorner.y = Math.max(bottomRightCorner.y, firstPointY, lastPointY); } else { // If entity is a node topLeftCorner.x = Math.min(topLeftCorner.x, entity.x); topLeftCorner.y = Math.min(topLeftCorner.y, entity.y); bottomRightCorner.x = Math.max(bottomRightCorner.x, entity.x + entity.width); bottomRightCorner.y = Math.max(bottomRightCorner.y, entity.y + entity.height); } runningDimensions.x = topLeftCorner.x - padding - strokeWidth; runningDimensions.y = topLeftCorner.y - padding - strokeWidth; runningDimensions.width = bottomRightCorner.x - topLeftCorner.x + 2 * (padding + strokeWidth); runningDimensions.height = bottomRightCorner.y - topLeftCorner.y + 2 * (padding + strokeWidth); return { runningDimensions, topLeftCorner, bottomRightCorner }; }, { topLeftCorner: { x: Infinity, y: Infinity }, bottomRightCorner: { x: 0, y: 0 }, runningDimensions: { zIndex: Infinity } }).runningDimensions; const propertiesToCheck = ["x", "y", "width", "height", "zIndex"]; const nonFinites = propertiesToCheck .map(function (key) { return [[key], dimensions[key]]; }) .filter(dims => !isFinite(dims[1])); if (nonFinites.length > 0) { throw new Error(`Got a non-finite value(s): ${JSON.stringify(fromPairs(nonFinites), null, " ")} when calling getGroupDimensions( padding: ${padding}, strokeWidth: ${strokeWidth}, containedEntities: ${JSON.stringify(containedEntities, null, " ")} ) `); } return dimensions; } // NOTE: side effects export const preprocessGPML = curry(function (processor, Group) { // NOTE: The class "Group" is the only class that uses the "Style" property. // There are defaults for each Style, so we apply them here. toPairs(GPML2013aGroupMappingsByStyle[Group.Style]).forEach(function ([mappingKey, mappingValue]) { const oldValue = Group[mappingKey]; let newValue; if (isPlainObject(mappingValue)) { newValue = assign(oldValue || {}, mappingValue); } else if (Group.hasOwnProperty(mappingKey)) { if (isArray(mappingValue)) { newValue = unionLSV(mappingValue, oldValue); } else { newValue = oldValue; } } else { // override prototype with default by style newValue = mappingValue; } Group[mappingKey] = newValue; }); Group.Contains = processor.containedGraphIdsByGroupGroupId[Group.GroupId]; return Group; }); export function postprocessPVJSON(containedEntities, group) { return assign(group, getGroupDimensions(group.padding, group.strokeWidth, containedEntities)); } //// TODO do we need any of this old code that was in post-process.ts? // // Kludge to get the zIndex for Groups // const zIndexForGroups = // -1 + // EDGES.concat(["DataNode", "Label"]) // .reduce(function(acc, gpmlElementName) { // data[gpmlElementName].forEach(function(el) { // acc.push(el); // }); // return acc; // }, []) // .reduce(getFromElementMapByIdIfExists, []) // .map(element => element.zIndex) // .reduce(function(acc, zIndex) { // return Math.min(acc, zIndex); // }, Infinity); // // // specify contained elements in groups // data.Group // .reduce(getFromElementMapByIdIfExists, []) // .map(function(element) { // element.zIndex = zIndexForGroups; // // // NOTE: pvjson doesn't use GroupId. It just uses GraphId as the id for an element. // // That means: // // GPML GroupId is replaced in pvjson by just id (from GraphId), and // // GPML GroupRef is replaced in pvjson by element.isPartOf and group.contains (from GraphRef) // // We need to map from GroupId/GroupRef to id/contains/isPartOf here. // // element.id refers to the value of the GraphId of the Group // const groupGraphId = element.id; // const containedIds = (element.contains = // data.containedIdsByGroupId[data.GraphIdToGroupId[groupGraphId]] || []); // // if (containedIds.length > 0) { // // NOTE side effects // containedIds // .reduce(getFromElementMapByIdIfExists, []) // .map(function(contained) { // contained.isPartOf = groupGraphId; // return contained; // }) // .forEach(upsertDataMapEntry.bind(undefined, elementMap)); // } else { // // NOTE: side effect // delete elementMap[groupGraphId]; // } // // return element; // }) // .forEach(upsertDataMapEntry.bind(undefined, elementMap)); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZ3JvdXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxFQUNULE9BQU8sRUFDUCxhQUFhLEVBQ2IsUUFBUSxFQUNSLE9BQU8sRUFDUixNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLEVBQ0wsWUFBWSxFQUNaLHNCQUFzQixFQUN0QixRQUFRLEVBQ1QsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEtBQUssNkJBQTZCLE1BQU0sbUNBQW1DLENBQUM7QUFhbkYsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxPQUFlLEVBQ2YsV0FBbUIsRUFDbkIsaUJBQWlDO0lBRWpDLElBQUksaUJBQWlCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNsQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDL0MsT0FBTztZQUNMLENBQUMsRUFBRSxDQUFDO1lBQ0osQ0FBQyxFQUFFLENBQUM7WUFDSixLQUFLLEVBQUUsQ0FBQztZQUNSLE1BQU0sRUFBRSxDQUFDO1lBQ1QsTUFBTSxFQUFFLENBQUM7U0FDVixDQUFDO0tBQ0g7U0FBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztLQUN0RDtTQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUU7UUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO0tBQzlEO0lBQ0QsTUFBTSxVQUFVLEdBQUcsaUJBQWlCO1NBQ2pDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN4RSxNQUFNLENBQ0wsVUFDRSxFQUFFLGlCQUFp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