module HScraper.QueryParser (
parseQuery
) where
import qualified Data.Text as T
import Text.Parsec
import HScraper.Types
parseQuery :: String -> Either ParseError Query
parseQuery s = case parse parseNodeQueries "" (unwords (words s)) of
Left err -> Left err
Right nodes -> Right nodes
parseNodeQueries :: Stream s m Char => ParsecT s u m [NodeQuery]
parseNodeQueries = sepBy node (spaces >> char '>' >> spaces)
clas :: Stream s m Char => ParsecT s u m String
clas = do
_ <- char '['
clnm <- many (noneOf "]")
_ <- char ']'
return clnm
idd :: Stream s m Char => ParsecT s u m String
idd = do
_ <- char '{'
idnm <- many (noneOf "}")
_ <- char '}'
return idnm
node :: Stream s m Char => ParsecT s u m NodeQuery
node = do
name <-many (noneOf " {[>")
cls <- optionMaybe clas
ids <- optionMaybe idd
return (NodeQuery (T.pack name) (fmap T.pack cls) (fmap T.pack ids))