{-# LANGUAGE OverloadedStrings #-}
module Graphics.Layout.Grid.CSS(CSSGrid(..), Axis(..), CSSCell(..), Placement(..),
finalizeGrid, Areas, parseASCIIGrid) where
import Stylist (PropertyParser(..), parseOperands)
import Data.CSS.Syntax.Tokens (Token(..), NumericValue(..))
import Data.Text (Text)
import qualified Data.Text as Txt
import Data.Char (isAlphaNum)
import Data.Maybe (fromMaybe, isNothing)
import Data.List (nub)
import qualified Data.HashMap.Lazy as HM
import Graphics.Layout.CSS.Length
import Graphics.Layout.Box
import Graphics.Layout.Grid
import Graphics.Layout
type Areas = HM.HashMap Text ((Int, Int), (Int, Maybe Int))
parseASCIIGrid :: [[Text]] -> Int -> Areas -> Maybe Areas
parseASCIIGrid :: [[Text]] -> Int -> Areas -> Maybe Areas
parseASCIIGrid ([Text]
row:[[Text]]
rows) Int
i Areas
prev
| [Text]
names [Text] -> [Text] -> Bool
forall a. Eq a => a -> a -> Bool
== [Text] -> [Text]
forall a. Eq a => [a] -> [a]
nub [Text]
names, [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and [(Int, Int)
span (Int, Int) -> (Int, Int) -> Bool
forall a. Eq a => a -> a -> Bool
== ((Int, Int), (Int, Maybe Int)) -> (Int, Int)
forall a b. (a, b) -> a
fst ((Int, Int), (Int, Maybe Int))
rec Bool -> Bool -> Bool
&& Maybe Int -> Bool
forall a. Maybe a -> Bool
isNothing ((Int, Maybe Int) -> Maybe Int
forall a b. (a, b) -> b
snd ((Int, Maybe Int) -> Maybe Int) -> (Int, Maybe Int) -> Maybe Int
forall a b. (a -> b) -> a -> b
$ ((Int, Int), (Int, Maybe Int)) -> (Int, Maybe Int)
forall a b. (a, b) -> b
snd ((Int, Int), (Int, Maybe Int))
rec)
| (Text
name, (Int, Int)
span) <- [(Text, (Int, Int))]
row', Just ((Int, Int), (Int, Maybe Int))
rec <- [Text
name Text -> Areas -> Maybe ((Int, Int), (Int, Maybe Int))
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
`HM.lookup` Areas
prev]] =
[[Text]] -> Int -> Areas -> Maybe Areas
parseASCIIGrid [[Text]]
rows (Int -> Int
forall a. Enum a => a -> a
succ Int
i) (Areas -> Maybe Areas) -> Areas -> Maybe Areas
forall a b. (a -> b) -> a -> b
$ (Text
-> ((Int, Int), (Int, Maybe Int))
-> ((Int, Int), (Int, Maybe Int)))
-> Areas -> Areas
forall k v1 v2. (k -> v1 -> v2) -> HashMap k v1 -> HashMap k v2
HM.mapWithKey Text
-> ((Int, Int), (Int, Maybe Int)) -> ((Int, Int), (Int, Maybe Int))
forall {a} {a}. Text -> (a, (a, Maybe Int)) -> (a, (a, Maybe Int))
closeAreas (Areas -> Areas) -> Areas -> Areas
forall a b. (a -> b) -> a -> b
$ Areas -> Areas -> Areas
forall k v. Eq k => HashMap k v -> HashMap k v -> HashMap k v
HM.union Areas
prev (Areas -> Areas) -> Areas -> Areas
forall a b. (a -> b) -> a -> b
$
[(Text, ((Int, Int), (Int, Maybe Int)))] -> Areas
forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
HM.fromList [(Text
name, ((Int, Int)
span, (Int
i, Maybe Int
forall a. Maybe a
Nothing))) | (Text
name, (Int, Int)
span) <- [(Text, (Int, Int))]
row']
| Bool
otherwise = Maybe Areas
forall a. Maybe a
Nothing
where
names :: [Text]
names = ((Text, (Int, Int)) -> Text) -> [(Text, (Int, Int))] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map (Text, (Int, Int)) -> Text
forall a b. (a, b) -> a
fst [(Text, (Int, Int))]
row'
row' :: [(Text, (Int, Int))]
row' = [(Int, Text)] -> [(Text, (Int, Int))]
forall {a}. Eq a => [(Int, a)] -> [(a, (Int, Int))]
parseAsciiRow ([(Int, Text)] -> [(Text, (Int, Int))])
-> [(Int, Text)] -> [(Text, (Int, Int))]
forall a b. (a -> b) -> a -> b
$ [Text] -> [(Int, Text)]
forall {b}. [b] -> [(Int, b)]
enumerate [Text]
row
parseAsciiRow :: [(Int, a)] -> [(a, (Int, Int))]
parseAsciiRow ((Int
j, a
cell):[(Int, a)]
cells) =
let ([(Int, a)]
self, [(Int, a)]
cells') = ((Int, a) -> Bool) -> [(Int, a)] -> ([(Int, a)], [(Int, a)])
forall a. (a -> Bool) -> [a] -> ([a], [a])
span (\(Int, a)
z -> (Int, a) -> a
forall a b. (a, b) -> b
snd (Int, a)
z a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
cell) [(Int, a)]
cells
in (a
cell, (Int
j, Int -> Int
forall a. Enum a => a -> a
succ Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ [(Int, a)] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(Int, a)]
self))(a, (Int, Int)) -> [(a, (Int, Int))] -> [(a, (Int, Int))]
forall a. a -> [a] -> [a]
:[(Int, a)] -> [(a, (Int, Int))]
parseAsciiRow [(Int, a)]
cells'
parseAsciiRow [] = []
enumerate :: [b] -> [(Int, b)]
enumerate = [Int] -> [b] -> [(Int, b)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0..]
closeAreas :: Text -> (a, (a, Maybe Int)) -> (a, (a, Maybe Int))
closeAreas Text
name (a
a, (a
b, Maybe Int
Nothing)) | Text
name Text -> [Text] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Text]
names = (a
a, (a
b, Int -> Maybe Int
forall a. a -> Maybe a
Just Int
i))
closeAreas Text
_ (a, (a, Maybe Int))
ret = (a, (a, Maybe Int))
ret
parseASCIIGrid [] Int
_ Areas
ret = Areas -> Maybe Areas
forall a. a -> Maybe a
Just Areas
ret
data CSSGrid = CSSGrid {
CSSGrid -> Unitted
autoColumns :: Unitted,
CSSGrid -> Axis
autoFlow :: Axis,
CSSGrid -> Bool
autoFlowDense :: Bool,
CSSGrid -> Unitted
autoRows :: Unitted,
CSSGrid -> Areas
templateAreas :: Areas,
CSSGrid -> [([Text], Unitted)]
templateColumns :: [([Text], Unitted)],
CSSGrid -> [([Text], Unitted)]
templateRows :: [([Text], Unitted)],
CSSGrid -> Size Unitted Unitted
cssGap :: Size Unitted Unitted,
CSSGrid -> Size Alignment Alignment
alignItems :: Size Alignment Alignment
}
data Axis = Row | Col deriving Axis -> Axis -> Bool
(Axis -> Axis -> Bool) -> (Axis -> Axis -> Bool) -> Eq Axis
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Axis -> Axis -> Bool
== :: Axis -> Axis -> Bool
$c/= :: Axis -> Axis -> Bool
/= :: Axis -> Axis -> Bool
Eq
data CSSCell = CSSCell {
CSSCell -> Placement
columnStart :: Placement,
CSSCell -> Placement
columnEnd :: Placement,
CSSCell -> Placement
rowStart :: Placement,
CSSCell -> Placement
rowEnd :: Placement,
CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
}
data Placement = Autoplace | Named Text | Numbered Int (Maybe Text) |
Span Int (Maybe Text)
instance PropertyParser CSSGrid where
temp :: CSSGrid
temp = CSSGrid {
autoColumns :: Unitted
autoColumns = Unitted
auto,
autoFlow :: Axis
autoFlow = Axis
Row,
autoFlowDense :: Bool
autoFlowDense = Bool
False,
autoRows :: Unitted
autoRows = Unitted
auto,
templateAreas :: Areas
templateAreas = Areas
forall k v. HashMap k v
HM.empty,
templateColumns :: [([Text], Unitted)]
templateColumns = [],
templateRows :: [([Text], Unitted)]
templateRows = [],
cssGap :: Size Unitted Unitted
cssGap = Unitted -> Unitted -> Size Unitted Unitted
forall m n. n -> m -> Size m n
Size (Double
0,Text
"px") (Double
0,Text
"px"),
alignItems :: Size Alignment Alignment
alignItems = Alignment -> Alignment -> Size Alignment Alignment
forall m n. n -> m -> Size m n
Size Alignment
Start Alignment
Start
}
inherit :: CSSGrid -> CSSGrid
inherit CSSGrid
_ = CSSGrid
forall a. PropertyParser a => a
temp
priority :: CSSGrid -> [Text]
priority CSSGrid
_ = []
longhand :: CSSGrid -> CSSGrid -> Text -> [Token] -> Maybe CSSGrid
longhand CSSGrid
_ CSSGrid
s Text
"grid-auto-columns" [Token]
toks | Just Unitted
x <- [Token] -> Maybe Unitted
parseFR [Token]
toks = CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
s {autoColumns :: Unitted
autoColumns=Unitted
x}
longhand CSSGrid
_ CSSGrid
s Text
"grid-auto-rows" [Token]
toks | Just Unitted
x <- [Token] -> Maybe Unitted
parseFR [Token]
toks = CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
s { autoRows :: Unitted
autoRows = Unitted
x }
longhand CSSGrid
_ CSSGrid
self Text
"grid-auto-flow" [Ident Text
"row"] = CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self {
autoFlow :: Axis
autoFlow = Axis
Row, autoFlowDense :: Bool
autoFlowDense = Bool
False
}
longhand CSSGrid
_ CSSGrid
self Text
"grid-auto-flow" [Ident Text
"column"] = CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self {
autoFlow :: Axis
autoFlow = Axis
Col, autoFlowDense :: Bool
autoFlowDense = Bool
False
}
longhand CSSGrid
_ CSSGrid
self Text
"grid-auto-flow" [Ident Text
"row", Ident Text
"dense"] = CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self {
autoFlow :: Axis
autoFlow = Axis
Row, autoFlowDense :: Bool
autoFlowDense = Bool
True
}
longhand CSSGrid
_ CSSGrid
self Text
"grid-auto-flow" [Ident Text
"column", Ident Text
"dense"] = CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self {
autoFlow :: Axis
autoFlow = Axis
Col, autoFlowDense :: Bool
autoFlowDense = Bool
True
}
longhand CSSGrid
_ CSSGrid
self Text
"grid-template-areas" [Ident Text
"none"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { templateAreas :: Areas
templateAreas = Areas
forall k v. HashMap k v
HM.empty }
longhand CSSGrid
_ CSSGrid
self Text
"grid-template-areas" [Ident Text
"initial"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { templateAreas :: Areas
templateAreas = Areas
forall k v. HashMap k v
HM.empty }
longhand CSSGrid
_ CSSGrid
self Text
"grid-template-areas" [Token]
toks
| (Token -> Bool) -> [Token] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Token -> Bool
isString [Token]
toks, let grid :: [[Text]]
grid = [Text -> [Text]
Txt.words Text
x | String Text
x <- [Token]
toks],
[[Text]] -> Bool
validate [[Text]]
grid, Just Areas
areas <- [[Text]] -> Int -> Areas -> Maybe Areas
parseASCIIGrid [[Text]]
grid Int
0 Areas
forall k v. HashMap k v
HM.empty =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { templateAreas :: Areas
templateAreas = Areas
areas }
where
isString :: Token -> Bool
isString (String Text
_) = Bool
True
isString Token
_ = Bool
False
validate :: [[Text]] -> Bool
validate grid :: [[Text]]
grid@([Text]
row:[[Text]]
rows) =
(Text -> Bool) -> [Text] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Text -> Bool
isValidName ([[Text]] -> [Text]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Text]]
grid) Bool -> Bool -> Bool
&& ([Text] -> Bool) -> [[Text]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (\[Text]
x -> [Text] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Text]
row Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== [Text] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Text]
x) [[Text]]
rows
validate [] = Bool
False
isValidName :: Text -> Bool
isValidName Text
name = (Char -> Bool) -> Text -> Bool
Txt.all (\Char
c -> Char -> Bool
isAlphaNum Char
c Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'-') Text
name
longhand CSSGrid
_ CSSGrid
self Text
"grid-template-columns" [Token]
toks | Just [([Text], Unitted)]
x <- [Token] -> Maybe [([Text], Unitted)]
parseTemplate [Token]
toks =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { templateColumns :: [([Text], Unitted)]
templateColumns = [([Text], Unitted)]
x }
longhand CSSGrid
_ CSSGrid
self Text
"grid-template-rows" [Token]
toks | Just [([Text], Unitted)]
x <- [Token] -> Maybe [([Text], Unitted)]
parseTemplate [Token]
toks =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { templateRows :: [([Text], Unitted)]
templateRows = [([Text], Unitted)]
x}
longhand CSSGrid
_ CSSGrid
self Text
"row-gap" [Token]
toks | Just Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { cssGap :: Size Unitted Unitted
cssGap = (CSSGrid -> Size Unitted Unitted
cssGap CSSGrid
self) { inline :: Unitted
inline = Unitted
x } }
longhand CSSGrid
_ CSSGrid
self Text
"column-gap" [Token]
toks | Just Unitted
x <- [Token] -> Maybe Unitted
parseLength [Token]
toks =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { cssGap :: Size Unitted Unitted
cssGap = (CSSGrid -> Size Unitted Unitted
cssGap CSSGrid
self) { block :: Unitted
block = Unitted
x } }
longhand CSSGrid
_ CSSGrid
self Text
"justify-items" [Ident Text
"start"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { alignItems :: Size Alignment Alignment
alignItems = (CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) { inline :: Alignment
inline = Alignment
Start } }
longhand CSSGrid
_ CSSGrid
self Text
"justify-items" [Ident Text
"flex-start"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { alignItems :: Size Alignment Alignment
alignItems = (CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) { inline :: Alignment
inline = Alignment
Start } }
longhand CSSGrid
_ CSSGrid
self Text
"justify-items" [Ident Text
"self-start"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { alignItems :: Size Alignment Alignment
alignItems = (CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) { inline :: Alignment
inline = Alignment
Start } }
longhand CSSGrid
_ CSSGrid
self Text
"justify-items" [Ident Text
"left"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { alignItems :: Size Alignment Alignment
alignItems = (CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) { inline :: Alignment
inline = Alignment
Start } }
longhand CSSGrid
_ CSSGrid
self Text
"justify-items" [Ident Text
"center"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { alignItems :: Size Alignment Alignment
alignItems = (CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) { inline :: Alignment
inline = Alignment
Mid } }
longhand CSSGrid
_ CSSGrid
self Text
"justify-items" [Ident Text
"end"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { alignItems :: Size Alignment Alignment
alignItems = (CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) { inline :: Alignment
inline = Alignment
End } }
longhand CSSGrid
_ CSSGrid
self Text
"justify-items" [Ident Text
"flex-end"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { alignItems :: Size Alignment Alignment
alignItems = (CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) { inline :: Alignment
inline = Alignment
End } }
longhand CSSGrid
_ CSSGrid
self Text
"justify-items" [Ident Text
"self-end"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { alignItems :: Size Alignment Alignment
alignItems = (CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) { inline :: Alignment
inline = Alignment
End } }
longhand CSSGrid
_ CSSGrid
self Text
"justify-items" [Ident Text
"right"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { alignItems :: Size Alignment Alignment
alignItems = (CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) { inline :: Alignment
inline = Alignment
End } }
longhand CSSGrid
parent CSSGrid
self Text
"justify-items" (Ident Text
"unsafe":[Token]
toks) =
CSSGrid -> CSSGrid -> Text -> [Token] -> Maybe CSSGrid
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSGrid
parent CSSGrid
self Text
"justify-items" [Token]
toks
longhand CSSGrid
_ CSSGrid
self Text
"justify-items" [Ident Text
"normal"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { alignItems :: Size Alignment Alignment
alignItems = (CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) { inline :: Alignment
inline = Alignment
Start } }
longhand CSSGrid
_ CSSGrid
self Text
"justify-items" [Ident Text
"initial"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { alignItems :: Size Alignment Alignment
alignItems = (CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) { inline :: Alignment
inline = Alignment
Start } }
longhand CSSGrid
_ CSSGrid
self Text
"align-items" [Ident Text
"start"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { alignItems :: Size Alignment Alignment
alignItems = (CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) { block :: Alignment
block = Alignment
Start } }
longhand CSSGrid
_ CSSGrid
self Text
"align-items" [Ident Text
"flex-start"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { alignItems :: Size Alignment Alignment
alignItems = (CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) { block :: Alignment
block = Alignment
Start } }
longhand CSSGrid
_ CSSGrid
self Text
"align-items" [Ident Text
"self-start"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { alignItems :: Size Alignment Alignment
alignItems = (CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) { block :: Alignment
block = Alignment
Start } }
longhand CSSGrid
_ CSSGrid
self Text
"align-items" [Ident Text
"center"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { alignItems :: Size Alignment Alignment
alignItems = (CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) { block :: Alignment
block = Alignment
Mid } }
longhand CSSGrid
_ CSSGrid
self Text
"align-items" [Ident Text
"end"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { alignItems :: Size Alignment Alignment
alignItems = (CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) { block :: Alignment
block = Alignment
End } }
longhand CSSGrid
_ CSSGrid
self Text
"align-items" [Ident Text
"flex-end"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { alignItems :: Size Alignment Alignment
alignItems = (CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) { block :: Alignment
block = Alignment
End } }
longhand CSSGrid
_ CSSGrid
self Text
"align-items" [Ident Text
"self-end"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { alignItems :: Size Alignment Alignment
alignItems = (CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) { block :: Alignment
block = Alignment
End } }
longhand CSSGrid
parent CSSGrid
self Text
"align-items" (Ident Text
"unsafe":[Token]
toks) =
CSSGrid -> CSSGrid -> Text -> [Token] -> Maybe CSSGrid
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSGrid
parent CSSGrid
self Text
"align-items" [Token]
toks
longhand CSSGrid
_ CSSGrid
self Text
"align-items" [Ident Text
"normal"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { alignItems :: Size Alignment Alignment
alignItems = (CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) { block :: Alignment
block = Alignment
Start } }
longhand CSSGrid
_ CSSGrid
self Text
"align-items" [Ident Text
"initial"] =
CSSGrid -> Maybe CSSGrid
forall a. a -> Maybe a
Just CSSGrid
self { alignItems :: Size Alignment Alignment
alignItems = (CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) { block :: Alignment
block = Alignment
Start } }
longhand CSSGrid
_ CSSGrid
_ Text
_ [Token]
_ = Maybe CSSGrid
forall a. Maybe a
Nothing
instance PropertyParser CSSCell where
temp :: CSSCell
temp = CSSCell {
columnStart :: Placement
columnStart = Placement
Autoplace,
columnEnd :: Placement
columnEnd = Placement
Autoplace,
rowStart :: Placement
rowStart = Placement
Autoplace,
rowEnd :: Placement
rowEnd = Placement
Autoplace,
alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = Maybe Alignment
-> Maybe Alignment -> Size (Maybe Alignment) (Maybe Alignment)
forall m n. n -> m -> Size m n
Size Maybe Alignment
forall a. Maybe a
Nothing Maybe Alignment
forall a. Maybe a
Nothing
}
inherit :: CSSCell -> CSSCell
inherit CSSCell
_ = CSSCell
forall a. PropertyParser a => a
temp
priority :: CSSCell -> [Text]
priority CSSCell
_ = []
longhand :: CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
longhand CSSCell
_ CSSCell
self Text
"grid-column-start" [Token]
toks | Just Placement
x <- [Token] -> Maybe Placement
placement [Token]
toks =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { columnStart :: Placement
columnStart = Placement
x}
longhand CSSCell
_ CSSCell
s Text
"grid-column-end" [Token]
toks | Just Placement
x <- [Token] -> Maybe Placement
placement [Token]
toks = CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
s {columnEnd :: Placement
columnEnd=Placement
x}
longhand CSSCell
_ CSSCell
s Text
"grid-row-start" [Token]
toks | Just Placement
x <- [Token] -> Maybe Placement
placement [Token]
toks = CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
s {rowStart :: Placement
rowStart = Placement
x}
longhand CSSCell
_ CSSCell
s Text
"grid-row-end" [Token]
toks | Just Placement
x <- [Token] -> Maybe Placement
placement [Token]
toks = CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
s { rowEnd :: Placement
rowEnd = Placement
x }
longhand CSSCell
_ CSSCell
self Text
"align-self" [Ident Text
"start"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { block :: Maybe Alignment
block = Alignment -> Maybe Alignment
forall a. a -> Maybe a
Just Alignment
Start } }
longhand CSSCell
_ CSSCell
self Text
"align-self" [Ident Text
"self-start"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { block :: Maybe Alignment
block = Alignment -> Maybe Alignment
forall a. a -> Maybe a
Just Alignment
Start } }
longhand CSSCell
_ CSSCell
self Text
"align-self" [Ident Text
"flex-start"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { block :: Maybe Alignment
block = Alignment -> Maybe Alignment
forall a. a -> Maybe a
Just Alignment
Start } }
longhand CSSCell
_ CSSCell
self Text
"align-self" [Ident Text
"center"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { block :: Maybe Alignment
block = Alignment -> Maybe Alignment
forall a. a -> Maybe a
Just Alignment
Mid } }
longhand CSSCell
_ CSSCell
self Text
"align-self" [Ident Text
"end"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { block :: Maybe Alignment
block = Alignment -> Maybe Alignment
forall a. a -> Maybe a
Just Alignment
End } }
longhand CSSCell
_ CSSCell
self Text
"align-self" [Ident Text
"self-end"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { block :: Maybe Alignment
block = Alignment -> Maybe Alignment
forall a. a -> Maybe a
Just Alignment
End } }
longhand CSSCell
_ CSSCell
self Text
"align-self" [Ident Text
"flex-end"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { block :: Maybe Alignment
block = Alignment -> Maybe Alignment
forall a. a -> Maybe a
Just Alignment
End } }
longhand CSSCell
_ CSSCell
self Text
"align-self" [Ident Text
"normal"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { block :: Maybe Alignment
block = Alignment -> Maybe Alignment
forall a. a -> Maybe a
Just Alignment
Start } }
longhand CSSCell
parent CSSCell
self Text
"align-self" (Ident Text
"unsafe":[Token]
toks) =
CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
parent CSSCell
self Text
"align-self" [Token]
toks
longhand CSSCell
_ CSSCell
self Text
"align-self" [Ident Text
"auto"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { block :: Maybe Alignment
block = Maybe Alignment
forall a. Maybe a
Nothing } }
longhand CSSCell
_ CSSCell
self Text
"align-self" [Ident Text
"initial"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { block :: Maybe Alignment
block = Maybe Alignment
forall a. Maybe a
Nothing } }
longhand CSSCell
_ CSSCell
self Text
"justify-self" [Ident Text
"start"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { inline :: Maybe Alignment
inline = Alignment -> Maybe Alignment
forall a. a -> Maybe a
Just Alignment
Start } }
longhand CSSCell
_ CSSCell
self Text
"justify-self" [Ident Text
"self-start"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { inline :: Maybe Alignment
inline = Alignment -> Maybe Alignment
forall a. a -> Maybe a
Just Alignment
Start } }
longhand CSSCell
_ CSSCell
self Text
"justify-self" [Ident Text
"flex-start"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { inline :: Maybe Alignment
inline = Alignment -> Maybe Alignment
forall a. a -> Maybe a
Just Alignment
Start } }
longhand CSSCell
_ CSSCell
self Text
"justify-self" [Ident Text
"left"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { inline :: Maybe Alignment
inline = Alignment -> Maybe Alignment
forall a. a -> Maybe a
Just Alignment
Start } }
longhand CSSCell
_ CSSCell
self Text
"justify-self" [Ident Text
"center"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { inline :: Maybe Alignment
inline = Alignment -> Maybe Alignment
forall a. a -> Maybe a
Just Alignment
Mid } }
longhand CSSCell
_ CSSCell
self Text
"justify-self" [Ident Text
"end"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { inline :: Maybe Alignment
inline = Alignment -> Maybe Alignment
forall a. a -> Maybe a
Just Alignment
End } }
longhand CSSCell
_ CSSCell
self Text
"justify-self" [Ident Text
"self-end"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { inline :: Maybe Alignment
inline = Alignment -> Maybe Alignment
forall a. a -> Maybe a
Just Alignment
End } }
longhand CSSCell
_ CSSCell
self Text
"justify-self" [Ident Text
"flex-end"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { inline :: Maybe Alignment
inline = Alignment -> Maybe Alignment
forall a. a -> Maybe a
Just Alignment
End } }
longhand CSSCell
_ CSSCell
self Text
"justify-self" [Ident Text
"right"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { inline :: Maybe Alignment
inline = Alignment -> Maybe Alignment
forall a. a -> Maybe a
Just Alignment
End } }
longhand CSSCell
_ CSSCell
self Text
"justify-self" [Ident Text
"normal"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { inline :: Maybe Alignment
inline = Alignment -> Maybe Alignment
forall a. a -> Maybe a
Just Alignment
Start } }
longhand CSSCell
parent CSSCell
self Text
"justify-self" (Ident Text
"unsafe":[Token]
toks) =
CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
parent CSSCell
self Text
"justify-self" [Token]
toks
longhand CSSCell
_ CSSCell
self Text
"justify-self" [Ident Text
"auto"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { inline :: Maybe Alignment
inline = Maybe Alignment
forall a. Maybe a
Nothing } }
longhand CSSCell
_ CSSCell
self Text
"justify-self" [Ident Text
"initial"] =
CSSCell -> Maybe CSSCell
forall a. a -> Maybe a
Just CSSCell
self { alignSelf :: Size (Maybe Alignment) (Maybe Alignment)
alignSelf = (CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
self) { inline :: Maybe Alignment
inline = Maybe Alignment
forall a. Maybe a
Nothing } }
longhand CSSCell
_ CSSCell
_ Text
_ [Token]
_ = Maybe CSSCell
forall a. Maybe a
Nothing
shorthand :: CSSCell -> Text -> [Token] -> Props
shorthand CSSCell
_ Text
"grid-column" [Token]
toks = case (Token -> Bool) -> [Token] -> ([Token], [Token])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Token -> Token -> Bool
forall a. Eq a => a -> a -> Bool
== Char -> Token
Delim Char
'/') [Token]
toks of
([Token]
a, Delim Char
'/':[Token]
b) | Just Placement
_ <- [Token] -> Maybe Placement
placement [Token]
a, Just Placement
_ <- [Token] -> Maybe Placement
placement [Token]
b ->
[(Text
"grid-column-start", [Token]
a), (Text
"grid-column-end", [Token]
b)]
([Token], [Token])
_ | Just Placement
_ <- [Token] -> Maybe Placement
placement [Token]
toks ->
[(Text
"grid-column-start", [Token]
toks), (Text
"grid-column-end", [Token]
toks)]
([Token], [Token])
_ -> []
shorthand CSSCell
self Text
"grid-gap" [Token]
toks = case [Token] -> [[Token]]
parseOperands [Token]
toks of
[[Token]
a] | Just CSSCell
_ <- CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
self CSSCell
self Text
"grid-row-gap" [Token]
a ->
[(Text
"grid-row-gap", [Token]
a), (Text
"grid-column-gap", [Token]
a)]
[[Token]
a, [Token]
b] | Just CSSCell
_ <- CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
self CSSCell
self Text
"grid-row-gap" [Token]
a,
Just CSSCell
_ <- CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
self CSSCell
self Text
"grid-column-gap" [Token]
b ->
[(Text
"grid-row-gap", [Token]
a), (Text
"grid-column-gap", [Token]
b)]
[[Token]]
_ -> []
shorthand CSSCell
_ Text
"grid-row" [Token]
toks = case (Token -> Bool) -> [Token] -> ([Token], [Token])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Token -> Token -> Bool
forall a. Eq a => a -> a -> Bool
== Char -> Token
Delim Char
'/') [Token]
toks of
([Token]
a, Delim Char
'/':[Token]
b) | Just Placement
_ <- [Token] -> Maybe Placement
placement [Token]
a, Just Placement
_ <- [Token] -> Maybe Placement
placement [Token]
b ->
[(Text
"grid-row-start", [Token]
a), (Text
"grid-row-end", [Token]
b)]
([Token], [Token])
_ | Just Placement
_ <- [Token] -> Maybe Placement
placement [Token]
toks ->
[(Text
"grid-row-start", [Token]
toks), (Text
"grid-row-end", [Token]
toks)]
([Token], [Token])
_ -> []
shorthand CSSCell
_ Text
"grid-template" toks :: [Token]
toks@[Ident Text
"none"] =
[(Text
"grid-template-columns", [Token]
toks), (Text
"grid-template-rows", [Token]
toks),
(Text
"grid-template-areas", [Token]
toks)]
shorthand CSSCell
self Text
"grid-template" [Token]
toks
| ([Token]
rows, Delim Char
'/':[Token]
cols) <- (Token -> Bool) -> [Token] -> ([Token], [Token])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Token -> Token -> Bool
forall a. Eq a => a -> a -> Bool
== Char -> Token
Delim Char
'/') [Token]
toks,
Just CSSCell
_ <- CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
self CSSCell
self Text
"grid-template-rows" [Token]
rows,
Just CSSCell
_ <- CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
self CSSCell
self Text
"grid-template-columns" [Token]
cols =
[(Text
"grid-template-rows", [Token]
rows), (Text
"grid-template-columns", [Token]
cols),
(Text
"grid-template-areas", [Text -> Token
Ident Text
"none"])]
| ([Token]
rowsTemplate, Delim Char
'/':[Token]
cols) <- (Token -> Bool) -> [Token] -> ([Token], [Token])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Token -> Token -> Bool
forall a. Eq a => a -> a -> Bool
== Char -> Token
Delim Char
'/') [Token]
toks,
Just ([Token]
areas, [[Token]]
rows) <- [Token] -> Maybe ([Token], [[Token]])
splitTemplate [Token]
rowsTemplate,
Just CSSCell
_ <- CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
self CSSCell
self Text
"grid-template-cols" [Token]
cols,
Just CSSCell
_ <- CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
self CSSCell
self Text
"grid-template-areas" [Token]
areas =
[(Text
"grid-template-rows", [[Token]] -> [Token]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Token]]
rows),
(Text
"grid-template-columns", [Token]
cols), (Text
"grid-template-areas", [Token]
areas)]
where
splitTemplate :: [Token] -> Maybe ([Token], [[Token]])
splitTemplate (Token
LeftSquareBracket:[Token]
t)
| ([Token]
names, Token
RightSquareBracket:[Token]
t') <- (Token -> Bool) -> [Token] -> ([Token], [Token])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Token -> Token -> Bool
forall a. Eq a => a -> a -> Bool
== Token
RightSquareBracket) [Token]
t,
(Token -> Bool) -> [Token] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Token -> Bool
isIdent [Token]
names, Just ([Token]
areas, [Token]
row:[[Token]]
rows) <- [Token] -> Maybe ([Token], [[Token]])
splitTemplate [Token]
t' =
([Token], [[Token]]) -> Maybe ([Token], [[Token]])
forall a. a -> Maybe a
Just ([Token]
areas,
(Token
LeftSquareBracketToken -> [Token] -> [Token]
forall a. a -> [a] -> [a]
:[Token]
names [Token] -> [Token] -> [Token]
forall a. [a] -> [a] -> [a]
++ Token
RightSquareBracketToken -> [Token] -> [Token]
forall a. a -> [a] -> [a]
:[Token]
row)[Token] -> [[Token]] -> [[Token]]
forall a. a -> [a] -> [a]
:[[Token]]
rows)
splitTemplate (x :: Token
x@(String Text
_):[Token]
toks)
| Just ([Token]
areas, [[Token]]
rows) <- [Token] -> Maybe ([Token], [[Token]])
splitTemplate' [Token]
toks = ([Token], [[Token]]) -> Maybe ([Token], [[Token]])
forall a. a -> Maybe a
Just (Token
xToken -> [Token] -> [Token]
forall a. a -> [a] -> [a]
:[Token]
areas, [[Token]]
rows)
splitTemplate [Token]
_ = Maybe ([Token], [[Token]])
forall a. Maybe a
Nothing
splitTemplate' :: [Token] -> Maybe ([Token], [[Token]])
splitTemplate' (Token
x:Token
LeftSquareBracket:[Token]
t)
| ([Token]
names, Token
RightSquareBracket:[Token]
t') <- (Token -> Bool) -> [Token] -> ([Token], [Token])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Token -> Token -> Bool
forall a. Eq a => a -> a -> Bool
== Token
RightSquareBracket) [Token]
t,
(Token -> Bool) -> [Token] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Token -> Bool
isIdent [Token]
names, Just Unitted
_ <- [Token] -> Maybe Unitted
parseFR' [Token
x],
Just ([Token]
areas, [[Token]]
rows) <- [Token] -> Maybe ([Token], [[Token]])
splitTemplate [Token]
t' =
([Token], [[Token]]) -> Maybe ([Token], [[Token]])
forall a. a -> Maybe a
Just ([Token]
areas,
(Token
xToken -> [Token] -> [Token]
forall a. a -> [a] -> [a]
:Token
LeftSquareBracketToken -> [Token] -> [Token]
forall a. a -> [a] -> [a]
:[Token]
names [Token] -> [Token] -> [Token]
forall a. [a] -> [a] -> [a]
++ [Token
RightSquareBracket])[Token] -> [[Token]] -> [[Token]]
forall a. a -> [a] -> [a]
:[[Token]]
rows)
splitTemplate' (Token
x:[Token]
toks)
| Just Unitted
_ <- [Token] -> Maybe Unitted
parseFR' [Token
x], Just ([Token]
areas, [[Token]]
rows) <- [Token] -> Maybe ([Token], [[Token]])
splitTemplate [Token]
toks =
([Token], [[Token]]) -> Maybe ([Token], [[Token]])
forall a. a -> Maybe a
Just ([Token]
areas, [Token
x][Token] -> [[Token]] -> [[Token]]
forall a. a -> [a] -> [a]
:[[Token]]
rows)
splitTemplate' (Token
LeftSquareBracket:[Token]
t)
| ([Token]
names, Token
RightSquareBracket:[Token]
t') <- (Token -> Bool) -> [Token] -> ([Token], [Token])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Token -> Token -> Bool
forall a. Eq a => a -> a -> Bool
== Token
RightSquareBracket) [Token]
t,
(Token -> Bool) -> [Token] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Token -> Bool
isIdent [Token]
names, Just ([Token]
areas, [[Token]]
rows) <- [Token] -> Maybe ([Token], [[Token]])
splitTemplate [Token]
t' =
([Token], [[Token]]) -> Maybe ([Token], [[Token]])
forall a. a -> Maybe a
Just ([Token]
areas,
(Token
LeftSquareBracketToken -> [Token] -> [Token]
forall a. a -> [a] -> [a]
:[Token]
names [Token] -> [Token] -> [Token]
forall a. [a] -> [a] -> [a]
++ [Token
RightSquareBracket])[Token] -> [[Token]] -> [[Token]]
forall a. a -> [a] -> [a]
:[[Token]]
rows)
splitTemplate' [Token]
toks
| Just ([Token]
areas, [[Token]]
rows) <- [Token] -> Maybe ([Token], [[Token]])
splitTemplate [Token]
toks = ([Token], [[Token]]) -> Maybe ([Token], [[Token]])
forall a. a -> Maybe a
Just ([Token]
areas, [][Token] -> [[Token]] -> [[Token]]
forall a. a -> [a] -> [a]
:[[Token]]
rows)
| Bool
otherwise = Maybe ([Token], [[Token]])
forall a. Maybe a
Nothing
isIdent :: Token -> Bool
isIdent (Ident Text
_) = Bool
True
isIdent Token
_ = Bool
False
shorthand CSSCell
self Text
"grid" [Token]
toks
| ret :: Props
ret@((Text, [Token])
_:Props
_) <- CSSCell -> Text -> [Token] -> Props
forall a. PropertyParser a => a -> Text -> [Token] -> Props
shorthand CSSCell
self Text
"grid-template" [Token]
toks =
(Text
"grid-auto-flow", [Text -> Token
Ident Text
"row"])(Text, [Token]) -> Props -> Props
forall a. a -> [a] -> [a]
:Props
ret
shorthand CSSCell
self Text
"grid" [Token]
toks = case (Token -> Bool) -> [Token] -> ([Token], [Token])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Token -> Token -> Bool
forall a. Eq a => a -> a -> Bool
== Char -> Token
Delim Char
'/') [Token]
toks of
([Token]
rows, Delim Char
'/':Ident Text
"auto-flow":Ident Text
"dense":[Token]
cols) |
Just CSSCell
_ <- CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
self CSSCell
self Text
"grid-template-rows" [Token]
rows,
Just CSSCell
_ <- CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
self CSSCell
self Text
"grid-auto-columns" [Token]
cols ->
[(Text
"grid-template-rows", [Token]
rows),
(Text
"grid-template-columns", [Text -> Token
Ident Text
"none"]),
(Text
"grid-auto-columns", [Token]
cols), (Text
"grid-auto-rows", [Text -> Token
Ident Text
"none"]),
(Text
"grid-auto-flow", [Text -> Token
Ident Text
"column", Text -> Token
Ident Text
"dense"])]
([Token]
rows, Delim Char
'/':Ident Text
"dense":Ident Text
"auto-flow":[Token]
cols) |
Just CSSCell
_ <- CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
self CSSCell
self Text
"grid-template-rows" [Token]
rows,
Just CSSCell
_ <- CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
self CSSCell
self Text
"grid-auto-columns" [Token]
cols ->
[(Text
"grid-template-rows", [Token]
rows),
(Text
"grid-template-columns", [Text -> Token
Ident Text
"none"]),
(Text
"grid-auto-columns", [Token]
cols), (Text
"grid-auto-rows", [Text -> Token
Ident Text
"none"]),
(Text
"grid-auto-flow", [Text -> Token
Ident Text
"column", Text -> Token
Ident Text
"dense"])]
([Token]
rows, Delim Char
'/':Ident Text
"auto-flow":[Token]
cols) |
Just CSSCell
_ <- CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
self CSSCell
self Text
"grid-template-rows" [Token]
rows,
Just CSSCell
_ <- CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
self CSSCell
self Text
"grid-auto-columns" [Token]
cols ->
[(Text
"grid-template-rows", [Token]
rows),
(Text
"grid-template-columns", [Text -> Token
Ident Text
"none"]),
(Text
"grid-auto-columns", [Token]
cols), (Text
"grid-auto-rows", [Text -> Token
Ident Text
"none"]),
(Text
"grid-auto-flow", [Text -> Token
Ident Text
"column"])]
(Ident Text
"auto-flow":Ident Text
"dense":[Token]
rows, Delim Char
'/':[Token]
cols) |
Just CSSCell
_ <- CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
self CSSCell
self Text
"grid-auto-rows" [Token]
rows,
Just CSSCell
_ <- CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
self CSSCell
self Text
"grid-template-columns" [Token]
cols ->
[(Text
"grid-auto-rows", [Token]
rows), (Text
"grid-auto-columns", [Text -> Token
Ident Text
"none"]),
(Text
"grid-template-columns", [Token]
cols),
(Text
"grid-template-rows", [Text -> Token
Ident Text
"none"]),
(Text
"grid-auto-flow", [Text -> Token
Ident Text
"row", Text -> Token
Ident Text
"dense"])]
(Ident Text
"dense":Ident Text
"auto-flow":[Token]
rows, Delim Char
'/':[Token]
cols) |
Just CSSCell
_ <- CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
self CSSCell
self Text
"grid-auto-rows" [Token]
rows,
Just CSSCell
_ <- CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
self CSSCell
self Text
"grid-template-columns" [Token]
cols ->
[(Text
"grid-auto-rows", [Token]
rows), (Text
"grid-auto-columns", [Text -> Token
Ident Text
"none"]),
(Text
"grid-template-columns", [Token]
cols),
(Text
"grid-template-rows", [Text -> Token
Ident Text
"none"]),
(Text
"grid-auto-flow", [Text -> Token
Ident Text
"row", Text -> Token
Ident Text
"dense"])]
(Ident Text
"auto-flow":[Token]
rows, Delim Char
'/':[Token]
cols) |
Just CSSCell
_ <- CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
self CSSCell
self Text
"grid-auto-rows" [Token]
rows,
Just CSSCell
_ <- CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
self CSSCell
self Text
"grid-template-columns" [Token]
cols ->
[(Text
"grid-auto-rows", [Token]
rows), (Text
"grid-auto-columns", [Text -> Token
Ident Text
"none"]),
(Text
"grid-template-columns", [Token]
cols),
(Text
"grid-template-rows", [Text -> Token
Ident Text
"none"]),
(Text
"grid-auto-flow", [Text -> Token
Ident Text
"row"])]
([Token], [Token])
_ -> []
shorthand CSSCell
self Text
k [Token]
v | Just CSSCell
_ <- CSSCell -> CSSCell -> Text -> [Token] -> Maybe CSSCell
forall a. PropertyParser a => a -> a -> Text -> [Token] -> Maybe a
longhand CSSCell
self CSSCell
self Text
k [Token]
v = [(Text
k, [Token]
v)]
| Bool
otherwise = []
parseFR :: [Token] -> Maybe Unitted
parseFR [Dimension Text
_ NumericValue
x Text
"fr"] = Unitted -> Maybe Unitted
forall a. a -> Maybe a
Just (NumericValue -> Double
forall x. (Fractional x, RealFloat x) => NumericValue -> x
n2f NumericValue
x,Text
"fr")
parseFR [Token]
toks = [Token] -> Maybe Unitted
parseLength [Token]
toks
parseFR' :: [Token] -> Maybe Unitted
parseFR' [Dimension Text
_ NumericValue
x Text
"fr"] = Unitted -> Maybe Unitted
forall a. a -> Maybe a
Just (NumericValue -> Double
forall x. (Fractional x, RealFloat x) => NumericValue -> x
n2f NumericValue
x,Text
"fr")
parseFR' [Token]
toks = [Token] -> Maybe Unitted
parseLength' [Token]
toks
placement :: [Token] -> Maybe Placement
placement [Ident Text
"auto"] = Placement -> Maybe Placement
forall a. a -> Maybe a
Just (Placement -> Maybe Placement) -> Placement -> Maybe Placement
forall a b. (a -> b) -> a -> b
$ Placement
Autoplace
placement [Ident Text
x] = Placement -> Maybe Placement
forall a. a -> Maybe a
Just (Placement -> Maybe Placement) -> Placement -> Maybe Placement
forall a b. (a -> b) -> a -> b
$ Text -> Placement
Named Text
x
placement [Number Text
_ (NVInteger Integer
x)] = Placement -> Maybe Placement
forall a. a -> Maybe a
Just (Placement -> Maybe Placement) -> Placement -> Maybe Placement
forall a b. (a -> b) -> a -> b
$ Int -> Maybe Text -> Placement
Numbered (Integer -> Int
forall a. Enum a => a -> Int
fromEnum Integer
x) Maybe Text
forall a. Maybe a
Nothing
placement [Number Text
_ (NVInteger Integer
x), Ident Text
y] = Placement -> Maybe Placement
forall a. a -> Maybe a
Just (Placement -> Maybe Placement) -> Placement -> Maybe Placement
forall a b. (a -> b) -> a -> b
$ Int -> Maybe Text -> Placement
Numbered (Integer -> Int
forall a. Enum a => a -> Int
fromEnum Integer
x) (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
y)
placement [Ident Text
"span", Number Text
_ (NVInteger Integer
x)]
| Integer
x Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> Integer
0 = Placement -> Maybe Placement
forall a. a -> Maybe a
Just (Placement -> Maybe Placement) -> Placement -> Maybe Placement
forall a b. (a -> b) -> a -> b
$ Int -> Maybe Text -> Placement
Span (Integer -> Int
forall a. Enum a => a -> Int
fromEnum Integer
x) Maybe Text
forall a. Maybe a
Nothing
placement [Ident Text
"span", Ident Text
x] = Placement -> Maybe Placement
forall a. a -> Maybe a
Just (Placement -> Maybe Placement) -> Placement -> Maybe Placement
forall a b. (a -> b) -> a -> b
$ Int -> Maybe Text -> Placement
Span Int
1 (Maybe Text -> Placement) -> Maybe Text -> Placement
forall a b. (a -> b) -> a -> b
$ Text -> Maybe Text
forall a. a -> Maybe a
Just Text
x
placement [Ident Text
"span", Number Text
_ (NVInteger Integer
x), Ident Text
y]
| Integer
x Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> Integer
0 = Placement -> Maybe Placement
forall a. a -> Maybe a
Just (Placement -> Maybe Placement) -> Placement -> Maybe Placement
forall a b. (a -> b) -> a -> b
$ Int -> Maybe Text -> Placement
Span (Integer -> Int
forall a. Enum a => a -> Int
fromEnum Integer
x) (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
y)
placement [Ident Text
"span", Ident Text
y, Number Text
_ (NVInteger Integer
x)]
| Integer
x Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> Integer
0 = Placement -> Maybe Placement
forall a. a -> Maybe a
Just (Placement -> Maybe Placement) -> Placement -> Maybe Placement
forall a b. (a -> b) -> a -> b
$ Int -> Maybe Text -> Placement
Span (Integer -> Int
forall a. Enum a => a -> Int
fromEnum Integer
x) (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
y)
placement [Token]
_ = Maybe Placement
forall a. Maybe a
Nothing
parseTemplate :: [Token] -> Maybe [([Text], Unitted)]
parseTemplate [Ident Text
"none"] = [([Text], Unitted)] -> Maybe [([Text], Unitted)]
forall a. a -> Maybe a
Just []
parseTemplate [Ident Text
"initial"] = [([Text], Unitted)] -> Maybe [([Text], Unitted)]
forall a. a -> Maybe a
Just []
parseTemplate [Token]
toks | (tracks :: [([Text], Unitted)]
tracks@(([Text], Unitted)
_:[([Text], Unitted)]
_), []) <- [Token] -> ([([Text], Unitted)], [Token])
parseTrack [Token]
toks = [([Text], Unitted)] -> Maybe [([Text], Unitted)]
forall a. a -> Maybe a
Just [([Text], Unitted)]
tracks
parseTemplate [Token]
_ = Maybe [([Text], Unitted)]
forall a. Maybe a
Nothing
parseTrack :: [Token] -> ([([Text], Unitted)], [Token])
parseTrack (Token
LeftSquareBracket:[Token]
toks)
| Just ([Text]
names', [Token]
toks') <- [Token] -> Maybe ([Text], [Token])
parseNames [Token]
toks,
(([Text]
names,Unitted
size):[([Text], Unitted)]
cells,[Token]
toks) <- [Token] -> ([([Text], Unitted)], [Token])
parseTrack [Token]
toks' = (([Text]
names' [Text] -> [Text] -> [Text]
forall a. [a] -> [a] -> [a]
++ [Text]
names,Unitted
size)([Text], Unitted) -> [([Text], Unitted)] -> [([Text], Unitted)]
forall a. a -> [a] -> [a]
:[([Text], Unitted)]
cells,[Token]
toks)
| Just ([Text]
names', [Token]
toks') <- [Token] -> Maybe ([Text], [Token])
parseNames [Token]
toks = ([([Text]
names',(Double
0,Text
"end"))],[Token]
toks')
parseTrack (Token
tok:[Token]
toks) | Just Unitted
x <- [Token] -> Maybe Unitted
parseFR' [Token
tok] =
(([], Unitted
x)([Text], Unitted) -> [([Text], Unitted)] -> [([Text], Unitted)]
forall a. a -> [a] -> [a]
:([([Text], Unitted)], [Token]) -> [([Text], Unitted)]
forall a b. (a, b) -> a
fst ([Token] -> ([([Text], Unitted)], [Token])
parseTrack [Token]
toks), ([([Text], Unitted)], [Token]) -> [Token]
forall a b. (a, b) -> b
snd (([([Text], Unitted)], [Token]) -> [Token])
-> ([([Text], Unitted)], [Token]) -> [Token]
forall a b. (a -> b) -> a -> b
$ [Token] -> ([([Text], Unitted)], [Token])
parseTrack [Token]
toks)
parseTrack (Function Text
"repeat":Number Text
_ (NVInteger Integer
x):Token
Comma:[Token]
toks)
| Integer
x Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> Integer
0, (tracks :: [([Text], Unitted)]
tracks@(([Text], Unitted)
_:[([Text], Unitted)]
_), Token
RightParen:[Token]
toks') <- [Token] -> ([([Text], Unitted)], [Token])
parseTrack [Token]
toks =
([[([Text], Unitted)]] -> [([Text], Unitted)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[([Text], Unitted)]] -> [([Text], Unitted)])
-> [[([Text], Unitted)]] -> [([Text], Unitted)]
forall a b. (a -> b) -> a -> b
$ Int -> [([Text], Unitted)] -> [[([Text], Unitted)]]
forall a. Int -> a -> [a]
replicate (Integer -> Int
forall a. Enum a => a -> Int
fromEnum Integer
x) [([Text], Unitted)]
tracks, [Token]
toks')
parseTrack [Token]
toks = ([], [Token]
toks)
parseSubgrid :: [Token] -> ([[Text]], [Token])
parseSubgrid (Token
LeftSquareBracket:[Token]
toks)
| Just ([Text]
names', [Token]
toks') <- [Token] -> Maybe ([Text], [Token])
parseNames [Token]
toks, ([[Text]]
names,[Token]
toks'') <- [Token] -> ([[Text]], [Token])
parseSubgrid [Token]
toks' =
([Text]
names' [Text] -> [[Text]] -> [[Text]]
forall a. a -> [a] -> [a]
: [[Text]]
names, [Token]
toks')
parseSubgrid (Function Text
"repeat":Number Text
_ (NVInteger Integer
x):Token
Comma:[Token]
toks)
| Integer
x Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> Integer
0, (names :: [[Text]]
names@([Text]
_:[[Text]]
_), Token
RightParen:[Token]
toks') <- [Token] -> ([[Text]], [Token])
parseSubgrid [Token]
toks =
([[[Text]]] -> [[Text]]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[[Text]]] -> [[Text]]) -> [[[Text]]] -> [[Text]]
forall a b. (a -> b) -> a -> b
$ Int -> [[Text]] -> [[[Text]]]
forall a. Int -> a -> [a]
replicate (Integer -> Int
forall a. Enum a => a -> Int
fromEnum Integer
x) [[Text]]
names, [Token]
toks')
parseSubgrid [Token]
toks = ([], [Token]
toks)
parseNames :: [Token] -> Maybe ([Text], [Token])
parseNames (Ident Text
x:[Token]
toks)
| Just ([Text]
names,[Token]
toks') <- [Token] -> Maybe ([Text], [Token])
parseNames [Token]
toks = ([Text], [Token]) -> Maybe ([Text], [Token])
forall a. a -> Maybe a
Just (Text
xText -> [Text] -> [Text]
forall a. a -> [a] -> [a]
:[Text]
names,[Token]
toks')
parseNames (Token
RightSquareBracket:[Token]
toks) = ([Text], [Token]) -> Maybe ([Text], [Token])
forall a. a -> Maybe a
Just ([], [Token]
toks)
parseNames [Token]
_ = Maybe ([Text], [Token])
forall a. Maybe a
Nothing
finalizeGrid :: PropertyParser x => CSSGrid -> Font' ->
[CSSCell] -> [LayoutItem Length Length x] -> LayoutItem Length Length x
finalizeGrid :: forall x.
PropertyParser x =>
CSSGrid
-> Font'
-> [CSSCell]
-> [LayoutItem Length Length x]
-> LayoutItem Length Length x
finalizeGrid self :: CSSGrid
self@CSSGrid {
templateColumns :: CSSGrid -> [([Text], Unitted)]
templateColumns = [([Text], Unitted)]
cols', templateRows :: CSSGrid -> [([Text], Unitted)]
templateRows = [([Text], Unitted)]
rows'
} Font'
font [CSSCell]
cells [LayoutItem Length Length x]
childs = x
-> Grid Length Length
-> [GridItem]
-> [LayoutItem Length Length x]
-> LayoutItem Length Length x
forall m n x.
x
-> Grid m n -> [GridItem] -> [LayoutItem m n x] -> LayoutItem m n x
LayoutGrid x
forall a. PropertyParser a => a
temp Grid Length Length
self' [GridItem]
cells' [LayoutItem Length Length x]
childs
where
self' :: Grid Length Length
self' = Track Length -> Track Length -> Grid Length Length
forall m n. n -> m -> Size m n
Size Track {
cells :: [Either Length Double]
cells = (Unitted -> Either Length Double)
-> [Unitted] -> [Either Length Double]
forall a b. (a -> b) -> [a] -> [b]
map Unitted -> Either Length Double
finalizeFR ([Unitted] -> [Either Length Double])
-> [Unitted] -> [Either Length Double]
forall a b. (a -> b) -> a -> b
$ (([Text], Unitted) -> Unitted) -> [([Text], Unitted)] -> [Unitted]
forall a b. (a -> b) -> [a] -> [b]
map ([Text], Unitted) -> Unitted
forall a b. (a, b) -> b
snd [([Text], Unitted)]
rows0,
trackMins :: [Double]
trackMins = [], trackNats :: [Double]
trackNats = [],
gap :: Length
gap = Unitted -> Font' -> Length
finalizeLength (Size Unitted Unitted -> Unitted
forall m n. Size m n -> n
inline (Size Unitted Unitted -> Unitted)
-> Size Unitted Unitted -> Unitted
forall a b. (a -> b) -> a -> b
$ CSSGrid -> Size Unitted Unitted
cssGap CSSGrid
self) Font'
font
} Track {
cells :: [Either Length Double]
cells = (Unitted -> Either Length Double)
-> [Unitted] -> [Either Length Double]
forall a b. (a -> b) -> [a] -> [b]
map Unitted -> Either Length Double
finalizeFR ([Unitted] -> [Either Length Double])
-> [Unitted] -> [Either Length Double]
forall a b. (a -> b) -> a -> b
$ (([Text], Unitted) -> Unitted) -> [([Text], Unitted)] -> [Unitted]
forall a b. (a -> b) -> [a] -> [b]
map ([Text], Unitted) -> Unitted
forall a b. (a, b) -> b
snd [([Text], Unitted)]
cols0,
trackMins :: [Double]
trackMins = [], trackNats :: [Double]
trackNats = [],
gap :: Length
gap = Unitted -> Font' -> Length
finalizeLength (Size Unitted Unitted -> Unitted
forall m n. Size m n -> m
block (Size Unitted Unitted -> Unitted)
-> Size Unitted Unitted -> Unitted
forall a b. (a -> b) -> a -> b
$ CSSGrid -> Size Unitted Unitted
cssGap CSSGrid
self) Font'
font
}
([GridItem]
cells', [([Text], Unitted)]
rows0, [([Text], Unitted)]
cols0) = [CSSCell]
-> [([Text], Unitted)]
-> [([Text], Unitted)]
-> ([GridItem], [([Text], Unitted)], [([Text], Unitted)])
finalizeCells [CSSCell]
cells [([Text], Unitted)]
rows' [([Text], Unitted)]
cols'
finalizeCells :: [CSSCell] -> [([Text], Unitted)] -> [([Text], Unitted)] ->
([GridItem], [([Text], Unitted)], [([Text], Unitted)])
finalizeCells :: [CSSCell]
-> [([Text], Unitted)]
-> [([Text], Unitted)]
-> ([GridItem], [([Text], Unitted)], [([Text], Unitted)])
finalizeCells (CSSCell
cell:[CSSCell]
cells) [([Text], Unitted)]
rows [([Text], Unitted)]
cols = (GridItem
cell'GridItem -> [GridItem] -> [GridItem]
forall a. a -> [a] -> [a]
:[GridItem]
cells', [([Text], Unitted)]
rows_, [([Text], Unitted)]
cols_)
where
(GridItem
cell', [([Text], Unitted)]
rows0, [([Text], Unitted)]
cols0) = CSSCell
-> [([Text], Unitted)]
-> [([Text], Unitted)]
-> (GridItem, [([Text], Unitted)], [([Text], Unitted)])
finalizeCell CSSCell
cell [([Text], Unitted)]
rows [([Text], Unitted)]
cols
([GridItem]
cells', [([Text], Unitted)]
rows_, [([Text], Unitted)]
cols_) = [CSSCell]
-> [([Text], Unitted)]
-> [([Text], Unitted)]
-> ([GridItem], [([Text], Unitted)], [([Text], Unitted)])
finalizeCells [CSSCell]
cells [([Text], Unitted)]
rows0 [([Text], Unitted)]
cols0
finalizeCells [] [([Text], Unitted)]
rows [([Text], Unitted)]
cols = ([], [([Text], Unitted)]
rows, [([Text], Unitted)]
cols)
finalizeCell :: CSSCell -> [([Text], Unitted)] -> [([Text], Unitted)] ->
(GridItem, [([Text], Unitted)], [([Text], Unitted)])
finalizeCell :: CSSCell
-> [([Text], Unitted)]
-> [([Text], Unitted)]
-> (GridItem, [([Text], Unitted)], [([Text], Unitted)])
finalizeCell cell :: CSSCell
cell@CSSCell {
rowStart :: CSSCell -> Placement
rowStart = Placement
Autoplace, columnStart :: CSSCell -> Placement
columnStart = Placement
Autoplace
} [([Text], Unitted)]
rows [([Text], Unitted)]
cols | CSSGrid -> Axis
autoFlow CSSGrid
self Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
Row =
CSSCell
-> [([Text], Unitted)]
-> [([Text], Unitted)]
-> (GridItem, [([Text], Unitted)], [([Text], Unitted)])
finalizeCell CSSCell
cell { columnStart :: Placement
columnStart = Int -> Maybe Text -> Placement
Numbered Int
1 Maybe Text
forall a. Maybe a
Nothing } [([Text], Unitted)]
rows [([Text], Unitted)]
cols
| CSSGrid -> Axis
autoFlow CSSGrid
self Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
Col =
CSSCell
-> [([Text], Unitted)]
-> [([Text], Unitted)]
-> (GridItem, [([Text], Unitted)], [([Text], Unitted)])
finalizeCell CSSCell
cell { rowStart :: Placement
rowStart = Int -> Maybe Text -> Placement
Numbered Int
1 Maybe Text
forall a. Maybe a
Nothing } [([Text], Unitted)]
rows [([Text], Unitted)]
cols
finalizeCell CSSCell
cell [([Text], Unitted)]
rows [([Text], Unitted)]
cols = (GridItem' -> GridItem' -> GridItem
forall m n. n -> m -> Size m n
Size GridItem {
cellStart :: Int
cellStart = Int
startCol', cellEnd :: Int
cellEnd = Int
endCol',
minSize :: Double
minSize = Double
0, natSize :: Double
natSize = Double
0,
alignment :: Alignment
alignment = Alignment -> Maybe Alignment -> Alignment
forall a. a -> Maybe a -> a
fromMaybe (Size Alignment Alignment -> Alignment
forall m n. Size m n -> n
inline (Size Alignment Alignment -> Alignment)
-> Size Alignment Alignment -> Alignment
forall a b. (a -> b) -> a -> b
$ CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) (Size (Maybe Alignment) (Maybe Alignment) -> Maybe Alignment
forall m n. Size m n -> n
inline (Size (Maybe Alignment) (Maybe Alignment) -> Maybe Alignment)
-> Size (Maybe Alignment) (Maybe Alignment) -> Maybe Alignment
forall a b. (a -> b) -> a -> b
$ CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
cell)
} GridItem {
cellStart :: Int
cellStart = Int
startRow', cellEnd :: Int
cellEnd = Int
endRow',
minSize :: Double
minSize = Double
0, natSize :: Double
natSize = Double
0,
alignment :: Alignment
alignment = Alignment -> Maybe Alignment -> Alignment
forall a. a -> Maybe a -> a
fromMaybe (Size Alignment Alignment -> Alignment
forall m n. Size m n -> n
inline (Size Alignment Alignment -> Alignment)
-> Size Alignment Alignment -> Alignment
forall a b. (a -> b) -> a -> b
$ CSSGrid -> Size Alignment Alignment
alignItems CSSGrid
self) (Size (Maybe Alignment) (Maybe Alignment) -> Maybe Alignment
forall m n. Size m n -> n
inline (Size (Maybe Alignment) (Maybe Alignment) -> Maybe Alignment)
-> Size (Maybe Alignment) (Maybe Alignment) -> Maybe Alignment
forall a b. (a -> b) -> a -> b
$ CSSCell -> Size (Maybe Alignment) (Maybe Alignment)
alignSelf CSSCell
cell)
}, [([Text], Unitted)]
rows', [([Text], Unitted)]
cols')
where
(Int
startRow', Int
endRow', [([Text], Unitted)]
rows') = [([Text], Unitted)]
-> ([Text], Unitted)
-> Placement
-> Placement
-> (Int, Int, [([Text], Unitted)])
forall {b}.
[([Text], b)]
-> ([Text], b)
-> Placement
-> Placement
-> (Int, Int, [([Text], b)])
lowerTrack2 [([Text], Unitted)]
rows ([], CSSGrid -> Unitted
autoRows CSSGrid
self)
(CSSCell -> Placement
rowStart CSSCell
cell) (CSSCell -> Placement
rowEnd CSSCell
cell)
(Int
startCol', Int
endCol', [([Text], Unitted)]
cols') = [([Text], Unitted)]
-> ([Text], Unitted)
-> Placement
-> Placement
-> (Int, Int, [([Text], Unitted)])
forall {b}.
[([Text], b)]
-> ([Text], b)
-> Placement
-> Placement
-> (Int, Int, [([Text], b)])
lowerTrack2 [([Text], Unitted)]
cols ([], CSSGrid -> Unitted
autoColumns CSSGrid
self)
(CSSCell -> Placement
columnStart CSSCell
cell) (CSSCell -> Placement
columnEnd CSSCell
cell)
lowerTrack2 :: [([Text], b)]
-> ([Text], b)
-> Placement
-> Placement
-> (Int, Int, [([Text], b)])
lowerTrack2 [([Text], b)]
tracks ([Text], b)
auto Placement
start Placement
Autoplace = [([Text], b)]
-> ([Text], b)
-> Placement
-> Placement
-> (Int, Int, [([Text], b)])
lowerTrack2 [([Text], b)]
tracks ([Text], b)
auto Placement
start (Placement -> (Int, Int, [([Text], b)]))
-> Placement -> (Int, Int, [([Text], b)])
forall a b. (a -> b) -> a -> b
$ Int -> Maybe Text -> Placement
Span Int
1 Maybe Text
forall a. Maybe a
Nothing
lowerTrack2 [([Text], b)]
tracks ([Text], b)
auto start :: Placement
start@(Span Int
_ Maybe Text
_) end :: Placement
end@(Span Int
_ Maybe Text
_) =
[([Text], b)]
-> ([Text], b)
-> Placement
-> Placement
-> (Int, Int, [([Text], b)])
lowerTrack2 [([Text], b)]
tracks ([Text], b)
auto Placement
start (Placement -> (Int, Int, [([Text], b)]))
-> Placement -> (Int, Int, [([Text], b)])
forall a b. (a -> b) -> a -> b
$ Int -> Maybe Text -> Placement
Numbered (Int -> Int
forall a. Enum a => a -> a
pred (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ [([Text], b)] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [([Text], b)]
tracks) Maybe Text
forall a. Maybe a
Nothing
lowerTrack2 [([Text], b)]
tracks ([Text], b)
auto start :: Placement
start@(Span Int
_ Maybe Text
_) Placement
end = (Int
start', Int
end', [([Text], b)]
tracks')
where
(Int
end', [([Text], b)]
tracks0) = [([Text], b)]
-> ([Text], b) -> Int -> Placement -> (Int, [([Text], b)])
forall {b}.
[([Text], b)]
-> ([Text], b) -> Int -> Placement -> (Int, [([Text], b)])
lowerTrack [([Text], b)]
tracks ([Text], b)
auto Int
0 Placement
end
(Int
start', [([Text], b)]
tracks') = [([Text], b)]
-> ([Text], b) -> Int -> Placement -> (Int, [([Text], b)])
forall {b}.
[([Text], b)]
-> ([Text], b) -> Int -> Placement -> (Int, [([Text], b)])
lowerTrack [([Text], b)]
tracks ([Text], b)
auto (Int -> Int
forall a. Num a => a -> a
negate Int
end') Placement
start
lowerTrack2 [([Text], b)]
tracks ([Text], b)
auto Placement
start Placement
end = (Int
start', Int
end', [([Text], b)]
tracks')
where
(Int
start', [([Text], b)]
tracks0) = [([Text], b)]
-> ([Text], b) -> Int -> Placement -> (Int, [([Text], b)])
forall {b}.
[([Text], b)]
-> ([Text], b) -> Int -> Placement -> (Int, [([Text], b)])
lowerTrack [([Text], b)]
tracks ([Text], b)
auto Int
0 Placement
start
(Int
end', [([Text], b)]
tracks') = [([Text], b)]
-> ([Text], b) -> Int -> Placement -> (Int, [([Text], b)])
forall {b}.
[([Text], b)]
-> ([Text], b) -> Int -> Placement -> (Int, [([Text], b)])
lowerTrack [([Text], b)]
tracks ([Text], b)
auto Int
start' Placement
end
lowerTrack :: [([Text], b)]
-> ([Text], b) -> Int -> Placement -> (Int, [([Text], b)])
lowerTrack [([Text], b)]
tracks ([Text], b)
auto Int
_ (Named Text
name)
| Int
ix:[Int]
_ <- [Int
ix | (Int
ix, ([Text]
names, b
_)) <- [([Text], b)] -> [(Int, ([Text], b))]
forall {b}. [b] -> [(Int, b)]
enumerate [([Text], b)]
tracks, Text
name Text -> [Text] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Text]
names] = (Int
ix, [([Text], b)]
tracks)
| Bool
otherwise = ([([Text], b)] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [([Text], b)]
tracks, [([Text], b)]
tracks [([Text], b)] -> [([Text], b)] -> [([Text], b)]
forall a. [a] -> [a] -> [a]
++ [([Text], b)
auto])
lowerTrack [([Text], b)]
tracks ([Text], b)
auto Int
_ Placement
Autoplace = ([([Text], b)] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [([Text], b)]
tracks, [([Text], b)]
tracks [([Text], b)] -> [([Text], b)] -> [([Text], b)]
forall a. [a] -> [a] -> [a]
++ [([Text], b)
auto])
lowerTrack [([Text], b)]
tracks ([Text], b)
_ Int
_ (Numbered Int
ix Maybe Text
Nothing) = (Int
ix, [([Text], b)]
tracks)
lowerTrack [([Text], b)]
tracks ([Text], b)
auto Int
_ (Numbered Int
ix (Just Text
name))
| Int
ix Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< [Int] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Int]
tracks' = ([Int]
tracks' [Int] -> Int -> Int
forall a. HasCallStack => [a] -> Int -> a
!! Int
ix, [([Text], b)]
tracks)
| Bool
otherwise = ([([Text], b)] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [([Text], b)]
tracks, [([Text], b)]
tracks [([Text], b)] -> [([Text], b)] -> [([Text], b)]
forall a. [a] -> [a] -> [a]
++ [([Text], b)
auto])
where tracks' :: [Int]
tracks' = [Int
ix | (Int
ix, ([Text]
names, b
_)) <- [([Text], b)] -> [(Int, ([Text], b))]
forall {b}. [b] -> [(Int, b)]
enumerate [([Text], b)]
tracks, Text
name Text -> [Text] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Text]
names]
lowerTrack [([Text], b)]
tracks ([Text], b)
_ Int
start (Span Int
x Maybe Text
Nothing)
| Int
start Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 = (Int
start Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
x,[([Text], b)]
tracks)
| Bool
otherwise = (-Int
start Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
x,[([Text], b)]
tracks)
lowerTrack [([Text], b)]
tracks ([Text]
_, b
auto) Int
start (Span Int
x (Just Text
name)) = ([Int]
tracks' [Int] -> Int -> Int
forall a. HasCallStack => [a] -> Int -> a
!! Int
x,[([Text], b)]
tracks)
where
tracks0 :: [([Text], b)]
tracks0 | Int
start Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 = [([Text], b)] -> [([Text], b)]
forall a. [a] -> [a]
reverse [([Text], b)]
tracks
| Bool
otherwise = [([Text], b)]
tracks
tracks' :: [Int]
tracks' = [Int
ix | (Int
ix, ([Text]
names, b
_)) <-
Int -> [(Int, ([Text], b))] -> [(Int, ([Text], b))]
forall a. Int -> [a] -> [a]
drop (Int -> Int
forall a. Num a => a -> a
abs Int
start) ([(Int, ([Text], b))] -> [(Int, ([Text], b))])
-> [(Int, ([Text], b))] -> [(Int, ([Text], b))]
forall a b. (a -> b) -> a -> b
$ [([Text], b)] -> [(Int, ([Text], b))]
forall {b}. [b] -> [(Int, b)]
enumerate ([([Text], b)]
tracks0 [([Text], b)] -> [([Text], b)] -> [([Text], b)]
forall a. [a] -> [a] -> [a]
++ ([Text], b) -> [([Text], b)]
forall a. a -> [a]
repeat ([Text
name],b
auto)),
Text
name Text -> [Text] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Text]
names]
finalizeFR :: Unitted -> Either Length Double
finalizeFR (Double
x,Text
"fr") = Double -> Either Length Double
forall a b. b -> Either a b
Right Double
x
finalizeFR Unitted
x = Length -> Either Length Double
forall a b. a -> Either a b
Left (Length -> Either Length Double) -> Length -> Either Length Double
forall a b. (a -> b) -> a -> b
$ Unitted -> Font' -> Length
finalizeLength Unitted
x Font'
font