Просмотр исходного кода

Add subQueryOne/Many utility functions

jherve 1 год назад
Родитель
Сommit
39606d3b7f
4 измененных файлов с 36 добавлено и 43 удалено
  1. 23 37
      src/LinkedIn/ArtDeco.purs
  2. 3 3
      src/LinkedIn/ArtDecoCard.purs
  3. 3 3
      src/LinkedIn/ArtDecoTab.purs
  4. 7 0
      src/LinkedIn/QueryRunner.purs

+ 23 - 37
src/LinkedIn/ArtDeco.purs

@@ -9,8 +9,8 @@ import Data.List.NonEmpty (NonEmptyList)
 import Data.List.NonEmpty as NEL
 import Data.List.NonEmpty as NEL
 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 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)
 import Web.DOM (Node)
 
 
 
 
@@ -134,53 +134,39 @@ instance Traversable ArtDecoPvsEntity where
 
 
   traverse = \x -> traverseDefault x
   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
   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 <-
   normal <-
     ignoreNotFound $
     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 <-
   light <-
     ignoreNotFound $
     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}
   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 ∷ forall a. ArtDecoPvsEntity a → a
 toHeaderBold (ArtDecoPvsEntity {
 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 Data.Traversable (class Traversable, sequence, traverseDefault)
 import LinkedIn.ArtDeco (ArtDecoPvsEntity, queryArtDecoPvsEntity)
 import LinkedIn.ArtDeco (ArtDecoPvsEntity, queryArtDecoPvsEntity)
 import LinkedIn.ArtDeco as AD
 import LinkedIn.ArtDeco as AD
-import LinkedIn.QueryRunner (QueryRunner)
+import LinkedIn.QueryRunner (QueryRunner, subQueryOne)
 import Web.DOM (Node)
 import Web.DOM (Node)
 
 
 
 
@@ -40,8 +40,8 @@ instance Traversable ArtDecoCardElement where
 
 
 queryArtDecoCard :: QueryRunner (ArtDecoCardElement Node)
 queryArtDecoCard :: QueryRunner (ArtDecoCardElement Node)
 queryArtDecoCard n = do
 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 ∷ forall a. ArtDecoCardElement a → List a
 toCenterContent = toPvsEntity >>> AD.toCenterContent
 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 Data.Traversable (class Traversable, sequence, traverseDefault)
 import LinkedIn.ArtDeco (ArtDecoPvsEntity, queryArtDecoPvsEntity)
 import LinkedIn.ArtDeco (ArtDecoPvsEntity, queryArtDecoPvsEntity)
 import LinkedIn.ArtDeco as AD
 import LinkedIn.ArtDeco as AD
-import LinkedIn.QueryRunner (QueryRunner)
+import LinkedIn.QueryRunner (QueryRunner, subQueryOne)
 import Web.DOM (Node)
 import Web.DOM (Node)
 
 
 
 
@@ -40,8 +40,8 @@ instance Traversable ArtDecoTabElement where
 
 
 queryArtDecoTab :: QueryRunner (ArtDecoTabElement Node)
 queryArtDecoTab :: QueryRunner (ArtDecoTabElement Node)
 queryArtDecoTab n = do
 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 ∷ forall a. ArtDecoTabElement a → List a
 toCenterContent = toPvsEntity >>> AD.toCenterContent
 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.List.Types (NonEmptyList)
 import Data.Maybe (Maybe(..))
 import Data.Maybe (Maybe(..))
 import Data.Show.Generic (genericShow)
 import Data.Show.Generic (genericShow)
+import Data.Traversable (traverse)
 import Effect (Effect)
 import Effect (Effect)
 import LinkedIn.Utils as U
 import LinkedIn.Utils as U
 import Web.DOM (Node)
 import Web.DOM (Node)
@@ -44,3 +45,9 @@ queryAll ∷ String → QueryRunner (NonEmptyList Node)
 queryAll selector node = ExceptT $ do
 queryAll selector node = ExceptT $ do
   maybeNodes <- U.queryAll selector node
   maybeNodes <- U.queryAll selector node
   pure $ note (QNodeListNotFoundError selector) maybeNodes
   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