1
- import vscode , { TextDocument , TextEditor , TextEditorEdit } from "vscode" ;
1
+ import vscode , { TextDocument , TextEditor , TextEditorEdit , ViewColumn , WebviewPanel } from "vscode" ;
2
2
import { ParserError , ParserErrorLevel } from "@azimutt/models" ;
3
3
import { generateSql , parseSql } from "@azimutt/parser-sql" ;
4
4
import {
@@ -14,10 +14,26 @@ import {
14
14
} from "@azimutt/aml" ;
15
15
16
16
export function activate ( context : vscode . ExtensionContext ) {
17
+ let previewPanel : WebviewPanel | undefined = undefined
17
18
context . subscriptions . push (
18
- vscode . commands . registerTextEditorCommand ( 'vscode-aml.fromJson' , ( editor : TextEditor , edit : TextEditorEdit ) => convertJson ( editor , edit ) ) ,
19
- vscode . commands . registerTextEditorCommand ( 'vscode-aml.fromSQL' , ( editor : TextEditor , edit : TextEditorEdit ) => convertSql ( editor , edit ) ) ,
20
- vscode . commands . registerTextEditorCommand ( 'vscode-aml.convert' , ( editor : TextEditor , edit : TextEditorEdit ) => convertAml ( editor , edit ) )
19
+ vscode . commands . registerTextEditorCommand ( 'aml.fromJson' , ( editor : TextEditor , edit : TextEditorEdit ) => convertJson ( editor , edit ) ) ,
20
+ vscode . commands . registerTextEditorCommand ( 'aml.fromSQL' , ( editor : TextEditor , edit : TextEditorEdit ) => convertSql ( editor , edit ) ) ,
21
+ vscode . commands . registerTextEditorCommand ( 'aml.convert' , ( editor : TextEditor , edit : TextEditorEdit ) => convertAml ( editor , edit ) ) ,
22
+ vscode . commands . registerTextEditorCommand ( 'aml.preview' , ( editor : TextEditor , edit : TextEditorEdit ) => {
23
+ vscode . window . showInformationMessage ( 'aml.preview called' )
24
+ if ( editor . document . languageId !== 'aml' ) {
25
+ vscode . window . showErrorMessage ( 'Needs AML file to preview it.' )
26
+ return
27
+ }
28
+ const viewColumn = editor . viewColumn ? editor . viewColumn + 1 : ViewColumn . Two
29
+ if ( ! previewPanel ) {
30
+ previewPanel = vscode . window . createWebviewPanel ( 'aml-preview' , 'Preview AML' , { viewColumn, preserveFocus : true } , { localResourceRoots : [ ] } )
31
+ previewPanel . onDidDispose ( ( ) => previewPanel = undefined , null , context . subscriptions )
32
+ }
33
+ updateAmlPreview ( editor . document , previewPanel , viewColumn )
34
+ // TODO: update preview when editor text changes or when editor changes to another aml (with debounce)
35
+ // vscode.window.onDidChangeActiveTextEditor((editor: TextEditor) => {})
36
+ } )
21
37
)
22
38
}
23
39
@@ -101,6 +117,28 @@ async function convertAml(editor: TextEditor, edit: TextEditorEdit): Promise<voi
101
117
}
102
118
}
103
119
120
+ function updateAmlPreview ( doc : TextDocument , panel : WebviewPanel , col : ViewColumn ) {
121
+ panel . title = 'Preview ' + doc . fileName
122
+ panel . webview . html = buildAmlPreview ( doc . getText ( ) )
123
+ if ( panel . viewColumn !== col ) {
124
+ panel . reveal ( col )
125
+ }
126
+ }
127
+
128
+ function buildAmlPreview ( aml : string ) : string {
129
+ return `<!DOCTYPE html>
130
+ <html lang="en">
131
+ <head>
132
+ <meta charset="UTF-8">
133
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
134
+ <title>AML preview</title>
135
+ </head>
136
+ <body>
137
+ <pre>${ aml } </pre>
138
+ </body>
139
+ </html>` ;
140
+ }
141
+
104
142
async function openFile ( lang : string , content : string ) : Promise < TextDocument > {
105
143
const doc : TextDocument = await vscode . workspace . openTextDocument ( { language : lang , content : content } )
106
144
await vscode . window . showTextDocument ( doc )
@@ -124,5 +162,6 @@ function formatErrorLevel(level: ParserErrorLevel): string {
124
162
case 'warning' : return '[WARN]'
125
163
case 'info' : return '[INFO]'
126
164
case 'hint' : return '[HINT]'
165
+ default : return '[ERR] '
127
166
}
128
167
}
0 commit comments