@@ -9,13 +9,93 @@ open FunScript.TypeScript.child_process
99open FunScript.TypeScript .fs
1010
1111open DTO
12+ open Ionide.VSCode
1213open Ionide.VSCode .Helpers
1314
1415
1516[<ReflectedDefinition>]
1617module WebPreview =
18+ [<FunScript.JSEmitInline " (vscode.workspace.registerTextDocumentContentProvider({0}, {1}))" >]
19+ let registerTextDocumentContentProvider ( scheme : string , provider : TextDocumentContentProvider ) : Disposable = failwith " JS"
20+
21+ let private previewUri = Uri.parse " webpreview://preview"
22+ let private eventEmitter = EventEmitter.Create ()
23+ let private update = eventEmitter.fire
24+
25+
26+ let mutable linuxPrefix = " "
27+ let mutable command = " packages/FAKE/tools/FAKE.exe"
28+ let mutable host = " "
29+ let mutable port = 8083
30+ let mutable script = " "
31+ let mutable build = " "
32+ let mutable startString = " "
33+ let mutable parameters = [||]
34+ let mutable startingPage = " "
35+ let mutable fakeProcess : ChildProcess Option = None
36+
37+
38+
39+
40+ let loadSettings () =
41+ linuxPrefix <- Settings.loadOrDefault ( fun s -> s.WebPreview.linuxPrefix) " mono"
42+ command <- Settings.loadOrDefault ( fun s -> s.WebPreview.command) " packages/FAKE/tools/FAKE.exe"
43+ host <- Settings.loadOrDefault ( fun s -> s.WebPreview.host) " localhost"
44+ port <- Settings.loadOrDefault ( fun s -> s.WebPreview.port) 8888
45+ script <- Settings.loadOrDefault ( fun s -> s.WebPreview.script) " build.fsx"
46+ build <- Settings.loadOrDefault ( fun s -> s.WebPreview.build) " Serve"
47+ startString <- Settings.loadOrDefault ( fun s -> s.WebPreview.startString) " listener started"
48+ parameters <- Settings.loadOrDefault ( fun s -> s.WebPreview.parameters) [||]
49+ startingPage <- Settings.loadOrDefault ( fun s -> s.WebPreview.startingPage) " "
50+ ()
51+
52+ let private createProvider () =
53+ let provider = createEmpty< TextDocumentContentProvider> ()
54+
55+ let generate () =
56+ let src = sprintf " http://%s :%d /%s " host port startingPage
57+ let style = " height: 100%; width: 100%; background-color: white;"
58+ sprintf " <iframe style='%s ' src='%s ' />" style src
59+
60+ provider.`` provideTextDocumentContent <- `` (( fun _ -> generate ()) |> unbox<_>)
61+ provider.onDidChange <- eventEmitter.event
62+ provider
63+
64+ let parseResponse o =
65+ if JS.isDefined o && o <> null then
66+ let str = o.ToString ()
67+ if str.Contains startString then
68+ vscode.commands.Globals.executeCommandOverload2( " vscode.previewHtml" , previewUri, 2 )
69+ |> ignore
70+ Globals.console.log <| o.ToString ()
71+ ()
72+
73+ let close () =
74+ try
75+ fakeProcess |> Option.iter ( fun p ->
76+ p.kill ()
77+ fakeProcess <- None)
78+ with
79+ | _ -> ()
80+
81+ let show () =
82+ loadSettings ()
83+ if fakeProcess.IsSome then close ()
84+ let cp =
85+ let args = sprintf " %s %s port=%d " script build port
86+ let args ' = parameters |> Array.fold ( fun acc e -> acc + " " + e) args
87+ Process.spawn command linuxPrefix args'
88+
89+ cp.stdout.on ( " readable" , unbox< Function> ( cp.stdout.read >> parseResponse )) |> ignore
90+ cp.stderr.on ( " readable" , unbox< Function> ( cp.stdout.read >> ( fun o -> if JS.isDefined o && o <> null then Globals.console.error <| o.ToString ()) )) |> ignore
91+ fakeProcess <- Some cp
1792
1893
1994
2095 let activate ( disposables : Disposable []) =
96+ let prov = createProvider ()
97+ registerTextDocumentContentProvider( " webpreview" , prov) |> ignore
98+
99+ commands.Globals.registerCommand( " webpreview.Show" , show |> unbox) |> ignore
100+ commands.Globals.registerCommand( " webpreview.Refresh" , ( fun _ -> eventEmitter.fire previewUri) |> unbox) |> ignore
21101 ()
0 commit comments