packages feed

cake-0.0.1: Cake/Rules.hs

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