Source file test_traversal.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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
open! Core
let%expect_test "Traversal can reach nested ppx_html expressions" =
let expr =
Ppx_html_syntax.Model_parser.of_string
~loc:Ppxlib.Location.none
{|
<div>
Outer statement
%{[%html {xxx|<div>Inner statement 1</div>|xxx}]}
%{[%html {xxx|<span>Inner statement 2 %{[%html {yyy|<span>Inner statement 3, nested in 2</span>|yyy}]} </span>|xxx}]}
</div>
|}
in
let all_nodes = ref [] in
let traverser =
object
inherit Ppx_html_traverser.iter as super
method! node node =
all_nodes := node :: !all_nodes;
super#node node
end
in
let () = List.iter ~f:traverser#node expr in
let node_expr =
!all_nodes
|> List.rev
|> List.map ~f:(fun node ->
Ppx_html_expander.Model_code_gen.code
~html_syntax_module:None
~loc:Ppxlib.Location.none
~runtime_kind:Js_of_ocaml
[ node ]
|> Ppxlib.Pprintast.string_of_expression)
in
let string_expr = String.concat ~sep:"\n\n===========================\n\n" node_expr in
print_endline string_expr;
[%expect
{|
Html_syntax.Node.div
[Html_syntax.Node.Primitives.text "Outer statement";
([%html {xxx|<div>Inner statement 1</div>|xxx}] : _);
([%html
{xxx|<span>Inner statement 2 %{[%html {yyy|<span>Inner statement 3, nested in 2</span>|yyy}]} </span>|xxx}] :
_)]
===========================
Html_syntax.Node.Primitives.text "Outer statement"
===========================
([%html {xxx|<div>Inner statement 1</div>|xxx}] : _)
===========================
Html_syntax.Node.div [Html_syntax.Node.Primitives.text "Inner statement 1"]
===========================
Html_syntax.Node.Primitives.text "Inner statement 1"
===========================
([%html
{xxx|<span>Inner statement 2 %{[%html {yyy|<span>Inner statement 3, nested in 2</span>|yyy}]} </span>|xxx}] :
_)
===========================
Html_syntax.Node.span
[Html_syntax.Node.Primitives.text "Inner statement 2 ";
([%html {yyy|<span>Inner statement 3, nested in 2</span>|yyy}] : _);
Html_syntax.Node.Primitives.text " "]
===========================
Html_syntax.Node.Primitives.text "Inner statement 2 "
===========================
([%html {yyy|<span>Inner statement 3, nested in 2</span>|yyy}] : _)
===========================
Html_syntax.Node.span
[Html_syntax.Node.Primitives.text "Inner statement 3, nested in 2"]
===========================
Html_syntax.Node.Primitives.text "Inner statement 3, nested in 2"
===========================
Html_syntax.Node.Primitives.none
|}]
;;