import System.IO import System.Environment main = do (arg1:arg2:args) <- getArgs input <- readFile (arg1) replacementCode <- getReplacementCode(filesToRead input [] [] Search) let output = replaceWithCode input [] replacementCode Search if arg1 /= arg2 then writeFile arg2 output else return() data Mode = Search | Marker replaceWithCode :: String -> String -> [(String,String)] -> Mode -> String replaceWithCode ('R':'E':'P':'L':'A':'C':'E':'W':'I':'T':'H':'C':'O':'D':'E':'(':a) [] c Search = replaceWithCode a [] c Marker replaceWithCode (a:as) b c Marker | a == ')' = replaceFromList b c ++ replaceWithCode as [] c Search | otherwise = replaceWithCode as (b ++ [a]) c Marker replaceWithCode (a:as) [] c Search = (a: replaceWithCode as [] c Search) replaceWithCode [] [] _ Search = [] replaceFromList :: String -> [(String,String)] -> String replaceFromList a ((b,c):ds) | a == b = c | otherwise = replaceFromList a ds replaceFromList a [] = a filesToRead :: String -> String -> [String] -> Mode -> [String] filesToRead ('R':'E':'P':'L':'A':'C':'E':'W':'I':'T':'H':'C':'O':'D':'E':'(':a) [] c Search = filesToRead a [] c Marker filesToRead (a:as) b c Marker | a == ')' = filesToRead as [] (b:c) Search | otherwise = filesToRead as (b ++ [a]) c Marker filesToRead [] _ c _ = c filesToRead (a:as) b c Search = filesToRead as b c Search getReplacementCode :: [String] -> IO [(String,String)] getReplacementCode [] = pure [] getReplacementCode (a:as) = do b <- readFile (a ++ ".conv") bs <- getReplacementCode as return ((a,b):bs)