@@ -7,10 +7,6 @@ module KDL.Render (
77 render ,
88
99 -- * Rendering components
10- renderNodeList ,
11- renderNode ,
12- renderEntry ,
13- renderAnn ,
1410 renderValue ,
1511 renderValueData ,
1612 renderIdentifier ,
@@ -38,36 +34,56 @@ import KDL.Types (
3834 )
3935
4036render :: Document -> Text
41- render = renderNodeList
37+ render = renderNodeList 0
4238
43- renderNodeList :: NodeList -> Text
44- renderNodeList NodeList {.. } =
39+ type IndentLevel = Int
40+
41+ renderNodeList :: IndentLevel -> NodeList -> Text
42+ renderNodeList lvl NodeList {.. } =
4543 Text. concat
46- [ maybe " " (. leading) format
47- , foldMap renderNode nodes
44+ [ maybe ( if lvl > 0 then " \n " else " " ) (. leading) format
45+ , foldMap ( renderNode lvl) nodes
4846 , maybe " " (. trailing) format
4947 ]
5048
51- renderNode :: Node -> Text
52- renderNode Node {.. } =
49+ renderNode :: IndentLevel -> Node -> Text
50+ renderNode lvl Node {.. } =
5351 Text. concat
54- [ maybe " " (. leading) format
52+ [ maybe (indent lvl) (. leading) format
5553 , maybe " " renderAnn ann
5654 , renderIdentifier name
5755 , foldMap renderEntry entries
58- , maybe " " (. beforeChildren) format
5956 , case children of
6057 Nothing -> " "
61- Just nodes -> " {" <> renderNodeList nodes <> " }"
58+ Just nodes ->
59+ Text. concat
60+ [ maybe " " (. beforeChildren) format
61+ , renderChildren lvl nodes
62+ ]
6263 , maybe " " (. beforeTerminator) format
63- , maybe " " (. terminator) format
64+ , maybe " \n " (. terminator) format
6465 , maybe " " (. trailing) format
6566 ]
6667
68+ renderChildren :: IndentLevel -> NodeList -> Text
69+ renderChildren lvl nodeList =
70+ case nodeList. format of
71+ -- Special case empty node list to render as "{}"
72+ Nothing | null nodeList. nodes -> " {}"
73+ _ ->
74+ Text. concat
75+ [ " {"
76+ , renderNodeList (lvl + 1 ) nodeList
77+ , indent lvl <> " }"
78+ ]
79+
80+ indent :: IndentLevel -> Text
81+ indent lvl = Text. replicate lvl " "
82+
6783renderEntry :: Entry -> Text
6884renderEntry Entry {.. } =
6985 Text. concat
70- [ maybe " " (. leading) format
86+ [ maybe " " (. leading) format
7187 , case name of
7288 Nothing -> renderValue value
7389 Just nameId ->
0 commit comments