module AnsiStyle
  ( toAnsi
  ) where

data Style
  = Normal
  | Emphasized
  | Code
  deriving (Show)

data Text = Text
  { style :: Style
  , parsed :: String
  , rest :: String
  } deriving (Show)

getStyle :: Style -> Char -> (Style, String)
getStyle Normal '*' = (Emphasized, "\x1B[1m")
getStyle Normal '_' = (Emphasized, "\x1B[1m")
getStyle Normal '`' = (Code, "\x1B[4m")
getStyle Emphasized '*' = (Normal, "\x1B[21m")
getStyle Emphasized '_' = (Normal, "\x1B[21m")
getStyle Code '`' = (Normal, "\x1B[24m")
getStyle s c = (s, [c])

toAnsi :: String -> String
toAnsi s = parsed $ parseNote $ Text Normal [] s

parseNote :: Text -> Text
parseNote (Text s p (c:t)) = do
  let (s1, c1) = getStyle s c
  parseNote $ Text s1 (p ++ c1) t
parseNote (Text s p ([])) = Text s p []