1+ 'use strict'
2+ const path = require ( 'path' )
3+ const pug = require ( 'pug' )
4+ const vscode = require ( 'vscode' )
5+
6+ class SpecWebviewPanel {
7+ constructor ( panel , extensionPath ) {
8+ this . disposables = [ ]
9+ this . panel = panel
10+ this . extensionPath = extensionPath
11+
12+ this . panel . onDidDispose ( ( ) => this . dispose ( ) , null , this . disposables )
13+ this . panel . onDidChangeViewState ( event => { } , null , this . disposables )
14+ this . panel . webview . onDidReceiveMessage ( message => { } , null , this . disposables )
15+ this . panel . webview . html = this . getHtmlForWebview ( extensionPath )
16+ }
17+
18+ static createOrShow ( extensionPath ) {
19+ const column = vscode . window . activeTextEditor ? vscode . window . activeTextEditor . viewColumn : undefined
20+
21+ // If we already have a panel, show it.
22+ if ( SpecWebviewPanel . currentPanel ) {
23+ SpecWebviewPanel . currentPanel . panel . reveal ( column )
24+ return
25+ }
26+
27+ const panel = vscode . window . createWebviewPanel ( SpecWebviewPanel . viewType , 'Spec' , column || vscode . ViewColumn . One , {
28+ enableScripts : true ,
29+ // localResourceRoots: [vscode.Uri.file(path.join(extensionPath, 'media'))]
30+ } )
31+ SpecWebviewPanel . currentPanel = new SpecWebviewPanel ( panel , extensionPath )
32+ }
33+
34+ static revive ( panel , extensionPath ) {
35+ SpecWebviewPanel . currentPanel = new SpecWebviewPanel ( panel , extensionPath )
36+ }
37+
38+ dispose ( ) {
39+ SpecWebviewPanel . currentPanel = undefined
40+
41+ this . panel . dispose ( )
42+ while ( this . disposables . length ) {
43+ const x = this . disposables . pop ( )
44+ if ( x ) x . dispose ( )
45+ }
46+ }
47+
48+ getHtmlForWebview ( extensionPath ) {
49+ const jquery_path = require . resolve ( 'jquery' )
50+ const semjs_path = require . resolve ( 'semantic-ui-css' )
51+ const semcss_path = require . resolve ( 'semantic-ui-css/semantic.min.css' )
52+
53+ const bundle_uri = vscode . Uri . file ( path . join ( extensionPath , 'src' , 'bundle.js' ) ) . with ( { scheme : 'vscode-resource' } )
54+ const ctmcss_uri = vscode . Uri . file ( path . join ( extensionPath , 'src' , 'custom.css' ) ) . with ( { scheme : 'vscode-resource' } )
55+ const semjs_uri = vscode . Uri . file ( semjs_path ) . with ( { scheme : 'vscode-resource' } )
56+ const semcss_uri = vscode . Uri . file ( semcss_path ) . with ( { scheme : 'vscode-resource' } )
57+ const jquery_uri = vscode . Uri . file ( jquery_path ) . with ( { scheme : 'vscode-resource' } )
58+ const compiledFunction = pug . compileFile ( `${ __dirname } \\index.pug` )
59+
60+ return compiledFunction ( {
61+ bundle_uri : bundle_uri ,
62+ jquery_uri : jquery_uri ,
63+ semjs_uri : semjs_uri ,
64+ semcss_uri : semcss_uri ,
65+ ctmcss_uri : ctmcss_uri ,
66+ nonce : getNonce ( )
67+ } )
68+ }
69+ }
70+
71+ SpecWebviewPanel . currentPanel = undefined
72+ SpecWebviewPanel . viewType = 'spec'
73+
74+ function getNonce ( ) {
75+ let text = ''
76+ const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
77+ for ( let i = 0 ; i < 32 ; i ++ ) {
78+ text += possible . charAt ( Math . floor ( Math . random ( ) * possible . length ) )
79+ }
80+ return text
81+ }
82+
83+ exports . SpecWebviewPanel = SpecWebviewPanel
0 commit comments