Skip to content

Commit c440a3c

Browse files
Fix default rendering
1 parent eacca1d commit c440a3c

1 file changed

Lines changed: 32 additions & 16 deletions

File tree

src/KDL/Render.hs

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

4036
render :: 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+
6783
renderEntry :: Entry -> Text
6884
renderEntry 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

Comments
 (0)