@@ -15,7 +15,7 @@ import {
15
15
} from '@model' ;
16
16
17
17
export class DgmlParser {
18
-
18
+
19
19
public parseDgmlFile ( filename : string ) : IDirectedGraph | undefined {
20
20
const xml = fs . readFileSync ( filename , 'utf8' ) ;
21
21
const obj = parse ( xml ) ;
@@ -51,6 +51,7 @@ export class DgmlParser {
51
51
} ) ;
52
52
this . addCategoryStylingToNodes ( directedGraph ) ;
53
53
this . addCategoryStylingToLinks ( directedGraph ) ;
54
+ this . addStylingToCategories ( directedGraph ) ;
54
55
}
55
56
return directedGraph ;
56
57
}
@@ -103,10 +104,10 @@ export class DgmlParser {
103
104
}
104
105
if ( attributesCopy [ 'bounds' ] !== undefined && attributesCopy [ 'bounds' ] . indexOf ( ',' ) !== - 1 ) {
105
106
const bounds = attributesCopy [ 'bounds' ] . split ( ',' ) ;
106
- newNode . boundsX = + bounds [ 0 ] ;
107
- newNode . boundsY = + bounds [ 1 ] ;
108
- newNode . boundsWidth = + bounds [ 2 ] ;
109
- newNode . boundsHeight = + bounds [ 3 ] ;
107
+ newNode . boundsX = + bounds [ 0 ] ;
108
+ newNode . boundsY = + bounds [ 1 ] ;
109
+ newNode . boundsWidth = + bounds [ 2 ] ;
110
+ newNode . boundsHeight = + bounds [ 3 ] ;
110
111
}
111
112
if ( nodes . filter ( n => n . id === newNode . id ) . length === 0 ) {
112
113
nodes . push ( newNode ) ;
@@ -126,6 +127,7 @@ export class DgmlParser {
126
127
const newLink = new Link ( ) ;
127
128
newLink . source = attributesCopy [ 'source' ] ;
128
129
newLink . target = attributesCopy [ 'target' ] ;
130
+ newLink . label = attributesCopy [ 'label' ] ;
129
131
newLink . category = attributesCopy [ 'category' ] ;
130
132
newLink . visibility = attributesCopy [ 'visibility' ] !== undefined ? attributesCopy [ 'visibility' ] === 'hidden' : false ;
131
133
newLink . background = attributesCopy [ 'background' ] ;
@@ -245,7 +247,7 @@ export class DgmlParser {
245
247
valueLabel : attributesCopy [ 'valuelabel' ] ,
246
248
toolTip : attributesCopy [ 'tooltip' ] ,
247
249
condition : this . createCondition ( xmlNode ) ,
248
- setter : this . createSetter ( xmlNode )
250
+ setters : this . createSetter ( xmlNode )
249
251
} as IStyle ;
250
252
styles . push ( newProperty ) ;
251
253
}
@@ -270,22 +272,25 @@ export class DgmlParser {
270
272
return condition ;
271
273
}
272
274
273
- private createSetter ( xmlNode : IXmlNode ) : ISetter | undefined {
274
- let setter : ISetter | undefined = undefined ;
275
+ private createSetter ( xmlNode : IXmlNode ) : ISetter [ ] | undefined {
276
+ let setters : ISetter [ ] | undefined = undefined ;
275
277
if ( xmlNode . children !== undefined ) {
276
278
xmlNode . children . forEach ( childNode => {
277
- if ( childNode . name . toLowerCase ( ) === 'setter' && childNode . attributes !== undefined && setter === undefined ) {
279
+ if ( childNode . name . toLowerCase ( ) === 'setter' && childNode . attributes !== undefined ) {
278
280
const attributesCopy : { [ key : string ] : string } = this . toLowercaseDictionary ( childNode . attributes ) ;
279
281
const newSetter = {
280
282
expression : attributesCopy [ 'expression' ] ,
281
283
property : attributesCopy [ 'property' ] ,
282
284
value : attributesCopy [ 'value' ]
283
285
} as ISetter ;
284
- setter = newSetter ;
286
+ if ( ! setters ) {
287
+ setters = [ ] ;
288
+ }
289
+ setters ?. push ( newSetter ) ;
285
290
}
286
291
} ) ;
287
292
}
288
- return setter ;
293
+ return setters ;
289
294
}
290
295
291
296
private addCategoryStylingToNodes ( directedGraph : IDirectedGraph ) : void {
@@ -315,4 +320,70 @@ export class DgmlParser {
315
320
} ) ;
316
321
}
317
322
}
323
+
324
+ private addStylingToCategories ( directedGraph : IDirectedGraph ) : void {
325
+ if ( directedGraph . categories !== undefined &&
326
+ directedGraph . categories . length > 0 &&
327
+ directedGraph . styles !== undefined &&
328
+ directedGraph . styles . length > 0 ) {
329
+ directedGraph . styles . forEach ( style => {
330
+ if ( style . condition !== undefined &&
331
+ style . condition . expression !== undefined &&
332
+ style . setters !== undefined &&
333
+ style . setters . length > 0 ) {
334
+ const regex = / H a s C a t e g o r y \( [ ' " ] ( \w + ) [ ' " ] \) + / ig;
335
+ const match = regex . exec ( style . condition . expression ) ;
336
+ if ( match ) {
337
+ const categoryName = match [ 1 ] ;
338
+ const category = directedGraph . categories . find ( category => category . id . toLowerCase ( ) === categoryName . toLowerCase ( ) ) ;
339
+ if ( category ) {
340
+ style . setters . forEach ( setter => {
341
+ if ( setter . property !== undefined ) {
342
+ if ( setter . property . toLowerCase ( ) === 'stroke' ) {
343
+ category . stroke = setter . value ;
344
+ }
345
+ if ( setter . property . toLowerCase ( ) === 'strokethickness' ) {
346
+ category . strokeThickness = setter . value ;
347
+ }
348
+ if ( setter . property . toLowerCase ( ) === 'strokedasharray' ) {
349
+ category . strokeDashArray = setter . value ;
350
+ }
351
+ if ( setter . property . toLowerCase ( ) === 'strokedasharray' ) {
352
+ category . strokeDashArray = setter . value ;
353
+ }
354
+ if ( setter . property . toLowerCase ( ) === 'fontfamily' ) {
355
+ category . fontFamily = setter . value ;
356
+ }
357
+ if ( setter . property . toLowerCase ( ) === 'fontsize' ) {
358
+ category . fontSize = + setter . value ;
359
+ }
360
+ if ( setter . property . toLowerCase ( ) === 'fontstyle' ) {
361
+ category . fontStyle = setter . value ;
362
+ }
363
+ if ( setter . property . toLowerCase ( ) === 'fontweight' ) {
364
+ category . fontWeight = setter . value ;
365
+ }
366
+ if ( setter . property . toLowerCase ( ) === 'background' ) {
367
+ category . background = setter . value ;
368
+ }
369
+ if ( setter . property . toLowerCase ( ) === 'horizontalalignment' ) {
370
+ category . horizontalAlignment = setter . value ;
371
+ }
372
+ if ( setter . property . toLowerCase ( ) === 'verticalalignment' ) {
373
+ category . verticalAlignment = setter . value ;
374
+ }
375
+ if ( setter . property . toLowerCase ( ) === 'minwidth' ) {
376
+ category . minWidth = + setter . value ;
377
+ }
378
+ if ( setter . property . toLowerCase ( ) === 'maxwidth' ) {
379
+ category . maxWidth = + setter . value ;
380
+ }
381
+ }
382
+ } ) ;
383
+ }
384
+ }
385
+ }
386
+ } ) ;
387
+ }
388
+ }
318
389
}
0 commit comments