realizing I should just use cmark and come back if I still don't like something later
This commit is contained in:
parent
07218a32a6
commit
925c70f52b
2 changed files with 37 additions and 44 deletions
|
@ -1,30 +1,43 @@
|
||||||
{-# LANGUAGE RankNTypes, FlexibleContexts #-}
|
{-# LANGUAGE FlexibleContexts #-}
|
||||||
|
{-# LANGUAGE RankNTypes #-}
|
||||||
|
|
||||||
module Markdown.Data
|
module Markdown.Data
|
||||||
( MarkDownElement,
|
( MListItem,
|
||||||
MListItem,
|
|
||||||
Parser,
|
Parser,
|
||||||
|
MarkdownElement
|
||||||
|
( MHeading,
|
||||||
|
MParagraph,
|
||||||
|
MBold,
|
||||||
|
MItalic,
|
||||||
|
MBoldItalic,
|
||||||
|
MLink,
|
||||||
|
MLine,
|
||||||
|
MUnorderedList,
|
||||||
|
MOrderedList,
|
||||||
|
Only
|
||||||
|
),
|
||||||
)
|
)
|
||||||
where
|
where
|
||||||
|
|
||||||
import Data.Text
|
import Data.Text
|
||||||
import Text.Parsec
|
import Text.Parsec
|
||||||
|
|
||||||
-- modified version of https://github.com/tusharad/markdown-parser
|
-- very slightly modified version of https://github.com/tusharad/markdown-parser
|
||||||
data MarkDownElement
|
data MarkdownElement
|
||||||
= MHeading Int MarkDownElement
|
= MHeading Int MarkdownElement
|
||||||
| MParagraph MarkDownElement
|
| MParagraph MarkdownElement
|
||||||
| MBold MarkDownElement
|
| MBold MarkdownElement
|
||||||
| MItalic MarkDownElement
|
| MItalic MarkdownElement
|
||||||
| MBoldItalic MarkDownElement
|
| MBoldItalic MarkdownElement
|
||||||
| MLink MarkDownElement Text
|
| MLink MarkdownElement Text
|
||||||
| MLine [MarkDownElement]
|
| MLine [MarkdownElement]
|
||||||
| MUnorderedList [MListItem]
|
| MUnorderedList [MListItem]
|
||||||
| MOrderedList [MListItem]
|
| MOrderedList [MListItem]
|
||||||
|
| Raw Text -- HTML contained in the markdown
|
||||||
| Only Text -- Bottom of all types
|
| Only Text -- Bottom of all types
|
||||||
deriving (Eq, Show)
|
deriving (Eq, Show)
|
||||||
|
|
||||||
data MListItem = MListItem MarkDownElement [MarkDownElement]
|
data MListItem = MListItem MarkdownElement [MarkdownElement]
|
||||||
deriving (Eq, Show)
|
deriving (Eq, Show)
|
||||||
|
|
||||||
type Parser v = forall s u m. (Monad m, Stream s m Char) => ParsecT s u m v
|
type Parser v = forall s u m. (Monad m, Stream s m Char) => ParsecT s u m v
|
||||||
|
|
|
@ -1,44 +1,24 @@
|
||||||
{-# LANGUAGE FlexibleContexts #-}
|
{-# LANGUAGE FlexibleContexts #-}
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
|
||||||
module Markdown.Parser
|
module Markdown.Parser
|
||||||
( Markdown.Parser.lines,
|
( heading,
|
||||||
)
|
)
|
||||||
where
|
where
|
||||||
|
|
||||||
import Data.Functor (void)
|
import Markdown.Data
|
||||||
import Data.Text (Text, pack)
|
|
||||||
import Text.Parsec
|
import Text.Parsec
|
||||||
|
|
||||||
-- https://spec.commonmark.org/0.31.2/
|
-- https://spec.commonmark.org/0.31.2/
|
||||||
-- https://hackage.haskell.org/package/parsec
|
-- https://hackage.haskell.org/package/parsec
|
||||||
|
|
||||||
linebreak ::
|
-- only ATX headings
|
||||||
(Monad m, Stream s m Char) =>
|
heading :: Parser MarkdownElement
|
||||||
ParsecT s u m ()
|
|
||||||
-- 2 newlines due to mark
|
|
||||||
linebreak = void (newline *> newline)
|
|
||||||
|
|
||||||
emptyParse ::
|
|
||||||
(Monad m, Stream s m Char) =>
|
|
||||||
ParsecT s u m String
|
|
||||||
emptyParse = "" <$ notFollowedBy anyChar
|
|
||||||
|
|
||||||
line ::
|
|
||||||
(Monad m, Stream s m Char) =>
|
|
||||||
ParsecT s u m Text
|
|
||||||
line = fmap pack $ many $ notFollowedBy linebreak *> anyChar
|
|
||||||
|
|
||||||
lines ::
|
|
||||||
(Monad m, Stream s m Char) =>
|
|
||||||
ParsecT s u m [Text]
|
|
||||||
lines = line `sepBy` linebreak
|
|
||||||
|
|
||||||
heading ::
|
|
||||||
(Monad m, Stream s m Char) =>
|
|
||||||
ParsecT s u m (Int, Text)
|
|
||||||
heading = do
|
heading = do
|
||||||
level <- fmap length $ many1 $ char '#'
|
-- technically this can lead to illegal heading levels but
|
||||||
text <- line
|
-- all the input is written by me so who cares
|
||||||
pure (level, text)
|
level <- fmap length $ try $ many1 $ char '#'
|
||||||
|
|
||||||
-- TODO: blockquote, single backticks, triple backticks, links, arb HTML
|
return $ MHeading level $ Only "TODO"
|
||||||
|
|
||||||
|
rawHTML
|
||||||
|
|
Loading…
Reference in a new issue