~alcinnz/haskell-stylist

95737cbd3bde394a9fc65dc0a2979f85a98d119a — Adrian Cochrane 1 year, 6 months ago f58afc0
Add speak-as support in counter-styles, some codestyle improvements.
1 files changed, 31 insertions(+), 24 deletions(-)

M src/Data/CSS/Preprocessor/Text.hs
M src/Data/CSS/Preprocessor/Text.hs => src/Data/CSS/Preprocessor/Text.hs +31 -24
@@ 11,7 11,7 @@ import qualified Data.Text as Txt
import Data.Text (Text)
import Data.CSS.Preprocessor.Text.CounterStyle
        (parseCounter, counterRender, CounterStore'(..), decimalCounter,
        defaultCounterStore, CounterStore, CounterStyle(..))
        defaultCounterStore, CounterStore, CounterStyle(..), speakAs')

import Data.Maybe (fromMaybe, isJust)
import qualified Data.HashMap.Lazy as M


@@ 231,19 231,21 @@ insertPseudos :: PropertyParser p =>
    CounterStore -> StyleTree (TextStyle p) -> StyleTree (TextStyle p)
insertPseudos s (StyleTree self@TextStyle { afterPseudo = Just child } childs) =
    insertPseudos s $
        StyleTree self { afterPseudo = Nothing } (childs ++ [t child])
        StyleTree self { afterPseudo = Nothing } (childs ++ [t Nothing child])
insertPseudos s (StyleTree self@TextStyle { beforePseudo = Just child } childs) =
    insertPseudos s $ StyleTree self { beforePseudo = Nothing } (t child:childs)
    insertPseudos s $ StyleTree self { beforePseudo = Nothing }
        (t Nothing child:childs)

insertPseudos s (StyleTree self@TextStyle { markerPseudo = Nothing } childs) =
    insertPseudos s $ StyleTree self { markerPseudo = Just temp } childs
insertPseudos s self@(StyleTree TextStyle { markerPseudo = Just child} _)
    | Just text <- lookup "content" $ counterProps child =
        addBullet self s text
        addBullet self s Nothing text
insertPseudos s self@(StyleTree TextStyle { listStyleImage = bullet@(_:_) } _) =
    addBullet self s (bullet ++ [String " "])
    addBullet self s Nothing (bullet ++ [String " "])
insertPseudos s self@(StyleTree TextStyle { listStyleType = bullet@(_:_) } _)
    | Just (cstyle, _) <- parseCounter s bullet = addBullet self s $ text cstyle
    | Just (cstyle, _) <- parseCounter s bullet =
        addBullet self s (Just cstyle) $ text cstyle
  where
    text counter = String (prefix counter):
        Function "counter":Ident "list-item":Comma:bullet ++


@@ 252,51 254,54 @@ insertPseudos s self@(StyleTree TextStyle { listStyleType = bullet@(_:_) } _)
insertPseudos store (StyleTree self childs) =
    StyleTree self $ map (insertPseudos store) childs

addBullet :: PropertyParser p =>
    StyleTree (TextStyle p) -> CounterStore -> [Token] -> StyleTree (TextStyle p)
addBullet :: PropertyParser p => StyleTree (TextStyle p) ->
    CounterStore -> Maybe CounterStyle -> [Token] -> StyleTree (TextStyle p)
addBullet (StyleTree self@TextStyle {
        isListItem = True, listPosInside = True, markerPseudo = Just child
    } childs) store txt = insertPseudos store $
        StyleTree self { isListItem = False } (t child {
    } childs) store cstyle txt = insertPseudos store $
        StyleTree self { isListItem = False } (t cstyle child {
            counterProps = insertList "content" txt $ counterProps child
        } : childs)
addBullet (StyleTree self@TextStyle { markerIsRight = Nothing } childs) store txt
    = addBullet (StyleTree self { markerIsRight = Just $ isRTL self } childs)
        store txt
addBullet (StyleTree s@TextStyle {markerIsRight=Nothing} childs) store cstyle txt
    = addBullet (StyleTree s { markerIsRight = Just $ isRTL s } childs)
        store cstyle txt
addBullet (StyleTree self@TextStyle { markerIsRight = Just False,
        isListItem = True, listPosInside = False, markerPseudo = Just child
    } childs) store txt = insertPseudos store $
    } childs) store cstyle txt = insertPseudos store $
        StyleTree self {
            isListItem = False,
            -- Flex lays out children horizontally at min size.
            counterProps=insertList "display" [Ident "flex"] $ counterProps child
        } [
            t child {
                counterProps= insertList "content" txt $ counterProps child
            t cstyle child {
                counterProps = insertList "content" txt $ counterProps child
            },
            -- Generate a new layout box for the bullet to sit outside of.
            StyleTree temp childs
        ]
addBullet (StyleTree self@TextStyle { markerIsRight = Just True,
        isListItem = True, listPosInside = False, markerPseudo = Just child
    } childs) store txt = insertPseudos store $
    } childs) store cstyle txt = insertPseudos store $
        StyleTree self {
            isListItem = False,
            counterProps=insertList "display" [Ident "flex"] $ counterProps child
        } [
            StyleTree temp childs,
            t child {
                counterProps= insertList "content" txt $ counterProps child
            t cstyle child {
                counterProps = insertList "content" txt $ counterProps child
            }
        ]
addBullet (StyleTree self childs) store _ =
addBullet (StyleTree self childs) store _ _ =
    insertPseudos store $ StyleTree self {
        isListItem = False,
        listStyleImage = [], listStyleType = []
    } childs

t :: p -> StyleTree p
t = flip StyleTree []
t :: Maybe CounterStyle -> TextStyle p -> StyleTree (TextStyle p)
t (Just cstyle) self = StyleTree self {
    counterProps = insertList "speak-as" [Ident $ speakAs' cstyle] $
        counterProps self } []
t Nothing self = StyleTree self []

--------
---- Counters


@@ 309,7 314,8 @@ inheritCounters counterSource valueSource = M.unionWith cb valueSource counterSo
                            path `elem` [p | (p, _) <- source]]

instantiateCounter :: Context -> Path -> Text -> Int -> Context
instantiateCounter counters path name val = M.insertWith appendCounter name [(path, val)] counters
instantiateCounter counters path name val =
        M.insertWith appendCounter name [(path, val)] counters
    where
        appendCounter new (old@((_:oldPath), _):olds)
            | oldPath == tail path = new ++ olds


@@ 321,7 327,8 @@ instantiateCounters path instruct counters = foldl cb counters instruct
    where cb counters' (name, value) = instantiateCounter counters' path name value

incrementCounter :: Context -> Path -> Text -> Int -> Context
incrementCounter counters path name val = M.insertWith addCounter name [(path, val)] counters
incrementCounter counters path name val =
        M.insertWith addCounter name [(path, val)] counters
    where
        addCounter ((_, new):_) ((path', old):rest) = (path', new + old):rest
        addCounter [] old = old