jherve 2 лет назад
Родитель
Сommit
8e2202e036
2 измененных файлов с 10 добавлено и 93 удалено
  1. 0 89
      src/LinkedIn/JobsUnifiedTopCard.purs
  2. 10 4
      test/JobsUnifiedTopCard.purs

+ 0 - 89
src/LinkedIn/JobsUnifiedTopCard.purs

@@ -1,21 +1,15 @@
 module LinkedIn.JobsUnifiedTopCard where
 module LinkedIn.JobsUnifiedTopCard where
 
 
-import Control.Alt
-import Control.Alt
 import Prelude
 import Prelude
 
 
 import Control.Monad.Error.Class (throwError)
 import Control.Monad.Error.Class (throwError)
-import Data.Either (Either(..), hush)
 import Data.Foldable (class Foldable, foldMap, foldlDefault, foldrDefault)
 import Data.Foldable (class Foldable, foldMap, foldlDefault, foldrDefault)
 import Data.Generic.Rep (class Generic)
 import Data.Generic.Rep (class Generic)
 import Data.List.Types (NonEmptyList)
 import Data.List.Types (NonEmptyList)
 import Data.Maybe (Maybe(..))
 import Data.Maybe (Maybe(..))
 import Data.Show.Generic (genericShow)
 import Data.Show.Generic (genericShow)
 import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
 import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
-import LinkedIn (DetachedNode(..))
 import LinkedIn.QueryRunner (QueryError(..), QueryRunner, chooseOne, chooseOne3, ignoreNotFound, queryAll, queryOne, queryText)
 import LinkedIn.QueryRunner (QueryError(..), QueryRunner, chooseOne, chooseOne3, ignoreNotFound, queryAll, queryOne, queryText)
-import LinkedIn.Types (ParseError(..), Parser)
-import LinkedIn.Utils (detachNonEmptyTextChild, parseDetachedNode, queryAndDetachMany, queryAndDetachOne, queryManyAndParse, queryOneAndParse)
 import Web.DOM (Node)
 import Web.DOM (Node)
 import Web.DOM.Node as N
 import Web.DOM.Node as N
 
 
@@ -183,27 +177,9 @@ instance Traversable TopCardAction where
 
 
   traverse = \x -> traverseDefault x
   traverse = \x -> traverseDefault x
 
 
-parseTopCardAction :: Parser (TopCardAction DetachedNode)
-parseTopCardAction n = do
-  self <- parseDetachedNode n
-
-  pure $ ado
-    s <- self
-  in TopCardActionApplyButton s
-
 queryTopCardAction :: QueryRunner (TopCardAction Node)
 queryTopCardAction :: QueryRunner (TopCardAction Node)
 queryTopCardAction n = pure $ TopCardActionApplyButton n
 queryTopCardAction n = pure $ TopCardActionApplyButton n
 
 
-parseTopCardSecondaryInsight :: Parser (TopCardSecondaryInsight DetachedNode)
-parseTopCardSecondaryInsight n = do
-  nested <- queryAndDetachOne ":scope span[aria-hidden=true]" n
-  plain <- parseDetachedNode n
-
-  pure $ case nested, plain of
-    Right p@(DetachedElement _), _ -> Right $ TopCardSecondaryInsightNested p
-    _, Right p@(DetachedElement _) -> Right $ TopCardSecondaryInsightPlain p
-    _, _ -> Left TextNotFoundError
-
 queryTopCardSecondaryInsightNested :: QueryRunner (TopCardSecondaryInsight Node)
 queryTopCardSecondaryInsightNested :: QueryRunner (TopCardSecondaryInsight Node)
 queryTopCardSecondaryInsightNested n = do
 queryTopCardSecondaryInsightNested n = do
   nested <- queryOne ":scope span[aria-hidden=true]" n
   nested <- queryOne ":scope span[aria-hidden=true]" n
@@ -216,21 +192,6 @@ queryTopCardSecondaryInsight :: QueryRunner (TopCardSecondaryInsight Node)
 queryTopCardSecondaryInsight n =
 queryTopCardSecondaryInsight n =
   chooseOne queryTopCardSecondaryInsightNested queryTopCardSecondaryInsightPlain n
   chooseOne queryTopCardSecondaryInsightNested queryTopCardSecondaryInsightPlain n
 
 
-parseTopCardInsightContent :: Parser (TopCardInsightContent DetachedNode)
-parseTopCardInsightContent n = do
-  primary <- queryAndDetachOne ":scope > span:first-child span[aria-hidden=true]" n
-  secondary <- queryManyAndParse
-    ":scope > span.job-details-jobs-unified-top-card__job-insight-view-model-secondary"
-    parseTopCardSecondaryInsight
-    n
-  self <- parseDetachedNode n
-
-  pure $ case primary, secondary, self of
-    _, _, Right b@(DetachedElement {tag: "BUTTON"}) -> Right $ TopCardInsightContentButton b
-    Right p@(DetachedElement _), Right s, _ -> Right $ TopCardInsightContentSecondary {primary: p, secondary: s}
-    _, _, Right el@(DetachedElement _) -> Right $ TopCardInsightContentSingle el
-    _, _, _ -> Left TextNotFoundError
-
 queryTopCardInsightContentSingle :: QueryRunner (TopCardInsightContent Node)
 queryTopCardInsightContentSingle :: QueryRunner (TopCardInsightContent Node)
 queryTopCardInsightContentSingle n = pure $ TopCardInsightContentSingle n
 queryTopCardInsightContentSingle n = pure $ TopCardInsightContentSingle n
 
 
@@ -253,18 +214,6 @@ queryTopCardInsightContent :: QueryRunner (TopCardInsightContent Node)
 queryTopCardInsightContent n =
 queryTopCardInsightContent n =
   chooseOne3 queryTopCardInsightContentSecondary queryTopCardInsightContentButton queryTopCardInsightContentSingle n
   chooseOne3 queryTopCardInsightContentSecondary queryTopCardInsightContentButton queryTopCardInsightContentSingle n
 
 
-parseTopCardInsight :: Parser (TopCardInsight DetachedNode)
-parseTopCardInsight n = do
-  icon <- queryAndDetachOne ":scope li-icon" n
-  svg <- queryAndDetachOne ":scope svg" n
-  content <- queryOneAndParse ":scope > span" parseTopCardInsightContent n
-  actionButton <- queryOneAndParse ":scope > button" parseTopCardInsightContent n
-
-  pure $ ado
-    i <- icon <|> svg
-    c <- content <|> actionButton
-  in TopCardInsight {icon: i, content: c}
-
 queryTopCardInsight :: QueryRunner (TopCardInsight Node)
 queryTopCardInsight :: QueryRunner (TopCardInsight Node)
 queryTopCardInsight n = do
 queryTopCardInsight n = do
   icon <- chooseOne (queryOne ":scope li-icon") (queryOne ":scope svg") n
   icon <- chooseOne (queryOne ":scope li-icon") (queryOne ":scope svg") n
@@ -273,17 +222,6 @@ queryTopCardInsight n = do
 
 
   pure $ TopCardInsight {icon, content: c}
   pure $ TopCardInsight {icon, content: c}
 
 
-parseTopCardPrimaryDescription :: Parser (TopCardPrimaryDescription DetachedNode)
-parseTopCardPrimaryDescription n = do
-  link <- queryAndDetachOne ":scope > a" n
-  text <- detachNonEmptyTextChild n
-  tvmText <- queryAndDetachMany "span.tvm__text" n
-
-  pure $ ado
-    l <- link
-    t <- text
-  in TopCardPrimaryDescription {link: l, text: t, tvmText: hush tvmText}
-
 queryTopCardPrimaryDescription :: QueryRunner (TopCardPrimaryDescription Node)
 queryTopCardPrimaryDescription :: QueryRunner (TopCardPrimaryDescription Node)
 queryTopCardPrimaryDescription n = do
 queryTopCardPrimaryDescription n = do
   link <- queryOne ":scope > a" n
   link <- queryOne ":scope > a" n
@@ -292,32 +230,6 @@ queryTopCardPrimaryDescription n = do
 
 
   pure $ TopCardPrimaryDescription {link, text, tvmText: tvmText}
   pure $ TopCardPrimaryDescription {link, text, tvmText: tvmText}
 
 
-parseJobsUnifiedTopCardElement :: Parser (JobsUnifiedTopCardElement DetachedNode)
-parseJobsUnifiedTopCardElement n = do
-  h1 <- queryAndDetachOne "h1.job-details-jobs-unified-top-card__job-title" n
-  primary <- queryOneAndParse
-    "div.job-details-jobs-unified-top-card__primary-description-container > div"
-    parseTopCardPrimaryDescription
-    n
-  insights <- queryManyAndParse
-    "li.job-details-jobs-unified-top-card__job-insight"
-    parseTopCardInsight
-    n
-  actions <- queryManyAndParse
-    ".mt5 button"
-    parseTopCardAction
-    n
-
-  pure $ ado
-    h <- h1
-    p <- primary
-  in JobsUnifiedTopCardElement {
-    header: h,
-    primaryDescription: p,
-    insights: hush insights,
-    actions: hush actions
-  }
-
 queryJobsUnifiedTopCardElement :: QueryRunner (JobsUnifiedTopCardElement Node)
 queryJobsUnifiedTopCardElement :: QueryRunner (JobsUnifiedTopCardElement Node)
 queryJobsUnifiedTopCardElement n = do
 queryJobsUnifiedTopCardElement n = do
   h1 <- queryOne "h1.job-details-jobs-unified-top-card__job-title" n
   h1 <- queryOne "h1.job-details-jobs-unified-top-card__job-title" n
@@ -353,5 +265,3 @@ toPrimaryDescriptionText ∷ forall a. JobsUnifiedTopCardElement a → a
 toPrimaryDescriptionText (JobsUnifiedTopCardElement {
 toPrimaryDescriptionText (JobsUnifiedTopCardElement {
   primaryDescription: TopCardPrimaryDescription {text}
   primaryDescription: TopCardPrimaryDescription {text}
 }) = text
 }) = text
-

+ 10 - 4
test/JobsUnifiedTopCard.purs

@@ -10,10 +10,12 @@ import Data.List.NonEmpty (NonEmptyList(..))
 import Data.List.NonEmpty as NEL
 import Data.List.NonEmpty as NEL
 import Data.Maybe (Maybe(..), isJust)
 import Data.Maybe (Maybe(..), isJust)
 import Data.NonEmpty (NonEmpty(..))
 import Data.NonEmpty (NonEmpty(..))
+import Data.Traversable (traverse)
 import Effect (Effect)
 import Effect (Effect)
-import LinkedIn (DetachedNode(..), LinkedInUIElement(..), getJobsUnifiedTopCard)
+import LinkedIn (DetachedNode(..), LinkedInUIElement(..), getJobsUnifiedTopCard, toDetached)
 import LinkedIn.Profile.WorkExperience (WorkExperience(..))
 import LinkedIn.Profile.WorkExperience (WorkExperience(..))
 import LinkedIn.Profile.WorkExperience as PWE
 import LinkedIn.Profile.WorkExperience as PWE
+import LinkedIn.QueryRunner (QueryError, runQuery)
 import LinkedIn.Types (ParseError(..))
 import LinkedIn.Types (ParseError(..))
 import LinkedIn.UIElements.Types (Duration(..), TimeSpan(..))
 import LinkedIn.UIElements.Types (Duration(..), TimeSpan(..))
 import Node.JsDom (jsDomFromFile)
 import Node.JsDom (jsDomFromFile)
@@ -154,8 +156,12 @@ testJobsUnifiedTopCard = do
   }
   }
 
 
 
 
-parseHeadCard ∷ Partial => Maybe (NonEmptyList LinkedInUIElement) → Effect (Either ParseError (JobsUnifiedTopCardElement DetachedNode))
+parseHeadCard ∷ Partial ⇒ Maybe (NonEmptyList LinkedInUIElement) → Effect (Either QueryError (JobsUnifiedTopCardElement DetachedNode))
 parseHeadCard (Just l) = do
 parseHeadCard (Just l) = do
-  parsed <- (\(LinkedInUIElement _ n) -> parseJobsUnifiedTopCardElement n) $ NEL.head l
-  pure $ parsed
+  queried <- (\(LinkedInUIElement _ n) -> runQuery $ queryJobsUnifiedTopCardElement n) $ NEL.head l
+  case queried of
+    Left l -> pure $ Left l
+    Right q -> do
+      parsed <- traverse toDetached q
+      pure $ Right parsed