module Parser.Detail ( parse ) where import Data.Text (Text) import qualified Data.Text as T import Data.Map (Map) import qualified Data.Map as M import Data.Maybe (catMaybes, fromMaybe) import Text.HTML.TagSoup import Model.Detail import Parser.Utils parse :: Text -> Detail parse page = let tags = parseTags page in Detail { description = parseDescription tags , images = map (\url -> T.concat [T.pack "https:", url]) $ getTagAttributes "" (T.pack "content") tags , properties = parseProperties tags } parseDescription :: [Tag Text] -> Maybe Text parseDescription tags = let descriptionTags = getTagsBetween "

" "

" tags in if null descriptionTags then Nothing else let replaceBr = map (\tag -> if tag ~== "
" then TagText (T.pack "\n") else tag) in Just . T.strip . renderTags . replaceBr $ descriptionTags parseProperties :: [Tag Text] -> Map Text Text parseProperties tags = let mbUtagData = getTagTextAfter "" . getTagsAfter "" $ tags in fromMaybe M.empty (fmap parseUtagData mbUtagData) parseUtagData :: Text -> Map Text Text parseUtagData = M.fromList . catMaybes . fmap parseUtag . T.splitOn (T.pack ",") . T.takeWhile (/= '}') . T.drop 1 . T.dropWhile (/= '{') parseUtag :: Text -> Maybe (Text, Text) parseUtag utag = case T.splitOn (T.pack ":") utag of [x, y] -> Just (T.strip x, removeQuotes y) _ -> Nothing removeQuotes :: Text -> Text removeQuotes = T.takeWhile (/= '\"') . T.dropWhile (== '\"') . T.strip