UNPKG

14.7 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var fp_1 = require("lodash/fp");
4var gpml_utilities_1 = require("./gpml-utilities");
5var GPML2013aGroupMappingsByStyle = require("./2013a/GroupMappingsByStyle.json");
6function getGroupDimensions(padding, strokeWidth, containedEntities) {
7 if (containedEntities.length === 0) {
8 console.warn("Warning: Empty group observed.");
9 return {
10 x: 0,
11 y: 0,
12 width: 0,
13 height: 0,
14 zIndex: 0
15 };
16 }
17 else if (!fp_1.isFinite(padding)) {
18 throw new Error("Invalid padding value: ${padding}");
19 }
20 else if (!fp_1.isFinite(strokeWidth)) {
21 throw new Error("Invalid strokeWidth value: ${strokeWidth}");
22 }
23 var dimensions = containedEntities
24 .filter(function (entity) { return gpml_utilities_1.isPvjsonSingleFreeNode(entity) || gpml_utilities_1.isPvjsonEdge(entity); })
25 .reduce(function (_a, entity) {
26 var runningDimensions = _a.runningDimensions, topLeftCorner = _a.topLeftCorner, bottomRightCorner = _a.bottomRightCorner;
27 var zIndex = entity.zIndex;
28 var zIndexIsFinite = fp_1.isFinite(zIndex);
29 var runningDimensionsZIndexIsFinite = fp_1.isFinite(runningDimensions.zIndex);
30 if (zIndexIsFinite && runningDimensionsZIndexIsFinite) {
31 runningDimensions.zIndex = Math.min(zIndex, runningDimensions.zIndex);
32 }
33 else if (zIndexIsFinite) {
34 runningDimensions.zIndex = zIndex;
35 }
36 if (gpml_utilities_1.isPvjsonEdge(entity)) {
37 var points = entity.points;
38 // If entity is an edge
39 var firstPoint = points[0];
40 var firstPointX = firstPoint.x;
41 var firstPointY = firstPoint.y;
42 var lastPoint = points[points.length - 1];
43 var lastPointX = lastPoint.x;
44 var lastPointY = lastPoint.y;
45 topLeftCorner.x = Math.min(topLeftCorner.x, firstPointX, lastPointX);
46 topLeftCorner.y = Math.min(topLeftCorner.y, firstPointY, lastPointY);
47 bottomRightCorner.x = Math.max(bottomRightCorner.x, firstPointX, lastPointX);
48 bottomRightCorner.y = Math.max(bottomRightCorner.y, firstPointY, lastPointY);
49 }
50 else {
51 // If entity is a node
52 topLeftCorner.x = Math.min(topLeftCorner.x, entity.x);
53 topLeftCorner.y = Math.min(topLeftCorner.y, entity.y);
54 bottomRightCorner.x = Math.max(bottomRightCorner.x, entity.x + entity.width);
55 bottomRightCorner.y = Math.max(bottomRightCorner.y, entity.y + entity.height);
56 }
57 runningDimensions.x = topLeftCorner.x - padding - strokeWidth;
58 runningDimensions.y = topLeftCorner.y - padding - strokeWidth;
59 runningDimensions.width =
60 bottomRightCorner.x - topLeftCorner.x + 2 * (padding + strokeWidth);
61 runningDimensions.height =
62 bottomRightCorner.y - topLeftCorner.y + 2 * (padding + strokeWidth);
63 return { runningDimensions: runningDimensions, topLeftCorner: topLeftCorner, bottomRightCorner: bottomRightCorner };
64 }, {
65 topLeftCorner: {
66 x: Infinity,
67 y: Infinity
68 },
69 bottomRightCorner: {
70 x: 0,
71 y: 0
72 },
73 runningDimensions: {
74 zIndex: Infinity
75 }
76 }).runningDimensions;
77 var propertiesToCheck = ["x", "y", "width", "height", "zIndex"];
78 var nonFinites = propertiesToCheck
79 .map(function (key) {
80 return [[key], dimensions[key]];
81 })
82 .filter(function (dims) { return !fp_1.isFinite(dims[1]); });
83 if (nonFinites.length > 0) {
84 throw new Error("Got a non-finite value(s):\n\t\t\t" + JSON.stringify(fp_1.fromPairs(nonFinites), null, " ") + "\n\t\t\twhen calling\n\t\t\tgetGroupDimensions(\n\t\t\t\tpadding: " + padding + ",\n\t\t\t\tstrokeWidth: " + strokeWidth + ",\n\t\t\t\tcontainedEntities: " + JSON.stringify(containedEntities, null, " ") + "\n\t\t\t)\n\t\t\t\n\t\t\t");
85 }
86 return dimensions;
87}
88exports.getGroupDimensions = getGroupDimensions;
89// NOTE: side effects
90exports.preprocessGPML = fp_1.curry(function (processor, Group) {
91 // NOTE: The class "Group" is the only class that uses the "Style" property.
92 // There are defaults for each Style, so we apply them here.
93 fp_1.toPairs(GPML2013aGroupMappingsByStyle[Group.Style]).forEach(function (_a) {
94 var mappingKey = _a[0], mappingValue = _a[1];
95 var oldValue = Group[mappingKey];
96 var newValue;
97 if (fp_1.isPlainObject(mappingValue)) {
98 newValue = fp_1.assign(oldValue || {}, mappingValue);
99 }
100 else if (Group.hasOwnProperty(mappingKey)) {
101 if (fp_1.isArray(mappingValue)) {
102 newValue = gpml_utilities_1.unionLSV(mappingValue, oldValue);
103 }
104 else {
105 newValue = oldValue;
106 }
107 }
108 else {
109 // override prototype with default by style
110 newValue = mappingValue;
111 }
112 Group[mappingKey] = newValue;
113 });
114 Group.Contains = processor.containedGraphIdsByGroupGroupId[Group.GroupId];
115 return Group;
116});
117function postprocessPVJSON(containedEntities, group) {
118 return fp_1.assign(group, getGroupDimensions(group.padding, group.strokeWidth, containedEntities));
119}
120exports.postprocessPVJSON = postprocessPVJSON;
121//// TODO do we need any of this old code that was in post-process.ts?
122// // Kludge to get the zIndex for Groups
123// const zIndexForGroups =
124// -1 +
125// EDGES.concat(["DataNode", "Label"])
126// .reduce(function(acc, gpmlElementName) {
127// data[gpmlElementName].forEach(function(el) {
128// acc.push(el);
129// });
130// return acc;
131// }, [])
132// .reduce(getFromElementMapByIdIfExists, [])
133// .map(element => element.zIndex)
134// .reduce(function(acc, zIndex) {
135// return Math.min(acc, zIndex);
136// }, Infinity);
137//
138// // specify contained elements in groups
139// data.Group
140// .reduce(getFromElementMapByIdIfExists, [])
141// .map(function(element) {
142// element.zIndex = zIndexForGroups;
143//
144// // NOTE: pvjson doesn't use GroupId. It just uses GraphId as the id for an element.
145// // That means:
146// // GPML GroupId is replaced in pvjson by just id (from GraphId), and
147// // GPML GroupRef is replaced in pvjson by element.isPartOf and group.contains (from GraphRef)
148// // We need to map from GroupId/GroupRef to id/contains/isPartOf here.
149// // element.id refers to the value of the GraphId of the Group
150// const groupGraphId = element.id;
151// const containedIds = (element.contains =
152// data.containedIdsByGroupId[data.GraphIdToGroupId[groupGraphId]] || []);
153//
154// if (containedIds.length > 0) {
155// // NOTE side effects
156// containedIds
157// .reduce(getFromElementMapByIdIfExists, [])
158// .map(function(contained) {
159// contained.isPartOf = groupGraphId;
160// return contained;
161// })
162// .forEach(upsertDataMapEntry.bind(undefined, elementMap));
163// } else {
164// // NOTE: side effect
165// delete elementMap[groupGraphId];
166// }
167//
168// return element;
169// })
170// .forEach(upsertDataMapEntry.bind(undefined, elementMap));
171//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZ3JvdXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxnQ0FRbUI7QUFDbkIsbURBSTBCO0FBQzFCLGlGQUFtRjtBQWFuRiw0QkFDRSxPQUFlLEVBQ2YsV0FBbUIsRUFDbkIsaUJBQWlDO0lBRWpDLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUMvQyxNQUFNLENBQUM7WUFDTCxDQUFDLEVBQUUsQ0FBQztZQUNKLENBQUMsRUFBRSxDQUFDO1lBQ0osS0FBSyxFQUFFLENBQUM7WUFDUixNQUFNLEVBQUUsQ0FBQztZQUNULE1BQU0sRUFBRSxDQUFDO1NBQ1YsQ0FBQztJQUNKLENBQUM7SUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUNELElBQU0sVUFBVSxHQUFHLGlCQUFpQjtTQUNqQyxNQUFNLENBQUMsVUFBQSxNQUFNLElBQUksT0FBQSx1Q0FBc0IsQ0FBQyxNQUFNLENBQUMsSUFBSSw2QkFBWSxDQUFDLE1BQU0sQ0FBQyxFQUF0RCxDQUFzRCxDQUFDO1NBQ3hFLE1BQU0sQ0FDTCxVQUNFLEVBQXVELEVBQ3ZELE1BQXlDO1lBRHZDLHdDQUFpQixFQUFFLGdDQUFhLEVBQUUsd0NBQWlCO1FBRzdDLElBQUEsc0JBQU0sQ0FBWTtRQUMx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
\No newline at end of file