@@ -7,16 +7,13 @@ module KDL.Render (
77 render ,
88
99 -- * Rendering components
10- renderNodeList ,
11- renderNode ,
12- renderEntry ,
13- renderAnn ,
1410 renderValue ,
1511 renderValueData ,
1612 renderIdentifier ,
1713) where
1814
1915import Data.Char (isDigit )
16+ import Data.Maybe (fromMaybe )
2017import Data.Text (Text )
2118import Data.Text qualified as Text
2219import KDL.Types (
@@ -37,36 +34,49 @@ import KDL.Types (
3734 )
3835
3936render :: Document -> Text
40- render = renderNodeList
37+ render = renderNodeList 0
4138
42- renderNodeList :: NodeList -> Text
43- renderNodeList NodeList {.. } =
39+ type IndentLevel = Int
40+
41+ renderNodeList :: IndentLevel -> NodeList -> Text
42+ renderNodeList lvl NodeList {.. } =
4443 Text. concat
45- [ maybe " " (. leading) format
46- , foldMap renderNode nodes
47- , 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
4847 ]
4948
50- renderNode :: Node -> Text
51- renderNode Node {.. } =
49+ renderNode :: IndentLevel -> Node -> Text
50+ renderNode lvl Node {.. } =
5251 Text. concat
53- [ maybe " " (. leading) format
52+ [ maybe (indent lvl) (. leading) format
5453 , maybe " " renderAnn ann
5554 , renderIdentifier name
5655 , foldMap renderEntry entries
57- , maybe " " (. beforeChildren) format
56+ , let def_ = if children == Nothing then " " else " "
57+ in maybe def_ (. beforeChildren) format
5858 , case children of
5959 Nothing -> " "
60- Just nodes -> " { " <> renderNodeList nodes <> " } "
60+ Just nodes -> renderChildren lvl nodes
6161 , maybe " " (. beforeTerminator) format
62- , maybe " " (. terminator) format
62+ , maybe " \n " (. terminator) format
6363 , maybe " " (. trailing) format
6464 ]
6565
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+
6676renderEntry :: Entry -> Text
6777renderEntry Entry {.. } =
6878 Text. concat
69- [ maybe " " (. leading) format
79+ [ maybe " " (. leading) format
7080 , case name of
7181 Nothing -> renderValue value
7282 Just nameId ->
@@ -96,7 +106,7 @@ renderValue :: Value -> Text
96106renderValue Value {.. } =
97107 Text. concat
98108 [ maybe " " renderAnn ann
99- , maybe (renderValueData data_) (. repr) format
109+ , fromMaybe (renderValueData data_) (format >>= ( . repr))
100110 ]
101111
102112renderValueData :: ValueData -> Text
@@ -181,4 +191,4 @@ renderValueData = \case
181191 c -> Text. singleton c
182192
183193renderIdentifier :: Identifier -> Text
184- renderIdentifier ident = maybe ident. value (. repr) ident. format
194+ renderIdentifier ident = fromMaybe ident. value (ident. format >>= ( . repr))
0 commit comments