ArtDeco.purs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. module LinkedIn.ArtDeco where
  2. import Prelude
  3. import Data.Either (Either(..), hush)
  4. import Data.Generic.Rep (class Generic)
  5. import Data.List (List)
  6. import Data.List.NonEmpty (NonEmptyList)
  7. import Data.List.NonEmpty as NEL
  8. import Data.Maybe (Maybe)
  9. import Data.Show.Generic (genericShow)
  10. import LinkedIn (DetachedNode)
  11. import LinkedIn.Profile.Utils (toUIElement)
  12. import LinkedIn.Types (Parser)
  13. import LinkedIn.UIElements.Types (UIElement)
  14. import LinkedIn.Utils (queryAndDetachMany, queryAndDetachOne, queryManyAndParse, queryOneAndParse)
  15. import Parsing (ParseError)
  16. data ArtDecoPvsEntity a = ArtDecoPvsEntity {
  17. side :: Unit,
  18. center :: ArtDecoCenter a
  19. }
  20. data ArtDecoCenter a = ArtDecoCenter {
  21. header :: ArtDecoCenterHeader a,
  22. content :: ArtDecoCenterContent a
  23. }
  24. data ArtDecoCenterHeader a = ArtDecoCenterHeader {
  25. bold :: a,
  26. normal :: Maybe a,
  27. light :: Maybe (NonEmptyList a)
  28. }
  29. data ArtDecoCenterContent a = ArtDecoCenterContent (NonEmptyList (ArtDecoPvsEntitySubComponent a))
  30. data ArtDecoPvsEntitySubComponent a = ArtDecoPvsEntitySubComponent (Maybe a)
  31. derive instance Generic (ArtDecoPvsEntitySubComponent a) _
  32. derive instance Eq a => Eq (ArtDecoPvsEntitySubComponent a)
  33. instance Show a => Show (ArtDecoPvsEntitySubComponent a) where
  34. show = genericShow
  35. derive instance Functor ArtDecoPvsEntitySubComponent
  36. derive instance Generic (ArtDecoCenterContent a) _
  37. derive instance Eq a => Eq(ArtDecoCenterContent a)
  38. instance Show a => Show(ArtDecoCenterContent a) where
  39. show = genericShow
  40. derive instance Functor ArtDecoCenterContent
  41. derive instance Generic (ArtDecoCenterHeader a) _
  42. derive instance Eq a => Eq(ArtDecoCenterHeader a)
  43. instance Show a => Show(ArtDecoCenterHeader a) where
  44. show = genericShow
  45. derive instance Functor ArtDecoCenterHeader
  46. derive instance Generic (ArtDecoCenter a) _
  47. derive instance Eq a => Eq(ArtDecoCenter a)
  48. instance Show a => Show(ArtDecoCenter a) where
  49. show = genericShow
  50. derive instance Functor ArtDecoCenter
  51. derive instance Generic (ArtDecoPvsEntity a) _
  52. derive instance Eq a => Eq(ArtDecoPvsEntity a)
  53. instance Show a => Show(ArtDecoPvsEntity a) where
  54. show = genericShow
  55. derive instance Functor ArtDecoPvsEntity
  56. parseArtDecoPvsEntitySubComponent ∷ Parser (ArtDecoPvsEntitySubComponent DetachedNode)
  57. parseArtDecoPvsEntitySubComponent n = do
  58. content <- queryAndDetachOne "span[aria-hidden=true]" n
  59. pure $ Right $ ArtDecoPvsEntitySubComponent $ hush content
  60. parseArtDecoCenterContent ∷ Parser (ArtDecoCenterContent DetachedNode)
  61. parseArtDecoCenterContent n = do
  62. list <- queryManyAndParse ":scope > ul > li" parseArtDecoPvsEntitySubComponent n
  63. pure $ ado
  64. l <- list
  65. in ArtDecoCenterContent l
  66. parseArtDecoCenterHeader :: Parser (ArtDecoCenterHeader DetachedNode)
  67. parseArtDecoCenterHeader n = do
  68. bold <- queryAndDetachOne ":scope div.t-bold > span[aria-hidden=true]" n
  69. normal <- queryAndDetachOne ":scope span.t-normal:not(t-black--light) > span[aria-hidden=true]" n
  70. light <- queryAndDetachMany ":scope span.t-black--light > span[aria-hidden=true]" n
  71. pure $ ado
  72. b <- bold
  73. in ArtDecoCenterHeader {bold: b, normal: hush normal, light: hush light}
  74. parseArtDecoCenter :: Parser (ArtDecoCenter DetachedNode)
  75. parseArtDecoCenter n = do
  76. header <- queryOneAndParse ":scope > div" parseArtDecoCenterHeader n
  77. content <- queryOneAndParse ":scope > div.pvs-entity__sub-components" parseArtDecoCenterContent n
  78. pure $ ado
  79. h <- header
  80. c <- content
  81. in ArtDecoCenter {header: h, content: c}
  82. parseArtDecoPvsEntity :: Parser (ArtDecoPvsEntity DetachedNode)
  83. parseArtDecoPvsEntity n = do
  84. center <- queryOneAndParse ":scope > div.display-flex" parseArtDecoCenter n
  85. pure $ ado
  86. c <- center
  87. in ArtDecoPvsEntity {side: unit, center: c}
  88. toHeaderBold ∷ forall a. ArtDecoPvsEntity a → a
  89. toHeaderBold (ArtDecoPvsEntity {
  90. center: ArtDecoCenter { header: ArtDecoCenterHeader { bold }}
  91. }) = bold
  92. toHeaderNormal ∷ forall a. ArtDecoPvsEntity a → Maybe (a)
  93. toHeaderNormal (ArtDecoPvsEntity {
  94. center: ArtDecoCenter { header: ArtDecoCenterHeader { normal }}
  95. }) = normal
  96. toHeaderLight ∷ forall a. ArtDecoPvsEntity a → Maybe (NonEmptyList a)
  97. toHeaderLight (ArtDecoPvsEntity {
  98. center: ArtDecoCenter { header: ArtDecoCenterHeader { light }}
  99. }) = light
  100. toCenterContent ∷ forall a. ArtDecoPvsEntity a → List a
  101. toCenterContent (ArtDecoPvsEntity {
  102. center: ArtDecoCenter { content: ArtDecoCenterContent subComponents }
  103. }) = NEL.catMaybes $ map (\(ArtDecoPvsEntitySubComponent c) -> c) subComponents