{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
module Text.MMark.Extension.PunctuationPrettifier
( punctuationPrettifier )
where
import Data.Char (isSpace)
import Data.Text (Text)
import Text.MMark.Extension (Extension, Inline (..))
import qualified Data.Text as T
import qualified Text.MMark.Extension as Ext
punctuationPrettifier :: Extension
punctuationPrettifier = Ext.inlineTrans $ \case
Plain txt -> Plain (T.unfoldr gen (True, txt))
other -> other
gen
:: (Bool, Text)
-> Maybe (Char, (Bool, Text))
gen (s, i) =
case T.uncons i of
Nothing -> Nothing
Just ('.', i') ->
case T.splitAt 2 i' of
("..", i'') -> Just ('…', (False, i''))
_ -> Just ('.', (False, i'))
Just ('-', i') ->
case T.splitAt 2 i' of
("--", i'') -> Just ('—', (False, i''))
_ ->
case T.splitAt 1 i' of
("-", i'') -> Just ('–', (False, i''))
_ -> Just ('-', (False, i'))
Just ('\"', i') ->
if s
then Just ('“', (False, i'))
else Just ('”', (False, i'))
Just ('\'', i') ->
if s
then Just ('‘', (False, i'))
else Just ('’', (False, i'))
Just (ch, i') ->
Just (ch, (isSpace ch, i'))