module Text.HTML.TagSoup.HT.Match where import qualified Text.HTML.TagSoup.HT.Tag as Tag ignore :: a -> Bool ignore _ = True -- | match an opening tag open :: (String -> Bool) -> ([Tag.Attribute char] -> Bool) -> Tag.T char -> Bool open pName pAttrs (Tag.Open name attrs) = pName name && pAttrs attrs open _ _ _ = False -- | match an closing tag close :: (String -> Bool) -> Tag.T char -> Bool close pName (Tag.Close name) = pName name close _ _ = False -- | match a text text :: ([char] -> Bool) -> Tag.T char -> Bool text p (Tag.Text str) = p str text _ _ = False comment :: (String -> Bool) -> Tag.T char -> Bool comment p (Tag.Comment str) = p str comment _ _ = False special :: (String -> Bool) -> (String -> Bool) -> Tag.T char -> Bool special pType pInfo (Tag.Special typ info) = pType typ && pInfo info special _ _ _ = False -- | match a opening tag's name literally openLit :: String -> ([Tag.Attribute char] -> Bool) -> Tag.T char -> Bool openLit name = open (name==) -- | match a closing tag's name literally closeLit :: String -> Tag.T char -> Bool closeLit name = close (name==) openAttrLit :: (Eq char) => String -> Tag.Attribute char -> Tag.T char -> Bool openAttrLit name attr = openLit name (anyAttrLit attr) {- | 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 :: String -> String -> ([char] -> Bool) -> Tag.T char -> Bool openAttrNameLit tagName attrName pAttrValue = openLit tagName (anyAttr (\(name,value) -> name==attrName && pAttrValue value)) -- | Check if the 'Tag.T' is 'Tag.Open' and matches the given name openNameLit :: String -> Tag.T char -> Bool openNameLit name = openLit name ignore -- | Check if the 'Tag.T' is 'Tag.Close' and matches the given name closeNameLit :: String -> Tag.T char -> Bool closeNameLit name = closeLit name anyAttr :: ((String,[char]) -> Bool) -> [Tag.Attribute char] -> Bool anyAttr = any anyAttrName :: (String -> Bool) -> [Tag.Attribute char] -> Bool anyAttrName p = any (p . fst) anyAttrValue :: ([char] -> Bool) -> [Tag.Attribute char] -> Bool anyAttrValue p = any (p . snd) anyAttrLit :: (Eq char) => (String,[char]) -> [Tag.Attribute char] -> Bool anyAttrLit attr = anyAttr (attr==) anyAttrNameLit :: String -> [Tag.Attribute char] -> Bool anyAttrNameLit name = anyAttrName (name==) anyAttrValueLit :: (Eq char) => [char] -> [Tag.Attribute char] -> Bool anyAttrValueLit value = anyAttrValue (value==) {- getTagContent :: String -> ([Tag.Attribute char] -> Bool) -> [Tag.T char] -> [Tag.T char] getTagContent name pAttrs = takeWhile (not . tagCloseLit name) . drop 1 . head . sections (tagOpenLit name pAttrs) -}