packages feed

markup-preview-0.2.2.0: Application/FileHandling.hs

{-# LANGUAGE CPP #-}
module Application.FileHandling (detectFiletype, renderHtml) where

    import Application.Types

    import Text.Pandoc
    import GHC.IO.Handle
    import System.IO.Temp

#ifdef CABAL
    import Paths_markup_preview
#endif

    import Control.Applicative
    import Data.List
    import Data.List.Utils
    import Data.Maybe
    import qualified Data.Text.IO as T (readFile)
    import Data.Text (Text)


    detectFiletype :: FilePath -> Maybe FileType
    detectFiletype filepath = fst <$> find (any (`isSuffixOf` filepath) . snd)
                            [ (Markdown, [".markdown", ".md"])
                            , (Textile, [".textile"])
                            , (ReStructuredText, [".rst", ".rest", ".restx"]) ]


    readResource :: FilePath -> IO Text
    readResource filepath =
#ifdef CABAL
        getDataFileName filepath >>= \filepath' -> T.readFile filepath'
#endif
#ifndef CABAL
        T.readFile filepath
#endif


    renderHtml :: (FileType, FilePath) -> IO String
    renderHtml (format, filepath) = readFile filepath >>= writeHtmlFile where
        readerF = fromJust $ lookup format [(Markdown, readMarkdown), (ReStructuredText, readRST), (Textile, readTextile)]
        writer = writeHtmlString def
        reader = readerF (def { readerStandalone = True })
        writeHtmlFile content = do
            -- make this cross OS path style handling
            let tempDirectory = (++ "/") . join "/" . init . split "/" $ filepath
            contents <- readResource "Resources/layout.html"
            let layout = compileTemplate contents
            case layout of
              Left s -> putStrLn s >> return "" -- return error file
              Right t -> do
                  let htmlContent = renderTemplate t $ varListToJSON [("htmlContent", writer $ reader content)]
                  (tempFilePath, tempHandle) <- openTempFile tempDirectory "markup-preview.html"
                  hPutStr tempHandle htmlContent >> hFlush tempHandle
                  return ("file://" ++ tempFilePath)