ArtDecoTab.purs 3.5 KB

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