realizing I should just use cmark and come back if I still don't like something later

This commit is contained in:
Pagwin 2025-05-09 20:32:43 -04:00
parent 07218a32a6
commit 925c70f52b
No known key found for this signature in database
GPG key ID: 81137023740CA260
2 changed files with 37 additions and 44 deletions

View file

@ -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

View file

@ -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