module Text.HTML.Tagchup.Tag.Match where

import qualified Text.HTML.Tagchup.Tag as Tag
import qualified Text.XML.Basic.Attribute as Attr
import qualified Text.XML.Basic.Name as Name


ignore :: a -> Bool
ignore :: forall a. a -> Bool
ignore a
_ = Bool
True


-- | match an opening tag
open ::
   (Tag.Name name -> Bool) -> ([Attr.T name string] -> Bool) ->
   Tag.T name string -> Bool
open :: forall name string.
(Name name -> Bool)
-> ([T name string] -> Bool) -> T name string -> Bool
open Name name -> Bool
pName [T name string] -> Bool
pAttrs (Tag.Open Name name
name [T name string]
attrs) = Name name -> Bool
pName Name name
name Bool -> Bool -> Bool
&& [T name string] -> Bool
pAttrs [T name string]
attrs
open Name name -> Bool
_ [T name string] -> Bool
_ T name string
_ = Bool
False

-- | match a closing tag
close :: (Tag.Name name -> Bool) -> Tag.T name string -> Bool
close :: forall name string. (Name name -> Bool) -> T name string -> Bool
close Name name -> Bool
pName (Tag.Close Name name
name) = Name name -> Bool
pName Name name
name
close Name name -> Bool
_ T name string
_ = Bool
False

-- | match a text
text :: (string -> Bool) -> Tag.T name string -> Bool
text :: forall string name. (string -> Bool) -> T name string -> Bool
text string -> Bool
p (Tag.Text string
str) = string -> Bool
p string
str
text string -> Bool
_ T name string
_ = Bool
False

comment :: (String -> Bool) -> Tag.T name string -> Bool
comment :: forall name string. (String -> Bool) -> T name string -> Bool
comment String -> Bool
p (Tag.Comment String
str) = String -> Bool
p String
str
comment String -> Bool
_ T name string
_ = Bool
False

special :: (Tag.Name name -> Bool) -> (String -> Bool) -> Tag.T name string -> Bool
special :: forall name string.
(Name name -> Bool) -> (String -> Bool) -> T name string -> Bool
special Name name -> Bool
pType String -> Bool
pInfo (Tag.Special Name name
typ String
info) = Name name -> Bool
pType Name name
typ Bool -> Bool -> Bool
&& String -> Bool
pInfo String
info
special Name name -> Bool
_ String -> Bool
_ T name string
_ = Bool
False


-- | match a opening tag's name literally
openLit ::
   (Name.Tag name) =>
   String -> ([Attr.T name string] -> Bool) -> Tag.T name string -> Bool
openLit :: forall name string.
Tag name =>
String -> ([T name string] -> Bool) -> T name string -> Bool
openLit String
name = forall name string.
(Name name -> Bool)
-> ([T name string] -> Bool) -> T name string -> Bool
open (forall name. C name => String -> name -> Bool
Name.match String
name)

-- | match a closing tag's name literally
closeLit ::
   (Name.Tag name) =>
   String -> Tag.T name string -> Bool
closeLit :: forall name string. Tag name => String -> T name string -> Bool
closeLit String
name = forall name string. (Name name -> Bool) -> T name string -> Bool
close (forall name. C name => String -> name -> Bool
Name.match String
name)

openAttrLit ::
   (Name.Attribute name, Name.Tag name, Eq string) =>
   String -> String -> string -> Tag.T name string -> Bool
openAttrLit :: forall name string.
(Attribute name, Tag name, Eq string) =>
String -> String -> string -> T name string -> Bool
openAttrLit String
name String
attrName string
attrValue =
   forall name string.
Tag name =>
String -> ([T name string] -> Bool) -> T name string -> Bool
openLit String
name (forall name string.
(Attribute name, Eq string) =>
String -> string -> [T name string] -> Bool
Attr.anyLit String
attrName string
attrValue)

{- |
Match a tag with given name, that contains an attribute
with given name, that satisfies a predicate.
If an attribute occurs multiple times,
all occurrences are checked.
-}
openAttrNameLit ::
   (Name.Attribute name, Name.Tag name) =>
   String -> String -> (string -> Bool) -> Tag.T name string -> Bool
openAttrNameLit :: forall name string.
(Attribute name, Tag name) =>
String -> String -> (string -> Bool) -> T name string -> Bool
openAttrNameLit String
tagName String
attrName string -> Bool
pAttrValue =
   forall name string.
Tag name =>
String -> ([T name string] -> Bool) -> T name string -> Bool
openLit String
tagName
      (forall name string.
(T name string -> Bool) -> [T name string] -> Bool
Attr.any (\(Attr.Cons Name name
name string
value) ->
          forall name. C name => String -> name -> Bool
Name.match String
attrName Name name
name Bool -> Bool -> Bool
&& string -> Bool
pAttrValue string
value))


-- | Check whether the 'Tag.T' is 'Tag.Open' and matches the given name
openNameLit ::
   (Name.Tag name) =>
   String -> Tag.T name string -> Bool
openNameLit :: forall name string. Tag name => String -> T name string -> Bool
openNameLit String
name = forall name string.
Tag name =>
String -> ([T name string] -> Bool) -> T name string -> Bool
openLit String
name forall a. a -> Bool
ignore

-- | Check whether the 'Tag.T' is 'Tag.Close' and matches the given name
closeNameLit ::
   (Name.Tag name) =>
   String -> Tag.T name string -> Bool
closeNameLit :: forall name string. Tag name => String -> T name string -> Bool
closeNameLit String
name = forall name string. Tag name => String -> T name string -> Bool
closeLit String
name



{-
getTagContent :: String -> ([Attr.T name string] -> Bool) -> [Tag.T name string] -> [Tag.T name string]
getTagContent name pAttrs =
   takeWhile (not . tagCloseLit name) . drop 1 .
   head . sections (tagOpenLit name pAttrs)
-}