Utils.purs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. module LinkedIn.Profile.Utils where
  2. import Prelude
  3. import Control.Alt ((<|>))
  4. import Data.Either (Either(..))
  5. import Data.List as L
  6. import Data.Maybe (Maybe(..))
  7. import Data.Traversable (class Traversable, traverse)
  8. import Effect (Effect)
  9. import LinkedIn.DetachedNode (DetachedNode(..), toDetached)
  10. import LinkedIn.UIElements.Parser (uiStringP)
  11. import LinkedIn.UIElements.Types (UIElement(..))
  12. import Parsing (ParseError(..), initialPos, runParser)
  13. import Web.DOM (Node)
  14. fromNodeToDetached ∷ ∀ t. Traversable t ⇒ t Node → Effect (t DetachedNode)
  15. fromNodeToDetached = traverse toDetached
  16. fromDetachedToUI ∷ ∀ t. Traversable t ⇒ t DetachedNode → Either String (t UIElement)
  17. fromDetachedToUI el = case traverse toUIElement el of
  18. Left _ -> Left "error on conversion to UI element"
  19. Right ui -> Right ui
  20. -- TODO : should certainly use another type than ParseError here
  21. toUIElement ∷ DetachedNode → Either ParseError UIElement
  22. toUIElement (DetachedElement {content}) = wrapInUiElement content
  23. toUIElement (DetachedComment str) = wrapInUiElement str
  24. toUIElement (DetachedText str) = wrapInUiElement str
  25. toUIElement (DetachedSvgElement {id, dataTestIcon, tag: "svg"}) = case id <|> dataTestIcon of
  26. Just i -> Right (UIIcon i)
  27. Nothing -> Left (ParseError "SVG element could not be identified" initialPos)
  28. toUIElement (DetachedSvgElement _) = Left (ParseError "SVG element could not be identified" initialPos)
  29. toUIElement (DetachedLiIcon i) = Right (UIIcon i)
  30. toUIElement (DetachedButton {content, role, classes}) = map toButton $ runParser content uiStringP
  31. where toButton ui = UIButton {role, label: ui, mainClass: L.head classes}
  32. toUIElement (DetachedA {content, href}) = map toLink $ runParser content uiStringP
  33. where toLink ui = UILink href ui
  34. wrapInUiElement ∷ String → Either ParseError UIElement
  35. wrapInUiElement string = map UIElement $ runParser string uiStringP