From 2e9860d147c1383713d66af2e1cbcab19a8d9d84 Mon Sep 17 00:00:00 2001 From: Pagwin Date: Thu, 8 May 2025 19:44:43 -0400 Subject: [PATCH] started work on markdown parser --- app/Markdown.hs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) 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