Skip to content

Commit bcb9820

Browse files
Fix default rendering
1 parent eacca1d commit bcb9820

1 file changed

Lines changed: 26 additions & 17 deletions

File tree

src/KDL/Render.hs

Lines changed: 26 additions & 17 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,49 @@ 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
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+
6776
renderEntry :: Entry -> Text
6877
renderEntry 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

Comments
 (0)