Переглянути джерело

Add subQueryOne/Many utility functions

jherve 1 рік тому
батько
коміт
39606d3b7f

+ 23 - 37
src/LinkedIn/ArtDeco.purs

@@ -9,8 +9,8 @@ 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, traverse, traverseDefault)
-import LinkedIn.QueryRunner (QueryRunner, ignoreNotFound, queryAll, queryOne)
+import Data.Traversable (class Traversable, sequence, traverseDefault)
+import LinkedIn.QueryRunner (QueryRunner, ignoreNotFound, queryAll, queryOne, subQueryMany, subQueryOne)
 import Web.DOM (Node)
 
 
@@ -134,53 +134,39 @@ instance Traversable ArtDecoPvsEntity where
 
   traverse = \x -> traverseDefault x
 
-queryArtDecoPvsEntitySubComponents ∷ String -> QueryRunner (NonEmptyList (ArtDecoPvsEntitySubComponent Node))
-queryArtDecoPvsEntitySubComponents selector n = do
-  roots <- queryAll selector n
-  traverse queryComponent roots
-
-  where
-    queryComponent n' = do
-      content <- ignoreNotFound $ queryOne "span[aria-hidden=true]" n'
-      pure $ ArtDecoPvsEntitySubComponent content
-
-queryArtDecoCenterContent ∷ String -> QueryRunner (ArtDecoCenterContent Node)
-queryArtDecoCenterContent selector n = do
-  content <- queryOne selector n
-
-  sc <- queryArtDecoPvsEntitySubComponents ":scope > ul > li" content
+queryArtDecoPvsEntitySubComponent ∷ QueryRunner (ArtDecoPvsEntitySubComponent Node)
+queryArtDecoPvsEntitySubComponent n = do
+  content <- ignoreNotFound $ queryOne "span[aria-hidden=true]" n
+  pure $ ArtDecoPvsEntitySubComponent content
 
+queryArtDecoCenterContent ∷ QueryRunner (ArtDecoCenterContent Node)
+queryArtDecoCenterContent n = do
+  sc <- subQueryMany queryArtDecoPvsEntitySubComponent ":scope > ul > li" n
   pure $ ArtDecoCenterContent sc
 
-queryArtDecoCenterHeader ∷ String -> QueryRunner (ArtDecoCenterHeader Node)
-queryArtDecoCenterHeader selector n = do
-  header <- queryOne selector n
-
-  bold <- queryOne ":scope div.t-bold > span[aria-hidden=true]" header
+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]" header
+    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]" header
+    queryAll ":scope span.t-black--light > span[aria-hidden=true]" n
 
   pure $ ArtDecoCenterHeader {bold, normal, light}
 
-queryArtDecoCenter ∷ String -> QueryRunner (ArtDecoCenter Node)
-queryArtDecoCenter selector n = do
-  root <- queryOne selector n
-
-  h <- queryArtDecoCenterHeader ":scope > div" root
-  c <- queryArtDecoCenterContent ":scope > div.pvs-entity__sub-components" root
-
-  pure $ ArtDecoCenter {header: h, content: c}
+queryArtDecoCenter ∷ QueryRunner (ArtDecoCenter Node)
+queryArtDecoCenter n = do
+  header <- subQueryOne queryArtDecoCenterHeader ":scope > div" n
+  content <- subQueryOne queryArtDecoCenterContent ":scope > div.pvs-entity__sub-components" n
 
-queryArtDecoPvsEntity ∷ String -> QueryRunner (ArtDecoPvsEntity Node)
-queryArtDecoPvsEntity selector n = do
-  root <- queryOne selector n
-  c <- queryArtDecoCenter ":scope > div.display-flex" root
+  pure $ ArtDecoCenter {header, content}
 
-  pure $ ArtDecoPvsEntity {side: unit, center: c}
+queryArtDecoPvsEntity ∷ QueryRunner (ArtDecoPvsEntity Node)
+queryArtDecoPvsEntity n = do
+  center <- subQueryOne queryArtDecoCenter ":scope > div.display-flex" n
+  pure $ ArtDecoPvsEntity {side: unit, center}
 
 toHeaderBold ∷ forall a. ArtDecoPvsEntity a → a
 toHeaderBold (ArtDecoPvsEntity {

+ 3 - 3
src/LinkedIn/ArtDecoCard.purs

@@ -11,7 +11,7 @@ import Data.Show.Generic (genericShow)
 import Data.Traversable (class Traversable, sequence, traverseDefault)
 import LinkedIn.ArtDeco (ArtDecoPvsEntity, queryArtDecoPvsEntity)
 import LinkedIn.ArtDeco as AD
-import LinkedIn.QueryRunner (QueryRunner)
+import LinkedIn.QueryRunner (QueryRunner, subQueryOne)
 import Web.DOM (Node)
 
 
@@ -40,8 +40,8 @@ instance Traversable ArtDecoCardElement where
 
 queryArtDecoCard :: QueryRunner (ArtDecoCardElement Node)
 queryArtDecoCard n = do
-  pvs <- queryArtDecoPvsEntity ":scope div.pvs-entity--padded" n
-  pure $ ArtDecoCardElement {pvs_entity: pvs}
+  pvs_entity <- subQueryOne queryArtDecoPvsEntity ":scope div.pvs-entity--padded" n
+  pure $ ArtDecoCardElement {pvs_entity}
 
 toCenterContent ∷ forall a. ArtDecoCardElement a → List a
 toCenterContent = toPvsEntity >>> AD.toCenterContent

+ 3 - 3
src/LinkedIn/ArtDecoTab.purs

@@ -11,7 +11,7 @@ import Data.Show.Generic (genericShow)
 import Data.Traversable (class Traversable, sequence, traverseDefault)
 import LinkedIn.ArtDeco (ArtDecoPvsEntity, queryArtDecoPvsEntity)
 import LinkedIn.ArtDeco as AD
-import LinkedIn.QueryRunner (QueryRunner)
+import LinkedIn.QueryRunner (QueryRunner, subQueryOne)
 import Web.DOM (Node)
 
 
@@ -40,8 +40,8 @@ instance Traversable ArtDecoTabElement where
 
 queryArtDecoTab :: QueryRunner (ArtDecoTabElement Node)
 queryArtDecoTab n = do
-  pvs <- queryArtDecoPvsEntity ":scope div.pvs-entity--padded" n
-  pure $ ArtDecoTabElement {pvs_entity: pvs}
+  pvs_entity <- subQueryOne queryArtDecoPvsEntity ":scope div.pvs-entity--padded" n
+  pure $ ArtDecoTabElement {pvs_entity}
 
 toCenterContent ∷ forall a. ArtDecoTabElement a → List a
 toCenterContent = toPvsEntity >>> AD.toCenterContent

+ 7 - 0
src/LinkedIn/QueryRunner.purs

@@ -8,6 +8,7 @@ import Data.Generic.Rep (class Generic)
 import Data.List.Types (NonEmptyList)
 import Data.Maybe (Maybe(..))
 import Data.Show.Generic (genericShow)
+import Data.Traversable (traverse)
 import Effect (Effect)
 import LinkedIn.Utils as U
 import Web.DOM (Node)
@@ -44,3 +45,9 @@ queryAll ∷ String → QueryRunner (NonEmptyList Node)
 queryAll selector node = ExceptT $ do
   maybeNodes <- U.queryAll selector node
   pure $ note (QNodeListNotFoundError selector) maybeNodes
+
+subQueryMany ∷ ∀ a. QueryRunner a → String → QueryRunner (NonEmptyList a)
+subQueryMany query selector n = traverse query =<< queryAll selector n
+
+subQueryOne ∷ ∀ a. QueryRunner a → String → QueryRunner a
+subQueryOne query selector n = query =<< queryOne selector n