module Parser.Utils ( getTagsBefore , getTagsAfter , getTagsBetween , getTagAttributes , getTagAttribute , getTagTextAfter ) where import Data.List (find, findIndex) import Data.Maybe (catMaybes, listToMaybe) import Data.Text (Text) import qualified Data.Text as T import Text.HTML.TagSoup getTagsBefore :: Text -> [Tag Text] -> [Tag Text] getTagsBefore selector = takeWhile (~/= (T.unpack selector)) getTagsAfter :: Text -> [Tag Text] -> [Tag Text] getTagsAfter selector = drop 1 . dropWhile (~/= (T.unpack selector)) getTagsBetween :: Text -> Text -> [Tag Text] -> [Tag Text] getTagsBetween begin end = getTagsBefore end . getTagsAfter begin getTagAttributes :: Text -> Text -> [Tag Text] -> [Text] getTagAttributes selector attribute = catMaybes . fmap (maybeTagAttribute attribute) . filter (~== (T.unpack selector)) getTagAttribute :: Text -> Text -> [Tag Text] -> Maybe Text getTagAttribute selector attribute = listToMaybe . getTagAttributes selector attribute getTagTextAfter :: Text -> [Tag Text] -> Maybe Text getTagTextAfter selector tags = case findIndex (~== (T.unpack selector)) tags of Just index -> fmap T.strip $ safeGetAt (index + 1) tags >>= maybeTagText Nothing -> Nothing maybeTagAttribute :: Text -> Tag Text -> Maybe Text maybeTagAttribute name (TagOpen _ xs) = fmap snd . find (\(x, _) -> x == name) $ xs maybeTagAttribute _ _ = Nothing safeGetAt :: Int -> [a] -> Maybe a safeGetAt index = listToMaybe . drop index