1
1
import { ArrowType , BoundingBox , Category , Edge , NetworkNode , Node , NodeType , Position } from "@model" ;
2
+ import * as xmldom from '@xmldom/xmldom' ;
2
3
3
4
export class DgmlManager {
4
5
5
- public createNewDirectedGraph ( domImpl : DOMImplementation , direction : string , layout : string , zoomLevel : string ) : Document {
6
- let xmlDoc : Document = domImpl . createDocument ( '' , null , null ) ;
6
+ public createNewDirectedGraph ( domImpl : xmldom . DOMImplementation , direction : string , layout : string , zoomLevel : string ) : xmldom . Document {
7
+ let xmlDoc : xmldom . Document = domImpl . createDocument ( '' , '' , null ) ;
7
8
const root = xmlDoc . createElement ( "DirectedGraph" ) ;
8
9
if ( direction . length > 0 ) {
9
10
root . setAttribute ( "GraphDirection" , direction ) ;
@@ -15,50 +16,50 @@ export class DgmlManager {
15
16
return xmlDoc ;
16
17
}
17
18
18
- private addNodeToRoot ( xmlDoc : Document , tagName : string ) : Element | null {
19
+ private addNodeToRoot ( xmlDoc : xmldom . Document , tagName : string ) : xmldom . Element | undefined | null {
19
20
const root = xmlDoc . documentElement ;
20
- const elements = root . getElementsByTagName ( tagName ) ;
21
- let nodeElement : Element ;
22
- if ( elements . length === 0 ) {
21
+ const elements = root ? .getElementsByTagName ( tagName ) ;
22
+ let nodeElement : xmldom . Element ;
23
+ if ( elements ? .length === 0 ) {
23
24
nodeElement = xmlDoc . createElement ( tagName ) ;
24
- root . appendChild ( nodeElement ) ;
25
+ root ? .appendChild ( nodeElement ) ;
25
26
return nodeElement ;
26
27
}
27
28
else {
28
- const exitingNode = elements . item ( 0 ) ;
29
+ const exitingNode = elements ? .item ( 0 ) ;
29
30
return exitingNode ;
30
31
}
31
32
}
32
33
33
- private addNode ( element : Element | null , nodeElement : Element , attribute : string = 'Id' ) {
34
+ private addNode ( element : xmldom . Element | undefined | null , nodeElement : xmldom . Element , attribute : string = 'Id' ) {
34
35
if ( element !== null ) {
35
36
let nodeAlreadyAdded = false ;
36
- if ( element . childNodes . length > 0 ) {
37
+ if ( element != undefined && element . childNodes . length > 0 ) {
37
38
for ( let i = 0 ; i < element . childNodes . length ; i ++ ) {
38
39
let node = element . childNodes [ i ] ;
39
- if ( node . nodeType === 1 && ( node as Element ) . hasAttribute ( attribute ) &&
40
- ( node as Element ) . getAttribute ( attribute ) ?. toLowerCase ( ) === nodeElement . getAttribute ( attribute ) ?. toLowerCase ( ) ) {
40
+ if ( node . nodeType === 1 && ( node as xmldom . Element ) . hasAttribute ( attribute ) &&
41
+ ( node as xmldom . Element ) . getAttribute ( attribute ) ?. toLowerCase ( ) === nodeElement . getAttribute ( attribute ) ?. toLowerCase ( ) ) {
41
42
nodeAlreadyAdded = true ;
42
43
}
43
44
}
44
45
}
45
46
if ( ! nodeAlreadyAdded ) {
46
- element . appendChild ( nodeElement ) ;
47
+ element ? .appendChild ( nodeElement ) ;
47
48
}
48
49
}
49
50
}
50
51
51
- private addLinkNode ( xmlDoc : Document , element : Element | null , source : string , target : string , categoryId : string , label : string | undefined ) {
52
+ private addLinkNode ( xmlDoc : xmldom . Document , element : xmldom . Element | undefined | null , source : string , target : string , categoryId : string , label : string | undefined ) {
52
53
if ( element !== null ) {
53
54
let nodeAlreadyAdded = false ;
54
- if ( element . childNodes . length > 0 ) {
55
- for ( let i = 0 ; i < element . childNodes . length ; i ++ ) {
56
- let node = element . childNodes [ i ] ;
55
+ if ( element != undefined && element . childNodes . length > 0 ) {
56
+ for ( let i = 0 ; i < element ? .childNodes . length ; i ++ ) {
57
+ let node = element ? .childNodes [ i ] ;
57
58
if ( node . nodeType === 1 &&
58
- ( node as Element ) . hasAttribute ( "Source" ) &&
59
- ( node as Element ) . hasAttribute ( "Target" ) &&
60
- ( node as Element ) . getAttribute ( "Source" ) ?. toLowerCase ( ) === source . toLowerCase ( ) &&
61
- ( node as Element ) . getAttribute ( "Target" ) ?. toLowerCase ( ) === target . toLowerCase ( ) ) {
59
+ ( node as xmldom . Element ) . hasAttribute ( "Source" ) &&
60
+ ( node as xmldom . Element ) . hasAttribute ( "Target" ) &&
61
+ ( node as xmldom . Element ) . getAttribute ( "Source" ) ?. toLowerCase ( ) === source . toLowerCase ( ) &&
62
+ ( node as xmldom . Element ) . getAttribute ( "Target" ) ?. toLowerCase ( ) === target . toLowerCase ( ) ) {
62
63
nodeAlreadyAdded = true ;
63
64
}
64
65
}
@@ -71,12 +72,12 @@ export class DgmlManager {
71
72
if ( label !== undefined ) {
72
73
linkElement . setAttribute ( "Label" , label ) ;
73
74
}
74
- element . appendChild ( linkElement ) ;
75
+ element ? .appendChild ( linkElement ) ;
75
76
}
76
77
}
77
78
}
78
79
79
- public addNodesAndLinks ( xmlDoc : Document , nodes : Node [ ] , nodeInfoDictionary : { [ id : string ] : NetworkNode } , edges : Edge [ ] ) {
80
+ public addNodesAndLinks ( xmlDoc : xmldom . Document , nodes : Node [ ] , nodeInfoDictionary : { [ id : string ] : NetworkNode } , edges : Edge [ ] ) {
80
81
const nodesElement = this . addNodeToRoot ( xmlDoc , "Nodes" ) ;
81
82
const linksElement = this . addNodeToRoot ( xmlDoc , "Links" ) ;
82
83
const categoryDictionary : { [ nodeType : string ] : Category } = { } ;
@@ -116,7 +117,7 @@ export class DgmlManager {
116
117
}
117
118
}
118
119
119
- private generateDirectedGraphNodesXml ( xmlDoc : Document , node : Node , nodesElement : Element | null ) {
120
+ private generateDirectedGraphNodesXml ( xmlDoc : xmldom . Document , node : Node , nodesElement : xmldom . Element | undefined | null ) {
120
121
const nodeElement = xmlDoc . createElement ( "Node" ) ;
121
122
nodeElement . setAttribute ( "Label" , node . name ) ;
122
123
nodeElement . setAttribute ( "Id" , node . id ) ;
@@ -143,18 +144,18 @@ export class DgmlManager {
143
144
return `${ position . x } ,${ position . y } ,${ width } ,${ height } ` ;
144
145
}
145
146
146
- private generateDirectedGraphLinksXml ( xmlDoc : Document , edge : Edge , linksElement : Element | null ) {
147
+ private generateDirectedGraphLinksXml ( xmlDoc : xmldom . Document , edge : Edge , linksElement : xmldom . Element | undefined | null ) {
147
148
const categoryId = ArrowType [ edge . arrowType ] ;
148
149
this . addLinkNode ( xmlDoc , linksElement , edge . source , edge . target , categoryId , edge . getEdgeTitle ( ) ) ;
149
150
}
150
151
151
- private addCategoryRef ( xmlDoc : Document , node : Element , categoryRef : string ) {
152
+ private addCategoryRef ( xmlDoc : xmldom . Document , node : xmldom . Element , categoryRef : string ) {
152
153
const categoryElement = xmlDoc . createElement ( "Category" ) ;
153
154
categoryElement . setAttribute ( "Ref" , categoryRef ) ;
154
155
node . appendChild ( categoryElement ) ;
155
156
}
156
157
157
- private addCategory ( xmlDoc : Document , categoriesElement : Element | null , category : Category ) {
158
+ private addCategory ( xmlDoc : xmldom . Document , categoriesElement : xmldom . Element | undefined | null , category : Category ) {
158
159
if ( categoriesElement !== null && ( category . backgroundColor || category . stroke || category . icon ) ) {
159
160
const categoryElement = xmlDoc . createElement ( "Category" ) ;
160
161
categoryElement . setAttribute ( "Id" , category . id ) ;
@@ -175,14 +176,14 @@ export class DgmlManager {
175
176
}
176
177
}
177
178
178
- private addCategoriesAndStyles ( xmlDoc : Document , categories : { [ nodeType : string ] : Category } ) {
179
+ private addCategoriesAndStyles ( xmlDoc : xmldom . Document , categories : { [ nodeType : string ] : Category } ) {
179
180
const categoriesElement = this . addNodeToRoot ( xmlDoc , "Categories" ) ;
180
181
Object . keys ( categories ) . forEach ( nodeType => {
181
182
this . addCategory ( xmlDoc , categoriesElement , categories [ nodeType ] ) ;
182
183
} ) ;
183
184
}
184
185
185
- private addProperties ( xmlDoc : Document ) {
186
+ private addProperties ( xmlDoc : xmldom . Document ) {
186
187
const propertiesElement = this . addNodeToRoot ( xmlDoc , "Properties" ) ;
187
188
this . addProperty ( xmlDoc , propertiesElement , "TypescriptFilepath" , "System.String" , "Typescript filepath" , true ) ;
188
189
this . addProperty ( xmlDoc , propertiesElement , "Background" , "System.Windows.Media.Brush" ) ;
@@ -194,7 +195,7 @@ export class DgmlManager {
194
195
this . addProperty ( xmlDoc , propertiesElement , "Bounds" , "System.Windows.Rect" ) ;
195
196
}
196
197
197
- private addProperty ( xmlDoc : Document , propertiesElement : Element | null , idValue : string , datatypeValue : string , label : string | undefined = undefined , isReference : boolean | undefined = undefined ) {
198
+ private addProperty ( xmlDoc : xmldom . Document , propertiesElement : xmldom . Element | undefined | null , idValue : string , datatypeValue : string , label : string | undefined = undefined , isReference : boolean | undefined = undefined ) {
198
199
const propertyElement = xmlDoc . createElement ( "Property" ) ;
199
200
propertyElement . setAttribute ( "Id" , idValue ) ;
200
201
propertyElement . setAttribute ( "DataType" , datatypeValue ) ;
0 commit comments