@@ -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,49 @@ 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
48- , maybe " " (. trailing) format
44+ [ maybe ( if lvl > 0 then " \n " else " " ) (. leading) format
45+ , foldMap ( renderNode lvl) nodes
46+ , maybe (indent (lvl - 1 )) (. 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
56+ , let def_ = if children == Nothing then " " else " "
57+ in maybe def_ (. beforeChildren) format
5958 , case children of
6059 Nothing -> " "
61- Just nodes -> " { " <> renderNodeList nodes <> " } "
60+ Just nodes -> renderChildren lvl nodes
6261 , maybe " " (. beforeTerminator) format
63- , maybe " " (. terminator) format
62+ , maybe " \n " (. terminator) format
6463 , maybe " " (. trailing) format
6564 ]
6665
66+ renderChildren :: IndentLevel -> NodeList -> Text
67+ renderChildren lvl nodeList =
68+ case nodeList. format of
69+ -- Special case empty node list to render as "{}"
70+ Nothing | null nodeList. nodes -> " {}"
71+ _ -> " {" <> renderNodeList (lvl + 1 ) nodeList <> " }"
72+
73+ indent :: IndentLevel -> Text
74+ indent lvl = Text. replicate lvl " "
75+
6776renderEntry :: Entry -> Text
6877renderEntry Entry {.. } =
6978 Text. concat
70- [ maybe " " (. leading) format
79+ [ maybe " " (. leading) format
7180 , case name of
7281 Nothing -> renderValue value
7382 Just nameId ->
0 commit comments