@@ -28,145 +28,10 @@ export class StructureView {
28
28
return ;
29
29
}
30
30
if ( data . structure . length > 0 ) {
31
- const container = document . createElement ( "div" ) ;
32
-
33
- const title = document . createElement ( "div" ) ;
34
- title . classList . add ( "title" ) ;
35
- title . innerText = `${ data . text } Syntax` ;
36
- container . appendChild ( title ) ;
37
-
38
- switch ( data . type ) {
39
- case "decl" : {
40
- const label = document . createElement ( "span" ) ;
41
- label . classList . add ( "badge" , "text-bg-light" ) ;
42
- label . innerText = "DeclSyntax" ;
43
- title . appendChild ( label ) ;
44
- break ;
45
- }
46
- case "expr" : {
47
- const label = document . createElement ( "span" ) ;
48
- label . classList . add ( "badge" , "text-bg-light" ) ;
49
- label . innerText = "ExprSyntax" ;
50
- title . appendChild ( label ) ;
51
- break ;
52
- }
53
- case "pattern" : {
54
- const label = document . createElement ( "span" ) ;
55
- label . classList . add ( "badge" , "text-bg-light" ) ;
56
- label . innerText = "PatternSyntax" ;
57
- title . appendChild ( label ) ;
58
- break ;
59
- }
60
- case "type" : {
61
- const label = document . createElement ( "span" ) ;
62
- label . classList . add ( "badge" , "text-bg-light" ) ;
63
- label . innerText = "TypeSyntax" ;
64
- title . appendChild ( label ) ;
65
- break ;
66
- }
67
- default :
68
- break ;
69
- }
70
-
71
- const dl = document . createElement ( "dl" ) ;
72
-
73
- const dt = document . createElement ( "dt" ) ;
74
- const dd = document . createElement ( "dd" ) ;
75
-
76
- dt . innerHTML = "Source Range" ;
77
- const range = data . range ;
78
- // prettier-ignore
79
- dd . innerHTML = `Ln ${ range . startRow + 1 } , Col ${ range . startColumn + 1 } - Ln ${ range . endRow + 1 } , Col ${ range . endColumn + 1 } ` ;
80
-
81
- dl . appendChild ( dt ) ;
82
- dl . appendChild ( dd ) ;
83
-
84
- for ( const property of data . structure ) {
85
- const dt = document . createElement ( "dt" ) ;
86
- const dd = document . createElement ( "dd" ) ;
87
-
88
- const name = property . name ;
89
- const value = property . value ;
90
- if ( value && value . text && value . kind ) {
91
- const text = stripHTMLTag ( value . text ) ;
92
- const kind = stripHTMLTag ( value . kind ) ;
93
- dt . innerHTML = `${ name } ` ;
94
- dd . innerHTML = `${ text } <span class="badge rounded-pill">${ kind } </span>` ;
95
- } else if ( value && value . text ) {
96
- const text = stripHTMLTag ( value . text ) ;
97
- dt . innerHTML = `${ name } ` ;
98
- dd . innerHTML = `${ text } ` ;
99
- }
100
- dl . appendChild ( dt ) ;
101
- dl . appendChild ( dd ) ;
102
- }
103
- container . appendChild ( dl ) ;
104
-
105
- this . popover . content = container . innerHTML ;
31
+ this . popover . content = makeSyntaxPopoverContent ( data ) ;
106
32
}
107
33
if ( data . token ) {
108
- const container = document . createElement ( "div" ) ;
109
-
110
- const title = document . createElement ( "div" ) ;
111
- title . classList . add ( "title" ) ;
112
- title . innerText = "TokenSyntax" ;
113
- container . appendChild ( title ) ;
114
-
115
- const dl = document . createElement ( "dl" ) ;
116
-
117
- {
118
- const dt = document . createElement ( "dt" ) ;
119
- const dd = document . createElement ( "dd" ) ;
120
-
121
- dt . innerHTML = "Source Range" ;
122
- const range = data . range ;
123
- // prettier-ignore
124
- dd . innerHTML = `Ln ${ range . startRow + 1 } , Col ${ range . startColumn + 1 } - Ln ${ range . endRow + 1 } , Col ${ range . endColumn + 1 } ` ;
125
-
126
- dl . appendChild ( dt ) ;
127
- dl . appendChild ( dd ) ;
128
- }
129
-
130
- {
131
- const dt = document . createElement ( "dt" ) ;
132
- dt . innerHTML = "kind" ;
133
- dl . appendChild ( dt ) ;
134
-
135
- const dd = document . createElement ( "dd" ) ;
136
- dd . innerHTML = stripHTMLTag ( data . token . kind ) ;
137
- dl . appendChild ( dd ) ;
138
- }
139
- {
140
- const dt = document . createElement ( "dt" ) ;
141
- dt . innerHTML = "leadingTrivia" ;
142
- dl . appendChild ( dt ) ;
143
-
144
- const dd = document . createElement ( "dd" ) ;
145
- dd . innerHTML = stripHTMLTag ( data . token . leadingTrivia ) ;
146
- dl . appendChild ( dd ) ;
147
- }
148
- {
149
- const dt = document . createElement ( "dt" ) ;
150
- dt . innerHTML = "text" ;
151
- dl . appendChild ( dt ) ;
152
-
153
- const dd = document . createElement ( "dd" ) ;
154
- dd . innerHTML = stripHTMLTag ( data . text ) ;
155
- dl . appendChild ( dd ) ;
156
- }
157
- {
158
- const dt = document . createElement ( "dt" ) ;
159
- dt . innerHTML = "trailingTrivia" ;
160
- dl . appendChild ( dt ) ;
161
-
162
- const dd = document . createElement ( "dd" ) ;
163
- dd . innerHTML = stripHTMLTag ( data . token . trailingTrivia ) ;
164
-
165
- dl . appendChild ( dd ) ;
166
- }
167
- container . appendChild ( dl ) ;
168
-
169
- this . popover . content = container . innerHTML ;
34
+ this . popover . content = makeTokenPopoverContent ( data ) ;
170
35
}
171
36
172
37
const tabContainerRect = document
@@ -193,6 +58,113 @@ export class StructureView {
193
58
}
194
59
}
195
60
61
+ function makeSyntaxPopoverContent ( data ) {
62
+ const container = document . createElement ( "div" ) ;
63
+
64
+ const title = document . createElement ( "div" ) ;
65
+ title . classList . add ( "title" ) ;
66
+ title . innerText = `${ data . text } Syntax` ;
67
+ container . appendChild ( title ) ;
68
+
69
+ const label = document . createElement ( "span" ) ;
70
+ label . classList . add ( "badge" , "text-bg-light" ) ;
71
+ switch ( data . type ) {
72
+ case "decl" : {
73
+ label . innerText = "DeclSyntax" ;
74
+ break ;
75
+ }
76
+ case "expr" : {
77
+ label . innerText = "ExprSyntax" ;
78
+ break ;
79
+ }
80
+ case "pattern" : {
81
+ label . innerText = "PatternSyntax" ;
82
+ break ;
83
+ }
84
+ case "type" : {
85
+ label . innerText = "TypeSyntax" ;
86
+ break ;
87
+ }
88
+ default :
89
+ break ;
90
+ }
91
+ title . appendChild ( label ) ;
92
+
93
+ const dl = document . createElement ( "dl" ) ;
94
+
95
+ makeSourceRangePopoverContent ( data , dl ) ;
96
+
97
+ for ( const property of data . structure ) {
98
+ makePropertyPopoverContent ( property , dl ) ;
99
+ }
100
+ container . appendChild ( dl ) ;
101
+
102
+ return container . innerHTML ;
103
+ }
104
+
105
+ function makeTokenPopoverContent ( data ) {
106
+ const container = document . createElement ( "div" ) ;
107
+
108
+ const title = document . createElement ( "div" ) ;
109
+ title . classList . add ( "title" ) ;
110
+ title . innerText = "TokenSyntax" ;
111
+
112
+ container . appendChild ( title ) ;
113
+
114
+ const dl = document . createElement ( "dl" ) ;
115
+
116
+ makeSourceRangePopoverContent ( data , dl ) ;
117
+
118
+ makeDescriptionList ( "kind" , stripHTMLTag ( data . token . kind ) , dl ) ;
119
+ makeDescriptionList (
120
+ "leadingTrivia" ,
121
+ stripHTMLTag ( data . token . leadingTrivia ) ,
122
+ dl
123
+ ) ;
124
+ makeDescriptionList ( "text" , stripHTMLTag ( data . text ) , dl ) ;
125
+ makeDescriptionList (
126
+ "trailingTrivia" ,
127
+ stripHTMLTag ( data . token . trailingTrivia ) ,
128
+ dl
129
+ ) ;
130
+
131
+ container . appendChild ( dl ) ;
132
+
133
+ return container . innerHTML ;
134
+ }
135
+
136
+ function makeSourceRangePopoverContent ( data , list ) {
137
+ const range = data . range ;
138
+ // prettier-ignore
139
+ const details = `Ln ${ range . startRow + 1 } , Col ${ range . startColumn + 1 } - Ln ${ range . endRow + 1 } , Col ${ range . endColumn + 1 } ` ;
140
+ makeDescriptionList ( "Source Range" , details , list ) ;
141
+ }
142
+
143
+ function makePropertyPopoverContent ( property , list ) {
144
+ const details = ( ( ) => {
145
+ const value = property . value ;
146
+ if ( value && value . text && value . kind ) {
147
+ const text = stripHTMLTag ( value . text ) ;
148
+ const kind = stripHTMLTag ( value . kind ) ;
149
+ return `${ text } <span class="badge rounded-pill">${ kind } </span>` ;
150
+ } else if ( value && value . text ) {
151
+ return stripHTMLTag ( value . text ) ;
152
+ }
153
+ } ) ( ) ;
154
+ makeDescriptionList ( property . name , details , list ) ;
155
+ }
156
+
157
+ function makeDescriptionList ( term , details , list ) {
158
+ const dt = document . createElement ( "dt" ) ;
159
+ dt . innerHTML = term ;
160
+
161
+ const dd = document . createElement ( "dd" ) ;
162
+ dd . innerHTML = details ;
163
+
164
+ list . appendChild ( dt ) ;
165
+ list . appendChild ( dd ) ;
166
+ }
167
+
196
168
function stripHTMLTag ( text ) {
197
169
const div = document . createElement ( "div" ) ;
198
170
div . innerHTML = text
0 commit comments