1
1
"use strict" ;
2
2
3
3
import { Tooltip } from "bootstrap" ;
4
- import { TreeView } from "./tree_view .js" ;
4
+ import { StructureView } from "./structure_view .js" ;
5
5
import { SyntaxView } from "./syntax_view.js" ;
6
6
import { StatisticsView } from "./statistics_view.js" ;
7
- import { Popover } from "./popover.js" ;
8
7
import { WebSocketClient } from "./websocket.js" ;
9
8
import { debounce } from "./debounce.js" ;
10
9
11
10
import "../css/editor.css" ;
12
- import "../css/syntax.css" ;
13
11
14
12
import "ace-builds/src-min-noconflict/ace" ;
15
13
import "ace-builds/src-min-noconflict/ext-language_tools" ;
@@ -50,9 +48,9 @@ export class App {
50
48
showPrintMargin : false ,
51
49
} ) ;
52
50
53
- this . treeViewContainer = document . getElementById ( "structure" ) ;
54
- this . popover = new Popover ( ) ;
55
-
51
+ this . structureView = new StructureView (
52
+ document . getElementById ( "structure" )
53
+ ) ;
56
54
this . syntaxView = new SyntaxView (
57
55
document . getElementById ( "syntax-container" )
58
56
) ;
@@ -202,11 +200,8 @@ export class App {
202
200
}
203
201
204
202
updateStructure ( structureData ) {
205
- this . treeViewContainer . innerHTML = "" ;
206
- this . treeView = new TreeView ( this . treeViewContainer , structureData ) ;
207
-
208
- let mouseoverCancel = undefined ;
209
- this . treeView . onmouseover = ( event , target , data ) => {
203
+ this . structureView . update ( structureData ) ;
204
+ this . structureView . onmouseover = ( event , target , data ) => {
210
205
this . editor . selection . setRange (
211
206
new Range (
212
207
data . range . startRow ,
@@ -215,189 +210,6 @@ export class App {
215
210
data . range . endColumn
216
211
)
217
212
) ;
218
-
219
- if ( mouseoverCancel ) {
220
- cancelAnimationFrame ( mouseoverCancel ) ;
221
- }
222
- mouseoverCancel = requestAnimationFrame ( ( ) => {
223
- if ( ! data . structure . length && ! data . token ) {
224
- return ;
225
- }
226
- if ( data . structure . length > 0 ) {
227
- const container = document . createElement ( "div" ) ;
228
-
229
- const title = document . createElement ( "div" ) ;
230
- title . classList . add ( "title" ) ;
231
- title . innerText = `${ data . text } Syntax` ;
232
- container . appendChild ( title ) ;
233
-
234
- switch ( data . type ) {
235
- case "decl" : {
236
- const label = document . createElement ( "span" ) ;
237
- label . classList . add ( "badge" , "text-bg-light" ) ;
238
- label . innerText = "DeclSyntax" ;
239
- title . appendChild ( label ) ;
240
- break ;
241
- }
242
- case "expr" : {
243
- const label = document . createElement ( "span" ) ;
244
- label . classList . add ( "badge" , "text-bg-light" ) ;
245
- label . innerText = "ExprSyntax" ;
246
- title . appendChild ( label ) ;
247
- break ;
248
- }
249
- case "pattern" : {
250
- const label = document . createElement ( "span" ) ;
251
- label . classList . add ( "badge" , "text-bg-light" ) ;
252
- label . innerText = "PatternSyntax" ;
253
- title . appendChild ( label ) ;
254
- break ;
255
- }
256
- case "type" : {
257
- const label = document . createElement ( "span" ) ;
258
- label . classList . add ( "badge" , "text-bg-light" ) ;
259
- label . innerText = "TypeSyntax" ;
260
- title . appendChild ( label ) ;
261
- break ;
262
- }
263
- default :
264
- break ;
265
- }
266
-
267
- const dl = document . createElement ( "dl" ) ;
268
-
269
- const dt = document . createElement ( "dt" ) ;
270
- const dd = document . createElement ( "dd" ) ;
271
-
272
- dt . innerHTML = "Source Range" ;
273
- const range = data . range ;
274
- // prettier-ignore
275
- dd . innerHTML = `Ln ${ range . startRow + 1 } , Col ${ range . startColumn + 1 } - Ln ${ range . endRow + 1 } , Col ${ range . endColumn + 1 } ` ;
276
-
277
- dl . appendChild ( dt ) ;
278
- dl . appendChild ( dd ) ;
279
-
280
- for ( const property of data . structure ) {
281
- const dt = document . createElement ( "dt" ) ;
282
- const dd = document . createElement ( "dd" ) ;
283
-
284
- const name = property . name ;
285
- const value = property . value ;
286
- if ( value && value . text && value . kind ) {
287
- const text = stripHTMLTag ( value . text ) ;
288
- const kind = stripHTMLTag ( value . kind ) ;
289
- dt . innerHTML = `${ name } ` ;
290
- dd . innerHTML = `${ text } <span class="badge rounded-pill">${ kind } </span>` ;
291
- } else if ( value && value . text ) {
292
- const text = stripHTMLTag ( value . text ) ;
293
- dt . innerHTML = `${ name } ` ;
294
- dd . innerHTML = `${ text } ` ;
295
- }
296
- dl . appendChild ( dt ) ;
297
- dl . appendChild ( dd ) ;
298
- }
299
- container . appendChild ( dl ) ;
300
-
301
- this . popover . content = container . innerHTML ;
302
- }
303
- if ( data . token ) {
304
- const container = document . createElement ( "div" ) ;
305
-
306
- const title = document . createElement ( "div" ) ;
307
- title . classList . add ( "title" ) ;
308
- title . innerText = "TokenSyntax" ;
309
- container . appendChild ( title ) ;
310
-
311
- const dl = document . createElement ( "dl" ) ;
312
-
313
- {
314
- const dt = document . createElement ( "dt" ) ;
315
- const dd = document . createElement ( "dd" ) ;
316
-
317
- dt . innerHTML = "Source Range" ;
318
- const range = data . range ;
319
- // prettier-ignore
320
- dd . innerHTML = `Ln ${ range . startRow + 1 } , Col ${ range . startColumn + 1 } - Ln ${ range . endRow + 1 } , Col ${ range . endColumn + 1 } ` ;
321
-
322
- dl . appendChild ( dt ) ;
323
- dl . appendChild ( dd ) ;
324
- }
325
-
326
- {
327
- const dt = document . createElement ( "dt" ) ;
328
- dt . innerHTML = "kind" ;
329
- dl . appendChild ( dt ) ;
330
-
331
- const dd = document . createElement ( "dd" ) ;
332
- dd . innerHTML = stripHTMLTag ( data . token . kind ) ;
333
- dl . appendChild ( dd ) ;
334
- }
335
- {
336
- const dt = document . createElement ( "dt" ) ;
337
- dt . innerHTML = "leadingTrivia" ;
338
- dl . appendChild ( dt ) ;
339
-
340
- const dd = document . createElement ( "dd" ) ;
341
- dd . innerHTML = stripHTMLTag ( data . token . leadingTrivia ) ;
342
- dl . appendChild ( dd ) ;
343
- }
344
- {
345
- const dt = document . createElement ( "dt" ) ;
346
- dt . innerHTML = "text" ;
347
- dl . appendChild ( dt ) ;
348
-
349
- const dd = document . createElement ( "dd" ) ;
350
- dd . innerHTML = stripHTMLTag ( data . text ) ;
351
- dl . appendChild ( dd ) ;
352
- }
353
- {
354
- const dt = document . createElement ( "dt" ) ;
355
- dt . innerHTML = "trailingTrivia" ;
356
- dl . appendChild ( dt ) ;
357
-
358
- const dd = document . createElement ( "dd" ) ;
359
- dd . innerHTML = stripHTMLTag ( data . token . trailingTrivia ) ;
360
-
361
- dl . appendChild ( dd ) ;
362
- }
363
- container . appendChild ( dl ) ;
364
-
365
- this . popover . content = container . innerHTML ;
366
- }
367
-
368
- const tabContainerRect = document
369
- . querySelector ( ".tab-content" )
370
- . getBoundingClientRect ( ) ;
371
-
372
- const parent = target . parentElement ;
373
- const caret = parent . querySelector ( ":scope > div > .caret" ) ;
374
- this . popover . show ( caret || target , {
375
- lowerLimit : tabContainerRect . top + tabContainerRect . height ,
376
- offsetX : caret ? 0 : 24 ,
377
- } ) ;
378
- } ) ;
379
- } ;
380
-
381
- let mouseoutCancel = undefined ;
382
- this . treeView . onmouseout = ( event , target , data ) => {
383
- if ( mouseoutCancel ) {
384
- cancelAnimationFrame ( mouseoutCancel ) ;
385
- }
386
- mouseoutCancel = requestAnimationFrame ( ( ) => {
387
- if ( ! event . relatedTarget . classList . contains ( "popover-content" ) ) {
388
- this . popover . hide ( ) ;
389
- }
390
- } ) ;
391
- } ;
392
-
393
- let mouseoutCancel2 = undefined ;
394
- this . popover . onmouseout = ( event ) => {
395
- if ( mouseoutCancel2 ) {
396
- cancelAnimationFrame ( mouseoutCancel2 ) ;
397
- }
398
- mouseoutCancel2 = requestAnimationFrame ( ( ) => {
399
- this . popover . hide ( ) ;
400
- } ) ;
401
213
} ;
402
214
}
403
215
@@ -452,19 +264,3 @@ function hideLoading() {
452
264
document . getElementById ( "run-button-icon" ) . classList . remove ( "d-none" ) ;
453
265
document . getElementById ( "run-button-spinner" ) . classList . add ( "d-none" ) ;
454
266
}
455
-
456
- function stripHTMLTag ( text ) {
457
- const div = document . createElement ( "div" ) ;
458
- div . innerHTML = text
459
- . replace ( / & l t ; / g, "<" )
460
- . replace ( / & g t ; / g, ">" )
461
- . replace ( / & # 0 3 9 ; / g, "'" )
462
- . replace ( / & a m p ; / g, "&" ) ;
463
- return escapeHTML ( div . textContent || div . innerText || "" ) ;
464
- }
465
-
466
- function escapeHTML ( text ) {
467
- const div = document . createElement ( "div" ) ;
468
- div . appendChild ( document . createTextNode ( text ) ) ;
469
- return div . innerHTML ;
470
- }
0 commit comments