0 | module Text.Markdown.Parser
2 | import Text.Markdown.Lexer
3 | import Text.Markdown.Data
8 | import public Text.Markdown.Tokens
15 | markdown : Grammar state MarkdownToken False Markdown
19 | (map Just horizontalRules)
20 | <|> (map (const Nothing) $
blankLine)
21 | <|> (map Just header)
22 | <|> (map Just paragraph)
24 | pure $
Doc (mapMaybe id els)
28 | inline : Grammar state MarkdownToken True Inline
44 | parts : Grammar state MarkdownToken True Inline
46 | map (const $
Text "!") (match ImageSym)
49 | wrapInline : MarkdownTokenKind -> (List Inline -> a) -> Grammar state MarkdownToken True a
50 | wrapInline sym tok =
53 | contents <- some inline
55 | pure $
tok $
toList contents
58 | blankLine : Grammar state MarkdownToken True ()
60 | map (const ()) (match BlankLine)
64 | header : Grammar state MarkdownToken True Block
67 | level <- match HeadingSym
69 | contents <- someTill blockTerminal inline
70 | pure $
Header level $
toList contents
74 | horizontalRules : Grammar state MarkdownToken True Block
75 | horizontalRules = do
76 | match MdHorizontalRules
77 | pure HorizontalRules
86 | blockTerminal : Grammar state MarkdownToken False ()
88 | (map (const ()) $
(some blankLine))
89 | <|> (map (const ()) $
(some horizontalRules))
97 | newLineInline : Grammar state MarkdownToken True Inline
99 | map (\_ => NewLine) (match MdNewLine)
103 | paragraph : Grammar state MarkdownToken True Block
106 | contents <- some inline
107 | pure $
Paragraph $
toList contents
110 | text : Grammar state MarkdownToken True Inline
112 | map Text (match MdText)
115 | pre : Grammar state MarkdownToken True Inline
117 | map Pre (match MdPre)
120 | codeBlock : Grammar state MarkdownToken True Inline
122 | map (uncurry CodeBlock) (match MdCodeBlock)
126 | bold : Grammar state MarkdownToken True Inline
128 | wrapInline BoldSym Bold
132 | italics : Grammar state MarkdownToken True Inline
134 | wrapInline ItalicsSym Italics
137 | image : Grammar state MarkdownToken True Inline
145 | buildImage : (String, String) -> Grammar state MarkdownToken False Inline
146 | buildImage (alt, src) =
147 | pure $
Image alt src
150 | link : Grammar state MarkdownToken True Inline
152 | map (\(href, desc) => Link href desc) (match MdLink)
156 | html : Grammar state MarkdownToken True Inline
159 | openTag <- match HtmlOpenTag
160 | contents <- many inline
162 | pure $
Html openTag contents
165 | closer : String -> Grammar state MarkdownToken True ()
168 | closeTag <- match HtmlCloseTag
169 | checkTag closeTag tag
172 | checkTag : String -> String -> Grammar state MarkdownToken False ()
176 | else fail "tag mismatch"
180 | parseMarkdown : List MarkdownToken -> Maybe Markdown
181 | parseMarkdown toks =
183 | bounds = MkBounds 0 0 10000000 80
184 | boundedToks = map (\tok => MkBounded tok True bounds) toks
186 | case parse markdown boundedToks of
187 | Right (j, []) => Just j