ソースを参照

Push fromNodeToDetached call to highest level

jherve 1 年間 前
コミット
2ba45e51f2

+ 15 - 5
src/Content.purs

@@ -14,7 +14,9 @@ import LinkedIn.Page.JobOffer as PageJ
 import LinkedIn.Page.Projects as PageP
 import LinkedIn.Page.Projects as PageP
 import LinkedIn.Page.Skills as PageS
 import LinkedIn.Page.Skills as PageS
 import LinkedIn.Page.WorkExperiences as PageWE
 import LinkedIn.Page.WorkExperiences as PageWE
+import LinkedIn.Profile.Utils (fromDetachedToUI, fromNodeToDetached)
 import LinkedIn.QueryRunner (QueryRunner', runQuery)
 import LinkedIn.QueryRunner (QueryRunner', runQuery)
+import LinkedIn.UIElements.Types (UIElement)
 import Web.DOM (Document, Node)
 import Web.DOM (Document, Node)
 
 
 main :: Effect Unit
 main :: Effect Unit
@@ -30,11 +32,19 @@ main = do
 
 
   runQueryAndDetach PageJ.query dom >>= logShow
   runQueryAndDetach PageJ.query dom >>= logShow
 
 
+extractData ∷ ∀ t a. Traversable t ⇒ (t UIElement → Either String a) → t Node → Effect (Either String a)
+extractData parsePageUI n = do
+  d <- fromNodeToDetached n
+  pure $ case fromDetachedToUI d of
+      Left l -> Left l
+      Right ui -> parsePageUI ui
+
 runQueryAndExtract ∷
 runQueryAndExtract ∷
-  ∀ f1 a.
-  Show a
-  ⇒ QueryRunner' Document (f1 Node)
-  → (f1 Node → Effect (Either String a))
+  ∀ t a.
+  Traversable t
+  => Show a
+  ⇒ QueryRunner' Document (t Node)
+  → (t UIElement → Either String a)
   → Document
   → Document
   → Effect Unit
   → Effect Unit
 runQueryAndExtract query extract dom = do
 runQueryAndExtract query extract dom = do
@@ -42,7 +52,7 @@ runQueryAndExtract query extract dom = do
   case n of
   case n of
     Left l' -> logShow l'
     Left l' -> logShow l'
     Right q -> do
     Right q -> do
-      extracted <- extract q
+      extracted <- (extractData extract) q
       logShow extracted
       logShow extracted
 
 
 runQueryAndDetach ∷
 runQueryAndDetach ∷

+ 4 - 10
src/LinkedIn/Page/JobOffer.purs

@@ -6,14 +6,12 @@ import Data.Either (Either)
 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.Show.Generic (genericShow)
 import Data.Show.Generic (genericShow)
-import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
-import Effect (Effect)
-import LinkedIn.DetachedNode (toDetached)
+import Data.Traversable (class Traversable, sequence, traverseDefault)
 import LinkedIn.Jobs.JobOffer (JobOffer)
 import LinkedIn.Jobs.JobOffer (JobOffer)
 import LinkedIn.Jobs.JobOffer as JJO
 import LinkedIn.Jobs.JobOffer as JJO
 import LinkedIn.JobsUnifiedTopCard (JobsUnifiedTopCardElement, queryJobsUnifiedTopCardElement)
 import LinkedIn.JobsUnifiedTopCard (JobsUnifiedTopCardElement, queryJobsUnifiedTopCardElement)
-import LinkedIn.Profile.Utils (fromDetachedToUI)
 import LinkedIn.QueryRunner (QueryRunner', subQueryOne)
 import LinkedIn.QueryRunner (QueryRunner', subQueryOne)
+import LinkedIn.UIElements.Types (UIElement)
 import Web.DOM (Document, Node)
 import Web.DOM (Document, Node)
 
 
 data JobOfferPage a = JobOfferPage (JobsUnifiedTopCardElement a)
 data JobOfferPage a = JobOfferPage (JobsUnifiedTopCardElement a)
@@ -42,9 +40,5 @@ query n = do
   card <- subQueryOne queryJobsUnifiedTopCardElement "div.jobs-unified-top-card" n
   card <- subQueryOne queryJobsUnifiedTopCardElement "div.jobs-unified-top-card" n
   pure $ JobOfferPage card
   pure $ JobOfferPage card
 
 
-extract ∷ JobOfferPage Node → Effect (Either String JobOffer)
-extract p = do
-  detached <- traverse toDetached p
-  let
-    JobOfferPage tabs = detached
-  pure $ (JJO.fromUI <=< fromDetachedToUI) tabs
+extract ∷ JobOfferPage UIElement → Either String JobOffer
+extract (JobOfferPage tabs) = JJO.fromUI tabs

+ 3 - 9
src/LinkedIn/Page/Projects.purs

@@ -8,13 +8,11 @@ import Data.Generic.Rep (class Generic)
 import Data.List.Types (NonEmptyList)
 import Data.List.Types (NonEmptyList)
 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 Effect (Effect)
 import LinkedIn.ArtDecoCard (ArtDecoCardElement, queryArtDecoCard)
 import LinkedIn.ArtDecoCard (ArtDecoCardElement, queryArtDecoCard)
-import LinkedIn.DetachedNode (toDetached)
 import LinkedIn.Profile.Project (Project)
 import LinkedIn.Profile.Project (Project)
 import LinkedIn.Profile.Project as PP
 import LinkedIn.Profile.Project as PP
-import LinkedIn.Profile.Utils (fromDetachedToUI)
 import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
 import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
+import LinkedIn.UIElements.Types (UIElement)
 import Web.DOM (Document, Node)
 import Web.DOM (Document, Node)
 
 
 data ProjectsPage a = ProjectsPage (NonEmptyList (ArtDecoCardElement a))
 data ProjectsPage a = ProjectsPage (NonEmptyList (ArtDecoCardElement a))
@@ -43,9 +41,5 @@ query n = do
   cards <- subQueryMany queryArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li" n
   cards <- subQueryMany queryArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li" n
   pure $ ProjectsPage cards
   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 <=< fromDetachedToUI) cards
+extract ∷ ProjectsPage UIElement → Either String (NonEmptyList Project)
+extract (ProjectsPage cards) = traverse PP.fromUI cards

+ 3 - 9
src/LinkedIn/Page/Skills.purs

@@ -8,13 +8,11 @@ import Data.Generic.Rep (class Generic)
 import Data.List.Types (NonEmptyList)
 import Data.List.Types (NonEmptyList)
 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 Effect (Effect)
 import LinkedIn.ArtDecoTab (ArtDecoTabElement, queryArtDecoTab)
 import LinkedIn.ArtDecoTab (ArtDecoTabElement, queryArtDecoTab)
-import LinkedIn.DetachedNode (toDetached)
 import LinkedIn.Profile.Skill (Skill)
 import LinkedIn.Profile.Skill (Skill)
 import LinkedIn.Profile.Skill as PS
 import LinkedIn.Profile.Skill as PS
-import LinkedIn.Profile.Utils (fromDetachedToUI)
 import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
 import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
+import LinkedIn.UIElements.Types (UIElement)
 import Web.DOM (Document, Node)
 import Web.DOM (Document, Node)
 
 
 data SkillsPage a = SkillsPage (NonEmptyList (ArtDecoTabElement a))
 data SkillsPage a = SkillsPage (NonEmptyList (ArtDecoTabElement a))
@@ -43,9 +41,5 @@ query n = do
   tabs <- subQueryMany queryArtDecoTab "div.artdeco-tabs > div > div > div > div > ul > li" n
   tabs <- subQueryMany queryArtDecoTab "div.artdeco-tabs > div > div > div > div > ul > li" n
   pure $ SkillsPage tabs
   pure $ SkillsPage tabs
 
 
-extract ∷ SkillsPage Node → Effect (Either String (NonEmptyList Skill))
-extract p = do
-  detached <- traverse toDetached p
-  let
-    SkillsPage tabs = detached
-  pure $ traverse (PS.fromUI <=< fromDetachedToUI) tabs
+extract ∷ SkillsPage UIElement → Either String (NonEmptyList Skill)
+extract (SkillsPage tabs) = traverse PS.fromUI tabs

+ 3 - 9
src/LinkedIn/Page/WorkExperiences.purs

@@ -8,13 +8,11 @@ import Data.Generic.Rep (class Generic)
 import Data.List.Types (NonEmptyList)
 import Data.List.Types (NonEmptyList)
 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 Effect (Effect)
 import LinkedIn.ArtDecoCard (ArtDecoCardElement, queryArtDecoCard)
 import LinkedIn.ArtDecoCard (ArtDecoCardElement, queryArtDecoCard)
-import LinkedIn.DetachedNode (toDetached)
-import LinkedIn.Profile.Utils (fromDetachedToUI)
 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 (QueryRunner', subQueryMany)
 import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
+import LinkedIn.UIElements.Types (UIElement)
 import Web.DOM (Document, Node)
 import Web.DOM (Document, Node)
 
 
 data WorkExperiencesPage a = WorkExperiencesPage (NonEmptyList (ArtDecoCardElement a))
 data WorkExperiencesPage a = WorkExperiencesPage (NonEmptyList (ArtDecoCardElement a))
@@ -43,9 +41,5 @@ query n = do
   cards <- subQueryMany queryArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li" n
   cards <- subQueryMany queryArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li" n
   pure $ WorkExperiencesPage cards
   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 <=< fromDetachedToUI) cards
+extract ∷ WorkExperiencesPage UIElement → Either String (NonEmptyList WorkExperience)
+extract (WorkExperiencesPage cards) = traverse PWE.fromUI cards

+ 6 - 1
src/LinkedIn/Profile/Utils.purs

@@ -6,10 +6,15 @@ import Control.Alt ((<|>))
 import Data.Either (Either(..))
 import Data.Either (Either(..))
 import Data.Maybe (Maybe(..))
 import Data.Maybe (Maybe(..))
 import Data.Traversable (class Traversable, traverse)
 import Data.Traversable (class Traversable, traverse)
-import LinkedIn.DetachedNode (DetachedNode(..))
+import Effect (Effect)
+import LinkedIn.DetachedNode (DetachedNode(..), toDetached)
 import LinkedIn.UIElements.Parser (uiStringP)
 import LinkedIn.UIElements.Parser (uiStringP)
 import LinkedIn.UIElements.Types (UIElement(..))
 import LinkedIn.UIElements.Types (UIElement(..))
 import Parsing (ParseError(..), initialPos, runParser)
 import Parsing (ParseError(..), initialPos, runParser)
+import Web.DOM (Node)
+
+fromNodeToDetached ∷ ∀ t. Traversable t ⇒ t Node → Effect (t DetachedNode)
+fromNodeToDetached = traverse toDetached
 
 
 fromDetachedToUI ∷ ∀ t. Traversable t ⇒ t DetachedNode → Either String (t UIElement)
 fromDetachedToUI ∷ ∀ t. Traversable t ⇒ t DetachedNode → Either String (t UIElement)
 fromDetachedToUI el = case traverse toUIElement el of
 fromDetachedToUI el = case traverse toUIElement el of