{-# OPTIONS_GHC -Wall #-}
module DatabaseDesign.Ampersand.Misc.Explain
    ( string2Blocks
    , blocks2String
    , PandocFormat(..)
    )
where

import Text.Pandoc
import Data.List (isPrefixOf)
import DatabaseDesign.Ampersand.Core.ParseTree      (PandocFormat(..))


-- | use a suitable format to read generated strings. if you have just normal text, ReST is fine.
-- | defaultPandocReader flags should be used on user-defined strings.
string2Blocks :: PandocFormat -> String -> [Block]
string2Blocks defaultformat str
 = case blocks of             -- WHY (SJ, dec 7th, 2011): What is the point of changing Para into Plain?
    [Para is] -> [Plain is]   -- BECAUSE (SJ, dec 7th, 2011): The table of relations in the LaTeX output of ChapterDataAnalysis gives errors when LaTeX is run, because Para generates a newline that LaTeX cannot cope with.
    _         -> blocks       --                              However, this Para is generated by Pandoc, so I'm wondering whether the mistake is in Pandoc? Anyway, this solution is a dirty fix, which I don't like.
   where 
     Pandoc _ blocks = thePandocParser (removeCRs str')
     removeCRs :: String -> String
     removeCRs [] = []
     removeCRs ('\r' :'\n' : xs) = '\n' : removeCRs xs
     removeCRs (c:xs) = c:removeCRs xs
     (thePandocParser,str') = whatParser2UseOnWhatString
     whatParser2UseOnWhatString :: (String -> Pandoc,String)
     whatParser2UseOnWhatString -- = (readRST, str)
        | markDownPrefix `isPrefixOf` str = (readMarkdown def, drop (length markDownPrefix) str)
        | reSTPrefix     `isPrefixOf` str = (readRST      def, drop (length reSTPrefix)     str)
        | hTMLPrefix     `isPrefixOf` str = (readHtml     def, drop (length hTMLPrefix)     str)
         --stateParseRaw=True e.g. such that "\ref{something}" is not read as "\{something\}". with parse raw it's read as inline latex
         --maybe html should be parsed raw too...
        | laTeXPrefix    `isPrefixOf` str = (readLaTeX    def, drop (length laTeXPrefix)    str)
        | otherwise   = case defaultformat of
                               Markdown  -> (readMarkdown def, str)
                               ReST      -> (readRST      def, str)
                               HTML      -> (readHtml     def, str)
                               LaTeX     -> (readLaTeX    def, str)
       where markDownPrefix = makePrefix Markdown
             reSTPrefix     = makePrefix ReST
             hTMLPrefix     = makePrefix HTML
             laTeXPrefix    = makePrefix LaTeX

makePrefix :: PandocFormat -> String             
makePrefix format = ":"++show format++":"

-- | write [Block] as String in a certain format using defaultWriterOptions
blocks2String :: PandocFormat -> Bool -> [Block] -> String
blocks2String format writeprefix ec 
 = [c | c<-makePrefix format,writeprefix]
   --you cannot unwords lines for all writers, because white lines have a meaning in LaTeX i.e. \par
   --if your application of blocks2String may not have line breaks, then unwords lines there
   ++ {- unwords -} ( {-lines $ -} writer def (Pandoc nullMeta ec))
   where writer = case format of
            Markdown  -> writeMarkdown
            ReST      -> writeRST
            HTML      -> writeHtmlString
            LaTeX     -> writeLaTeX