{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}

module Celtchar.Novel.Ogmarkup where

import Text.Ogmarkup
import Data.Text (Text, append)
import Data.String
import Text.Shakespeare.Text

import Celtchar.Novel.Structure (Language(..))

data NovConf = NovConf Language

el :: Text
el = "\n\n"

blk :: Text
    -> Text
blk = (`append` el)

instance GenConf NovConf Text where
    typography (NovConf French) = frenchTypo
    typography (NovConf English) = englishTypo

    printSpace _ None = ""
    printSpace _ Normal = " "
    printSpace _ Nbsp = "~"

    betweenDialogue _ = el

    storyTemplate _ sec = blk [st|\paragraph{} #{sec}|]

    paragraphTemplate _ = blk

    dialogueTemplate _ _ txt = [st|\dialogue{}#{txt}|]
    thoughtTemplate _ _ txt = [st|\thought{}#{txt}|]
    replyTemplate _ txt = [st|\reply{#{txt}}|]

    strongEmphTemplate _ txt = [st|\textbf{#{txt}}|]
    emphTemplate _ txt = [st|\textit{#{txt}}|]

parseDoc :: Language -> Text -> Text
parseDoc lang doc = ogmarkup doc $ NovConf lang