-- | module for reading dictionaries of templates from csv files. -- may be used for reading of csv containing translation templates module Text.StringTemplates.TextTemplates (getTextTemplates) where import qualified Data.Map as M import Text.JSON import System.Directory import Data.List import Data.Maybe import Control.Monad --- | Searches recursively give directory for translations --- path/lang_code/*.json will match. getTextTemplates :: FilePath -- ^ path of a directory to search for .json files -> IO (M.Map String [(String, String)]) getTextTemplates path = do dirs <- getDirectoryContents path list <- forM dirs $ \d -> do isDir <- doesDirectoryExist $ path ++ "/" ++ d if (not isDir || "." `isSuffixOf` d) then return $ Nothing else do entries <- filter (\s -> ".json" `isSuffixOf` s) <$> getDirectoryContents (path ++ "/" ++ d) translations <- forM entries (\e -> readTranslationFile $ path ++ "/" ++ d ++ "/" ++ e) return $ Just (d,concat translations) return $ M.fromList $ map fromJust $ filter isJust list readTranslationFile :: String -> IO [(String,String)] readTranslationFile file = do mjson <- readFile $ file case decode mjson of Ok js -> return $ sort $ textsFromJSON $ js e -> error $ "Can't parse json with message " ++ show e ++ " for json" ++ mjson textsFromJSON :: JSValue -> [(String,String)] textsFromJSON (JSObject jso) = map (\(a,JSString js) -> (a, fromJSString js)) (fromJSObject jso) textsFromJSON _ = error "While decoding JSON with translations"