@@ -7,6 +7,9 @@ module KDL.Render (
77 render ,
88
99 -- * Rendering components
10+ renderNodeList ,
11+ renderNode ,
12+ renderEntry ,
1013 renderAnn ,
1114 renderValue ,
1215 renderValueData ,
@@ -20,16 +23,62 @@ import KDL.Types (
2023 Ann (.. ),
2124 AnnFormat (.. ),
2225 Document ,
26+ Entry (.. ),
27+ EntryFormat (.. ),
2328 Identifier (.. ),
2429 IdentifierFormat (.. ),
30+ Node (.. ),
31+ NodeFormat (.. ),
32+ NodeList (.. ),
33+ NodeListFormat (.. ),
2534 Value (.. ),
2635 ValueData (.. ),
2736 ValueFormat (.. ),
2837 )
2938
30- -- TODO: Implement render after parsing Document with formatting information
3139render :: Document -> Text
32- render = error " render is not implemented yet"
40+ render = renderNodeList
41+
42+ renderNodeList :: NodeList -> Text
43+ renderNodeList NodeList {.. } =
44+ Text. concat
45+ [ maybe " " (. leading) format
46+ , foldMap renderNode nodes
47+ , maybe " " (. trailing) format
48+ ]
49+
50+ renderNode :: Node -> Text
51+ renderNode Node {.. } =
52+ Text. concat
53+ [ maybe " " (. leading) format
54+ , maybe " " renderAnn ann
55+ , renderIdentifier name
56+ , foldMap renderEntry entries
57+ , maybe " " (. before_children) format
58+ , case children of
59+ Nothing -> " "
60+ Just nodes -> " {" <> renderNodeList nodes <> " }"
61+ , maybe " " (. before_terminator) format
62+ , maybe " " (. terminator) format
63+ , maybe " " (. trailing) format
64+ ]
65+
66+ renderEntry :: Entry -> Text
67+ renderEntry Entry {.. } =
68+ Text. concat
69+ [ maybe " " (. leading) format
70+ , case name of
71+ Nothing -> renderValue value
72+ Just nameId ->
73+ Text. concat
74+ [ renderIdentifier nameId
75+ , maybe " " (. after_key) format
76+ , " ="
77+ , maybe " " (. after_eq) format
78+ , renderValue value
79+ ]
80+ , maybe " " (. trailing) format
81+ ]
3382
3483renderAnn :: Ann -> Text
3584renderAnn Ann {.. } =
0 commit comments