init.ml
This commit is contained in:
0
.config/.ocamlformat
Normal file
0
.config/.ocamlformat
Normal file
19
.config/dune
Normal file
19
.config/dune
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
(library
|
||||||
|
(name init)
|
||||||
|
(libraries
|
||||||
|
store
|
||||||
|
js_of_ocaml-compiler js_of_ocaml-tyxml js_of_ocaml-toplevel
|
||||||
|
lwt js_of_ocaml-lwt
|
||||||
|
;; not used directly
|
||||||
|
graphics
|
||||||
|
js_of_ocaml.deriving
|
||||||
|
react reactiveData
|
||||||
|
str dynlink
|
||||||
|
ocp-indent.lib
|
||||||
|
higlo
|
||||||
|
js_of_ocaml-lwt.graphics
|
||||||
|
js_of_ocaml-ppx
|
||||||
|
uucp
|
||||||
|
httpaf)
|
||||||
|
(modules init)
|
||||||
|
)
|
||||||
2
.config/dune-project
Normal file
2
.config/dune-project
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
(lang dune 3.4)
|
||||||
|
(name init)
|
||||||
114
.config/init.ml
Normal file
114
.config/init.ml
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
open Js_of_ocaml
|
||||||
|
open Js_of_ocaml_tyxml
|
||||||
|
open Lwt
|
||||||
|
open Store
|
||||||
|
|
||||||
|
let by_id s = Dom_html.getElementById s
|
||||||
|
|
||||||
|
let by_id_coerce s f =
|
||||||
|
Js.Opt.get
|
||||||
|
(f (Dom_html.getElementById s))
|
||||||
|
(fun () -> raise Not_found)
|
||||||
|
|
||||||
|
let do_by_id s f =
|
||||||
|
try f (Dom_html.getElementById s) with Not_found -> ()
|
||||||
|
|
||||||
|
let resize ~container ~textbox () =
|
||||||
|
Lwt.pause () >>= fun () ->
|
||||||
|
textbox##.style##.height := Js.string "auto";
|
||||||
|
textbox##.style##.height
|
||||||
|
:= Js.string (Printf.sprintf "%dpx" (max 18 textbox##.scrollHeight));
|
||||||
|
container##.scrollTop := container##.scrollHeight;
|
||||||
|
Lwt.return ()
|
||||||
|
|
||||||
|
let setup_storeview ~container ~textbox ~(storeview : Store.t Lwt.t) :
|
||||||
|
unit =
|
||||||
|
let storeview_container = by_id "toplevel-storeview" in
|
||||||
|
Lwt.async (fun _ ->
|
||||||
|
storeview >>= fun storeview ->
|
||||||
|
Firebug.console##log "setup_storeview";
|
||||||
|
Store.S.Tree.list storeview [] >>= fun all ->
|
||||||
|
ignore
|
||||||
|
(List.fold_left
|
||||||
|
(fun acc tok ->
|
||||||
|
match tok with
|
||||||
|
| step, _tree ->
|
||||||
|
let a =
|
||||||
|
Tyxml_js.Html.(
|
||||||
|
a
|
||||||
|
~a:
|
||||||
|
[
|
||||||
|
a_class [ "list-group-item" ];
|
||||||
|
a_onclick (fun _ ->
|
||||||
|
textbox##.value :=
|
||||||
|
(Js.string acc)##trim;
|
||||||
|
Lwt.async (fun () ->
|
||||||
|
resize ~container ~textbox ()
|
||||||
|
>>= fun () ->
|
||||||
|
textbox##focus;
|
||||||
|
Lwt.return_unit);
|
||||||
|
true);
|
||||||
|
]
|
||||||
|
[ txt step ])
|
||||||
|
in
|
||||||
|
Dom.appendChild storeview_container
|
||||||
|
(Tyxml_js.To_dom.of_a a);
|
||||||
|
"")
|
||||||
|
"" all);
|
||||||
|
Lwt.return_unit)
|
||||||
|
|
||||||
|
(* TODO replace with Angstrom like httpaf *)
|
||||||
|
let headers_of_string_list (sl : string list) : Httpaf.Headers.t =
|
||||||
|
Httpaf.Headers.of_list
|
||||||
|
(List.filter_map
|
||||||
|
(fun s ->
|
||||||
|
Firebug.console##log (F.str "headerparse: %s" s);
|
||||||
|
Option.map
|
||||||
|
(fun i ->
|
||||||
|
( String.trim (String.sub s 0 i),
|
||||||
|
String.trim
|
||||||
|
(String.sub s (i + 1) (String.length s - i - 1)) ))
|
||||||
|
(String.index_opt s ':'))
|
||||||
|
sl)
|
||||||
|
|
||||||
|
let setup_workspace ~container cstore : unit Lwt.t =
|
||||||
|
let render ~container cstore : unit Lwt.t =
|
||||||
|
let module Headers = Httpaf.Headers in
|
||||||
|
Store.S.Tree.list cstore [] >>= fun csl ->
|
||||||
|
container##.innerHTML := Js.string "";
|
||||||
|
Lwt_list.iter_s
|
||||||
|
(fun (step, tree) ->
|
||||||
|
Firebug.console##log (F.str ".config/workspace/%s" step);
|
||||||
|
Store.S.Tree.get tree [] >>= fun contents ->
|
||||||
|
let headers =
|
||||||
|
headers_of_string_list (String.split_on_char '\n' contents)
|
||||||
|
in
|
||||||
|
Firebug.console##log
|
||||||
|
(F.str "Headers:\n%a" Headers.pp_hum headers);
|
||||||
|
let uri =
|
||||||
|
Uri.of_string
|
||||||
|
(Option.fold ~none:""
|
||||||
|
~some:(fun s -> s)
|
||||||
|
(Headers.get headers "path"))
|
||||||
|
in
|
||||||
|
Dom.appendChild container
|
||||||
|
(Tyxml_js.To_dom.of_a
|
||||||
|
Tyxml_js.Html.(
|
||||||
|
a
|
||||||
|
~a:[ a_class [ "window" ] ]
|
||||||
|
[
|
||||||
|
div
|
||||||
|
~a:[ a_class [ "status" ] ]
|
||||||
|
[
|
||||||
|
txt
|
||||||
|
(F.str "Name: %s; Path: %a" step Uri.pp_hum
|
||||||
|
uri);
|
||||||
|
];
|
||||||
|
div
|
||||||
|
~a:[ a_class [ "output" ] ]
|
||||||
|
[ txt (F.str "%s" contents) ];
|
||||||
|
]));
|
||||||
|
Lwt.return_unit)
|
||||||
|
csl
|
||||||
|
in
|
||||||
|
cstore >>= render ~container
|
||||||
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
*~
|
||||||
Reference in New Issue
Block a user