0 | module Text.Markdown.Data
5 | import Derive.Prelude
8 | %language ElabReflection
14 | | Italics (List Inline)
15 | | Bold (List Inline)
16 | | Link (List Inline) String
17 | | Image String String
18 | | Html String (List Inline)
20 | %runElab derive "Inline" [Eq, Show]
24 | ListItem = List Inline
28 | = Header Nat (List Inline)
29 | | UList (List ListItem)
30 | | CodeBlock String (Maybe String)
32 | | Paragraph (List Inline)
34 | %runElab derive "Block" [Eq, Show]
40 | %runElab derive "Markdown" [Eq, Show]
42 | %name Markdown
markdown
46 | concatInlineVals : List Inline -> String
47 | concatInlineVals [] = ""
48 | concatInlineVals (x :: xs) = inlineValue x <+> concatInlineVals xs
50 | inlineValue : Inline -> String
51 | inlineValue (Text txt) = txt
52 | inlineValue (Pre txt) = txt
53 | inlineValue (Italics inlines) = concatInlineVals inlines
54 | inlineValue (Bold inlines) = concatInlineVals inlines
55 | inlineValue (Link inlines _) = concatInlineVals inlines
56 | inlineValue (Image alt _) = alt
57 | inlineValue (Html _ inlines) = concatInlineVals inlines
65 | normalise : Markdown -> Markdown
66 | normalise (Doc blocks) = Doc (map normBlockTexts blocks)
68 | normInlineTexts : List Inline -> List Inline
69 | normInlineTexts [] = []
70 | normInlineTexts (Italics inlines :: xs) =
71 | Italics (normInlineTexts inlines) :: normInlineTexts xs
73 | normInlineTexts (Bold inlines :: xs) =
74 | Bold (normInlineTexts inlines) :: normInlineTexts xs
76 | normInlineTexts (Link inlines str :: xs) =
77 | Link (normInlineTexts inlines) str :: normInlineTexts xs
79 | normInlineTexts (Html str inlines :: xs) =
80 | Html str (normInlineTexts inlines) :: normInlineTexts xs
82 | normInlineTexts (Text txt1 :: Text txt2 :: xs) =
83 | assert_total $
normInlineTexts (Text (txt1 <+> txt2) :: xs)
85 | normInlineTexts (x :: xs) = x :: normInlineTexts xs
87 | normList : List ListItem -> List ListItem
89 | normList (x :: xs) = normInlineTexts x :: normList xs
91 | normBlockTexts : Block -> Block
92 | normBlockTexts (Header level inlines) =
93 | Header level (normInlineTexts inlines)
95 | normBlockTexts (UList inlines) = UList (normList inlines)
96 | normBlockTexts (Paragraph inlines) = Paragraph (normInlineTexts inlines)
97 | normBlockTexts block = block