module Desktop where

import Data.Maybe
import Text.ParserCombinators.Parsec

data Desktop = Desktop [Entry] deriving Show
data Entry = Entry String [Pair] deriving Show
type Pair = (String, String)

type DesktopParser a = CharParser () a

parseDesktop :: String -> String -> Either ParseError Desktop
parseDesktop sourceName c = parse pDesktop sourceName c

pDesktop =
    do many pBlank
       --entries <- sepEndBy pEntry pBlanks
       entries <- many pEntry
       eof
       return $ Desktop entries

pEntry =
    do heading <- pHeading
       pairs <- many pPairOrComment
       return $ Entry heading (catMaybes pairs)

pHeading =
    do char '['
       s <- many (noneOf "]\n")
       char ']'
       pEOL
       return s

pPairOrComment =
    try pComment <|>
    pPair

pPair =
    do c <- noneOf "[=\n"
       lhs <- many1 (noneOf "=\n")
       char '='
       rhs <- many (noneOf "\n")
       pEOL
       many pBlank
       return $ Just (c:lhs, rhs)

pEOL =
    do many (oneOf " \t")
       char '\n'
       return Nothing

pComment =
    do many (oneOf " \t")
       char '#'
       many (noneOf "\n")
       char '\n'
       return Nothing

pBlank = 
    try pComment <|>
    pEOL

--pBlanks :: DesktopParser String
--pBlanks = many1 (oneOf " \t\n")
pBlanks = many1 pBlank

