{-# LANGUAGE OverloadedStrings #-}
module Graphics.Layout.CSS.Parse (
    CSSBox(..), direction, txtOpts, BoxSizing(..), Display(..)) where
import Data.CSS.Syntax.Tokens (Token(..), NumericValue(..))
import Stylist (PropertyParser(..), TrivialPropertyParser, parseOperands,
                parseUnorderedShorthand', parseUnorderedShorthand)
import Data.Text.ParagraphLayout (PageOptions(..))
import Data.Text.ParagraphLayout.Rich (textDirection)
import Data.Text.Glyphize (Direction(..))

import Graphics.Layout.Box as B
import Graphics.Text.Font.Choose (Pattern, unset)
import Graphics.Layout.CSS.Length (Unitted, parseLength', parseLength, auto)
import Graphics.Layout.CSS.Font (CSSFont)
import Graphics.Layout.Grid.CSS (CSSGrid(..), CSSCell(..), Placement(..))
import Graphics.Layout.Inline.CSS (CSSInline(..))

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

-- | Parsed CSS properties relevant to layout.
data CSSBox a = CSSBox {
    -- | Which layout formula to use, a.k.a. parsed CSS display property.
    CSSBox a -> Display
display :: Display,
    -- | (Unused) Parsed CSS box-sizing
    CSSBox a -> BoxSizing
boxSizing :: BoxSizing,
    -- | sizing, margins, border-width, & padding CSS properties.
    -- Stores units in case they're needed for font-related units.
    CSSBox a -> PaddedBox Unitted Unitted
cssBox :: PaddedBox Unitted Unitted, -- calc()?
    -- | Query parameters describing desired font.
    CSSBox a -> Pattern
font :: Pattern,
    -- | Additional font-related CSS properties.
    CSSBox a -> CSSFont
font' :: CSSFont,
    -- | Caller-specified data, to parse additional CSS properties.
    CSSBox a -> a
inner :: a,
    -- | Grid-related CSS properties.
    CSSBox a -> CSSGrid
gridStyles :: CSSGrid,
    -- | Grid item related CSS properties.
    CSSBox a -> CSSCell
cellStyles :: CSSCell,
    -- | inline-related CSS properties.
    CSSBox a -> CSSInline
inlineStyles :: CSSInline,
    -- | Parsed CSS caption-side.
    CSSBox a -> Bool
captionBelow :: Bool,
    -- | Parsed widows & orphans controlling pagination.
    CSSBox a -> PageOptions
pageOptions :: PageOptions
}
-- | Accessor for inlineStyle's `textDirection` attribute.
direction :: CSSBox a -> Direction
direction CSSBox { inlineStyles :: forall a. CSSBox a -> CSSInline
inlineStyles = CSSInline _ opts :: TextOptions
opts _ } = TextOptions -> Direction
textDirection TextOptions
opts
-- | Accessor for inlineStyle's options.
txtOpts :: CSSBox a -> TextOptions
txtOpts CSSBox { inlineStyles :: forall a. CSSBox a -> CSSInline
inlineStyles = CSSInline _ opts :: TextOptions
opts _ } = TextOptions
opts
-- | Possible values for CSS box-sizing.
data BoxSizing = BorderBox | ContentBox
-- | Empty border, to use as default value.
noborder :: Border Unitted Unitted
noborder = Unitted -> Unitted -> Unitted -> Unitted -> Border Unitted Unitted
forall m n. m -> m -> n -> n -> Border m n
Border (0,"px") (0,"px") (0,"px") (0,"px")

-- | Possibly values for CSS display property.
data Display = Block | Grid | Inline | Table | None |
    TableRow | TableHeaderGroup | TableRowGroup | TableFooterGroup | TableCell |
    TableColumn | TableColumnGroup | TableCaption deriving Display -> Display -> Bool
(Display -> Display -> Bool)
-> (Display -> Display -> Bool) -> Eq Display
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Display -> Display -> Bool
$c/= :: Display -> Display -> Bool
== :: Display -> Display -> Bool
$c== :: Display -> Display -> Bool
Eq
-- | Can the display value contain table-rows?
rowContainer :: CSSBox a -> Bool
rowContainer CSSBox { display :: forall a. CSSBox a -> Display
display = Display
d } =
    Display
d Display -> [Display] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Display
Table, Display
TableHeaderGroup, Display
TableRowGroup, Display
TableFooterGroup]

instance PropertyParser a => PropertyParser (CSSBox a) where
    temp :: CSSBox a
temp = CSSBox :: forall a.
Display
-> BoxSizing
-> PaddedBox Unitted Unitted
-> Pattern
-> CSSFont
-> a
-> CSSGrid
-> CSSCell
-> CSSInline
-> Bool
-> PageOptions
-> CSSBox a
CSSBox {
        boxSizing :: BoxSizing
boxSizing = BoxSizing
ContentBox,
        display :: Display
display = Display
Inline,
        cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox :: forall m n.
Size m n
-> Size m n
-> Size Double Double
-> Size m n
-> Border m n
-> Border m n
-> Border m n
-> PaddedBox m n
PaddedBox {
            min :: Size Unitted Unitted
B.min = Unitted -> Unitted -> Size Unitted Unitted
forall m n. n -> m -> Size m n
Size Unitted
auto Unitted
auto,
            size :: Size Unitted Unitted
size = Unitted -> Unitted -> Size Unitted Unitted
forall m n. n -> m -> Size m n
Size Unitted
auto Unitted
auto,
            nat :: Size Double Double
nat = Double -> Double -> Size Double Double
forall m n. n -> m -> Size m n
Size 0 0,
            max :: Size Unitted Unitted
B.max = Unitted -> Unitted -> Size Unitted Unitted
forall m n. n -> m -> Size m n
Size Unitted
auto Unitted
auto,
            padding :: Border Unitted Unitted
padding = Border Unitted Unitted
noborder,
            border :: Border Unitted Unitted
border = Border Unitted Unitted
noborder,
            margin :: Border Unitted Unitted
margin = Border Unitted Unitted
noborder
        },
        font :: Pattern
font = Pattern
forall a. PropertyParser a => a
temp,
        font' :: CSSFont
font' = CSSFont
forall a. PropertyParser a => a
temp,
        inner :: a
inner = a
forall a. PropertyParser a => a
temp,
        gridStyles :: CSSGrid
gridStyles = CSSGrid
forall a. PropertyParser a => a
temp,
        cellStyles :: CSSCell
cellStyles = CSSCell
forall a. PropertyParser a => a
temp,
        inlineStyles :: CSSInline
inlineStyles = CSSInline
forall a. PropertyParser a => a
temp,
        captionBelow :: Bool
captionBelow = Bool
False,
        pageOptions :: PageOptions
pageOptions = Int32 -> Int32 -> Word -> Word -> PageOptions
PageOptions 0 0 2 2
      }
    inherit :: CSSBox a -> CSSBox a
inherit parent :: CSSBox a
parent = CSSBox :: forall a.
Display
-> BoxSizing
-> PaddedBox Unitted Unitted
-> Pattern
-> CSSFont
-> a
-> CSSGrid
-> CSSCell
-> CSSInline
-> Bool
-> PageOptions
-> CSSBox a
CSSBox {
        boxSizing :: BoxSizing
boxSizing = CSSBox a -> BoxSizing
forall a. CSSBox a -> BoxSizing
boxSizing CSSBox a
parent,
        display :: Display
display = Display
Inline,
        cssBox :: PaddedBox Unitted Unitted
cssBox = CSSBox TrivialPropertyParser -> PaddedBox Unitted Unitted
forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox (CSSBox TrivialPropertyParser
forall a. PropertyParser a => a
temp :: CSSBox TrivialPropertyParser),
        font :: Pattern
font = Pattern -> Pattern
forall a. PropertyParser a => a -> a
inherit (Pattern -> Pattern) -> Pattern -> Pattern
forall a b. (a -> b) -> a -> b
$ CSSBox a -> Pattern
forall a. CSSBox a -> Pattern
font CSSBox a
parent,
        font' :: CSSFont
font' = CSSFont -> CSSFont
forall a. PropertyParser a => a -> a
inherit (CSSFont -> CSSFont) -> CSSFont -> CSSFont
forall a b. (a -> b) -> a -> b
$ CSSBox a -> CSSFont
forall a. CSSBox a -> CSSFont
font' CSSBox a
parent,
        inner :: a
inner = a -> a
forall a. PropertyParser a => a -> a
inherit (a -> a) -> a -> a
forall a b. (a -> b) -> a -> b
$ CSSBox a -> a
forall a. CSSBox a -> a
inner CSSBox a
parent,
        gridStyles :: CSSGrid
gridStyles = CSSGrid -> CSSGrid
forall a. PropertyParser a => a -> a
inherit (CSSGrid -> CSSGrid) -> CSSGrid -> CSSGrid
forall a b. (a -> b) -> a -> b
$ CSSBox a -> CSSGrid
forall a. CSSBox a -> CSSGrid
gridStyles CSSBox a
parent,
        cellStyles :: CSSCell
cellStyles = CSSCell -> CSSCell
forall a. PropertyParser a => a -> a
inherit (CSSCell -> CSSCell) -> CSSCell -> CSSCell
forall a b. (a -> b) -> a -> b
$ CSSBox a -> CSSCell
forall a. CSSBox a -> CSSCell
cellStyles CSSBox a
parent,
        inlineStyles :: CSSInline
inlineStyles = CSSInline -> CSSInline
forall a. PropertyParser a => a -> a
inherit (CSSInline -> CSSInline) -> CSSInline -> CSSInline
forall a b. (a -> b) -> a -> b
$ CSSBox a -> CSSInline
forall a. CSSBox a -> CSSInline
inlineStyles CSSBox a
parent,
        captionBelow :: Bool
captionBelow = CSSBox a -> Bool
forall a. CSSBox a -> Bool
captionBelow CSSBox a
parent,
        pageOptions :: PageOptions
pageOptions = CSSBox a -> PageOptions
forall a. CSSBox a -> PageOptions
pageOptions CSSBox a
parent
      }
    priority :: CSSBox a -> [Text]
priority self :: CSSBox a
self = [[Text]] -> [Text]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [(CSSBox a -> Pattern) -> [Text]
forall a. PropertyParser a => (CSSBox a -> a) -> [Text]
x CSSBox a -> Pattern
forall a. CSSBox a -> Pattern
font, (CSSBox a -> CSSFont) -> [Text]
forall a. PropertyParser a => (CSSBox a -> a) -> [Text]
x CSSBox a -> CSSFont
forall a. CSSBox a -> CSSFont
font', (CSSBox a -> CSSGrid) -> [Text]
forall a. PropertyParser a => (CSSBox a -> a) -> [Text]
x CSSBox a -> CSSGrid
forall a. CSSBox a -> CSSGrid
gridStyles, (CSSBox a -> CSSCell) -> [Text]
forall a. PropertyParser a => (CSSBox a -> a) -> [Text]
x CSSBox a -> CSSCell
forall a. CSSBox a -> CSSCell
cellStyles, (CSSBox a -> a) -> [Text]
forall a. PropertyParser a => (CSSBox a -> a) -> [Text]
x CSSBox a -> a
forall a. CSSBox a -> a
inner]
      where x :: (CSSBox a -> a) -> [Text]
x getter :: CSSBox a -> a
getter = a -> [Text]
forall a. PropertyParser a => a -> [Text]
priority (a -> [Text]) -> a -> [Text]
forall a b. (a -> b) -> a -> b
$ CSSBox a -> a
getter CSSBox a
self

    -- Wasn't sure how to implement in FontConfig-Pure
    longhand :: CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
longhand _ self :: CSSBox a
self "font-family" [Ident "initial"] =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { font :: Pattern
font = String -> Pattern -> Pattern
forall a b. Eq a => a -> [(a, b)] -> [(a, b)]
unset "family" (Pattern -> Pattern) -> Pattern -> Pattern
forall a b. (a -> b) -> a -> b
$ CSSBox a -> Pattern
forall a. CSSBox a -> Pattern
font CSSBox a
self}

    longhand _ self :: CSSBox a
self "box-sizing" [Ident "content-box"] = CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self {boxSizing :: BoxSizing
boxSizing = BoxSizing
ContentBox}
    longhand _ self :: CSSBox a
self "box-sizing" [Ident "border-box"] = CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self {boxSizing :: BoxSizing
boxSizing = BoxSizing
BorderBox}
    longhand _ self :: CSSBox a
self "box-sizing" [Ident "initial"] = CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self {boxSizing :: BoxSizing
boxSizing = BoxSizing
ContentBox}

    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "padding-top" toks :: [Token]
toks | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { padding :: Border Unitted Unitted
padding = (PaddedBox Unitted Unitted -> Border Unitted Unitted
forall m n. PaddedBox m n -> Border m n
padding PaddedBox Unitted Unitted
box) { top :: Unitted
top = Unitted
x } } }
    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "padding-bottom" toks :: [Token]
toks | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { padding :: Border Unitted Unitted
padding = (PaddedBox Unitted Unitted -> Border Unitted Unitted
forall m n. PaddedBox m n -> Border m n
padding PaddedBox Unitted Unitted
box) { bottom :: Unitted
bottom = Unitted
x } } }
    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "padding-left" toks :: [Token]
toks | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { padding :: Border Unitted Unitted
padding = (PaddedBox Unitted Unitted -> Border Unitted Unitted
forall m n. PaddedBox m n -> Border m n
padding PaddedBox Unitted Unitted
box) { left :: Unitted
left = Unitted
x } } }
    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "padding-right" toks :: [Token]
toks | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { padding :: Border Unitted Unitted
padding = (PaddedBox Unitted Unitted -> Border Unitted Unitted
forall m n. PaddedBox m n -> Border m n
padding PaddedBox Unitted Unitted
box) { right :: Unitted
right = Unitted
x } } }
    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "padding-inline-start" toks :: [Token]
toks
        | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks, Direction
DirLTR <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self =
            CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { padding :: Border Unitted Unitted
padding = (PaddedBox Unitted Unitted -> Border Unitted Unitted
forall m n. PaddedBox m n -> Border m n
padding PaddedBox Unitted Unitted
box) { left :: Unitted
left = Unitted
x } } }
        | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks, Direction
DirRTL <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self =
            CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { padding :: Border Unitted Unitted
padding = (PaddedBox Unitted Unitted -> Border Unitted Unitted
forall m n. PaddedBox m n -> Border m n
padding PaddedBox Unitted Unitted
box) { right :: Unitted
right = Unitted
x } } }
    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "padding-inline-end" toks :: [Token]
toks
        | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks, Direction
DirLTR <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self =
            CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { padding :: Border Unitted Unitted
padding = (PaddedBox Unitted Unitted -> Border Unitted Unitted
forall m n. PaddedBox m n -> Border m n
padding PaddedBox Unitted Unitted
box) { right :: Unitted
right = Unitted
x } } }
        | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks, Direction
DirRTL <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self =
            CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { padding :: Border Unitted Unitted
padding = (PaddedBox Unitted Unitted -> Border Unitted Unitted
forall m n. PaddedBox m n -> Border m n
padding PaddedBox Unitted Unitted
box) { left :: Unitted
left = Unitted
x } } }

    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "border-top-width" toks :: [Token]
toks | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { border :: Border Unitted Unitted
border = (PaddedBox Unitted Unitted -> Border Unitted Unitted
forall m n. PaddedBox m n -> Border m n
border PaddedBox Unitted Unitted
box) { top :: Unitted
top = Unitted
x } } }
    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "border-bottom-width" toks :: [Token]
toks | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { border :: Border Unitted Unitted
border = (PaddedBox Unitted Unitted -> Border Unitted Unitted
forall m n. PaddedBox m n -> Border m n
border PaddedBox Unitted Unitted
box) { bottom :: Unitted
bottom = Unitted
x } } }
    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "border-left-width" toks :: [Token]
toks | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { border :: Border Unitted Unitted
border = (PaddedBox Unitted Unitted -> Border Unitted Unitted
forall m n. PaddedBox m n -> Border m n
border PaddedBox Unitted Unitted
box) { left :: Unitted
left = Unitted
x } } }
    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "border-right-width" toks :: [Token]
toks | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { border :: Border Unitted Unitted
border = (PaddedBox Unitted Unitted -> Border Unitted Unitted
forall m n. PaddedBox m n -> Border m n
border PaddedBox Unitted Unitted
box) { right :: Unitted
right = Unitted
x } } }
    longhand p :: CSSBox a
p self :: CSSBox a
self "border-inline-start-color" toks :: [Token]
toks
        | Direction
DirLTR <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "border-left-color" [Token]
toks
        | Direction
DirRTL <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "border-right-color" [Token]
toks
    longhand p :: CSSBox a
p self :: CSSBox a
self "border-inline-start-width" toks :: [Token]
toks
        | Direction
DirLTR <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "border-left-width" [Token]
toks
        | Direction
DirRTL <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "border-right-width" [Token]
toks
    longhand p :: CSSBox a
p self :: CSSBox a
self "border-inline-start-style" toks :: [Token]
toks
        | Direction
DirLTR <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "border-left-style" [Token]
toks
        | Direction
DirRTL <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "border-right-style" [Token]
toks
    longhand p :: CSSBox a
p self :: CSSBox a
self "border-inline-end-color" toks :: [Token]
toks
        | Direction
DirLTR <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "border-right-color" [Token]
toks
        | Direction
DirRTL <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "border-left-color" [Token]
toks
    longhand p :: CSSBox a
p self :: CSSBox a
self "border-inline-end-width" toks :: [Token]
toks
        | Direction
DirLTR <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "border-right-width" [Token]
toks
        | Direction
DirRTL <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "border-left-width" [Token]
toks
    longhand p :: CSSBox a
p self :: CSSBox a
self "border-inline-end-style" toks :: [Token]
toks
        | Direction
DirLTR <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "border-right-style" [Token]
toks
        | Direction
DirRTL <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "border-left-style" [Token]
toks
    longhand p :: CSSBox a
p self :: CSSBox a
self "border-start-start-radius" t :: [Token]
t
        | Direction
DirLTR <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "border-top-left-radius" [Token]
t
        | Direction
DirRTL <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "border-top-right-radius" [Token]
t
    longhand p :: CSSBox a
p self :: CSSBox a
self "border-start-end-radius" t :: [Token]
t
        | Direction
DirLTR <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "border-top-right-radius" [Token]
t
        | Direction
DirRTL <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "border-top-left-radius" [Token]
t
    longhand p :: CSSBox a
p s :: CSSBox a
s "border-end-start-radius" t :: [Token]
t
        | Direction
DirLTR <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
s = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
s "border-bottom-left-radius" [Token]
t
        | Direction
DirRTL <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
s = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
s "border-bottom-right-radius" [Token]
t
    longhand p :: CSSBox a
p s :: CSSBox a
s "border-end-end-radius" t :: [Token]
t
        | Direction
DirLTR <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
s = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
s "border-bottom-right-radius" [Token]
t
        | Direction
DirRTL <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
s = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
s "border-bottom-left-radius" [Token]
t

    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "margin-top" toks :: [Token]
toks | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { margin :: Border Unitted Unitted
margin = (PaddedBox Unitted Unitted -> Border Unitted Unitted
forall m n. PaddedBox m n -> Border m n
margin PaddedBox Unitted Unitted
box) { top :: Unitted
top = Unitted
x } } }
    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "margin-bottom" toks :: [Token]
toks | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { margin :: Border Unitted Unitted
margin = (PaddedBox Unitted Unitted -> Border Unitted Unitted
forall m n. PaddedBox m n -> Border m n
margin PaddedBox Unitted Unitted
box) { bottom :: Unitted
bottom = Unitted
x } } }
    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "margin-left" toks :: [Token]
toks | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { margin :: Border Unitted Unitted
margin = (PaddedBox Unitted Unitted -> Border Unitted Unitted
forall m n. PaddedBox m n -> Border m n
margin PaddedBox Unitted Unitted
box) { left :: Unitted
left = Unitted
x } } }
    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "margin-right" toks :: [Token]
toks | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { margin :: Border Unitted Unitted
margin = (PaddedBox Unitted Unitted -> Border Unitted Unitted
forall m n. PaddedBox m n -> Border m n
margin PaddedBox Unitted Unitted
box) { right :: Unitted
right = Unitted
x } } }
    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "margin-inline-start" toks :: [Token]
toks
        | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks, Direction
DirLTR <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self =
            CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { margin :: Border Unitted Unitted
margin = (PaddedBox Unitted Unitted -> Border Unitted Unitted
forall m n. PaddedBox m n -> Border m n
margin PaddedBox Unitted Unitted
box) { left :: Unitted
left = Unitted
x } } }
        | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks, Direction
DirRTL <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self =
            CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { margin :: Border Unitted Unitted
margin = (PaddedBox Unitted Unitted -> Border Unitted Unitted
forall m n. PaddedBox m n -> Border m n
margin PaddedBox Unitted Unitted
box) { right :: Unitted
right = Unitted
x } } }
    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "margin-inline-end" toks :: [Token]
toks
        | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks, Direction
DirLTR <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self =
            CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { margin :: Border Unitted Unitted
margin = (PaddedBox Unitted Unitted -> Border Unitted Unitted
forall m n. PaddedBox m n -> Border m n
margin PaddedBox Unitted Unitted
box) { right :: Unitted
right = Unitted
x } } }
        | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks, Direction
DirRTL <- CSSBox a -> Direction
forall a. CSSBox a -> Direction
direction CSSBox a
self =
            CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { margin :: Border Unitted Unitted
margin = (PaddedBox Unitted Unitted -> Border Unitted Unitted
forall m n. PaddedBox m n -> Border m n
margin PaddedBox Unitted Unitted
box) { left :: Unitted
left = Unitted
x } } }

    -- Placeholder implementations until vertical text is implemented.
    longhand p :: CSSBox a
p self :: CSSBox a
self "padding-block-start" t :: [Token]
t = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "padding-top" [Token]
t
    longhand p :: CSSBox a
p self :: CSSBox a
self "padding-block-end" t :: [Token]
t = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "padding-bottom" [Token]
t
    longhand p :: CSSBox a
p self :: CSSBox a
self "margin-block-start" t :: [Token]
t = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "margin-top" [Token]
t
    longhand p :: CSSBox a
p self :: CSSBox a
self "margin-block-end" t :: [Token]
t = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "margin-bottom" [Token]
t
    longhand p :: CSSBox a
p self :: CSSBox a
self "border-block-start-color" toks :: [Token]
toks =
        CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "border-top-color" [Token]
toks
    longhand p :: CSSBox a
p self :: CSSBox a
self "border-block-start-style" toks :: [Token]
toks =
        CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "border-top-style" [Token]
toks
    longhand p :: CSSBox a
p self :: CSSBox a
self "border-block-start-width" toks :: [Token]
toks =
        CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
self "border-top-width" [Token]
toks
    longhand p :: CSSBox a
p s :: CSSBox a
s "border-block-end-color" t :: [Token]
t = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
s "border-bottom-color" [Token]
t
    longhand p :: CSSBox a
p s :: CSSBox a
s "border-block-end-style" t :: [Token]
t = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
s "border-bottom-style" [Token]
t
    longhand p :: CSSBox a
p s :: CSSBox a
s "border-block-end-width" t :: [Token]
t = CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
p CSSBox a
s "border-bottom-width" [Token]
t

    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "width" toks :: [Token]
toks | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength' [Token]
toks =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { size :: Size Unitted Unitted
size = (PaddedBox Unitted Unitted -> Size Unitted Unitted
forall m n. PaddedBox m n -> Size m n
size PaddedBox Unitted Unitted
box) { inline :: Unitted
inline = Unitted
x } } }
    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "height" toks :: [Token]
toks | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength' [Token]
toks =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { size :: Size Unitted Unitted
size = (PaddedBox Unitted Unitted -> Size Unitted Unitted
forall m n. PaddedBox m n -> Size m n
size PaddedBox Unitted Unitted
box) { block :: Unitted
block = Unitted
x } } }
    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "max-width" toks :: [Token]
toks | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength' [Token]
toks =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { max :: Size Unitted Unitted
B.max = (PaddedBox Unitted Unitted -> Size Unitted Unitted
forall m n. PaddedBox m n -> Size m n
B.max PaddedBox Unitted Unitted
box) { inline :: Unitted
inline = Unitted
x } } }
    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "min-width" toks :: [Token]
toks | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength' [Token]
toks =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { min :: Size Unitted Unitted
B.min = (PaddedBox Unitted Unitted -> Size Unitted Unitted
forall m n. PaddedBox m n -> Size m n
B.min PaddedBox Unitted Unitted
box) { inline :: Unitted
inline = Unitted
x } } }
    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "max-height" toks :: [Token]
toks | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength' [Token]
toks =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { max :: Size Unitted Unitted
B.max = (PaddedBox Unitted Unitted -> Size Unitted Unitted
forall m n. PaddedBox m n -> Size m n
B.max PaddedBox Unitted Unitted
box) { block :: Unitted
block = Unitted
x } } }
    longhand _ self :: CSSBox a
self@CSSBox {cssBox :: forall a. CSSBox a -> PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box} "min-height" toks :: [Token]
toks | Just x :: Unitted
x <- [Token] -> Maybe Unitted
parseLength' [Token]
toks =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cssBox :: PaddedBox Unitted Unitted
cssBox = PaddedBox Unitted Unitted
box { min :: Size Unitted Unitted
B.min = (PaddedBox Unitted Unitted -> Size Unitted Unitted
forall m n. PaddedBox m n -> Size m n
B.min PaddedBox Unitted Unitted
box) { block :: Unitted
block = Unitted
x } } }

    longhand _ self :: CSSBox a
self "display" [Ident "block"] = CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { display :: Display
display = Display
Block }
    longhand _ self :: CSSBox a
self "display" [Ident "none"] = CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { display :: Display
display = Display
None }
    longhand _ self :: CSSBox a
self "display" [Ident "grid"] = CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { display :: Display
display = Display
Grid }
    {-longhand _ self "display" [Ident "table"] = Just self { display = Table }
    longhand CSSBox { display = Table } self "display" [Ident "table-row-group"] =
        Just self { display=TableRowGroup }
    longhand CSSBox { display = Table } self "display" [Ident "table-header-group"] =
        Just self { display = TableHeaderGroup }
    longhand CSSBox { display = Table } self "display" [Ident "table-footer-group"] =
        Just self { display = TableFooterGroup }
    longhand parent self "display" [Ident "table-row"] | rowContainer parent =
        Just self { display = TableRow }
    longhand CSSBox { display = TableRow } self "display" [Ident "table-cell"] =
        Just self { display = TableCell }
    longhand CSSBox { display = Table } self "display" [Ident "table-column-group"] =
        Just self { display = TableColumnGroup }
    longhand CSSBox { display = TableColumnGroup } self "display" [Ident "table-column"] =
        Just self { display = TableColumn }
    longhand CSSBox { display = Table } self "display" [Ident "table-caption"] =
        Just self { display=TableCaption } -}
    longhand _ self :: CSSBox a
self "display" [Ident "inline"] = CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { display :: Display
display = Display
Inline }
    longhand _ self :: CSSBox a
self "display" [Ident "initial"] = CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { display :: Display
display = Display
Inline }

    longhand _ self :: CSSBox a
self "caption-side" [Ident "top"] = CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { captionBelow :: Bool
captionBelow = Bool
False }
    longhand _ self :: CSSBox a
self "caption-side" [Ident "bottom"] = CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { captionBelow :: Bool
captionBelow = Bool
True }
    longhand _ self :: CSSBox a
self "caption-side" [Ident "initial"] = CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self {captionBelow :: Bool
captionBelow = Bool
False}

    longhand _ self :: CSSBox a
self "orphans" [Number _ (NVInteger x :: Integer
x)] =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { pageOptions :: PageOptions
pageOptions = (CSSBox a -> PageOptions
forall a. CSSBox a -> PageOptions
pageOptions CSSBox a
self) { pageOrphans :: Word
pageOrphans = Integer -> Word
forall a. Num a => Integer -> a
fromInteger Integer
x } }
    longhand _ self :: CSSBox a
self "widows" [Number _ (NVInteger x :: Integer
x)] =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { pageOptions :: PageOptions
pageOptions = (CSSBox a -> PageOptions
forall a. CSSBox a -> PageOptions
pageOptions CSSBox a
self) { pageWidows :: Word
pageWidows = Integer -> Word
forall a. Num a => Integer -> a
fromInteger Integer
x } }

    longhand a :: CSSBox a
a b :: CSSBox a
b c :: Text
c d :: [Token]
d | Just x :: Pattern
x <- Pattern -> Pattern -> Text -> [Token] -> Maybe Pattern
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand (CSSBox a -> Pattern
forall a. CSSBox a -> Pattern
font CSSBox a
a) (CSSBox a -> Pattern
forall a. CSSBox a -> Pattern
font CSSBox a
b) Text
c [Token]
d,
        Just y :: CSSFont
y <- CSSFont -> CSSFont -> Text -> [Token] -> Maybe CSSFont
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand (CSSBox a -> CSSFont
forall a. CSSBox a -> CSSFont
font' CSSBox a
a) (CSSBox a -> CSSFont
forall a. CSSBox a -> CSSFont
font' CSSBox a
b) Text
c [Token]
d =
            CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
b { font :: Pattern
font = Pattern
x, font' :: CSSFont
font' = CSSFont
y } -- Those properties can overlap!
    longhand a :: CSSBox a
a b :: CSSBox a
b c :: Text
c d :: [Token]
d | Just font' :: Pattern
font' <- Pattern -> Pattern -> Text -> [Token] -> Maybe Pattern
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand (CSSBox a -> Pattern
forall a. CSSBox a -> Pattern
font CSSBox a
a) (CSSBox a -> Pattern
forall a. CSSBox a -> Pattern
font CSSBox a
b) Text
c [Token]
d = CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
b {
        font :: Pattern
font = Pattern
font'
      }
    longhand a :: CSSBox a
a b :: CSSBox a
b c :: Text
c d :: [Token]
d | Just font :: CSSFont
font <- CSSFont -> CSSFont -> Text -> [Token] -> Maybe CSSFont
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand (CSSBox a -> CSSFont
forall a. CSSBox a -> CSSFont
font' CSSBox a
a) (CSSBox a -> CSSFont
forall a. CSSBox a -> CSSFont
font' CSSBox a
b) Text
c [Token]
d = CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
b {
        font' :: CSSFont
font' = CSSFont
font
      }
    longhand a :: CSSBox a
a b :: CSSBox a
b c :: Text
c d :: [Token]
d | Just inline' :: CSSInline
inline' <- CSSInline -> CSSInline -> Text -> [Token] -> Maybe CSSInline
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand (CSSBox a -> CSSInline
forall a. CSSBox a -> CSSInline
inlineStyles CSSBox a
a) (CSSBox a -> CSSInline
forall a. CSSBox a -> CSSInline
inlineStyles CSSBox a
b) Text
c [Token]
d =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
b { inlineStyles :: CSSInline
inlineStyles = CSSInline
inline' }
    longhand a :: CSSBox a
a b :: CSSBox a
b c :: Text
c d :: [Token]
d | Just grid' :: CSSGrid
grid' <- CSSGrid -> CSSGrid -> Text -> [Token] -> Maybe CSSGrid
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand (CSSBox a -> CSSGrid
forall a. CSSBox a -> CSSGrid
gridStyles CSSBox a
a) (CSSBox a -> CSSGrid
forall a. CSSBox a -> CSSGrid
gridStyles CSSBox a
b) Text
c [Token]
d =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
b { gridStyles :: CSSGrid
gridStyles = CSSGrid
grid' }
    longhand a :: CSSBox a
a b :: CSSBox a
b c :: Text
c d :: [Token]
d | Just cell' :: CSSCell
cell' <- CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand (CSSBox a -> CSSCell
forall a. CSSBox a -> CSSCell
cellStyles CSSBox a
a) (CSSBox a -> CSSCell
forall a. CSSBox a -> CSSCell
cellStyles CSSBox a
b) Text
c [Token]
d =
        CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
b { cellStyles :: CSSCell
cellStyles = CSSCell
cell' }
    longhand a :: CSSBox a
a b :: CSSBox a
b c :: Text
c d :: [Token]
d | Just inner' :: a
inner' <- a -> a -> Text -> [Token] -> Maybe a
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand (CSSBox a -> a
forall a. CSSBox a -> a
inner CSSBox a
a) (CSSBox a -> a
forall a. CSSBox a -> a
inner CSSBox a
b) Text
c [Token]
d = CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
b {
        inner :: a
inner = a
inner'
      }

    -- Technically a grid shorthand, but we need parent data to parse it!
    longhand CSSBox { gridStyles :: forall a. CSSBox a -> CSSGrid
gridStyles = CSSGrid
parent } self :: CSSBox a
self "grid-area" [Ident x :: Text
x]
        | Just ((colS :: Int
colS, colE :: Int
colE), (rowS :: Int
rowS, rowE :: Maybe Int
rowE)) <- Text
x Text
-> HashMap Text ((Int, Int), (Int, Maybe Int))
-> Maybe ((Int, Int), (Int, Maybe Int))
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
`HM.lookup` CSSGrid -> HashMap Text ((Int, Int), (Int, Maybe Int))
templateAreas CSSGrid
parent
            = CSSBox a -> Maybe (CSSBox a)
forall a. a -> Maybe a
Just CSSBox a
self { cellStyles :: CSSCell
cellStyles = (CSSBox a -> CSSCell
forall a. CSSBox a -> CSSCell
cellStyles CSSBox a
self) {
                columnStart :: Placement
columnStart = Int -> Placement
p Int
colS,
                columnEnd :: Placement
columnEnd = Int -> Placement
p Int
colE,
                rowStart :: Placement
rowStart = Int -> Placement
p Int
rowS,
                rowEnd :: Placement
rowEnd = Int -> Placement
p (Int -> Placement) -> Int -> Placement
forall a b. (a -> b) -> a -> b
$ Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe (HashMap Text ((Int, Int), (Int, Maybe Int)) -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (HashMap Text ((Int, Int), (Int, Maybe Int)) -> Int)
-> HashMap Text ((Int, Int), (Int, Maybe Int)) -> Int
forall a b. (a -> b) -> a -> b
$ CSSGrid -> HashMap Text ((Int, Int), (Int, Maybe Int))
templateAreas CSSGrid
parent) Maybe Int
rowE
            }}
      where p :: Int -> Placement
p x :: Int
x = Int -> Maybe Text -> Placement
Numbered Int
x Maybe Text
forall a. Maybe a
Nothing

    longhand _ _ _ _ = Maybe (CSSBox a)
forall a. Maybe a
Nothing

    shorthand :: CSSBox a -> Text -> [Token] -> Props
shorthand self :: CSSBox a
self "font" toks :: [Token]
toks = case [Token] -> [[Token]]
parseOperands [Token]
toks of
        (a :: [Token]
a:b :: [Token]
b:c :: [Token]
c:d :: [Token]
d:toks' :: [[Token]]
toks') | ret :: Props
ret@(_:_) <- [[Token]] -> Props
unordered [[Token]
a,[Token]
b,[Token]
c,[Token]
d] -> Props -> [[Token]] -> Props
forall a.
IsString a =>
[(a, [Token])] -> [[Token]] -> [(a, [Token])]
inner Props
ret [[Token]]
toks'
        (a :: [Token]
a:b :: [Token]
b:c :: [Token]
c:toks' :: [[Token]]
toks') | ret :: Props
ret@(_:_) <- [[Token]] -> Props
unordered [[Token]
a,[Token]
b,[Token]
c] -> Props -> [[Token]] -> Props
forall a.
IsString a =>
[(a, [Token])] -> [[Token]] -> [(a, [Token])]
inner Props
ret [[Token]]
toks'
        (a :: [Token]
a:b :: [Token]
b:toks' :: [[Token]]
toks') | ret :: Props
ret@(_:_) <- [[Token]] -> Props
unordered [[Token]
a,[Token]
b] -> Props -> [[Token]] -> Props
forall a.
IsString a =>
[(a, [Token])] -> [[Token]] -> [(a, [Token])]
inner Props
ret [[Token]]
toks'
        (a :: [Token]
a:toks' :: [[Token]]
toks') | ret :: Props
ret@(_:_) <- [[Token]] -> Props
unordered [[Token]
a] -> Props -> [[Token]] -> Props
forall a.
IsString a =>
[(a, [Token])] -> [[Token]] -> [(a, [Token])]
inner Props
ret [[Token]]
toks'
        toks' :: [[Token]]
toks' -> Props -> [[Token]] -> Props
forall a.
IsString a =>
[(a, [Token])] -> [[Token]] -> [(a, [Token])]
inner [] [[Token]]
toks'
      where
        unordered :: [[Token]] -> Props
unordered operands :: [[Token]]
operands = CSSBox a -> [Text] -> [[Token]] -> Props
forall a. PropertyParser a => a -> [Text] -> [[Token]] -> Props
parseUnorderedShorthand' CSSBox a
self [
            "font-style", "font-variant", "font-weight", "font-stretch"] [[Token]]
operands
        inner :: [(a, [Token])] -> [[Token]] -> [(a, [Token])]
inner ret :: [(a, [Token])]
ret (size :: [Token]
size:[Delim '/']:height :: [Token]
height:family :: [[Token]]
family)
            | Just _ <- CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
self CSSBox a
self "font-size" [Token]
size,
              Just _ <- CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
self CSSBox a
self "line-height" [Token]
height,
              Just _ <- CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
self CSSBox a
self "font-family" ([Token] -> Maybe (CSSBox a)) -> [Token] -> Maybe (CSSBox a)
forall a b. (a -> b) -> a -> b
$ [[Token]] -> [Token]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Token]]
family =
                ("font-size", [Token]
size)(a, [Token]) -> [(a, [Token])] -> [(a, [Token])]
forall a. a -> [a] -> [a]
:("line-height", [Token]
height)(a, [Token]) -> [(a, [Token])] -> [(a, [Token])]
forall a. a -> [a] -> [a]
:
                    ("font-family", [[Token]] -> [Token]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Token]]
family)(a, [Token]) -> [(a, [Token])] -> [(a, [Token])]
forall a. a -> [a] -> [a]
:[(a, [Token])]
ret
            | Bool
otherwise = []
        inner ret :: [(a, [Token])]
ret (size :: [Token]
size:family :: [[Token]]
family)
            | Just _ <- CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
self CSSBox a
self "font-size" [Token]
size,
              Just _ <- CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
self CSSBox a
self "font-family" ([Token] -> Maybe (CSSBox a)) -> [Token] -> Maybe (CSSBox a)
forall a b. (a -> b) -> a -> b
$ [[Token]] -> [Token]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Token]]
family =
                ("font-size", [Token]
size)(a, [Token]) -> [(a, [Token])] -> [(a, [Token])]
forall a. a -> [a] -> [a]
:("line-height", [Text -> Token
Ident "initial"])(a, [Token]) -> [(a, [Token])] -> [(a, [Token])]
forall a. a -> [a] -> [a]
:
                    ("font-family", [[Token]] -> [Token]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Token]]
family)(a, [Token]) -> [(a, [Token])] -> [(a, [Token])]
forall a. a -> [a] -> [a]
:[(a, [Token])]
ret
            | Bool
otherwise = []
        inner _ _ = []
    shorthand self :: CSSBox a
self "margin" toks :: [Token]
toks
        | [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 0 Bool -> Bool -> Bool
&& [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= 4, ([Token] -> Bool) -> [[Token]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (CSSBox a -> Text -> [Token] -> Bool
forall a. PropertyParser a => a -> Text -> [Token] -> Bool
validProp CSSBox a
self "margin-top") [[Token]]
x,
            (top :: [Token]
top:right :: [Token]
right:bottom :: [Token]
bottom:left :: [Token]
left:_) <- [[Token]] -> [[Token]]
forall a. [a] -> [a]
cycle [[Token]]
x =
                [("margin-top", [Token]
top), ("margin-right", [Token]
right),
                 ("margin-bottom", [Token]
bottom), ("margin-left", [Token]
left)]
      where x :: [[Token]]
x = [Token] -> [[Token]]
parseOperands [Token]
toks
    shorthand self :: CSSBox a
self "padding" toks :: [Token]
toks
        | [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 0 Bool -> Bool -> Bool
&& [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= 4, ([Token] -> Bool) -> [[Token]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (CSSBox a -> Text -> [Token] -> Bool
forall a. PropertyParser a => a -> Text -> [Token] -> Bool
validProp CSSBox a
self "padding-top") [[Token]]
x,
            (top :: [Token]
top:right :: [Token]
right:bottom :: [Token]
bottom:left :: [Token]
left:_) <- [[Token]] -> [[Token]]
forall a. [a] -> [a]
cycle [[Token]]
x =
                [("padding-top", [Token]
top), ("padding-right", [Token]
right),
                 ("padding-bottom", [Token]
bottom), ("padding-left", [Token]
left)]
      where x :: [[Token]]
x = [Token] -> [[Token]]
parseOperands [Token]
toks
    shorthand self :: CSSBox a
self "border-width" toks :: [Token]
toks
        | [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 0 Bool -> Bool -> Bool
&& [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= 4, (top :: [Token]
top:right :: [Token]
right:bottom :: [Token]
bottom:left :: [Token]
left:_) <- [[Token]] -> [[Token]]
forall a. [a] -> [a]
cycle [[Token]]
x,
            ([Token] -> Bool) -> [[Token]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (CSSBox a -> Text -> [Token] -> Bool
forall a. PropertyParser a => a -> Text -> [Token] -> Bool
validProp CSSBox a
self "border-top-width") [[Token]]
x =
                [("border-top-width", [Token]
top), ("border-right-width", [Token]
right),
                 ("border-bottom-width", [Token]
bottom), ("border-left-width", [Token]
left)]
      where x :: [[Token]]
x = [Token] -> [[Token]]
parseOperands [Token]
toks
    -- Define other border shorthands here to properly handle border-widths
    shorthand self :: CSSBox a
self "border" toks :: [Token]
toks = CSSBox a -> [Text] -> [Token] -> Props
forall a. PropertyParser a => a -> [Text] -> [Token] -> Props
parseUnorderedShorthand CSSBox a
self [
        "border-color", "border-style", "border-width"] [Token]
toks
    shorthand self :: CSSBox a
self "border-top" toks :: [Token]
toks = CSSBox a -> [Text] -> [Token] -> Props
forall a. PropertyParser a => a -> [Text] -> [Token] -> Props
parseUnorderedShorthand CSSBox a
self [
        "border-top-color", "border-top-style", "border-top-width"] [Token]
toks
    shorthand self :: CSSBox a
self "border-right" toks :: [Token]
toks = CSSBox a -> [Text] -> [Token] -> Props
forall a. PropertyParser a => a -> [Text] -> [Token] -> Props
parseUnorderedShorthand CSSBox a
self [
        "border-right-color", "border-right-style", "border-right-width"] [Token]
toks
    shorthand self :: CSSBox a
self "border-bottom" toks :: [Token]
toks = CSSBox a -> [Text] -> [Token] -> Props
forall a. PropertyParser a => a -> [Text] -> [Token] -> Props
parseUnorderedShorthand CSSBox a
self [
        "border-bottom-color", "border-bottom-style", "border-bottom-width"] [Token]
toks
    shorthand self :: CSSBox a
self "border-left" toks :: [Token]
toks = CSSBox a -> [Text] -> [Token] -> Props
forall a. PropertyParser a => a -> [Text] -> [Token] -> Props
parseUnorderedShorthand CSSBox a
self [
        "border-left-color", "border-left-style", "border-left-width"] [Token]
toks
    shorthand self :: CSSBox a
self "border-inline" toks :: [Token]
toks = CSSBox a -> [Text] -> [Token] -> Props
forall a. PropertyParser a => a -> [Text] -> [Token] -> Props
parseUnorderedShorthand CSSBox a
self [
        "border-inline-color", "border-inline-style", "border-inline-width"] [Token]
toks
    shorthand self :: CSSBox a
self "border-inline-start" toks :: [Token]
toks = CSSBox a -> [Text] -> [Token] -> Props
forall a. PropertyParser a => a -> [Text] -> [Token] -> Props
parseUnorderedShorthand CSSBox a
self [
        "border-inline-start-color", "border-inline-start-style",
        "border-inline-start-width"] [Token]
toks
    shorthand self :: CSSBox a
self "border-inline-end" toks :: [Token]
toks = CSSBox a -> [Text] -> [Token] -> Props
forall a. PropertyParser a => a -> [Text] -> [Token] -> Props
parseUnorderedShorthand CSSBox a
self [
        "border-inline-end-color", "border-inline-end-style",
        "border-inline-end-width"] [Token]
toks
    shorthand self :: CSSBox a
self "border-block" toks :: [Token]
toks = CSSBox a -> [Text] -> [Token] -> Props
forall a. PropertyParser a => a -> [Text] -> [Token] -> Props
parseUnorderedShorthand CSSBox a
self [
        "border-block-color", "border-block-style", "border-block-width"] [Token]
toks
    shorthand self :: CSSBox a
self "border-block-start" toks :: [Token]
toks = CSSBox a -> [Text] -> [Token] -> Props
forall a. PropertyParser a => a -> [Text] -> [Token] -> Props
parseUnorderedShorthand CSSBox a
self [
        "border-block-start-color", "border-block-start-style",
        "border-block-start-width"] [Token]
toks
    shorthand self :: CSSBox a
self "border-block-end" toks :: [Token]
toks = CSSBox a -> [Text] -> [Token] -> Props
forall a. PropertyParser a => a -> [Text] -> [Token] -> Props
parseUnorderedShorthand CSSBox a
self [
        "border-block-end-color", "border-block-end-style",
        "border-block-end-width"] [Token]
toks
    shorthand self :: CSSBox a
self "border-color" toks :: [Token]
toks
        | [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 0 Bool -> Bool -> Bool
&& [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= 4, (top :: [Token]
top:right :: [Token]
right:bottom :: [Token]
bottom:left :: [Token]
left:_) <- [[Token]] -> [[Token]]
forall a. [a] -> [a]
cycle [[Token]]
x,
            ([Token] -> Bool) -> [[Token]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (CSSBox a -> Text -> [Token] -> Bool
forall a. PropertyParser a => a -> Text -> [Token] -> Bool
validProp CSSBox a
self "border-top-color") [[Token]]
x =
                [("border-top-color", [Token]
top), ("border-right-color", [Token]
right),
                 ("border-bottom-color", [Token]
bottom), ("border-left-color", [Token]
left)]
      where x :: [[Token]]
x = [Token] -> [[Token]]
parseOperands [Token]
toks
    shorthand self :: CSSBox a
self "border-style" toks :: [Token]
toks
        | [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 0 Bool -> Bool -> Bool
&& [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= 4, (top :: [Token]
top:right :: [Token]
right:bottom :: [Token]
bottom:left :: [Token]
left:_) <- [[Token]] -> [[Token]]
forall a. [a] -> [a]
cycle [[Token]]
x,
            ([Token] -> Bool) -> [[Token]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (CSSBox a -> Text -> [Token] -> Bool
forall a. PropertyParser a => a -> Text -> [Token] -> Bool
validProp CSSBox a
self "border-top-style") [[Token]]
x =
                [("border-top-style", [Token]
top), ("border-right-style", [Token]
right),
                 ("border-bottom-style", [Token]
bottom), ("border-left-style", [Token]
left)]
      where x :: [[Token]]
x = [Token] -> [[Token]]
parseOperands [Token]
toks
    shorthand self :: CSSBox a
self "border-width" toks :: [Token]
toks
        | [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 0 Bool -> Bool -> Bool
&& [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= 4, (top :: [Token]
top:right :: [Token]
right:bottom :: [Token]
bottom:left :: [Token]
left:_) <- [[Token]] -> [[Token]]
forall a. [a] -> [a]
cycle [[Token]]
x,
            ([Token] -> Bool) -> [[Token]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (CSSBox a -> Text -> [Token] -> Bool
forall a. PropertyParser a => a -> Text -> [Token] -> Bool
validProp CSSBox a
self "border-top-width") [[Token]]
x =
                [("border-top-width", [Token]
top), ("border-right-width", [Token]
right),
                 ("border-bottom-width", [Token]
bottom), ("border-left-width", [Token]
left)]
      where x :: [[Token]]
x = [Token] -> [[Token]]
parseOperands [Token]
toks
    shorthand self :: CSSBox a
self "border-inline-color" toks :: [Token]
toks
        | [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 0 Bool -> Bool -> Bool
&& [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= 2, (s :: [Token]
s:e :: [Token]
e:_) <- [[Token]] -> [[Token]]
forall a. [a] -> [a]
cycle [[Token]]
x,
            ([Token] -> Bool) -> [[Token]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (CSSBox a -> Text -> [Token] -> Bool
forall a. PropertyParser a => a -> Text -> [Token] -> Bool
validProp CSSBox a
self "border-inline-start-color") [[Token]]
x =
                [("border-inline-start-color", [Token]
s), ("border-inline-end-color", [Token]
e)]
      where x :: [[Token]]
x = [Token] -> [[Token]]
parseOperands [Token]
toks
    shorthand self :: CSSBox a
self "border-inline-style" toks :: [Token]
toks
        | [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 0 Bool -> Bool -> Bool
&& [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= 2, (s :: [Token]
s:e :: [Token]
e:_) <- [[Token]] -> [[Token]]
forall a. [a] -> [a]
cycle [[Token]]
x,
            ([Token] -> Bool) -> [[Token]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (CSSBox a -> Text -> [Token] -> Bool
forall a. PropertyParser a => a -> Text -> [Token] -> Bool
validProp CSSBox a
self "border-inline-start-style") [[Token]]
x =
                [("border-inline-start-style", [Token]
s), ("border-inline-end-style", [Token]
e)]
      where x :: [[Token]]
x = [Token] -> [[Token]]
parseOperands [Token]
toks
    shorthand self :: CSSBox a
self "border-inline-width" toks :: [Token]
toks
        | [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 0 Bool -> Bool -> Bool
&& [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= 2, (s :: [Token]
s:e :: [Token]
e:_) <- [[Token]] -> [[Token]]
forall a. [a] -> [a]
cycle [[Token]]
x,
            ([Token] -> Bool) -> [[Token]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (CSSBox a -> Text -> [Token] -> Bool
forall a. PropertyParser a => a -> Text -> [Token] -> Bool
validProp CSSBox a
self "border-inline-start-width") [[Token]]
x =
                [("border-inline-start-width", [Token]
s), ("border-inline-end-style", [Token]
e)]
      where x :: [[Token]]
x = [Token] -> [[Token]]
parseOperands [Token]
toks
    shorthand self :: CSSBox a
self "border-block-color" toks :: [Token]
toks
        | [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 0 Bool -> Bool -> Bool
&& [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= 2, (s :: [Token]
s:e :: [Token]
e:_) <- [[Token]] -> [[Token]]
forall a. [a] -> [a]
cycle [[Token]]
x,
            ([Token] -> Bool) -> [[Token]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (CSSBox a -> Text -> [Token] -> Bool
forall a. PropertyParser a => a -> Text -> [Token] -> Bool
validProp CSSBox a
self "border-block-start-color") [[Token]]
x =
                [("border-block-start-color", [Token]
s), ("border-block-end-color", [Token]
e)]
      where x :: [[Token]]
x = [Token] -> [[Token]]
parseOperands [Token]
toks
    shorthand self :: CSSBox a
self "border-block-style" toks :: [Token]
toks
        | [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 0 Bool -> Bool -> Bool
&& [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= 2, (s :: [Token]
s:e :: [Token]
e:_) <- [[Token]] -> [[Token]]
forall a. [a] -> [a]
cycle [[Token]]
x,
            ([Token] -> Bool) -> [[Token]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (CSSBox a -> Text -> [Token] -> Bool
forall a. PropertyParser a => a -> Text -> [Token] -> Bool
validProp CSSBox a
self "border-block-start-style") [[Token]]
x =
                [("border-block-start-style", [Token]
s), ("border-block-end-style", [Token]
e)]
      where x :: [[Token]]
x = [Token] -> [[Token]]
parseOperands [Token]
toks
    shorthand self :: CSSBox a
self "border-block-width" toks :: [Token]
toks
        | [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 0 Bool -> Bool -> Bool
&& [[Token]] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Token]]
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= 2, (s :: [Token]
s:e :: [Token]
e:_) <- [[Token]] -> [[Token]]
forall a. [a] -> [a]
cycle [[Token]]
x,
            ([Token] -> Bool) -> [[Token]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (CSSBox a -> Text -> [Token] -> Bool
forall a. PropertyParser a => a -> Text -> [Token] -> Bool
validProp CSSBox a
self "border-block-start-width") [[Token]]
x =
                [("border-block-start-width", [Token]
s), ("border-block-end-width", [Token]
e)]
      where x :: [[Token]]
x = [Token] -> [[Token]]
parseOperands [Token]
toks

    shorthand self :: CSSBox a
self k :: Text
k v :: [Token]
v | Just _ <- CSSBox a -> CSSBox a -> Text -> [Token] -> Maybe (CSSBox a)
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSBox a
self CSSBox a
self Text
k [Token]
v = [(Text
k, [Token]
v)]
    shorthand self :: CSSBox a
self k :: Text
k v :: [Token]
v | ret :: Props
ret@(_:_) <- Pattern -> Text -> [Token] -> Props
forall a. PropertyParser a => a -> Text -> [Token] -> Props
shorthand (CSSBox a -> Pattern
forall a. CSSBox a -> Pattern
font CSSBox a
self) Text
k [Token]
v = Props
ret
    shorthand self :: CSSBox a
self k :: Text
k v :: [Token]
v | ret :: Props
ret@(_:_) <- CSSFont -> Text -> [Token] -> Props
forall a. PropertyParser a => a -> Text -> [Token] -> Props
shorthand (CSSBox a -> CSSFont
forall a. CSSBox a -> CSSFont
font' CSSBox a
self) Text
k [Token]
v = Props
ret
    shorthand self :: CSSBox a
self k :: Text
k v :: [Token]
v | ret :: Props
ret@(_:_) <- CSSInline -> Text -> [Token] -> Props
forall a. PropertyParser a => a -> Text -> [Token] -> Props
shorthand (CSSBox a -> CSSInline
forall a. CSSBox a -> CSSInline
inlineStyles CSSBox a
self) Text
k [Token]
v = Props
ret
    shorthand self :: CSSBox a
self k :: Text
k v :: [Token]
v | ret :: Props
ret@(_:_) <- CSSGrid -> Text -> [Token] -> Props
forall a. PropertyParser a => a -> Text -> [Token] -> Props
shorthand (CSSBox a -> CSSGrid
forall a. CSSBox a -> CSSGrid
gridStyles CSSBox a
self) Text
k [Token]
v = Props
ret
    shorthand self :: CSSBox a
self k :: Text
k v :: [Token]
v | ret :: Props
ret@(_:_) <- CSSCell -> Text -> [Token] -> Props
forall a. PropertyParser a => a -> Text -> [Token] -> Props
shorthand (CSSBox a -> CSSCell
forall a. CSSBox a -> CSSCell
cellStyles CSSBox a
self) Text
k [Token]
v = Props
ret
    shorthand self :: CSSBox a
self k :: Text
k v :: [Token]
v = a -> Text -> [Token] -> Props
forall a. PropertyParser a => a -> Text -> [Token] -> Props
shorthand (CSSBox a -> a
forall a. CSSBox a -> a
inner CSSBox a
self) Text
k [Token]
v

validProp :: a -> Text -> [Token] -> Bool
validProp self :: a
self key :: Text
key value :: [Token]
value = Maybe a -> Bool
forall a. Maybe a -> Bool
isJust (Maybe a -> Bool) -> Maybe a -> Bool
forall a b. (a -> b) -> a -> b
$ a -> a -> Text -> [Token] -> Maybe a
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand a
self a
self Text
key [Token]
value