module Text.XML.PolySoup.Tag
(
getName
, getText
, getAttr
, getAtts
, name
, text
, attr
, atts
, innerTag
, leafTag
, textTag
, commentTag
, warningTag
, positionTag
, named
, hasAttr
, hasAttrVal
) where
import Prelude hiding (any)
import Control.Monad ((<=<))
import Data.Maybe (isJust)
import Text.HTML.TagSoup
import Text.XML.PolySoup.Predicate
getName :: Tag s -> Maybe s
getName t = case t of
TagOpen x _ -> Just x
TagClose x -> Just x
TagText x -> Just x
TagComment x -> Just x
TagWarning x -> Just x
TagPosition _ _ -> Nothing
getText :: Tag s -> Maybe s
getText = maybeTagText
getAtts :: Tag s -> Maybe [(s, s)]
getAtts (TagOpen _ x) = Just x
getAtts _ = Nothing
getAttr :: Eq s => s -> Tag s -> Maybe s
getAttr x = lookup x <=< getAtts
innerTag :: Q (Tag s) (Tag s)
innerTag = satisfy isTagOpen
leafTag :: Q (Tag s) (Tag s)
leafTag = satisfy $ not . isTagOpen
textTag :: Q (Tag s) (Tag s)
textTag = satisfy isTagText
commentTag :: Q (Tag s) (Tag s)
commentTag = satisfy isTagComment
warningTag :: Q (Tag s) (Tag s)
warningTag = satisfy isTagWarning
positionTag :: Q (Tag s) (Tag s)
positionTag = satisfy isTagPosition
named :: Eq s => s -> Q (Tag s) (Tag s)
named x = satisfy $ justSatisfy (==x) . getName
hasAttr :: Eq s => s -> Q (Tag s) (Tag s)
hasAttr x = satisfy $ isJust . getAttr x
hasAttrVal :: Eq s => s -> s -> Q (Tag s) (Tag s)
hasAttrVal x y = satisfy $ justSatisfy (==y) . getAttr x
name :: Q (Tag s) s
name = Q getName
text :: Q (Tag s) s
text = Q getText
attr :: Eq s => s -> Q (Tag s) s
attr = Q . getAttr
atts :: Q (Tag s) [(s, s)]
atts = Q getAtts
justSatisfy :: (a -> Bool) -> Maybe a -> Bool
justSatisfy = maybe False