Parcourir la source

Add Page for projects and work experiences

jherve il y a 1 an
Parent
commit
2f9048b669
3 fichiers modifiés avec 116 ajouts et 0 suppressions
  1. 16 0
      src/Content.purs
  2. 50 0
      src/LinkedIn/Page/Projects.purs
  3. 50 0
      src/LinkedIn/Page/WorkExperiences.purs

+ 16 - 0
src/Content.purs

@@ -16,6 +16,8 @@ import LinkedIn.ArtDecoCard (queryArtDecoCard)
 import LinkedIn.ArtDecoTab (queryArtDecoTab)
 import LinkedIn.DetachedNode (toDetached)
 import LinkedIn.JobsUnifiedTopCard (queryJobsUnifiedTopCardElement)
+import LinkedIn.Page.Projects as PageP
+import LinkedIn.Page.WorkExperiences as PageWE
 import LinkedIn.Page.Skills as PageS
 import LinkedIn.Profile.Project as PP
 import LinkedIn.Profile.Skill as PS
@@ -72,6 +74,20 @@ main = do
           log "parsed OK"
           logShow detached
 
+  wepNode <- runQuery $ PageWE.query dom
+  case wepNode of
+    Left l' -> logShow l'
+    Right q -> do
+      wep <- PageWE.extract q
+      logShow wep
+
+  projectsNode <- runQuery $ PageP.query dom
+  case projectsNode of
+    Left l' -> logShow l'
+    Right q -> do
+      projects <- PageP.extract q
+      logShow projects
+
   skillsNode <- runQuery $ PageS.query dom
   case skillsNode of
     Left l' -> logShow l'

+ 50 - 0
src/LinkedIn/Page/Projects.purs

@@ -0,0 +1,50 @@
+module LinkedIn.Page.Projects where
+
+import Prelude
+
+import Data.Either (Either)
+import Data.Foldable (class Foldable, foldMap, foldlDefault, foldrDefault)
+import Data.Generic.Rep (class Generic)
+import Data.List.Types (NonEmptyList)
+import Data.Show.Generic (genericShow)
+import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
+import Effect (Effect)
+import LinkedIn.ArtDecoCard (ArtDecoCardElement, queryArtDecoCard)
+import LinkedIn.DetachedNode (toDetached)
+import LinkedIn.Profile.Project (Project)
+import LinkedIn.Profile.Project as PP
+import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
+import Web.DOM (Document, Node)
+
+data ProjectsPage a = ProjectsPage (NonEmptyList (ArtDecoCardElement a))
+
+derive instance Generic (ProjectsPage a) _
+derive instance Eq a => Eq (ProjectsPage a)
+instance Show a => Show (ProjectsPage a) where
+  show = genericShow
+derive instance Functor ProjectsPage
+
+instance Foldable ProjectsPage where
+  foldMap f (ProjectsPage cards) = foldMap (foldMap f) cards
+
+  foldl = \x -> foldlDefault x
+  foldr = \x -> foldrDefault x
+
+instance Traversable ProjectsPage where
+  sequence (ProjectsPage cards) = ado
+    ts <- sequence (map sequence cards)
+  in ProjectsPage ts
+
+  traverse = \x -> traverseDefault x
+
+query :: QueryRunner' Document (ProjectsPage Node)
+query n = do
+  cards <- subQueryMany queryArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li" n
+  pure $ ProjectsPage cards
+
+extract ∷ ProjectsPage Node → Effect (Either String (NonEmptyList Project))
+extract p = do
+  detached <- traverse toDetached p
+  let
+    ProjectsPage cards = detached
+  pure $ traverse PP.fromUI cards

+ 50 - 0
src/LinkedIn/Page/WorkExperiences.purs

@@ -0,0 +1,50 @@
+module LinkedIn.Page.WorkExperiences where
+
+import Prelude
+
+import Data.Either (Either)
+import Data.Foldable (class Foldable, foldMap, foldlDefault, foldrDefault)
+import Data.Generic.Rep (class Generic)
+import Data.List.Types (NonEmptyList)
+import Data.Show.Generic (genericShow)
+import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
+import Effect (Effect)
+import LinkedIn.ArtDecoCard (ArtDecoCardElement, queryArtDecoCard)
+import LinkedIn.DetachedNode (toDetached)
+import LinkedIn.Profile.WorkExperience (WorkExperience)
+import LinkedIn.Profile.WorkExperience as PWE
+import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
+import Web.DOM (Document, Node)
+
+data WorkExperiencesPage a = WorkExperiencesPage (NonEmptyList (ArtDecoCardElement a))
+
+derive instance Generic (WorkExperiencesPage a) _
+derive instance Eq a => Eq (WorkExperiencesPage a)
+instance Show a => Show (WorkExperiencesPage a) where
+  show = genericShow
+derive instance Functor WorkExperiencesPage
+
+instance Foldable WorkExperiencesPage where
+  foldMap f (WorkExperiencesPage cards) = foldMap (foldMap f) cards
+
+  foldl = \x -> foldlDefault x
+  foldr = \x -> foldrDefault x
+
+instance Traversable WorkExperiencesPage where
+  sequence (WorkExperiencesPage cards) = ado
+    ts <- sequence (map sequence cards)
+  in WorkExperiencesPage ts
+
+  traverse = \x -> traverseDefault x
+
+query :: QueryRunner' Document (WorkExperiencesPage Node)
+query n = do
+  cards <- subQueryMany queryArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li" n
+  pure $ WorkExperiencesPage cards
+
+extract ∷ WorkExperiencesPage Node → Effect (Either String (NonEmptyList WorkExperience))
+extract p = do
+  detached <- traverse toDetached p
+  let
+    WorkExperiencesPage cards = detached
+  pure $ traverse PWE.fromUI cards