module Text.Seonbi.Html.Wrapper
( isWrappedBy
, isWrappedBy'
, wrap
) where
import Text.Seonbi.Html
import Text.Seonbi.Html.TagStack
-- | Wraps given entities with an element.
wrap :: HtmlTagStack -> HtmlTag -> HtmlRawAttrs -> [HtmlEntity] -> [HtmlEntity]
wrap baseStack tag' attributes entities = (:)
(HtmlStartTag baseStack tag' attributes)
[ e { tagStack = rebase' (tagStack e) }
| e <- entities
] ++ [HtmlEndTag baseStack tag']
where
newBaseStack :: HtmlTagStack
newBaseStack = push tag' baseStack
rebase' :: HtmlTagStack -> HtmlTagStack
rebase' = rebase baseStack newBaseStack
-- | A shortcut to 'isWrappedBy'' of wildcard attributes match.
isWrappedBy :: [HtmlEntity] -> HtmlTag -> Bool
isWrappedBy entities tag' =
isWrappedBy' entities tag' Nothing
-- | 'True' if the given @['HtmlEntity']@ is wrapped by a tag and attributes.
-- E.g.:
--
-- >>> :set -XOverloadedLists
-- >>> :set -XOverloadedStrings
-- >>> :{
-- let entities =
-- [ HtmlStartTag [] Em " id=foo"
-- , HtmlText [Em] "Hello"
-- , HtmlEndTag [] Em
-- ] :: [HtmlEntity]
-- :}
--
-- >>> isWrappedBy' entities Em $ Just " id=foo"
-- True
-- >>> isWrappedBy' entities Div $ Just " id=foo"
-- False
-- >>> isWrappedBy' entities Em $ Just " id=wrong"
-- False
--
-- In order to match to any attributes (wildcard match), give 'Nothing' to
-- the third argument:
--
-- >>> isWrappedBy' entities Em Nothing
-- True
-- >>> isWrappedBy' entities Span Nothing
-- False
--
-- Or you can use 'isWrappedBy' function which is a shortcut for that.
isWrappedBy' :: [HtmlEntity] -> HtmlTag -> Maybe HtmlRawAttrs -> Bool
isWrappedBy' entities@(HtmlStartTag s t a : _) tag' attributes =
case Prelude.last entities of
HtmlEndTag s' t' ->
t == tag' && t' == tag' && s == s' && maybe True (== a) attributes
_ ->
False
isWrappedBy' _ _ _ = False