{-# LANGUAGE NoImplicitPrelude #-}

module Bamboo.Type.Reader where

import Bamboo.Helper.ByteString
import Bamboo.Helper.PreludeEnv
import Data.Default
import Text.Pandoc
import Text.XHtml.Strict
import qualified Data.ByteString.Char8 as S
import qualified Data.ByteString.Char8 as S
import qualified Data.Map as Map


data Reader = Markdown | RST | HTML | Latex deriving (Show, Eq)

instance Default Reader where
  def = Markdown

readers :: [(Reader, [String])]
readers = 
  [ (Markdown,  ["markdown", "md"])
  , (RST,       ["rst"]  )
  , (HTML,      ["html", "htm"])
  , (Latex,     ["tex", "latex"])
  ] .map_snd (map ("." ++))


reader_map :: Map.Map String Reader
reader_map  = readers.map gen_lookup.join'.to_h
  where gen_lookup (r, xs) = xs.labeling (const r)

guess_reader :: String -> Maybe Reader
guess_reader ext = reader_map.Map.lookup ext

to_html :: (ParserState -> a -> Pandoc) -> a -> Html
to_html r = r defaultParserState > writeHtml defaultWriterOptions

rr :: Reader -> S.ByteString -> Html
rr Markdown    = to_us > to_html readMarkdown
rr RST         = to_us > to_html readRST
rr HTML        = to_us > primHtml
rr Latex       = to_us > to_html readLaTeX

render_to_html :: Reader -> S.ByteString -> Html
render_to_html = rr