module Text.HTML.TagSoup.Match where
import Text.HTML.TagSoup.Type (Tag(..), Attribute)
import Data.List
tagOpen :: (String -> Bool) -> ([Attribute] -> Bool) -> Tag -> Bool
tagOpen pName pAttrs (TagOpen name attrs) =
pName name && pAttrs attrs
tagOpen _ _ _ = False
tagClose :: (String -> Bool) -> Tag -> Bool
tagClose pName (TagClose name) = pName name
tagClose _ _ = False
tagText :: (String -> Bool) -> Tag -> Bool
tagText p (TagText text) = p text
tagText _ _ = False
tagComment :: (String -> Bool) -> Tag -> Bool
tagComment p (TagComment text) = p text
tagComment _ _ = False
tagOpenLit :: String -> ([Attribute] -> Bool) -> Tag -> Bool
tagOpenLit name = tagOpen (name==)
tagCloseLit :: String -> Tag -> Bool
tagCloseLit name = tagClose (name==)
tagOpenAttrLit :: String -> Attribute -> Tag -> Bool
tagOpenAttrLit name attr =
tagOpenLit name (anyAttrLit attr)
tagOpenAttrNameLit :: String -> String -> (String -> Bool) -> Tag -> Bool
tagOpenAttrNameLit tagName attrName pAttrValue =
tagOpenLit tagName
(anyAttr (\(name,value) -> name==attrName && pAttrValue value))
tagOpenNameLit :: String -> Tag -> Bool
tagOpenNameLit name = tagOpenLit name (const True)
tagCloseNameLit :: String -> Tag -> Bool
tagCloseNameLit name = tagCloseLit name
anyAttr :: ((String,String) -> Bool) -> [Attribute] -> Bool
anyAttr = any
anyAttrName :: (String -> Bool) -> [Attribute] -> Bool
anyAttrName p = any (p . fst)
anyAttrValue :: (String -> Bool) -> [Attribute] -> Bool
anyAttrValue p = any (p . snd)
anyAttrLit :: (String,String) -> [Attribute] -> Bool
anyAttrLit attr = anyAttr (attr==)
anyAttrNameLit :: String -> [Attribute] -> Bool
anyAttrNameLit name = anyAttrName (name==)
anyAttrValueLit :: String -> [Attribute] -> Bool
anyAttrValueLit value = anyAttrValue (value==)
getTagContent :: String -> ([Attribute] -> Bool) -> [Tag] -> [Tag]
getTagContent name pAttrs =
takeWhile (not . tagCloseLit name) . drop 1 .
head . sections (tagOpenLit name pAttrs)
where sections p = filter (p . head) . init . tails