From 45606ac3374ac49dddfa9fa778dd9f3b0cdb4563 Mon Sep 17 00:00:00 2001 From: Pfalzgraf Date: Wed, 8 Jun 2022 20:34:21 +0000 Subject: [PATCH 1/2] Adds Not type class, Fixes #239 --- spec/Clay/PseudoSpec.hs | 19 +++++++++++++++++++ src/Clay/Pseudo.hs | 22 +++++++++++++++++++--- src/Clay/Render.hs | 6 ++++++ 3 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 spec/Clay/PseudoSpec.hs diff --git a/spec/Clay/PseudoSpec.hs b/spec/Clay/PseudoSpec.hs new file mode 100644 index 0000000..b1e2850 --- /dev/null +++ b/spec/Clay/PseudoSpec.hs @@ -0,0 +1,19 @@ +{-# LANGUAGE OverloadedStrings, OverloadedLists, TypeApplications #-} +module Clay.PseudoSpec where + +import Test.Hspec +import Clay +import Common +import Prelude hiding (not, div) + +spec :: Spec +spec = do + describe "not pseudo selector" $ do + describe "applied to a selector" $ do + ":not(p){display:none}" `shouldRenderFrom` not p & display none + describe "applied to a refinement" $ do + "input:not(:checked){display:none}" `shouldRenderFrom` input # not checked ? display none + describe "applied to both a selector and a refinement" $ do + ":not(#some-input:not(:checked)){display:none}" `shouldRenderFrom` not ("#some-input" # not checked) & display none + describe "applied to a overloaded string" $ do + "#some-input:not(:checked) ~ #some-div > div:not(.test){display:none}" `shouldRenderFrom` "#some-input" # not checked |~ "#some-div" |> div # not @Clay.Selector ".test" ? display none diff --git a/src/Clay/Pseudo.hs b/src/Clay/Pseudo.hs index 436c053..f302cce 100644 --- a/src/Clay/Pseudo.hs +++ b/src/Clay/Pseudo.hs @@ -1,9 +1,11 @@ {-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE TypeSynonymInstances #-} +{-# LANGUAGE FlexibleInstances #-} module Clay.Pseudo where import Data.Text (Text) -import Clay.Render (renderSelector) +import Clay.Render (renderSelector, renderRefinement) import Clay.Selector import qualified Data.Text.Lazy as Lazy @@ -64,5 +66,19 @@ nthLastChild n = func "nth-last-child" [n] nthLastOfType n = func "nth-last-of-type" [n] nthOfType n = func "nth-of-type" [n] -not :: Selector -> Refinement -not r = func "not" [Lazy.toStrict (renderSelector r)] +-- | The 'not' pseudo selector can be applied to both a 'Refinement' +-- +-- > input # not checked +-- +-- or a 'Selector' +-- +-- > not p + +class Not a where + not :: a -> Refinement + +instance Not Selector where + not r = func "not" [Lazy.toStrict (renderSelector r)] + +instance Not Refinement where + not r = func "not" (Lazy.toStrict <$> renderRefinement r) diff --git a/src/Clay/Render.hs b/src/Clay/Render.hs index d4ebeba..83d5aec 100644 --- a/src/Clay/Render.hs +++ b/src/Clay/Render.hs @@ -8,6 +8,7 @@ module Clay.Render , putCss , renderWith , renderSelector +, renderRefinement , withBanner ) where @@ -120,6 +121,11 @@ renderWith cfg top renderSelector :: Selector -> Lazy.Text renderSelector = toLazyText . selector compact +-- | Render a CSS `Refinement`. + +renderRefinement :: Refinement -> [Lazy.Text] +renderRefinement r = toLazyText . predicate <$> unFilter r + ------------------------------------------------------------------------------- renderBanner :: Config -> Lazy.Text -> Lazy.Text From 574bcb7ba6b8662c73672857533f6af895e66d15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20B=C3=A4renz?= Date: Thu, 24 Oct 2024 11:54:35 +0200 Subject: [PATCH 2/2] Update src/Clay/Render.hs --- src/Clay/Render.hs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Clay/Render.hs b/src/Clay/Render.hs index 83d5aec..1f27930 100644 --- a/src/Clay/Render.hs +++ b/src/Clay/Render.hs @@ -122,7 +122,6 @@ renderSelector :: Selector -> Lazy.Text renderSelector = toLazyText . selector compact -- | Render a CSS `Refinement`. - renderRefinement :: Refinement -> [Lazy.Text] renderRefinement r = toLazyText . predicate <$> unFilter r