jherve 2 лет назад
Родитель
Сommit
cd3fa70e31
2 измененных файлов с 129 добавлено и 0 удалено
  1. 11 0
      src/Content.purs
  2. 118 0
      src/LinkedIn/ArtDecoCard.purs

+ 11 - 0
src/Content.purs

@@ -5,10 +5,15 @@ import LinkedIn
 import Prelude
 
 import Browser.DOM (getBrowserDom)
+import Data.List ((:))
 import Data.List as L
+import Data.List.NonEmpty as NEL
 import Data.Maybe (Maybe(..))
+import Data.NonEmpty (NonEmpty, (:|))
 import Effect (Effect)
+import Effect.Class.Console (logShow)
 import Effect.Console (log)
+import LinkedIn.ArtDecoCard (parseArtDecoCard)
 import Yoga.Tree (showTree)
 import Yoga.Tree.Zipper as Z
 
@@ -27,6 +32,12 @@ main = do
   maybeShowPruned "no tabs found" artDecoTabs >>= log
   maybeShowPruned "no top card found" jobsUnifiedTopCard >>= log
 
+  case artDecoCards of 
+    Nothing -> log "nothing"
+    Just l -> do
+      parsed <- (\(LinkedInUIElement _ n) -> parseArtDecoCard n) $ NEL.head l
+      logShow parsed
+
 
 maybeShowTree ∷ Maybe (NonEmptyList LinkedInUIElement) → Effect String
 maybeShowTree Nothing = pure "nope"

+ 118 - 0
src/LinkedIn/ArtDecoCard.purs

@@ -0,0 +1,118 @@
+module LinkedIn.ArtDecoCard where
+
+import Prelude
+
+import Control.Monad.Maybe.Trans (MaybeT)
+import Data.Either (Either(..))
+import Data.Generic.Rep (class Generic)
+import Data.List.NonEmpty as NEL
+import Data.List.Types (NonEmptyList)
+import Data.Maybe (Maybe(..), fromJust)
+import Data.Show.Generic (genericShow)
+import Debug (trace)
+import Effect (Effect)
+import Effect.Exception (try)
+import LinkedIn (DetachedNode, toDetached)
+import Partial.Unsafe (unsafePartial)
+import Web.DOM (Node, ParentNode)
+import Web.DOM.Element as E
+import Web.DOM.NodeList as NL
+import Web.DOM.ParentNode (QuerySelector(..), querySelector, querySelectorAll)
+
+data ArtDecoCenterHeader = ArtDecoCenterHeader {
+  bold :: DetachedNode,
+  normal :: Unit,
+  light :: Array Unit
+}
+
+derive instance Generic ArtDecoCenterHeader _
+instance Show ArtDecoCenterHeader where
+  show = genericShow
+
+parseArtDecoCenterHeader :: Node -> Effect (Either String ArtDecoCenterHeader)
+parseArtDecoCenterHeader n = do
+  bold <- queryOne ":scope div.t-bold > span[aria-hidden=true]" n
+  case bold of
+    Nothing -> pure $ Left "Could not parse ArtDecoCenterHeader"
+    Just bold -> do
+      bold <- toDetached bold
+      pure $ Right (ArtDecoCenterHeader {bold: bold, normal: unit, light: [unit]})
+
+data ArtDecoCenter = ArtDecoCenter {
+  header :: ArtDecoCenterHeader,
+  content :: Unit
+}
+
+derive instance Generic ArtDecoCenter _
+instance Show ArtDecoCenter where
+  show = genericShow
+
+parseArtDecoCenter :: Node -> Effect (Either String ArtDecoCenter)
+parseArtDecoCenter n = do
+  header <- queryOne ":scope > div" n
+  case header of
+    Nothing -> pure $ Left "Could not parse ArtDecoCenter"
+    Just header -> do
+      header <- parseArtDecoCenterHeader header :: Effect (Either String ArtDecoCenterHeader)
+      pure $ case header of
+        Left l -> Left l
+        Right header -> Right (ArtDecoCenter {header: header, content: unit})
+
+data ArtDecoPvsEntity = ArtDecoPvsEntity {
+  side :: Unit,
+  center :: ArtDecoCenter
+}
+
+derive instance Generic ArtDecoPvsEntity _
+instance Show ArtDecoPvsEntity where
+  show = genericShow
+
+parseArtDecoPvsEntity :: Node -> Effect (Either String ArtDecoPvsEntity)
+parseArtDecoPvsEntity n = do
+  center <- queryOne ":scope > div.display-flex" n
+  case center of
+    Nothing -> pure $ Left "Could not parse ArtDecoPvsEntity"
+    Just center -> do
+      center <- parseArtDecoCenter center :: Effect (Either String ArtDecoCenter)
+      pure $ case center of
+        Left l -> Left l
+        Right center -> Right $ ArtDecoPvsEntity {side: unit, center: center}
+
+data ArtDecoCardElement = ArtDecoCardElement {
+  pvs_entity :: ArtDecoPvsEntity
+}
+
+derive instance Generic ArtDecoCardElement _
+instance Show ArtDecoCardElement where
+  show = genericShow
+
+parseArtDecoCard :: Node -> Effect (Either String ArtDecoCardElement)
+parseArtDecoCard n = do
+  pvs <- queryOne ":scope div.pvs-entity--padded" n
+  case pvs of
+    Nothing -> pure $  Left "Could not parse entity"
+    Just pvs -> do
+      entity <- parseArtDecoPvsEntity pvs :: Effect (Either String ArtDecoPvsEntity)
+      pure $ case entity of
+        Left l -> Left l
+        Right entity -> Right $ ArtDecoCardElement {pvs_entity: entity}
+
+toParentNode' :: Node -> ParentNode
+toParentNode' n =
+  unsafePartial $ fromJust $ intoParentNode' n where
+      intoParentNode' :: Node -> Maybe ParentNode
+      intoParentNode' node = do
+        he <- E.fromNode node
+        pure $ E.toParentNode he
+
+queryOne :: String -> Node -> Effect (Maybe Node)
+queryOne selector n = do
+  found <- querySelector (QuerySelector selector) $ toParentNode' n
+  pure case found of
+    Nothing -> Nothing
+    Just el -> Just $ E.toNode el
+
+queryAll :: String -> Node -> Effect (Maybe (NonEmptyList Node))
+queryAll selector n = do
+  found <- querySelectorAll (QuerySelector selector) $ toParentNode' n
+  liftA1 NEL.fromFoldable $ NL.toArray found