module Hakyll.Contrib.Agda
(
literateAgdaCompiler
, literateAgdaCompilerWith
, literateAgdaCompilerWithTransform
, literateAgdaCompilerWithTransformM
, defaultFileType
, readLiterateAgda
, CommandLineOptions (..)
, defaultOptions
) where
import Agda.Contrib.Snippets
import Text.Pandoc.Options
import Text.Pandoc.Definition
import Hakyll.Core.Compiler
import Hakyll.Core.Item
import Hakyll.Core.Identifier
import Hakyll.Web.Pandoc
import Hakyll.Web.Pandoc.FileType
import System.FilePath
import System.Directory
import Network.URI
import Control.Exception
literateAgdaCompilerWithTransform
:: CommandLineOptions
-> FileType
-> URI
-> ReaderOptions
-> WriterOptions
-> (Item Pandoc -> Item Pandoc)
-> Compiler (Item String)
literateAgdaCompilerWithTransform opts ft uri ro wo
= literateAgdaCompilerWithTransformM opts ft uri ro wo . (return .)
literateAgdaCompilerWith
:: CommandLineOptions
-> FileType
-> URI
-> ReaderOptions
-> WriterOptions
-> Compiler (Item String)
literateAgdaCompilerWith opts ft uri ro wo
= literateAgdaCompilerWithTransform opts ft uri ro wo id
literateAgdaCompiler
:: CommandLineOptions
-> FileType
-> URI
-> Compiler (Item String)
literateAgdaCompiler opts ft uri
= literateAgdaCompilerWith opts ft uri defaultHakyllReaderOptions defaultHakyllWriterOptions
literateAgdaCompilerWithTransformM
:: CommandLineOptions
-> FileType
-> URI
-> ReaderOptions
-> WriterOptions
-> (Item Pandoc -> Compiler (Item Pandoc))
-> Compiler (Item String)
literateAgdaCompilerWithTransformM opts ft uri ro wo transform =
fmap (writePandocWith wo) $ getResourceBody
>>= readLiterateAgda opts uri
>>= defaultFileType ft (readPandocWith ro)
>>= transform
defaultFileType :: FileType
-> (Item a -> Compiler (Item b))
-> Item a
-> Compiler (Item b)
defaultFileType t act i = do
let tau Binary = t
tau x = x
x <- act (i {itemIdentifier = fromFilePath $ fn -<.> extensionFor (tau $ fileType fn) })
return $ x {itemIdentifier = fromFilePath fn }
where
fn = toFilePath $ itemIdentifier i
extensionFor = \case
Binary -> takeExtension fn
Css -> "css"
DocBook -> "dbk"
Html -> "html"
LaTeX -> "tex"
(LiterateHaskell f) -> extensionFor f ++ ".lhs"
Markdown -> "md"
MediaWiki -> "mediawiki"
OrgMode -> "org"
PlainText -> "txt"
Rst -> "rst"
Textile -> "textile"
readLiterateAgda :: CommandLineOptions
-> URI
-> Item String
-> Compiler (Item String)
readLiterateAgda aopt liburi i =
if isAgda i
then cached cacheName $
do fp <- getResourceFilePath
unsafeCompiler $ bracket getCurrentDirectory setCurrentDirectory $ const $
do abfp <- canonicalizePath fp
setCurrentDirectory (dropFileName abfp)
s <- renderAgdaSnippets aopt "Agda" liburi abfp
return $ i {itemBody = s}
else return i
where
cacheName = "LiterateAgda.agdaCompiler"
isAgda = (== ".lagda") . takeExtension . toFilePath . itemIdentifier