Skip to content

Commit 8cd7222

Browse files
authored
Merge pull request #61 from geostyler/fix-types
fix: typing
2 parents 18c4965 + 2c6a239 commit 8cd7222

19 files changed

+651
-465
lines changed

.idea/jsLinters/eslint.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/badTypes.ts

Lines changed: 0 additions & 43 deletions
This file was deleted.

src/esri/types/labeling/CIMSymbolReference.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,19 @@ import { CIMSymbol } from '../symbols/index.ts';
33
type CIMPrimitiveOverride = {};
44
type CIMScaleDependentSizeVariation = {};
55

6+
7+
export type Geometry = {
8+
rings?: number[][][];
9+
paths?: number[][][];
10+
curveRings?: { a?: number[][]; c?: number[][] }[][];
11+
};
12+
613
/**
714
* Represents a symbol reference.
815
*
916
*/
1017
export type CIMSymbolReference = {
18+
geometry: Geometry;
1119
/**
1220
* Gets or sets the primitive overrides. Typically set by renderers at draw time.
1321
*/

src/esri/types/layers/CIMFeatureLayer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { CIMLayerAction } from '../CIMLayerAction.ts';
22
import { CIMLayerDefinition } from './CIMLayerDefinition.ts';
3-
import { CIMRenderer } from '../renderers/CIMRenderer.ts';
43
import { CIMLabelClass } from '../labeling/CIMLabelClass.ts';
54
import { CIMSymbolReference } from '../labeling/CIMSymbolReference.ts';
5+
import {CIMRenderer} from '../renderers';
66

77
type CIMDataConnection = {};
88
type CIMSymbolLayerMasking = {};
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import {CIMRenderer, Group } from './CIMRenderer.ts';
2+
import {CIMSymbolReference} from '../labeling';
3+
4+
export type CIMBreaksRenderer = CIMRenderer & {
5+
classBreakType: string;
6+
defaultSymbol?: CIMSymbolReference;
7+
field: string;
8+
groups?: Group[];
9+
showInAscendingOrder: boolean;
10+
breaks: {
11+
type: string;
12+
fieldValues: string[];
13+
label: string;
14+
symbol: CIMSymbolReference;
15+
upperBound: number;
16+
}[];
17+
};
Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,38 @@
1-
import { CIMObject } from '../CIMObject.ts';
1+
import {CIMObject} from '../CIMObject.ts';
2+
import {CIMSymbolReference} from '../labeling';
23

3-
type Group = {};
4-
type SymbolReference = {};
4+
5+
export type Class = {
6+
alternateSymbols: CIMSymbolReference[];
7+
label: string;
8+
filter: string;
9+
symbol: CIMSymbolReference;
10+
minValue?: number;
11+
maxValue?: number;
12+
breakCount?: number;
13+
breakValues?: number[];
14+
breakLabels?: string[];
15+
breakSymbols?: CIMSymbolReference[];
16+
values: {
17+
type: string;
18+
fieldValues: string[];
19+
}[];
20+
};
21+
22+
export type Group = {
23+
classes: Class[];
24+
};
25+
26+
export type VisualVariable = CIMObject & {
27+
rotationTypeZ: string;
28+
visualVariableInfoZ: {
29+
expression: string;
30+
valueExpressionInfo: {
31+
expression: string;
32+
};
33+
};
34+
};
535

636
export type CIMRenderer = CIMObject & {
7-
type: string;
8-
fields?: string[];
9-
groups?: Group[];
10-
defaultSymbol?: SymbolReference;
11-
classBreakType?: string;
37+
visualVariables?: VisualVariable[];
1238
};
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import {CIMRenderer} from './CIMRenderer.ts';
2+
import {CIMSymbolReference} from '../labeling';
3+
4+
export type CIMSimpleRenderer = CIMRenderer & {
5+
label: string;
6+
symbol: CIMSymbolReference;
7+
};
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
import {CIMRenderer, Group} from './CIMRenderer.ts';
2+
import {CIMSymbolReference} from '../labeling';
13

2-
export type CIMUniqueValueRenderer = {
3-
4+
export type CIMUniqueValueRenderer = CIMRenderer & {
5+
defaultSymbol?: CIMSymbolReference;
6+
fields?: string[];
7+
groups?: Group[];
48
};

src/esri/types/symbols/CIMSymbol.ts

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,41 @@
11
import { CIMObject } from '../CIMObject.ts';
2+
import {CIMColor} from './CIMTextSymbol.ts';
3+
import {CIMSymbolReference} from '../labeling';
24

3-
export type CIMSymbol = CIMObject & {};
5+
export type CIMColorType = CIMColor & CIMObject;
6+
7+
export type CIMMarkerPlacement = CIMObject & {
8+
angleToLine: boolean;
9+
extremityPlacement: string;
10+
flipFirst: boolean;
11+
placementTemplate: number[];
12+
positionArray: number[];
13+
};
14+
15+
export type CIMEffect = CIMObject & {
16+
dashTemplate: number[];
17+
offset: number;
18+
};
19+
20+
export type SymbolLayer = CIMObject & {
21+
capStyle: string;
22+
characterIndex: number;
23+
color: CIMColorType;
24+
effects: CIMEffect[];
25+
enable: boolean;
26+
fontFamilyName: string;
27+
joinStyle: string;
28+
lineSymbol: CIMSymbol;
29+
markerPlacement: CIMMarkerPlacement;
30+
markerGraphics: CIMSymbolReference[];
31+
rotateClockwise: boolean;
32+
rotation: number;
33+
separation: number;
34+
size: number;
35+
symbol: CIMSymbol;
36+
};
37+
38+
export type CIMSymbol = CIMObject & {
39+
enabled: boolean;
40+
symbolLayers?: SymbolLayer[];
41+
};

src/expressions.ts

Lines changed: 58 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,38 @@
11
import { LabelExpressionEngine } from './esri/types/index.ts';
2-
import {ComparisonOperator, Filter} from 'geostyler-style';
2+
import {
3+
CombinationFilter,
4+
ComparisonOperator,
5+
Filter,
6+
Fproperty,
7+
GeoStylerNumberFunction
8+
} from 'geostyler-style';
9+
import {WARNINGS} from './toGeostylerUtils.ts';
10+
11+
export const fieldToFProperty = (field: string, toLowerCase: boolean): Fproperty => {
12+
return {
13+
args: [toLowerCase ? field.toLowerCase() : field],
14+
name: 'property',
15+
};
16+
};
17+
18+
export const andFilter = (filters: Filter[]): CombinationFilter => {
19+
return ['&&', ...filters];
20+
};
21+
22+
export const orFilter = (conditions: Filter[]): CombinationFilter => {
23+
return ['||', ...conditions];
24+
};
25+
26+
export const equalFilter = (name: string, val: string, toLowerCase: boolean): Filter => {
27+
return getSimpleFilter('==', name, val, toLowerCase);
28+
};
329

430
export const getSimpleFilter = (
531
operator: ComparisonOperator,
6-
value1: string, value2: string,
7-
toLowerCase=true): Filter => {
32+
value1: string,
33+
value2: string,
34+
toLowerCase=true
35+
): Filter => {
836
return [operator, stringToParameter(value1, toLowerCase), stringToParameter(value2, toLowerCase)];
937
};
1038

@@ -35,66 +63,65 @@ export const convertExpression = (
3563
return processPropertyName(expression);
3664
};
3765

38-
39-
export const convertWhereClause = (clause: string, toLowerCase: boolean): any => {
66+
export const convertWhereClause = (clause: string, toLowerCase: boolean): Filter => {
4067
clause = clause.replace('(', '').replace(')', '');
41-
const expression = [];
4268
if (clause.includes(' AND ')) {
43-
expression.push('And');
44-
let subexpressions = clause.split(' AND ').map(s => s.trim());
45-
expression.push(...subexpressions.map(s => convertWhereClause(s, toLowerCase)));
46-
return expression;
69+
const subexpressions = clause.split(' AND ').map(s => s.trim());
70+
return andFilter(subexpressions.map(s => convertWhereClause(s, toLowerCase)));
4771
}
4872
if (clause.includes('=')) {
49-
let tokens = clause.split('=').map(t => t.trim());
73+
const tokens = clause.split('=').map(t => t.trim());
5074
return getSimpleFilter('==', tokens[0], tokens[1], toLowerCase);
5175
}
5276
if (clause.includes('<>')) {
53-
let tokens = clause.split('<>').map(t => t.trim());
77+
const tokens = clause.split('<>').map(t => t.trim());
5478
return getSimpleFilter('!=', tokens[0], tokens[1], toLowerCase);
5579
}
5680
if (clause.includes('>')) {
57-
let tokens = clause.split('>').map(t => t.trim());
81+
const tokens = clause.split('>').map(t => t.trim());
5882
return getSimpleFilter('>', tokens[0], tokens[1], toLowerCase);
5983
}
6084
if (clause.toLowerCase().includes(' in ')) {
6185
clause = clause.replace(' IN ', ' in ');
62-
let tokens = clause.split(' in ');
63-
let attribute = tokens[0];
86+
const tokens = clause.split(' in ');
87+
const attribute = tokens[0];
6488
let values: string[] = [];
6589
if (tokens[1].startsWith('() ')) {
6690
values = tokens[1].substring(3).split(',');
6791
}
68-
let subexpressions = [];
69-
for (let v of values) {
70-
subexpressions.push([
71-
'PropertyIsEqualTo',
72-
stringToParameter(attribute, toLowerCase), stringToParameter(v, toLowerCase)
73-
]);
74-
}
92+
const subexpressions: Filter[] = [];
93+
values.forEach(value => {
94+
subexpressions.push(
95+
getSimpleFilter(
96+
'==',
97+
`${stringToParameter(attribute, toLowerCase)}`,
98+
`${stringToParameter(value, toLowerCase)}`
99+
)
100+
);
101+
});
75102
if (values.length === 1) {
76103
return subexpressions[0];
77104
}
78-
79-
let accum: any = ['Or', subexpressions[0], subexpressions[1]];
105+
let accum: Filter = orFilter([subexpressions[0], subexpressions[1]]);
80106
for (let subexpression of subexpressions.slice(2)) {
81-
accum = ['Or', accum, subexpression];
107+
accum = orFilter([accum, subexpression]);
82108
}
83109
return accum;
84110
}
85-
return clause;
111+
WARNINGS.push(`Clause skipped because it is not supported as filter: ${clause}}`);
112+
return ['==', 0, 0];
86113
};
87114

88115
export const processRotationExpression = (
89116
expression: string,
90117
rotationType: string,
91-
toLowerCase: boolean): [string, string[], number] | null => {
92-
let field = expression.includes('$feature') ? convertArcadeExpression(expression) : processPropertyName(expression);
93-
let propertyNameExpression = ['PropertyName', toLowerCase ? field.toLowerCase() : field];
118+
toLowerCase: boolean): GeoStylerNumberFunction | null => {
119+
const field = expression.includes('$feature') ? convertArcadeExpression(expression) : processPropertyName(expression);
120+
const fProperty: Fproperty = fieldToFProperty(field, toLowerCase);
94121
if (rotationType === 'Arithmetic') {
95-
return ['Mul', propertyNameExpression, -1];
122+
return { args: [fProperty, -1], name: 'mul' };
96123
} else if (rotationType === 'Geographic') {
97-
return ['Sub', propertyNameExpression, 90];
124+
return { args: [fProperty, 90], name: 'sub' };
98125
}
99126
return null;
100127
};

0 commit comments

Comments
 (0)