module Main where import InputParser import System.IO import ElementBlocker import UrlBlocker import Text.ParserCombinators.Parsec hiding (Line, many, optional) import Statistics import Control.Applicative hiding (many) import SourceInfo import System.Console.GetOpt import System.Environment import Control.Monad import Templates (writeTemplateFiles) import Data.Time.Clock (getCurrentTime) data Options = Options { _showVersion :: Bool , _privoxyDir :: FilePath , _webDir :: FilePath } deriving Show options :: [OptDescr (Options -> Options)] options = [ Option ['V'] ["version"] (NoArg (\ opts -> opts { _showVersion = True })) "show version number" , Option ['p'] ["privoxyDir"] (ReqArg (\ f opts -> opts { _privoxyDir = f }) "PATH") "privoxy config output path (required)" , Option ['w'] ["webDir"] (ReqArg (\ f opts -> opts { _webDir = f }) "PATH") "css files output path (optional, privoxyDir is used by default)" ] parseOptions :: [String] -> IO (Options, [String]) parseOptions argv = case getOpt Permute options argv of (opts,nonOpts,[] ) -> case foldl (flip id) (Options False [] []) opts of Options False [] _ -> writeError "Privoxy dir is not specified.\n" opts'@(Options _ privoxyDir []) -> return (opts'{_webDir = privoxyDir}, nonOpts) opts' -> return (opts', nonOpts) (_,_,errs) -> writeError $ concat errs where writeError msg = ioError $ userError $ msg ++ usageInfo header options header = "Usage: adblock2privoxy [OPTION...] adblockFiles..." processFiles :: String -> String -> [String] -> IO [()] processFiles privoxyDir webDir filenames = do let parseFile filename = do putStrLn $ "parse " ++ filename inputFile <- openFile filename ReadMode text <- hGetContents inputFile case parse adblockFile filename text of Right parsed -> return (parsed, extractInfo parsed, inputFile) Left msg -> return ([], NoInfo, inputFile) <$ putStrLn $ show msg (parsed, sourceInfo, handlers) <- unzip3 <$> mapM parseFile filenames showInfo' <- showInfo <$> getCurrentTime let parsed' = concat parsed info = (sourceInfo >>= showInfo') ++ ["------- end ------\n"] stat privoxyDir info parsed' elemBlock webDir info parsed' urlBlock privoxyDir info parsed' writeTemplateFiles privoxyDir sequence $ hClose <$> handlers main::IO() main = do args <- getArgs (opts, filenames) <- parseOptions args when (_showVersion opts) $ putStrLn "adblock2privoxy version 1.0" when (not . null $_privoxyDir opts) $ do _ <- processFiles (_privoxyDir opts) (_webDir opts) filenames putStrLn "done"