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 :: String -> [Tag Text] -> [Tag Text] getTagsBefore selector = takeWhile (~/= selector) getTagsAfter :: String -> [Tag Text] -> [Tag Text] getTagsAfter selector = drop 1 . dropWhile (~/= selector) getTagsBetween :: String -> String -> [Tag Text] -> [Tag Text] getTagsBetween begin end = getTagsBefore end . getTagsAfter begin getTagAttributes :: String -> Text -> [Tag Text] -> [Text] getTagAttributes selector attribute = catMaybes . fmap (maybeTagAttribute attribute) . filter (~== selector) getTagAttribute :: String -> Text -> [Tag Text] -> Maybe Text getTagAttribute selector attribute = listToMaybe . getTagAttributes selector attribute getTagTextAfter :: String -> [Tag Text] -> Maybe Text getTagTextAfter selector tags = case findIndex (~== 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