ArtDeco.purs 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. module LinkedIn.UI.Components.ArtDeco where
  2. import Prelude
  3. import Data.Foldable (class Foldable, foldMap, foldlDefault, foldrDefault)
  4. import Data.Generic.Rep (class Generic)
  5. import Data.Lens (Lens', Traversal', lens', traversed)
  6. import Data.Lens.Record (prop)
  7. import Data.List.NonEmpty (NonEmptyList)
  8. import Data.Maybe (Maybe)
  9. import Data.Show.Generic (genericShow)
  10. import Data.Traversable (class Traversable, sequence, traverseDefault)
  11. import Data.Tuple (Tuple(..))
  12. import LinkedIn.CanBeQueried (class CanBeQueried)
  13. import LinkedIn.QueryRunner (QueryRunner', ignoreNotFound, queryAll, queryOne, subQueryMany, subQueryOne)
  14. import LinkedIn.Queryable (class Queryable)
  15. import Type.Proxy (Proxy(..))
  16. import Web.DOM (Node)
  17. data ArtDecoPvsEntity a = ArtDecoPvsEntity {
  18. side :: Unit,
  19. center :: ArtDecoCenter a
  20. }
  21. data ArtDecoCenter a = ArtDecoCenter {
  22. header :: ArtDecoCenterHeader a,
  23. content :: ArtDecoCenterContent a
  24. }
  25. data ArtDecoCenterHeader a = ArtDecoCenterHeader {
  26. bold :: a,
  27. normal :: Maybe a,
  28. light :: Maybe (NonEmptyList a)
  29. }
  30. data ArtDecoCenterContent a = ArtDecoCenterContent (NonEmptyList (ArtDecoPvsEntitySubComponent a))
  31. data ArtDecoPvsEntitySubComponent a = ArtDecoPvsEntitySubComponent (Maybe a)
  32. derive instance Generic (ArtDecoPvsEntitySubComponent a) _
  33. derive instance Eq a => Eq (ArtDecoPvsEntitySubComponent a)
  34. instance Show a => Show (ArtDecoPvsEntitySubComponent a) where
  35. show = genericShow
  36. derive instance Functor ArtDecoPvsEntitySubComponent
  37. instance Foldable ArtDecoPvsEntitySubComponent where
  38. foldMap f (ArtDecoPvsEntitySubComponent sc) = foldMap f sc
  39. foldl = \x -> foldlDefault x
  40. foldr = \x -> foldrDefault x
  41. instance Traversable ArtDecoPvsEntitySubComponent where
  42. sequence (ArtDecoPvsEntitySubComponent subComponents) = ado
  43. sc <- sequence subComponents
  44. in ArtDecoPvsEntitySubComponent sc
  45. traverse = \x -> traverseDefault x
  46. instance Queryable q => CanBeQueried q ArtDecoPvsEntitySubComponent where
  47. query = queryArtDecoPvsEntitySubComponent
  48. derive instance Generic (ArtDecoCenterContent a) _
  49. derive instance Eq a => Eq(ArtDecoCenterContent a)
  50. instance Show a => Show(ArtDecoCenterContent a) where
  51. show = genericShow
  52. derive instance Functor ArtDecoCenterContent
  53. instance Foldable ArtDecoCenterContent where
  54. foldMap f (ArtDecoCenterContent c) = foldMap (foldMap f) c
  55. foldl = \x -> foldlDefault x
  56. foldr = \x -> foldrDefault x
  57. instance Traversable ArtDecoCenterContent where
  58. sequence (ArtDecoCenterContent center) = ado
  59. c <- sequence (map sequence center)
  60. in ArtDecoCenterContent c
  61. traverse = \x -> traverseDefault x
  62. instance Queryable q => CanBeQueried q ArtDecoCenterContent where
  63. query = queryArtDecoCenterContent
  64. derive instance Generic (ArtDecoCenterHeader a) _
  65. derive instance Eq a => Eq(ArtDecoCenterHeader a)
  66. instance Show a => Show(ArtDecoCenterHeader a) where
  67. show = genericShow
  68. derive instance Functor ArtDecoCenterHeader
  69. instance Foldable ArtDecoCenterHeader where
  70. foldMap f (ArtDecoCenterHeader {bold, normal, light}) = f bold <> foldMap f normal <> foldMap (foldMap f) light
  71. foldl = \x -> foldlDefault x
  72. foldr = \x -> foldrDefault x
  73. instance Traversable ArtDecoCenterHeader where
  74. sequence (ArtDecoCenterHeader {bold, normal, light}) = ado
  75. b <- bold
  76. n <- sequence normal
  77. l <- sequence (map sequence light)
  78. in ArtDecoCenterHeader {bold: b, normal: n, light: l}
  79. traverse = \x -> traverseDefault x
  80. instance Queryable q => CanBeQueried q ArtDecoCenterHeader where
  81. query = queryArtDecoCenterHeader
  82. derive instance Generic (ArtDecoCenter a) _
  83. derive instance Eq a => Eq(ArtDecoCenter a)
  84. instance Show a => Show(ArtDecoCenter a) where
  85. show = genericShow
  86. derive instance Functor ArtDecoCenter
  87. instance Foldable ArtDecoCenter where
  88. foldMap f (ArtDecoCenter {header, content}) = foldMap f header <> foldMap f content
  89. foldl = \x -> foldlDefault x
  90. foldr = \x -> foldrDefault x
  91. instance Traversable ArtDecoCenter where
  92. sequence (ArtDecoCenter {header, content}) = ado
  93. h <- sequence header
  94. c <- sequence content
  95. in ArtDecoCenter {header: h, content: c}
  96. traverse = \x -> traverseDefault x
  97. instance Queryable q => CanBeQueried q ArtDecoCenter where
  98. query = queryArtDecoCenter
  99. derive instance Generic (ArtDecoPvsEntity a) _
  100. derive instance Eq a => Eq(ArtDecoPvsEntity a)
  101. instance Show a => Show(ArtDecoPvsEntity a) where
  102. show = genericShow
  103. derive instance Functor ArtDecoPvsEntity
  104. instance Foldable ArtDecoPvsEntity where
  105. foldMap f (ArtDecoPvsEntity {side: _, center}) = foldMap f center
  106. foldl = \x -> foldlDefault x
  107. foldr = \x -> foldrDefault x
  108. instance Traversable ArtDecoPvsEntity where
  109. sequence (ArtDecoPvsEntity {side, center}) = ado
  110. s <- pure side
  111. c <- sequence center
  112. in ArtDecoPvsEntity {side: s, center: c}
  113. traverse = \x -> traverseDefault x
  114. instance Queryable q => CanBeQueried q ArtDecoPvsEntity where
  115. query = queryArtDecoPvsEntity
  116. queryArtDecoPvsEntitySubComponent ∷ forall q. Queryable q=> QueryRunner' q (ArtDecoPvsEntitySubComponent Node)
  117. queryArtDecoPvsEntitySubComponent n = do
  118. content <- ignoreNotFound $ queryOne "span[aria-hidden=true]" n
  119. pure $ ArtDecoPvsEntitySubComponent content
  120. queryArtDecoCenterContent :: forall q. Queryable q => QueryRunner' q (ArtDecoCenterContent Node)
  121. queryArtDecoCenterContent n = do
  122. sc <- subQueryMany queryArtDecoPvsEntitySubComponent ":scope > ul > li" n
  123. pure $ ArtDecoCenterContent sc
  124. queryArtDecoCenterHeader :: forall q. Queryable q => QueryRunner' q (ArtDecoCenterHeader Node)
  125. queryArtDecoCenterHeader n = do
  126. bold <- queryOne ":scope div.t-bold > span[aria-hidden=true]" n
  127. normal <-
  128. ignoreNotFound $
  129. queryOne ":scope span.t-normal:not(t-black--light) > span[aria-hidden=true]" n
  130. light <-
  131. ignoreNotFound $
  132. queryAll ":scope span.t-black--light > span[aria-hidden=true]" n
  133. pure $ ArtDecoCenterHeader {bold, normal, light}
  134. queryArtDecoCenter :: forall q. Queryable q => QueryRunner' q (ArtDecoCenter Node)
  135. queryArtDecoCenter n = do
  136. header <- subQueryOne queryArtDecoCenterHeader ":scope > div" n
  137. content <- subQueryOne queryArtDecoCenterContent ":scope > div.pvs-entity__sub-components" n
  138. pure $ ArtDecoCenter {header, content}
  139. queryArtDecoPvsEntity :: forall q. Queryable q => QueryRunner' q (ArtDecoPvsEntity Node)
  140. queryArtDecoPvsEntity n = do
  141. center <- subQueryOne queryArtDecoCenter ":scope > div.display-flex" n
  142. pure $ ArtDecoPvsEntity {side: unit, center}
  143. _pvs_entity :: forall a. Lens' (ArtDecoPvsEntity a) { center ∷ ArtDecoCenter a , side ∷ Unit }
  144. _pvs_entity = lens'
  145. \(ArtDecoPvsEntity pvs) -> Tuple pvs \pvs' -> ArtDecoPvsEntity pvs'
  146. _center :: forall a. Lens' (ArtDecoCenter a) { content ∷ ArtDecoCenterContent a , header ∷ ArtDecoCenterHeader a }
  147. _center = lens'
  148. \(ArtDecoCenter center) -> Tuple center \center' -> ArtDecoCenter center'
  149. _header :: forall a. Lens' (ArtDecoCenterHeader a) { bold ∷ a , light ∷ Maybe (NonEmptyList a) , normal ∷ Maybe a }
  150. _header = lens' \(ArtDecoCenterHeader h) -> Tuple h \h' -> ArtDecoCenterHeader h'
  151. _content :: forall a. Lens' (ArtDecoCenterContent a) (NonEmptyList (ArtDecoPvsEntitySubComponent a))
  152. _content = lens' \(ArtDecoCenterContent cs) -> Tuple cs \cs' -> ArtDecoCenterContent cs'
  153. _sub_component :: forall a. Lens' (ArtDecoPvsEntitySubComponent a) (Maybe a)
  154. _sub_component = lens' \(ArtDecoPvsEntitySubComponent s) -> Tuple s \s' -> ArtDecoPvsEntitySubComponent s'
  155. _pvs_to_header :: forall a. Lens' (ArtDecoPvsEntity a) { bold ∷ a , light ∷ Maybe (NonEmptyList a) , normal ∷ Maybe a }
  156. _pvs_to_header = _pvs_entity
  157. <<< prop (Proxy :: Proxy "center")
  158. <<< _center
  159. <<< prop (Proxy :: Proxy "header")
  160. <<< _header
  161. _pvs_to_subcomponents ∷ ∀ a. Traversal' (ArtDecoPvsEntity a) (Maybe a)
  162. _pvs_to_subcomponents = _pvs_entity
  163. <<< prop (Proxy :: Proxy "center")
  164. <<< _center
  165. <<< prop (Proxy :: Proxy "content")
  166. <<< _content
  167. <<< traversed
  168. <<< _sub_component
  169. _pvs_to_header_bold :: forall a. Lens' (ArtDecoPvsEntity a) a
  170. _pvs_to_header_bold = _pvs_to_header <<< prop (Proxy :: Proxy "bold")
  171. _pvs_to_header_normal :: forall a. Lens' (ArtDecoPvsEntity a) (Maybe a)
  172. _pvs_to_header_normal = _pvs_to_header <<< prop (Proxy :: Proxy "normal")
  173. _pvs_to_header_light :: forall a. Lens' (ArtDecoPvsEntity a) (Maybe (NonEmptyList a))
  174. _pvs_to_header_light = _pvs_to_header <<< prop (Proxy :: Proxy "light")