|
|
@@ -1,59 +0,0 @@
|
|
|
-module LinkedIn where
|
|
|
-
|
|
|
-import Prelude
|
|
|
-
|
|
|
-import Data.List.Types (NonEmptyList)
|
|
|
-import Data.Maybe (Maybe(..))
|
|
|
-import Data.Traversable (traverse)
|
|
|
-import Effect (Effect)
|
|
|
-import LinkedIn.DetachedNode (DetachedNode, asTree', cutBranches, filterEmpty)
|
|
|
-import LinkedIn.Queryable (queryAllNodes)
|
|
|
-import Web.DOM (Document, Node)
|
|
|
-import Web.DOM.Node (nodeName)
|
|
|
-import Yoga.Tree (Tree)
|
|
|
-
|
|
|
-
|
|
|
-data LinkedInUIElementType = LinkedInUIArtDecoCard | LinkedInUIArtDecoTab | LinkedInUIJobsUnifiedTopCard
|
|
|
-
|
|
|
-instance Show LinkedInUIElementType where
|
|
|
- show LinkedInUIArtDecoCard = "ArtDecoCard"
|
|
|
- show LinkedInUIArtDecoTab = "ArtDecoTab"
|
|
|
- show LinkedInUIJobsUnifiedTopCard = "JobsUnifiedTopCard"
|
|
|
-
|
|
|
-data LinkedInUIElement = LinkedInUIElement LinkedInUIElementType Node
|
|
|
-
|
|
|
-instance Show LinkedInUIElement where
|
|
|
- show (LinkedInUIElement typ n) = "LinkedInUIElement(" <> show typ <> ", " <> nodeName n <> ")"
|
|
|
-
|
|
|
-getArtDecoCards ∷ Document → Effect (Maybe (NonEmptyList LinkedInUIElement))
|
|
|
-getArtDecoCards = queryAll' LinkedInUIArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li"
|
|
|
-
|
|
|
-getArtDecoTabs ∷ Document → Effect (Maybe (NonEmptyList LinkedInUIElement))
|
|
|
-getArtDecoTabs = queryAll' LinkedInUIArtDecoTab "div.artdeco-tabs > div > div > div > div > ul > li"
|
|
|
-
|
|
|
-getJobsUnifiedTopCard ∷ Document → Effect (Maybe (NonEmptyList LinkedInUIElement))
|
|
|
-getJobsUnifiedTopCard = queryAll' LinkedInUIJobsUnifiedTopCard "div.jobs-unified-top-card"
|
|
|
-
|
|
|
-queryAll' ∷ LinkedInUIElementType → String → Document → Effect (Maybe (NonEmptyList LinkedInUIElement))
|
|
|
-queryAll' constructor selector doc = do
|
|
|
- nodes <- queryAllNodes selector doc
|
|
|
- pure case nodes of
|
|
|
- Nothing -> Nothing
|
|
|
- Just cards -> Just $ map (LinkedInUIElement constructor) cards
|
|
|
-
|
|
|
-asTree :: LinkedInUIElement -> Effect (Tree DetachedNode)
|
|
|
-asTree (LinkedInUIElement _ n) = asTree' n
|
|
|
-
|
|
|
-asPrunedTrees :: Maybe (NonEmptyList LinkedInUIElement) → Effect (Maybe (NonEmptyList (Tree DetachedNode)))
|
|
|
-asPrunedTrees =
|
|
|
- case _ of
|
|
|
- Nothing -> pure Nothing
|
|
|
- Just els -> do
|
|
|
- trees <- traverse asPrunedTree els
|
|
|
- pure $ Just $ trees
|
|
|
-
|
|
|
-asPrunedTree :: LinkedInUIElement → Effect (Tree DetachedNode)
|
|
|
-asPrunedTree el = do
|
|
|
- tree <- asTree el
|
|
|
- pure $ cutBranches filterEmpty tree
|