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 _ = True
-- | match an opening tag
open ::
(Tag.Name name -> Bool) -> ([Attr.T name string] -> Bool) ->
Tag.T name string -> Bool
open pName pAttrs (Tag.Open name attrs) = pName name && pAttrs attrs
open _ _ _ = False
-- | match a closing tag
close :: (Tag.Name name -> Bool) -> Tag.T name string -> Bool
close pName (Tag.Close name) = pName name
close _ _ = False
-- | match a text
text :: (string -> Bool) -> Tag.T name string -> Bool
text p (Tag.Text str) = p str
text _ _ = False
comment :: (String -> Bool) -> Tag.T name string -> Bool
comment p (Tag.Comment str) = p str
comment _ _ = False
special :: (Tag.Name name -> Bool) -> (String -> Bool) -> Tag.T name string -> Bool
special pType pInfo (Tag.Special typ info) = pType typ && pInfo info
special _ _ _ = False
-- | match a opening tag's name literally
openLit ::
(Name.Tag name) =>
String -> ([Attr.T name string] -> Bool) -> Tag.T name string -> Bool
openLit name = open (Name.match name)
-- | match a closing tag's name literally
closeLit ::
(Name.Tag name) =>
String -> Tag.T name string -> Bool
closeLit name = close (Name.match name)
openAttrLit ::
(Name.Attribute name, Name.Tag name, Eq string) =>
String -> String -> string -> Tag.T name string -> Bool
openAttrLit name attrName attrValue =
openLit name (Attr.anyLit attrName 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 tagName attrName pAttrValue =
openLit tagName
(Attr.any (\(Attr.Cons name value) ->
Name.match attrName name && pAttrValue 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 name = openLit name 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 name = closeLit 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)
-}