@@ 1,6 1,6 @@
-module Network.URI.XDG.Ini(parseIni) where
+module Network.URI.XDG.Ini(INI, parseIni, iniLookup, iniLookupLocalized) where
-import Data.Char (isSpace)
+import Data.Char (isSpace, toLower)
import Data.List (dropWhile, dropWhileEnd)
type INI = [(String, [(String, String)])]
@@ 8,7 8,7 @@ type INI = [(String, [(String, String)])]
parseIni :: String -> INI
parseIni source = parseIni' $ filter (not . isComment) $ map strip $ lines source
-strip cs = dropWhile isSpace $ dropWhileEnd isSpace cs
+strip cs = dropWhile isSpace $ dropWhileEnd isSpace $ map toLower cs
strip2 (a, b) = (strip a, strip b)
isComment ('#':_) = True
@@ 28,3 28,14 @@ parseKeys [] = ([], [])
parseKey ('=':as) = ([], as)
parseKey (a:as) = let (x, y) = parseKey as in (a:x, y)
parseKey [] = ([], [])
+
+---
+
+iniLookup :: String -> String -> INI -> Maybe String
+iniLookup group key ini = lookup group ini >>= lookup key
+
+iniLookupLocalized :: [String] -> String -> String -> INI -> Maybe String
+iniLookupLocalized (locale:locales) group key ini
+ | Just ret <- iniLookup group (key ++ "[" ++ locale ++ "]") ini = Just ret
+ | otherwise = iniLookupLocalized locales group key ini
+iniLookupLocalized [] group key ini = iniLookup group key ini