Skip to content

Commit da6a533

Browse files
authored
Technical debt (#59)
* Re-enable integration tests * Add test with multiline nodes and edges * Make a start improving handling Dimensions * Library builds and its tests succeed * Fix the playground * Simplify data structure for label texts * Typo * Make relations between dimensions interfaces explicit * Remove obsolete interface definition
1 parent 4241ae9 commit da6a533

18 files changed

Lines changed: 313 additions & 222 deletions
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { Dimensions } from '../public_api';
2+
import { EdgeLabelDimensions } from './graphics/edge-label-layouter';
3+
import { NodeAndEdgeDimensions } from './graphics/layout';
4+
import { SvgGenerationDimensions } from './graphics/svg-generator';
5+
import { calculateAverageFontCharacterWidth, NodeTextDimensions } from './model/text';
6+
7+
export interface DerivedDimensions
8+
extends EdgeLabelDimensions, NodeAndEdgeDimensions, SvgGenerationDimensions, NodeTextDimensions {}
9+
10+
export function getDerivedDimensions(d: Dimensions): DerivedDimensions {
11+
return {
12+
nodeTextFontSize: d.nodeTextFontSize,
13+
nodeTextBorder: d.nodeTextBorder,
14+
horizontalNodeBorder: d.horizontalNodeBorder,
15+
intermediateWidth: d.intermediateWidth,
16+
layerHeight: d.layerHeight,
17+
layerDistance: d.layerDistance,
18+
nodeBoxHeight: d.nodeBoxHeight,
19+
boxConnectorAreaPerc: d.boxConnectorAreaPerc,
20+
intermediateLayerPassedByVerticalLine: d.intermediateLayerPassedByVerticalLine,
21+
boxCrossProtectionMargin: d.boxCrossProtectionMargin,
22+
lineTransgressionPerc: d.lineTransgressionPerc,
23+
estEdgeLabelCharacterWidth: calculateAverageFontCharacterWidth(d.edgeLabelFontSize),
24+
edgeLabelFontSize: d.edgeLabelFontSize,
25+
// In theory, we need a margin between multiple lines of an edge label.
26+
// In practice, we get an acceptable result by adjusting the line heigt
27+
// to produce it.
28+
estEdgeLabelLineHeight: d.edgeLabelFontSize + 3,
29+
preferredVertDistanceFromOrigin: d.preferredVertDistanceFromOrigin,
30+
strictlyKeepLabelOutOfBox: d.strictlyKeepLabelOutOfBox,
31+
};
32+
}

projects/frank-config-layout/src/lib/graphics/edge-label-layouter.spec.ts

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { Line, Point } from '../graphics/graphics';
22
import { Box } from './box';
3-
import { DerivedEdgeLabelDimensions, EdgeLabelLayouter } from './edge-label-layouter';
3+
import { EdgeLabelDimensions, EdgeLabelLayouter } from './edge-label-layouter';
44

55
describe('EdgeLabelLayouter', () => {
66
it('When two labels fit next to each other they appear next to each other, downwards', () => {
7-
const dimensions: DerivedEdgeLabelDimensions = {
8-
estCharacterWidth: 5,
9-
estLabelLineHeight: 10,
7+
const dimensions: EdgeLabelDimensions = {
8+
estEdgeLabelCharacterWidth: 5,
9+
estEdgeLabelLineHeight: 10,
1010
preferredVertDistanceFromOrigin: 30,
1111
strictlyKeepLabelOutOfBox: false,
1212
};
@@ -26,9 +26,9 @@ describe('EdgeLabelLayouter', () => {
2626
});
2727

2828
it('When two labels do not fit next to each other they appear on different heights, downwards', () => {
29-
const dimensions: DerivedEdgeLabelDimensions = {
30-
estCharacterWidth: 5,
31-
estLabelLineHeight: 10,
29+
const dimensions: EdgeLabelDimensions = {
30+
estEdgeLabelCharacterWidth: 5,
31+
estEdgeLabelLineHeight: 10,
3232
preferredVertDistanceFromOrigin: 30,
3333
strictlyKeepLabelOutOfBox: false,
3434
};
@@ -51,9 +51,9 @@ describe('EdgeLabelLayouter', () => {
5151
// to test with upward lines.
5252

5353
it('When two labels fit next to each other they appear next to each other, upwards', () => {
54-
const dimensions: DerivedEdgeLabelDimensions = {
55-
estCharacterWidth: 5,
56-
estLabelLineHeight: 10,
54+
const dimensions: EdgeLabelDimensions = {
55+
estEdgeLabelCharacterWidth: 5,
56+
estEdgeLabelLineHeight: 10,
5757
preferredVertDistanceFromOrigin: 30,
5858
strictlyKeepLabelOutOfBox: false,
5959
};
@@ -73,9 +73,9 @@ describe('EdgeLabelLayouter', () => {
7373
});
7474

7575
it('When two labels do not fit next to each other they appear on different heights, upwards', () => {
76-
const dimensions: DerivedEdgeLabelDimensions = {
77-
estCharacterWidth: 5,
78-
estLabelLineHeight: 10,
76+
const dimensions: EdgeLabelDimensions = {
77+
estEdgeLabelCharacterWidth: 5,
78+
estEdgeLabelLineHeight: 10,
7979
preferredVertDistanceFromOrigin: 30,
8080
strictlyKeepLabelOutOfBox: false,
8181
};
@@ -96,8 +96,8 @@ describe('EdgeLabelLayouter', () => {
9696

9797
it('When not strictlyKeepLabelOutOfBox, label can intersect box', () => {
9898
const dimensions = {
99-
estCharacterWidth: 5,
100-
estLabelLineHeight: 10,
99+
estEdgeLabelCharacterWidth: 5,
100+
estEdgeLabelLineHeight: 10,
101101
preferredVertDistanceFromOrigin: 12,
102102
strictlyKeepLabelOutOfBox: false,
103103
};
@@ -114,8 +114,8 @@ describe('EdgeLabelLayouter', () => {
114114

115115
it('When strictlyKeepLabelOutOfBox, label can not intersect box', () => {
116116
const dimensions = {
117-
estCharacterWidth: 5,
118-
estLabelLineHeight: 10,
117+
estEdgeLabelCharacterWidth: 5,
118+
estEdgeLabelLineHeight: 10,
119119
preferredVertDistanceFromOrigin: 12,
120120
strictlyKeepLabelOutOfBox: true,
121121
};

projects/frank-config-layout/src/lib/graphics/edge-label-layouter.ts

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,45 +18,25 @@ import { NumbersAroundZero } from '../util/util';
1818
import { Box } from './box';
1919
import { Interval } from '../util/interval';
2020
import { Line, Point } from './graphics';
21-
import { calculateAverageFontCharacterWidth } from '../model/text';
2221

2322
export interface EdgeLabelDimensions {
24-
edgeLabelFontSize: number;
23+
estEdgeLabelCharacterWidth: number;
24+
estEdgeLabelLineHeight: number;
2525
preferredVertDistanceFromOrigin: number;
2626
strictlyKeepLabelOutOfBox: boolean;
2727
}
2828

29-
export interface DerivedEdgeLabelDimensions {
30-
estCharacterWidth: number;
31-
estLabelLineHeight: number;
32-
preferredVertDistanceFromOrigin: number;
33-
strictlyKeepLabelOutOfBox: boolean;
34-
}
35-
36-
export function getDerivedEdgeLabelDimensions(d: EdgeLabelDimensions): DerivedEdgeLabelDimensions {
37-
return {
38-
estCharacterWidth: calculateAverageFontCharacterWidth(d.edgeLabelFontSize),
39-
// TODO issue https://github.com/frankframework/frank-config-layout/issues/51.
40-
// When a label has multiple lines then we need a marging between the lines,
41-
// not an increased line height. The text is rendered with a martin in svg-generator.ts.
42-
estLabelLineHeight: d.edgeLabelFontSize + 3,
43-
preferredVertDistanceFromOrigin: d.preferredVertDistanceFromOrigin,
44-
strictlyKeepLabelOutOfBox: d.strictlyKeepLabelOutOfBox,
45-
};
46-
}
47-
4829
export class EdgeLabelLayouter {
4930
private boxes: Box[] = [];
5031

51-
constructor(readonly derivedDimensions: DerivedEdgeLabelDimensions) {}
32+
constructor(readonly dimensions: EdgeLabelDimensions) {}
5233

5334
add(line: Line, numCharactersOnLine: number, numTextLines: number): Box {
5435
const vdistSources = new NumbersAroundZero();
5536
while (true) {
5637
const vdistSource: number = vdistSources.next();
5738
const vdist: number =
58-
this.derivedDimensions.preferredVertDistanceFromOrigin +
59-
vdistSource * this.derivedDimensions.estLabelLineHeight;
39+
this.dimensions.preferredVertDistanceFromOrigin + vdistSource * this.dimensions.estEdgeLabelLineHeight;
6040
if (vdist <= 0) {
6141
// The vertical center of the label would be in the box from which the line originates.
6242
// Next vdistSource.
@@ -65,14 +45,14 @@ export class EdgeLabelLayouter {
6545
const candidateCenter: Point = this.pointAt(vdist, line);
6646
const horizontalBox = Interval.createFromCenterSize(
6747
candidateCenter.x,
68-
numCharactersOnLine * this.derivedDimensions.estCharacterWidth,
48+
numCharactersOnLine * this.dimensions.estEdgeLabelCharacterWidth,
6949
);
7050
const verticalBox = Interval.createFromCenterSize(
7151
candidateCenter.y,
72-
numTextLines * this.derivedDimensions.estLabelLineHeight,
52+
numTextLines * this.dimensions.estEdgeLabelLineHeight,
7353
);
7454
const candidateBox = new Box(horizontalBox, verticalBox);
75-
if (this.derivedDimensions.strictlyKeepLabelOutOfBox && candidateBox.verticalBox.contains(line.startPoint.y)) {
55+
if (this.dimensions.strictlyKeepLabelOutOfBox && candidateBox.verticalBox.contains(line.startPoint.y)) {
7656
// The label would intersect with the box from which the line originates.
7757
// Next vdistSource.
7858
continue;

projects/frank-config-layout/src/lib/graphics/layout.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import { HorizontalConflictResolver } from './horizontal-conflict';
2828
import { getRange } from '../util/util';
2929
import { getConnectedIdsOfKey, getKey, keyFor } from '../model/graph';
3030
import { Box, LineChecker } from './box';
31-
import { DerivedEdgeLabelDimensions, EdgeLabelLayouter } from './edge-label-layouter';
31+
import { EdgeLabelDimensions, EdgeLabelLayouter } from './edge-label-layouter';
3232
import { straighten, StraightenedLine, StraightenedLineSegmentsBuilder } from './straightened-line';
3333
import { EdgeText, NodeText } from '../model/text';
3434

@@ -84,11 +84,12 @@ export class LayoutBuilder {
8484
private layoutLineSegmentsByOriginalEdge = new Map<string, LayoutLineSegment[]>();
8585
private originalEdgesByConnector = new Map<string, string>();
8686
private lineThrougIntermediateNodeAllowance: number;
87+
8788
constructor(
8889
private model: LayoutModel,
8990
private og: OriginalGraphReferencingIntermediates,
9091
private d: NodeAndEdgeDimensions,
91-
private derivedEdgeLabelDimensions: DerivedEdgeLabelDimensions,
92+
private derivedEdgeLabelDimensions: EdgeLabelDimensions,
9293
) {
9394
this.lineThrougIntermediateNodeAllowance = Math.round((d.intermediateWidth * d.lineTransgressionPerc) / 100);
9495
}

projects/frank-config-layout/src/lib/graphics/straightened-line.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ export class StraightenedLine {
6666
return [first, second];
6767
}
6868

69-
// TODO: Test
7069
split(pointFunction: (id: string, line: Line) => Point): StraightenedLine[] {
7170
if (this.replacedNodes.length === 0) {
7271
return [this];

projects/frank-config-layout/src/lib/graphics/svg-generator.ts

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,24 @@ import { Box } from './box';
2121
import { Point } from './graphics';
2222
import { EdgeLabel, Layout, LayoutLineSegment, PlacedNode } from './layout';
2323

24-
// TODO: Issue https://github.com/frankframework/frank-config-layout/issues/51.
25-
// The way dimensions are divided over different interfaces and passed along
26-
// is not clear now. Should be reconsidered.
27-
export function generateSvg(
28-
layout: Layout,
29-
nodeTextFontSize: number,
30-
edgeLabelFontSize: number,
31-
border: number,
32-
): string {
24+
export interface SvgGenerationDimensions {
25+
nodeTextFontSize: number;
26+
nodeTextBorder: number;
27+
edgeLabelFontSize: number;
28+
estEdgeLabelCharacterWidth: number;
29+
}
30+
31+
export function generateSvg(layout: Layout, d: SvgGenerationDimensions): string {
3332
return (
3433
openSvg(layout.width, layout.height) +
3534
renderDefs() +
3635
renderNodes(
3736
layout.nodes.map((n) => n as PlacedNode),
38-
border,
39-
nodeTextFontSize,
37+
d.nodeTextBorder,
38+
d.nodeTextFontSize,
4039
) +
4140
renderEdges(layout.layoutLineSegments) +
42-
renderLabels(layout.edgeLabels, edgeLabelFontSize) +
41+
renderLabels(layout.edgeLabels, d.edgeLabelFontSize, d.estEdgeLabelCharacterWidth) +
4342
closeSvg()
4443
);
4544
}
@@ -165,23 +164,21 @@ function classOfLine(edge: LayoutLineSegment): string {
165164
}
166165
}
167166

168-
function renderLabels(labels: EdgeLabel[], edgeLabelFontSize: number): string {
169-
return ` <g text-anchor="middle" dominant-baseline="middle">${labels.map((label) => renderLabel(label, edgeLabelFontSize)).join('')}</g>`;
167+
function renderLabels(labels: EdgeLabel[], edgeLabelFontSize: number, estEdgeLabelCharacterWidth: number): string {
168+
return ` <g text-anchor="middle" dominant-baseline="middle">${labels.map((label) => renderLabel(label, edgeLabelFontSize, estEdgeLabelCharacterWidth)).join('')}</g>`;
170169
}
171170

172-
function renderLabel(label: EdgeLabel, edgeLabelFontSize: number): string {
171+
function renderLabel(label: EdgeLabel, edgeLabelFontSize: number, estEdgeLabelCharacterWidth: number): string {
173172
const coordinates: Point[] = arrangeInBox({
174173
container: new Box(label.horizontalBox, label.verticalBox),
175174
border: 0,
176-
itemWidths: label.text.lines.map((l) => l.width),
177-
// TODO: Issue https://github.com/frankframework/frank-config-layout/issues/51.
178-
// This is not right - either make height variable or do not store with each line.
179-
commonItemHeight: label.text.lines[0].height,
175+
itemWidths: label.text.lines.map((l) => l.length * estEdgeLabelCharacterWidth),
176+
commonItemHeight: edgeLabelFontSize,
180177
});
181178
let result: string = '';
182179
for (let i = 0; i < label.text.lines.length; ++i) {
183180
const p: Point = coordinates[i];
184-
result += renderSingleLayerText(p.x, p.y, edgeLabelFontSize, label.text.lines[i].text);
181+
result += renderSingleLayerText(p.x, p.y, edgeLabelFontSize, label.text.lines[i]);
185182
}
186183
return result;
187184
}

0 commit comments

Comments
 (0)