Jelajahi Sumber

Start adding query code

jherve 2 tahun lalu
induk
melakukan
471b715810
2 mengubah file dengan 62 tambahan dan 3 penghapusan
  1. 10 3
      src/Content.purs
  2. 52 0
      src/LinkedIn.purs

+ 10 - 3
src/Content.purs

@@ -2,12 +2,19 @@ module ExampleWebExt.Content where
 
 import Prelude
 
-import Browser.DOM (getBrowserDom)
 import Effect (Effect)
+import Effect.Class.Console (logShow)
 import Effect.Console (log)
 
+import Browser.DOM (getBrowserDom)
+import LinkedIn
+
 main :: Effect Unit
 main = do
-  _dom <- getBrowserDom
+  dom <- fromDocument <$> getBrowserDom
+  el1 <- queryOne "h2" dom
+  els <- queryAll "h2" dom
+
   log "[content] starting up"
-  
+  logShow el1
+  logShow els

+ 52 - 0
src/LinkedIn.purs

@@ -0,0 +1,52 @@
+module LinkedIn where
+
+import Prelude
+
+import Data.List.NonEmpty as NEL
+import Data.List.Types (NonEmptyList)
+import Data.Maybe (Maybe(..), fromJust)
+import Effect (Effect)
+import Partial.Unsafe (unsafePartial)
+import Web.DOM (Document, Element, Node, ParentNode)
+import Web.DOM.Document as D
+import Web.DOM.Element (tagName)
+import Web.DOM.Element as E
+import Web.DOM.Node as N
+import Web.DOM.NodeList as NL
+import Web.DOM.NodeType (NodeType(..))
+import Web.DOM.ParentNode (QuerySelector(..), querySelector, querySelectorAll)
+
+data LinkedInNode =
+  LinkedInDocument Document
+  | LinkedInElement Element
+
+fromDocument ∷ Document → LinkedInNode
+fromDocument = LinkedInDocument
+
+instance Show LinkedInNode where
+  show (LinkedInDocument _) = "some document"
+  show (LinkedInElement el) = "some " <> tagName el <> " element"
+
+toParentNode' ∷ LinkedInNode → ParentNode
+toParentNode' (LinkedInDocument doc) = D.toParentNode doc
+toParentNode' (LinkedInElement el) = E.toParentNode el
+
+fromNode ∷ Partial ⇒ Node → LinkedInNode
+fromNode n = case N.nodeType n of
+  ElementNode -> LinkedInElement $ unsafePartial $ fromJust $ E.fromNode n
+
+queryOne :: String -> LinkedInNode -> Effect (Maybe LinkedInNode)
+queryOne selector node = do
+  found <- querySelector (QuerySelector selector) $ toParentNode' node
+  pure case found of
+    Nothing -> Nothing
+    Just el -> Just $ LinkedInElement el
+
+queryAll :: String -> LinkedInNode -> Effect (Maybe (NonEmptyList LinkedInNode))
+queryAll selector node = do
+  found <- querySelectorAll (QuerySelector selector) $ toParentNode' node
+  nodeList <- liftA1 NEL.fromFoldable $ NL.toArray found
+
+  pure case nodeList of
+    Nothing -> Nothing
+    Just list -> Just $ map (unsafePartial fromNode) list