فهرست منبع

Use new method for ArtDecoCard + ArtDeco + ArtDecoTab

jherve 1 سال پیش
والد
کامیت
468dc71d3c
6فایلهای تغییر یافته به همراه90 افزوده شده و 16 حذف شده
  1. 1 0
      spago.dhall
  2. 17 4
      src/Content.purs
  3. 42 4
      src/LinkedIn/ArtDeco.purs
  4. 10 2
      src/LinkedIn/ArtDecoCard.purs
  5. 10 1
      src/LinkedIn/ArtDecoTab.purs
  6. 10 5
      test/ArtDecoCard.purs

+ 1 - 0
spago.dhall

@@ -25,6 +25,7 @@ You can edit this file as you like.
   , "partial"
   , "prelude"
   , "strings"
+  , "transformers"
   , "tuples"
   , "web-dom"
   , "yoga-tree"

+ 17 - 4
src/Content.purs

@@ -12,9 +12,9 @@ import Data.Traversable (traverse)
 import Effect (Effect)
 import Effect.Class.Console (logShow)
 import Effect.Console (log)
-import LinkedIn.ArtDecoCard (parseArtDecoCard)
+import LinkedIn.ArtDecoCard (parseArtDecoCard, queryArtDecoCard)
 import LinkedIn.ArtDecoCardAlt (ArtDecoCardAltElement, queryArtDecoCardAlt)
-import LinkedIn.ArtDecoTab (parseArtDecoTab)
+import LinkedIn.ArtDecoTab (parseArtDecoTab, queryArtDecoTab)
 import LinkedIn.JobsUnifiedTopCard (parseJobsUnifiedTopCardElement)
 import LinkedIn.Profile.Project as PP
 import LinkedIn.Profile.Skill as PS
@@ -54,12 +54,14 @@ main = do
   case artDecoCards of
     Nothing -> log "nothing"
     Just l -> do
-      queried <- (\(LinkedInUIElement _ n) -> runQuery $ queryArtDecoCardAlt n) $ NEL.head l
+      queried <- (\(LinkedInUIElement _ n) -> runQuery $ queryArtDecoCard n) $ NEL.head l
       case queried of
         Left l -> logShow l
         Right p -> do
-          detached <- traverse toDetached p :: Effect (ArtDecoCardAltElement DetachedNode)
+          detached <- traverse toDetached p
           logShow detached
+          logShow $ PWE.fromUI detached
+          logShow $ PP.fromUI detached
 
   case artDecoTabs of
     Nothing -> log "nothing"
@@ -71,6 +73,17 @@ main = do
         Right p -> do
           logShow $ PS.fromUI p
 
+  case artDecoTabs of
+    Nothing -> log "nothing"
+    Just l -> do
+      queried <- (\(LinkedInUIElement _ n) -> runQuery $ queryArtDecoTab n) $ NEL.head l
+      case queried of
+        Left l -> logShow l
+        Right p -> do
+          detached <- traverse toDetached p
+          logShow detached
+          logShow $ PS.fromUI detached
+
   case jobsUnifiedTopCard of
     Nothing -> log "nothing"
     Just l -> do

+ 42 - 4
src/LinkedIn/ArtDeco.purs

@@ -10,13 +10,12 @@ import Data.List.NonEmpty (NonEmptyList)
 import Data.List.NonEmpty as NEL
 import Data.Maybe (Maybe)
 import Data.Show.Generic (genericShow)
-import Data.Traversable (class Traversable, sequence, traverseDefault)
+import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
 import LinkedIn (DetachedNode)
-import LinkedIn.Profile.Utils (toUIElement)
+import LinkedIn.QueryRunner (QueryRunner, ignoreNotFound, queryAll, queryOne)
 import LinkedIn.Types (Parser)
-import LinkedIn.UIElements.Types (UIElement)
 import LinkedIn.Utils (queryAndDetachMany, queryAndDetachOne, queryManyAndParse, queryOneAndParse)
-import Parsing (ParseError)
+import Web.DOM (Node)
 
 
 data ArtDecoPvsEntity a = ArtDecoPvsEntity {
@@ -144,6 +143,11 @@ parseArtDecoPvsEntitySubComponent n = do
   content <- queryAndDetachOne "span[aria-hidden=true]" n
   pure $ Right $ ArtDecoPvsEntitySubComponent $ hush content
 
+queryArtDecoPvsEntitySubComponent ∷ QueryRunner (ArtDecoPvsEntitySubComponent Node)
+queryArtDecoPvsEntitySubComponent n = do
+  content <- ignoreNotFound $ queryOne "span[aria-hidden=true]" n
+  pure $ ArtDecoPvsEntitySubComponent content
+
 parseArtDecoCenterContent ∷ Parser (ArtDecoCenterContent DetachedNode)
 parseArtDecoCenterContent n = do
   list <- queryManyAndParse ":scope > ul > li" parseArtDecoPvsEntitySubComponent n
@@ -151,6 +155,12 @@ parseArtDecoCenterContent n = do
     l <- list
   in ArtDecoCenterContent l
 
+queryArtDecoCenterContent ∷ QueryRunner (ArtDecoCenterContent Node)
+queryArtDecoCenterContent n = do
+  list <- queryAll ":scope > ul > li" n
+  sc <- traverse queryArtDecoPvsEntitySubComponent list
+  pure $ ArtDecoCenterContent sc
+
 parseArtDecoCenterHeader :: Parser (ArtDecoCenterHeader DetachedNode)
 parseArtDecoCenterHeader n = do
   bold <- queryAndDetachOne ":scope div.t-bold > span[aria-hidden=true]" n
@@ -161,6 +171,18 @@ parseArtDecoCenterHeader n = do
     b <- bold
   in ArtDecoCenterHeader {bold: b, normal: hush normal, light: hush light}
 
+queryArtDecoCenterHeader ∷ QueryRunner (ArtDecoCenterHeader Node)
+queryArtDecoCenterHeader n = do
+  bold <- queryOne ":scope div.t-bold > span[aria-hidden=true]" n
+  normal <-
+    ignoreNotFound $
+    queryOne ":scope span.t-normal:not(t-black--light) > span[aria-hidden=true]" n
+  light <-
+    ignoreNotFound $
+    queryAll ":scope span.t-black--light > span[aria-hidden=true]" n
+
+  pure $ ArtDecoCenterHeader {bold, normal, light}
+
 parseArtDecoCenter :: Parser (ArtDecoCenter DetachedNode)
 parseArtDecoCenter n = do
   header <- queryOneAndParse ":scope > div" parseArtDecoCenterHeader n
@@ -171,6 +193,15 @@ parseArtDecoCenter n = do
     c <- content
   in ArtDecoCenter {header: h, content: c}
 
+queryArtDecoCenter ∷ QueryRunner (ArtDecoCenter Node)
+queryArtDecoCenter n = do
+  header <- queryOne ":scope > div" n
+  h <- queryArtDecoCenterHeader header
+  content <- queryOne ":scope > div.pvs-entity__sub-components" n
+  c <- queryArtDecoCenterContent content
+
+  pure $ ArtDecoCenter {header: h, content: c}
+
 parseArtDecoPvsEntity :: Parser (ArtDecoPvsEntity DetachedNode)
 parseArtDecoPvsEntity n = do
   center <- queryOneAndParse ":scope > div.display-flex" parseArtDecoCenter n
@@ -179,6 +210,13 @@ parseArtDecoPvsEntity n = do
     c <- center
   in ArtDecoPvsEntity {side: unit, center: c}
 
+queryArtDecoPvsEntity ∷ QueryRunner (ArtDecoPvsEntity Node)
+queryArtDecoPvsEntity n = do
+  center <- queryOne ":scope > div.display-flex" n
+  c <- queryArtDecoCenter center
+
+  pure $ ArtDecoPvsEntity {side: unit, center: c}
+
 toHeaderBold ∷ forall a. ArtDecoPvsEntity a → a
 toHeaderBold (ArtDecoPvsEntity {
   center: ArtDecoCenter { header: ArtDecoCenterHeader { bold }}

+ 10 - 2
src/LinkedIn/ArtDecoCard.purs

@@ -10,11 +10,12 @@ import Data.Maybe (Maybe)
 import Data.Show.Generic (genericShow)
 import Data.Traversable (class Traversable, sequence, traverseDefault)
 import LinkedIn (DetachedNode)
-import LinkedIn.ArtDeco (ArtDecoPvsEntity, parseArtDecoPvsEntity)
+import LinkedIn.ArtDeco (ArtDecoPvsEntity, parseArtDecoPvsEntity, queryArtDecoPvsEntity)
 import LinkedIn.ArtDeco as AD
-import LinkedIn.QueryRunner (QueryRunner, ignoreNotFound, queryAll, queryOne)
+import LinkedIn.QueryRunner (QueryRunner, queryOne)
 import LinkedIn.Types (Parser)
 import LinkedIn.Utils (queryOneAndParse)
+import Web.DOM (Node)
 
 
 data ArtDecoCardElement a = ArtDecoCardElement {
@@ -48,6 +49,13 @@ parseArtDecoCard n = do
     p <- pvs
   in ArtDecoCardElement {pvs_entity: p}
 
+queryArtDecoCard :: QueryRunner (ArtDecoCardElement Node)
+queryArtDecoCard n = do
+  pvs <- queryOne ":scope div.pvs-entity--padded" n
+  p <- queryArtDecoPvsEntity pvs
+
+  pure $ ArtDecoCardElement {pvs_entity: p}
+
 toCenterContent ∷ forall a. ArtDecoCardElement a → List a
 toCenterContent = toPvsEntity >>> AD.toCenterContent
 

+ 10 - 1
src/LinkedIn/ArtDecoTab.purs

@@ -10,10 +10,12 @@ import Data.Maybe (Maybe)
 import Data.Show.Generic (genericShow)
 import Data.Traversable (class Traversable, sequence, traverseDefault)
 import LinkedIn (DetachedNode)
-import LinkedIn.ArtDeco (ArtDecoPvsEntity, parseArtDecoPvsEntity)
+import LinkedIn.ArtDeco (ArtDecoPvsEntity, parseArtDecoPvsEntity, queryArtDecoPvsEntity)
 import LinkedIn.ArtDeco as AD
+import LinkedIn.QueryRunner (QueryRunner, queryOne)
 import LinkedIn.Types (Parser)
 import LinkedIn.Utils (queryOneAndParse)
+import Web.DOM (Node)
 
 
 data ArtDecoTabElement a = ArtDecoTabElement {
@@ -47,6 +49,13 @@ parseArtDecoTab n = do
     p <- pvs
   in ArtDecoTabElement {pvs_entity: p}
 
+queryArtDecoTab :: QueryRunner (ArtDecoTabElement Node)
+queryArtDecoTab n = do
+  pvs <- queryOne ":scope div.pvs-entity--padded" n
+  p <- queryArtDecoPvsEntity pvs
+
+  pure $ ArtDecoTabElement {pvs_entity: p}
+
 toCenterContent ∷ forall a. ArtDecoTabElement a → List a
 toCenterContent = toPvsEntity >>> AD.toCenterContent
 

+ 10 - 5
test/ArtDecoCard.purs

@@ -11,11 +11,12 @@ import Data.List.NonEmpty (NonEmptyList(..))
 import Data.List.NonEmpty as NEL
 import Data.Maybe (Maybe(..), isJust)
 import Data.NonEmpty (NonEmpty(..))
+import Data.Traversable (traverse)
 import Effect (Effect)
-import LinkedIn (DetachedNode(..), LinkedInUIElement(..), getArtDecoCards)
+import LinkedIn (DetachedNode(..), LinkedInUIElement(..), getArtDecoCards, toDetached)
 import LinkedIn.Profile.WorkExperience (WorkExperience(..))
 import LinkedIn.Profile.WorkExperience as PWE
-import LinkedIn.Types (ParseError)
+import LinkedIn.QueryRunner (QueryError, runQuery)
 import LinkedIn.UIElements.Types (Duration(..), TimeSpan(..))
 import Node.JsDom (jsDomFromFile)
 import Partial.Unsafe (unsafePartial)
@@ -90,10 +91,14 @@ testArtDecoCards = do
           })
       }
 
-parseHeadCard ∷ Partial => Maybe (NonEmptyList LinkedInUIElement) → Effect (Either ParseError (ArtDecoCardElement DetachedNode))
+parseHeadCard ∷ Partial => Maybe (NonEmptyList LinkedInUIElement) → Effect (Either QueryError (ArtDecoCardElement DetachedNode))
 parseHeadCard (Just l) = do
-  parsed <- (\(LinkedInUIElement _ n) -> parseArtDecoCard n) $ NEL.head l
-  pure $ parsed
+  queried <- (\(LinkedInUIElement _ n) -> runQuery $ queryArtDecoCard n) $ NEL.head l
+  case queried of
+    Left l -> pure $ Left l
+    Right q -> do
+      parsed <- traverse toDetached q
+      pure $ Right parsed
 
 testArtDecoCard :: Effect Unit
 testArtDecoCard = do