module Main where import OpenAFP import System.Exit import Data.Char (isDigit, isAlphaNum) import Data.List (find) import qualified Data.ByteString.Char8 as C -- Algorithm: -- Gather everything up to first BPG -- write out each BPG/EPG chunks -- append ENG+EDT main :: IO () main = do args <- getArgs if null args then error "Usage: afp-split-scb file.afp [pages]" else do let (inFile:outPages) = args cs <- readAFP inFile let (preamble:rest) = splitPages cs _eng = encodeChunk $ Record _ENG _edt = encodeChunk $ Record _EDT pagePairs = map show [1..] `zip` rest if null outPages then forM_ pagePairs $ \(i, page) -> do let Just tle = find (~~ _TLE) page Just (_:av:_) = tle_Chunks `applyToChunk` tle Just str = t_av `applyToChunk` av pgs = filter (~~ _BPG) page -- Just seg = find (~~ _IPS) page Just name = ips `applyToChunk` seg -- outFile = inFile ++ ('.':filter isDigit (fromAStr str)) ++ ('.':takeWhile isAlphaNum (fromAStr name)) ++ ('.':i) ++ ('.':show (length pgs)) putStrLn outFile writeAFP outFile $ preamble ++ page ++ [_eng, _edt] else do let outFile = inFile ++ ".part" writeAFP outFile $ preamble ++ concat [ page | (i, page) <- pagePairs, i `elem` outPages ] ++ [_eng, _edt] putStrLn outFile splitPages :: [AFP_] -> [[AFP_]] splitPages cs = if null rest then [this] else case splitPages rest' of [] -> [this, rest] (y:ys) -> (this:(begins ++ y):ys) where (this, rest) = break isBeginPage cs (begins, rest') = span isBeginPage rest isBeginPage :: AFP_ -> Bool isBeginPage t = (t ~~ _BNG)