{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeOperators #-}
module Text.XML.Selectors.Parsers.JQ
( jq
, jqFile
, jqFile'
, jqString
, jqText
, jqString'
, jqText'
, errorBundlePretty
)
where
import Text.Megaparsec
import Text.Megaparsec.Char
import Data.Text (Text)
import qualified Data.Text as Text
import qualified Data.Text.IO as Text
import Text.XML.Selectors.Types
import Text.XML (Name)
import Data.String (IsString, fromString)
import Data.Char (isAlphaNum, isDigit)
jq :: (IsString (Tokens s), Stream s, Token s ~ Char)
=> String
-> s
-> Either (ParseErrorBundle s Text) Selector
jq :: forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
String -> s -> Either (ParseErrorBundle s Text) Selector
jq = forall e s a.
Parsec e s a -> String -> s -> Either (ParseErrorBundle s e) a
parse forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
jqSelector
jqString :: String
-> Either (ParseErrorBundle String Text) Selector
jqString :: String -> Either (ParseErrorBundle String Text) Selector
jqString = forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
String -> s -> Either (ParseErrorBundle s Text) Selector
jq String
"<input>"
jqString' :: String
-> Selector
jqString' :: String -> Selector
jqString' = forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (forall a. HasCallStack => String -> a
error forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s e.
(VisualStream s, TraversableStream s, ShowErrorComponent e) =>
ParseErrorBundle s e -> String
errorBundlePretty) forall a. a -> a
id forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
String -> s -> Either (ParseErrorBundle s Text) Selector
jq String
"<input>"
jqText :: Text
-> Either (ParseErrorBundle Text Text) Selector
jqText :: Text -> Either (ParseErrorBundle Text Text) Selector
jqText = forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
String -> s -> Either (ParseErrorBundle s Text) Selector
jq String
"<input>"
jqText' :: Text
-> Selector
jqText' :: Text -> Selector
jqText' = forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (forall a. HasCallStack => String -> a
error forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s e.
(VisualStream s, TraversableStream s, ShowErrorComponent e) =>
ParseErrorBundle s e -> String
errorBundlePretty) forall a. a -> a
id forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
String -> s -> Either (ParseErrorBundle s Text) Selector
jq String
"<input>"
jqFile :: FilePath
-> IO (Either (ParseErrorBundle Text Text) Selector)
jqFile :: String -> IO (Either (ParseErrorBundle Text Text) Selector)
jqFile String
fn = do
forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
String -> s -> Either (ParseErrorBundle s Text) Selector
jq String
fn forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> IO Text
Text.readFile String
fn
jqFile' :: FilePath
-> IO Selector
jqFile' :: String -> IO Selector
jqFile' String
fn =
String -> IO (Either (ParseErrorBundle Text Text) Selector)
jqFile String
fn forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (forall (m :: * -> *) a. MonadFail m => String -> m a
fail forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s e.
(VisualStream s, TraversableStream s, ShowErrorComponent e) =>
ParseErrorBundle s e -> String
errorBundlePretty) forall (m :: * -> *) a. Monad m => a -> m a
return
instance ShowErrorComponent Text where
showErrorComponent :: Text -> String
showErrorComponent = Text -> String
Text.unpack
jqSelector :: (IsString (Tokens s), Stream s, Token s ~ Char) => Parsec Text s Selector
jqSelector :: forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
jqSelector = forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m ()
space forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
choices forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m ()
space forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall e s (m :: * -> *). MonadParsec e s m => m ()
eof
choices :: (IsString (Tokens s), Stream s, Token s ~ Char) => Parsec Text s Selector
choices :: forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
choices = do
[Selector]
xs <- forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
item forall (m :: * -> *) a sep. MonadPlus m => m a -> m sep -> m [a]
`sepBy` (forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m ()
space forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
',' forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m ()
space)
case [Selector]
xs of
[] -> forall (m :: * -> *) a. Monad m => a -> m a
return Selector
None
[Selector
x] -> forall (m :: * -> *) a. Monad m => a -> m a
return Selector
x
[Selector]
_ -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ [Selector] -> Selector
Choice [Selector]
xs
item :: (IsString (Tokens s), Stream s, Token s ~ Char) => Parsec Text s Selector
item :: forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
item = do
Selector
what <- forall (m :: * -> *) a. Alternative m => a -> m a -> m a
option Selector
Any (forall s. (Stream s, Token s ~ Char) => Parsec Text s Selector
anyElem forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try forall s. (Stream s, Token s ~ Char) => Parsec Text s Selector
elemName)
[Selector]
qualifiers <- forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
qualifier
Maybe Selector
mcont <- forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
continuation
let self :: Selector
self = forall a. Monoid a => [a] -> a
mconcat (Selector
what forall a. a -> [a] -> [a]
: [Selector]
qualifiers)
case Maybe Selector
mcont of
Maybe Selector
Nothing -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Selector
self
Just Selector
cont -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ Selector
self forall a. Semigroup a => a -> a -> a
<> Selector
cont
anyElem :: (Stream s, Token s ~ Char) => Parsec Text s Selector
anyElem :: forall s. (Stream s, Token s ~ Char) => Parsec Text s Selector
anyElem = forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'*' forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall (f :: * -> *) a. Applicative f => a -> f a
pure Selector
Any
elemName :: (Stream s, Token s ~ Char) => Parsec Text s Selector
elemName :: forall s. (Stream s, Token s ~ Char) => Parsec Text s Selector
elemName = Name -> Selector
Elem forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall n s.
(IsString n, Stream s, Token s ~ Char) =>
Parsec Text s n
name
name :: (IsString n, Stream s, Token s ~ Char) => Parsec Text s n
name :: forall n s.
(IsString n, Stream s, Token s ~ Char) =>
Parsec Text s n
name = forall a. IsString a => String -> a
fromString forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
some forall s. (Stream s, Token s ~ Char) => Parsec Text s Char
nameChar
nameChar :: (Stream s, Token s ~ Char) => Parsec Text s Char
nameChar :: forall s. (Stream s, Token s ~ Char) => Parsec Text s Char
nameChar = forall e s (m :: * -> *).
MonadParsec e s m =>
(Token s -> Bool) -> m (Token s)
satisfy Char -> Bool
isNameChar
isNameChar :: Char -> Bool
isNameChar :: Char -> Bool
isNameChar Char
c = Char -> Bool
isAlphaNum Char
c Bool -> Bool -> Bool
|| (Char
c forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Char
'_', Char
'-'])
continuation :: (IsString (Tokens s), Stream s, Token s ~ Char) => Parsec Text s Selector
continuation :: forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
continuation = forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice
[ forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
child
, forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
sibling
, forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
nextSibling
, forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
descendant
]
descendant :: (IsString (Tokens s), Stream s, Token s ~ Char) => Parsec Text s Selector
descendant :: forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
descendant = forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m ()
space1 forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ((Selector
Descendant forall a. Semigroup a => a -> a -> a
<>) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
item)
child :: (IsString (Tokens s), Stream s, Token s ~ Char) => Parsec Text s Selector
child :: forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
child = forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m ()
space forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'>' forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m ()
space) forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ((Selector
Child forall a. Semigroup a => a -> a -> a
<>) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
item)
sibling :: (IsString (Tokens s), Stream s, Token s ~ Char) => Parsec Text s Selector
sibling :: forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
sibling = forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m ()
space forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'~' forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m ()
space) forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ((Selector
Sibling forall a. Semigroup a => a -> a -> a
<>) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
item)
nextSibling :: (IsString (Tokens s), Stream s, Token s ~ Char) => Parsec Text s Selector
nextSibling :: forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
nextSibling = forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m ()
space forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'+' forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m ()
space) forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ((Selector
NextSibling forall a. Semigroup a => a -> a -> a
<>) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
item)
qualifier :: (IsString (Tokens s), Stream s, Token s ~ Char) => Parsec Text s Selector
qualifier :: forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
qualifier = forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice
[ forall s. (Stream s, Token s ~ Char) => Parsec Text s Selector
classAttrib
, forall s. (Stream s, Token s ~ Char) => Parsec Text s Selector
idAttrib
, forall s. (Stream s, Token s ~ Char) => Parsec Text s Selector
attribSelector
, forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
firstChild
, forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
nthChild
, forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
nthLastChild
, forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
having
, forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
not_
]
classAttrib :: (Stream s, Token s ~ Char) => Parsec Text s Selector
classAttrib :: forall s. (Stream s, Token s ~ Char) => Parsec Text s Selector
classAttrib = do
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'.'
Text
value <- forall n s.
(IsString n, Stream s, Token s ~ Char) =>
Parsec Text s n
name
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ AttribSelector -> Selector
Attrib (Name -> Text -> AttribSelector
AttribContainsWord Name
"class" Text
value)
idAttrib :: (Stream s, Token s ~ Char) => Parsec Text s Selector
idAttrib :: forall s. (Stream s, Token s ~ Char) => Parsec Text s Selector
idAttrib = do
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'#'
Text
value <- forall n s.
(IsString n, Stream s, Token s ~ Char) =>
Parsec Text s n
name
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ AttribSelector -> Selector
Attrib (Name -> Text -> AttribSelector
AttribIs Name
"id" Text
value)
attribSelector :: (Stream s, Token s ~ Char) => Parsec Text s Selector
attribSelector :: forall s. (Stream s, Token s ~ Char) => Parsec Text s Selector
attribSelector = do
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'['
Name
aname <- forall n s.
(IsString n, Stream s, Token s ~ Char) =>
Parsec Text s n
name
Maybe (Name -> Text -> AttribSelector)
mop <- forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional forall s.
(Stream s, Token s ~ Char) =>
Parsec Text s (Name -> Text -> AttribSelector)
attribOp
AttribSelector
asel <- case Maybe (Name -> Text -> AttribSelector)
mop of
Maybe (Name -> Text -> AttribSelector)
Nothing -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ Name -> AttribSelector
AttribExists Name
aname
Just Name -> Text -> AttribSelector
op -> Name -> Text -> AttribSelector
op Name
aname forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (forall n s.
(IsString n, Stream s, Token s ~ Char) =>
Parsec Text s n
quotedStr forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall n s.
(IsString n, Stream s, Token s ~ Char) =>
Parsec Text s n
name)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
']'
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ AttribSelector -> Selector
Attrib AttribSelector
asel
attribOp :: (Stream s, Token s ~ Char) => Parsec Text s (Name -> Text -> AttribSelector)
attribOp :: forall s.
(Stream s, Token s ~ Char) =>
Parsec Text s (Name -> Text -> AttribSelector)
attribOp = forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice
[ Name -> Text -> AttribSelector
AttribIs forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'=')
, Name -> Text -> AttribSelector
AttribIsNot forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'!' forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'=')
, Name -> Text -> AttribSelector
AttribStartsWith forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'^' forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'=')
, Name -> Text -> AttribSelector
AttribEndsWith forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'$' forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'=')
, Name -> Text -> AttribSelector
AttribContains forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'*' forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'=')
, Name -> Text -> AttribSelector
AttribContainsWord forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'~' forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'=')
, Name -> Text -> AttribSelector
AttribContainsPrefix forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'|' forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'=')
]
quotedStr :: (IsString v, Stream s, Token s ~ Char) => Parsec Text s v
quotedStr :: forall n s.
(IsString n, Stream s, Token s ~ Char) =>
Parsec Text s n
quotedStr = do
Token s
quoteSym <- forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'"' forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'\''
String
val <- forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many ((forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'\\' forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall e s (m :: * -> *).
MonadParsec e s m =>
(Token s -> Bool) -> m (Token s)
satisfy (forall a b. a -> b -> a
const Bool
True)) forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (forall e s (m :: * -> *).
MonadParsec e s m =>
(Token s -> Bool) -> m (Token s)
satisfy (forall a. Eq a => a -> a -> Bool
/= Token s
quoteSym)))
Token s
_ <- forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Token s
quoteSym
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall a. IsString a => String -> a
fromString String
val
firstChild :: (IsString (Tokens s), Stream s, Token s ~ Char) => Parsec Text s Selector
firstChild :: forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
firstChild = Selector
FirstChild forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens s
":first-child") forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m ()
notFollowedBy forall s. (Stream s, Token s ~ Char) => Parsec Text s Char
nameChar
lastChild :: (IsString (Tokens s), Stream s, Token s ~ Char) => Parsec Text s Selector
lastChild :: forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
lastChild = Selector
LastChild forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens s
":last-child") forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m ()
notFollowedBy forall s. (Stream s, Token s ~ Char) => Parsec Text s Char
nameChar
nthChild :: (IsString (Tokens s), Stream s, Token s ~ Char) => Parsec Text s Selector
nthChild :: forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
nthChild = do
Int -> Selector
NthChild forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens s
":nth-child") forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'(' forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m ()
space forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall s. (Stream s, Token s ~ Char) => Parsec Text s Int
positiveInt forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m ()
space forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
')')
nthLastChild :: (IsString (Tokens s), Stream s, Token s ~ Char) => Parsec Text s Selector
nthLastChild :: forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
nthLastChild = do
Int -> Selector
NthChild forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Num a => a -> a
negate forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens s
":nth-last-child") forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'(' forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m ()
space forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall s. (Stream s, Token s ~ Char) => Parsec Text s Int
positiveInt forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m ()
space forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
')')
positiveInt :: (Stream s, Token s ~ Char) => Parsec Text s Int
positiveInt :: forall s. (Stream s, Token s ~ Char) => Parsec Text s Int
positiveInt = forall a. Read a => String -> a
read forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
some forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m (Token s)
digitChar
having :: (IsString (Tokens s), Stream s, Token s ~ Char) => Parsec Text s Selector
having :: forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
having = forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens s
":has") forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m ()
space forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'(' forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (Selector -> Selector
Having forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
item) forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
')'
not_ :: (IsString (Tokens s), Stream s, Token s ~ Char) => Parsec Text s Selector
not_ :: forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
not_ = forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens s
":not") forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m ()
space forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
'(' forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (Selector -> Selector
Not forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s.
(IsString (Tokens s), Stream s, Token s ~ Char) =>
Parsec Text s Selector
item) forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
')'