9 -- XXX This define is a bit of a hack, and should be done more nicely
10 #define FAST_STRING_NOT_NEEDED 1
11 #include "HsVersions.h"
16 import Data.Char (isSpace)
20 | DocAppend (HsDoc id) (HsDoc id)
22 | DocParagraph (HsDoc id)
25 | DocEmphasis (HsDoc id)
26 | DocMonospaced (HsDoc id)
27 | DocUnorderedList [HsDoc id]
28 | DocOrderedList [HsDoc id]
29 | DocDefList [(HsDoc id, HsDoc id)]
30 | DocCodeBlock (HsDoc id)
36 type LHsDoc a = Located (HsDoc a)
38 instance Outputable (HsDoc a) where
39 ppr _ = text "<document comment>"
41 ppr_mbDoc :: Maybe (LHsDoc a) -> SDoc
42 ppr_mbDoc (Just doc) = ppr doc
43 ppr_mbDoc Nothing = empty
45 -- used to make parsing easier; we group the list items later
46 docAppend :: HsDoc id -> HsDoc id -> HsDoc id
47 docAppend (DocUnorderedList ds1) (DocUnorderedList ds2)
48 = DocUnorderedList (ds1++ds2)
49 docAppend (DocUnorderedList ds1) (DocAppend (DocUnorderedList ds2) d)
50 = DocAppend (DocUnorderedList (ds1++ds2)) d
51 docAppend (DocOrderedList ds1) (DocOrderedList ds2)
52 = DocOrderedList (ds1++ds2)
53 docAppend (DocOrderedList ds1) (DocAppend (DocOrderedList ds2) d)
54 = DocAppend (DocOrderedList (ds1++ds2)) d
55 docAppend (DocDefList ds1) (DocDefList ds2)
56 = DocDefList (ds1++ds2)
57 docAppend (DocDefList ds1) (DocAppend (DocDefList ds2) d)
58 = DocAppend (DocDefList (ds1++ds2)) d
59 docAppend DocEmpty d = d
60 docAppend d DocEmpty = d
64 -- again to make parsing easier - we spot a paragraph whose only item
65 -- is a DocMonospaced and make it into a DocCodeBlock
66 docParagraph :: HsDoc id -> HsDoc id
67 docParagraph (DocMonospaced p)
68 = DocCodeBlock (docCodeBlock p)
69 docParagraph (DocAppend (DocString s1) (DocMonospaced p))
71 = DocCodeBlock (docCodeBlock p)
72 docParagraph (DocAppend (DocString s1)
73 (DocAppend (DocMonospaced p) (DocString s2)))
74 | all isSpace s1 && all isSpace s2
75 = DocCodeBlock (docCodeBlock p)
76 docParagraph (DocAppend (DocMonospaced p) (DocString s2))
78 = DocCodeBlock (docCodeBlock p)
83 -- Drop trailing whitespace from @..@ code blocks. Otherwise this:
89 -- turns into (DocCodeBlock "\nfoo\n ") which when rendered in HTML
90 -- gives an extra vertical space after the code block. The single space
91 -- on the final line seems to trigger the extra vertical space.
93 docCodeBlock :: HsDoc id -> HsDoc id
94 docCodeBlock (DocString s)
95 = DocString (reverse $ dropWhile (`elem` " \t") $ reverse s)
96 docCodeBlock (DocAppend l r)
97 = DocAppend l (docCodeBlock r)