diff --git a/app/Markdown.hs b/app/Markdown.hs index 6a1333c..c0ca295 100644 --- a/app/Markdown.hs +++ b/app/Markdown.hs @@ -1,4 +1,41 @@ +{-# LANGUAGE FlexibleContexts #-} + module Markdown where +import Data.Functor (void) +import Data.Text (Text, pack) +import Text.Parsec + -- https://spec.commonmark.org/0.31.2/ -- https://hackage.haskell.org/package/parsec + +linebreak :: + (Monad m, Stream s m Char) => + 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 + level <- fmap length $ many1 $ char '#' + text <- line + pure (level, text) + +-- TODO: blockquote, single backticks, triple backticks, links, arb HTML