Skip to content

Commit 828aa32

Browse files
Add webpreview
1 parent fbf9734 commit 828aa32

File tree

3 files changed

+90
-1
lines changed

3 files changed

+90
-1
lines changed

release/package.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,13 @@
4545
},{
4646
"command": "ff.Show",
4747
"title": "F# Formatting: Show"
48+
},{
49+
"command": "webpreview.Show",
50+
"title": "Ionide: Show Web View"
51+
}
52+
,{
53+
"command": "webpreview.Refresh",
54+
"title": "Ionide: Refresh Web View"
4855
}],
4956
"outputChannels": [
5057
"F# Interactive"
@@ -70,7 +77,8 @@
7077
"vscode.fsharp"
7178
],
7279
"dependencies": {
73-
"xhr2": "*"
80+
"xhr2": "*",
81+
"toml": "*"
7482
},
7583
"devDependencies": {
7684
"vscode": "*"

src/Components/WebPreview.fs

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,93 @@ open FunScript.TypeScript.child_process
99
open FunScript.TypeScript.fs
1010

1111
open DTO
12+
open Ionide.VSCode
1213
open Ionide.VSCode.Helpers
1314

1415

1516
[<ReflectedDefinition>]
1617
module 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
()

src/main.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ let translateModules (typ : System.Type) fileName =
6161
yield "var XMLHttpRequest = require('xhr2');"
6262
yield "var fs = require('fs');"
6363
yield "var path = require('path');"
64+
yield "var toml = require('toml');"
6465
yield "var window = {
6566
Math: Math,
6667
JSON: JSON,

0 commit comments

Comments
 (0)