@@ 20,7 20,10 @@ data TextStyle p = TextStyle {
counterReset :: Counters,
counterIncrement :: Counters,
- counterSet :: Counters
+ counterSet :: Counters,
+
+ whiteSpaceCollapse :: Bool,
+ newlineCollapse :: Bool
}
instance PropertyParser p => PropertyParser (TextStyle p) where
@@ 29,26 32,41 @@ instance PropertyParser p => PropertyParser (TextStyle p) where
content = [],
counterReset = [],
counterIncrement = [],
- counterSet = []
+ counterSet = [],
+ whiteSpaceCollapse = True,
+ newlineCollapse = True
}
inherit parent = TextStyle {
inner = inherit $ inner parent,
content = [],
counterReset = [],
counterIncrement = [],
- counterSet = []
+ counterSet = [],
+ whiteSpaceCollapse = whiteSpaceCollapse parent,
+ newlineCollapse = newlineCollapse parent
}
shorthand self "content" value = shorthand (inner self) "content" $ removeCounters value
shorthand _ key value
| key `elem` ["counter-reset", "counter-increment", "counter-set"],
Just _ <- parseCounters 0 value = [(key, value)]
+ shorthand self "white-space" [Ident val]
+ | val `elem` ["normal", "pre", "pre-wrap", "pre-line"] = [("white-space", [Ident val])]
+ | otherwise = shorthand (inner self) "white-space" [Ident val]
shorthand self key value = shorthand (inner self) key value
- longhand _ self "content" value = Just $ self {content = value}
longhand _ self "counter-reset" value = (\v -> self {counterReset = v}) <$> parseCounters 0 value
longhand _ self "counter-increment" value = (\v -> self {counterIncrement = v}) <$> parseCounters 1 value
longhand _ self "counter-set" value = (\v -> self {counterSet = v}) <$> parseCounters 0 value
+
+ longhand p self "white-space" [Ident "initial"] = setWhiteSpace p self True True "normal"
+ longhand p self "white-space" [Ident "normal"] = setWhiteSpace p self True True "normal"
+ longhand p self "white-space" [Ident "pre"] = setWhiteSpace p self False False "nowrap"
+ longhand p self "white-space" [Ident "nowrap"] = setWhiteSpace p self True True "nowrap"
+ longhand p self "white-space" [Ident "pre-wrap"] = setWhiteSpace p self False False "normal"
+ longhand p self "white-space" [Ident "pre-line"] = setWhiteSpace p self True False "normal"
+
+ longhand _ self "content" value = Just $ self {content = value}
longhand parent self key value = (\v -> self {inner = v}) <$> longhand (inner parent ) (inner self) key value
removeCounters :: [Token] -> [Token]
@@ 57,8 75,15 @@ removeCounters (Function "counters":Ident _:Comma:String _:toks) = String "" : r
removeCounters (tok:toks) = tok : removeCounters toks
removeCounters [] = []
+setWhiteSpace :: PropertyParser p => TextStyle p -> TextStyle p -> Bool -> Bool -> Text -> Maybe (TextStyle p)
+setWhiteSpace parent self collapse noNewlines lowered = Just $ self {
+ inner = inner self `fromMaybe` longhand (inner parent) (inner self) "white-space" [Ident lowered],
+ whiteSpaceCollapse = collapse,
+ newlineCollapse = noNewlines
+ }
parseCounters :: Integer -> [Token] -> Maybe [(Text, Integer)]
parseCounters _ [Ident "none"] = Just []
+parseCounters _ [Ident "initial"] = Just []
parseCounters _ [] = Just []
parseCounters x (Ident counter : Number _ (NVInteger count') : toks) =
(:) (counter, count') <$> parseCounters x toks
@@ 66,7 91,11 @@ parseCounters x (Ident counter : toks) = (:) (counter, x) <$> parseCounters x to
parseCounters _ _ = Nothing
resolve :: PropertyParser p => StyleTree (TextStyle p) -> StyleTree p
-resolve = applyCounters
+resolve = resolve' . applyCounters
+resolve' :: PropertyParser p => StyleTree (TextStyle p) -> StyleTree p
+resolve' = treeMap $ \TextStyle {inner = inner', content = content'} -> (
+ fromMaybe inner' $ longhand temp inner' "content" content'
+ )
--------
---- Counters
@@ 123,14 152,12 @@ renderCounters counters (Function "counters":Ident name:Comma:String sep:RightPa
renderCounters counters (tok:toks) = tok : renderCounters counters toks
renderCounters _ [] = []
-applyCounters :: PropertyParser p => StyleTree (TextStyle p) -> StyleTree p
+applyCounters :: StyleTree (TextStyle p) -> StyleTree (TextStyle p)
applyCounters = treeOrder applyCounters0 M.empty
-applyCounters0 :: PropertyParser p => Context -> Context -> Path -> TextStyle p -> (Context, p)
+applyCounters0 :: Context -> Context -> Path -> TextStyle p -> (Context, TextStyle p)
applyCounters0 counterSource valueSource path node =
let counters = inheritCounters counterSource valueSource &
instantiateCounters path (counterReset node) &
incrementCounters path (counterIncrement node) &
setCounters path (counterSet node)
- in let inner' = inner node
- in (counters,
- fromMaybe inner' $ longhand temp inner' "content" $ renderCounters counters $ content node)
+ in (counters, node {content = renderCounters counters $ content node})