module Cake.Rules where import Cake.Core import qualified Parsek import System.Directory import System.FilePath import Control.Applicative import Control.Monad (when) import Control.Monad.RWS import qualified Parsek import Parsek (completeResults, parse, Parser) import qualified Data.Map as M import Data.Binary hiding (put,get) import Text.Groom import qualified System.Process as P import System.Exit import Data.List -- Helpers quote :: String -> String quote = show -- Patterns extension :: String -> Pattern extension s = Parsek.many Parsek.anyChar <* Parsek.string s -- Actions copy :: FilePath -> FilePath -> Act() copy from to = promise to $ needing [from] $ do mkdir $ takeDirectory to liftIO $ copyFile from to system' :: [String] -> Act ExitCode system' xs = do debug $ "Running: " ++ (intercalate " " xs) liftIO $ P.system (intercalate " " $ map quote xs) succeed :: Act ExitCode -> Act () succeed act = do code <- act when (code /= ExitSuccess) $ fail "Command returned non-zero exitcode." mkdir :: FilePath -> Act () mkdir d = liftIO $ createDirectoryIfMissing True d system xs = succeed $ system' xs touch :: FilePath -> Act () touch x = do system ["touch",x] readFile :: FilePath -> Act String readFile x = do need x liftIO $ Prelude.readFile x {- mpostDeriv = extension "-delayed.mp" ==> \s -> do let input = s ++ ".mp" need input rm (s ++ "-delayed.mp") mpost input mpost input -} needing :: [FilePath] -> Act () -> Act () needing xs act = do mapM_ need xs cut act -- Rules simple outExt inExt f = extension outExt ==> \s -> do let input = s ++ inExt output = s ++ outExt needing [input] $ f output input tex_markdown_standalone = simple ".tex" ".markdown" $ \o i -> system ["pandoc","--tab-stop=2","--standalone","-f","markdown","-t","latex", "-o", o, i] pdf_tex = simple ".pdf" ".tex" $ \o i -> system ["latexmk","-pdf",i] {- pdf_tex2 = extension ".pdf" $ \c -> do let input = extension ".tex" ls <- filter ("\\bibliography" `isPrefixOf`) lines <$> readFile input cut $ do case ls of [] -> return () (l:_) -> do let l' = reverse . dropWhile (== '}') . dropWhile . reverse . dropWhile (== '{') $ l bibs = spli -} allRules = tex_markdown_standalone <|> pdf_tex