psb/app/Markdown/Parser.hs
2025-05-09 20:08:42 -04:00

44 lines
954 B
Haskell

{-# LANGUAGE FlexibleContexts #-}
module Markdown.Parser
( Markdown.Parser.lines,
)
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