stylist 2.3.0.0 → 2.4.0.0
raw patch · 5 files changed
+35/−14 lines, 5 filesdep +regex-tdfadep ~base
Dependencies added: regex-tdfa
Dependency ranges changed: base
Files
- ChangeLog.md +4/−0
- src/Data/CSS/Preprocessor/Conditions.hs +4/−0
- src/Data/CSS/Preprocessor/Conditions/Expr.hs +1/−1
- src/Data/CSS/Preprocessor/PsuedoClasses.hs +22/−10
- stylist.cabal +4/−3
ChangeLog.md view
@@ -1,5 +1,9 @@ # Revision history for stylist +## 2.4.0 -- 2020-12-31+* Add `@document regexp()` support via TDFA.+* Allow callers to define psuedoclasses via callbacks on attribute value.+ ## 0.0.1 -- YYYY-mm-dd * First version. Released on an unsuspecting world.
src/Data/CSS/Preprocessor/Conditions.hs view
@@ -21,6 +21,7 @@ import Data.Text (unpack) import Network.URI (URI(..), URIAuth(..), parseURI) import Control.Concurrent.Async (forConcurrently)+import Text.Regex.TDFA ((=~)) import Data.List @@ -85,6 +86,9 @@ | isUnstyled self = parseAtBlock self toks | otherwise = addAtRule self "document" toks -- TODO Support regexp() conditions, requires new dependency+ addAtRule self "document" (Function "regexp":String pattern:RightParen:toks)+ | hostUrlS self =~ unpack pattern = parseAtBlock self toks+ | otherwise = addAtRule self "document" toks addAtRule self "document" tokens = (self, skipAtRule tokens) addAtRule self "media" toks
src/Data/CSS/Preprocessor/Conditions/Expr.hs view
@@ -86,7 +86,7 @@ -- Have tokens lower to variables, to make things easier for the callee. eval' stack v t (Tok tok:ops) | t tok /= B False = eval' (t tok:stack) v t ops eval' stack v t (Tok (Ident name):ops) = eval' (v name:stack) v t ops--- TODO: How should I handle ratios?+-- Ratios should be compared as floating point... eval' (N y:N x:stack) v t (MkRatio:ops) = eval' (N (x / y):stack) v t ops eval' (N y:N x:stack) v t (Less:ops) = eval' (B (x < y):stack) v t ops eval' (R _ y:N x:stack) v t (Less:ops) = eval' (B (x < y):stack) v t ops
src/Data/CSS/Preprocessor/PsuedoClasses.hs view
@@ -2,7 +2,7 @@ -- | Lowers psuedoclasses to rawer syntactic forms. module Data.CSS.Preprocessor.PsuedoClasses(LowerPsuedoClasses(..), psuedoClassesFilter, htmlPsuedoFilter,- addRewrite, addRewrite', addPsuedoEl, addNamespace) where+ addRewrite, addRewrite', addPsuedoEl, addNamespace, addTest, PropertyTest) where import Data.CSS.Syntax.StyleSheet import Data.CSS.Syntax.Selector@@ -16,9 +16,10 @@ -------- ---- core --------+type RewriteMap = HashMap Text ([Token] -> [SimpleSelector]) data LowerPsuedoClasses s = LowerPsuedoClasses { inner :: s,- rewriteRules :: HashMap Text [Token],+ rewriteRules :: RewriteMap, psuedoEls :: [Text], namespaces :: HashMap Text Text }@@ -48,7 +49,7 @@ extractPseudoEl' :: [Text] -> [SimpleSelector] -> Maybe Text extractPseudoEl' ps sel = listToMaybe [p | Psuedoclass p [] <- sel, p `elem` ps] -lowerSelector :: HashMap Text Text -> HashMap Text [Token] -> Selector -> Selector+lowerSelector :: HashMap Text Text -> RewriteMap -> Selector -> Selector lowerSelector ns rewrites (Element sel') = Element $ lowerSelector' ns rewrites sel' lowerSelector ns rewrites (Child p sel') = Child (lowerSelector ns rewrites p) $ lowerSelector' ns rewrites sel'@@ -59,14 +60,11 @@ lowerSelector ns rewrites (Sibling sib sel') = Sibling (lowerSelector ns rewrites sib) $ lowerSelector' ns rewrites sel' -lowerSelector' :: HashMap Text Text -> HashMap Text [Token] -> [SimpleSelector] -> [SimpleSelector]+lowerSelector' :: HashMap Text Text -> RewriteMap -> [SimpleSelector] -> [SimpleSelector] lowerSelector' namespaces' rewrites (Namespace ns:sels) = Namespace (fromMaybe "about:invalid" $ HM.lookup ns namespaces') : lowerSelector' namespaces' rewrites sels-lowerSelector' ns rewrites (Psuedoclass name []:sels)- | Just value <- name `HM.lookup` rewrites = Psuedoclass "where" value : lowerSelector' ns rewrites sels-lowerSelector' ns rewrites (Psuedoclass name [arg]:sels)- | Just value <- name `HM.lookup` rewrites =- Psuedoclass "where" [if a == Ident "_" then arg else a | a <- value] : lowerSelector' ns rewrites sels+lowerSelector' ns rewrites (Psuedoclass name args:sels)+ | Just value <- name `HM.lookup` rewrites = value args ++ lowerSelector' ns rewrites sels lowerSelector' ns rewrites (sel:sels) = sel : lowerSelector' ns rewrites sels lowerSelector' _ _ [] = [] @@ -82,7 +80,21 @@ addRewrite :: Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s addRewrite name sel self = addRewrite' name (tokenize sel) self addRewrite' :: Text -> [Token] -> LowerPsuedoClasses s -> LowerPsuedoClasses s-addRewrite' name sel self = self { rewriteRules = insert name sel $ rewriteRules self }+addRewrite' name sel self =+ addTest' name (\args -> [Psuedoclass "where" $ spliceArgs sel args]) self+ where+ spliceArgs [] [] = []+ spliceArgs (Ident "_":toks) (arg:args) = arg : spliceArgs toks args+ spliceArgs (tok:toks) args = tok : spliceArgs toks args+ spliceArgs _ _ = [Ident "\tfail"]++addTest :: Text -> Maybe Text -> Text -> PropertyFunc -> LowerPsuedoClasses s -> LowerPsuedoClasses s+addTest name ns attr test self = addTest' name (noArg [Property ns attr $ Callback test]) self+ where+ noArg sel [] = sel+ noArg _ _ = [Psuedoclass " fail" []]+addTest' :: Text -> ([Token] -> [SimpleSelector]) -> LowerPsuedoClasses s -> LowerPsuedoClasses s+addTest' name sel self = self {rewriteRules = insert name sel $ rewriteRules self } addNamespace :: Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s addNamespace ns uri self = self { namespaces = insert ns uri $ namespaces self }
stylist.cabal view
@@ -10,7 +10,7 @@ -- PVP summary: +-+------- breaking API changes -- | | +----- non-breaking API additions -- | | | +--- code changes with no API change-version: 2.3.0.0+version: 2.4.0.0 -- A short (one-line) description of the package. synopsis: Apply CSS styles to a document tree.@@ -70,7 +70,8 @@ -- Other library packages from which modules are imported. build-depends: base >=4.9 && <=4.12, css-syntax >=0.1 && <0.2, text, unordered-containers >= 0.2 && <0.3, hashable,- network-uri >= 2.6 && <2.7, async >= 2.1 && <2.3+ network-uri >= 2.6 && <2.7, async >= 2.1 && <2.3,+ regex-tdfa >= 1.3 -- Directories containing source files. hs-source-dirs: src@@ -89,5 +90,5 @@ build-depends: base >=4.9 && <=4.12, css-syntax >=0.1 && <0.2, text, unordered-containers >= 0.2 && <0.3, hashable, network-uri >= 2.6 && <2.7, async >= 2.1 && <2.3, hspec, QuickCheck,- scientific >= 0.3 && <1.0+ scientific >= 0.3 && <1.0, regex-tdfa >= 1.3 ghc-options: -Wall