Source file slipshow_communication.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
open Code_mirror
let preview ?slipshow_js ?frontmatter ?read_file () =
let id = ref 0 in
let open Fut.Syntax in
fun ~ms state content ->
incr id;
let my_id = !id in
let+ () = Fut.tick ~ms in
if my_id = !id then
Previewer.preview ?slipshow_js ?frontmatter ?read_file state content
let update_slipshow ?slipshow_js ?frontmatter ?read_file () =
let preview = preview ?slipshow_js ?frontmatter ?read_file () in
fun state view ->
let open Editor in
let content =
let state = View.state view in
let text = State.doc state in
let lines =
Text.to_jstr_array text |> Array.map Jstr.to_string |> Array.to_list
in
String.concat "\n" lines
in
preview state content
let slipshow_plugin ?slipshow_js ?frontmatter ?read_file preview_element =
let open Editor in
let update_slipshow =
update_slipshow ?slipshow_js ?frontmatter ?read_file ()
in
View.ViewPlugin.define (fun view ->
let state = Previewer.create_previewer preview_element in
let _ : unit Fut.t = update_slipshow ~ms:0 state view in
let update upd =
let _ : unit Fut.t =
if View.Update.docChanged upd then update_slipshow ~ms:500 state view
else Fut.return ()
in
()
in
let destruct () = () in
{ update; destruct })