|
Packit Service |
d2f85f |
module Text.Pandoc.CSS ( foldOrElse
|
|
Packit Service |
d2f85f |
, pickStyleAttrProps
|
|
Packit Service |
d2f85f |
, pickStylesToKVs
|
|
Packit Service |
d2f85f |
)
|
|
Packit Service |
d2f85f |
where
|
|
Packit Service |
d2f85f |
|
|
Packit Service |
d2f85f |
import Text.Pandoc.Shared (trim)
|
|
Packit Service |
d2f85f |
import Text.Parsec
|
|
Packit Service |
d2f85f |
import Text.Parsec.String
|
|
Packit Service |
d2f85f |
|
|
Packit Service |
d2f85f |
ruleParser :: Parser (String, String)
|
|
Packit Service |
d2f85f |
ruleParser = do
|
|
Packit Service |
d2f85f |
p <- many1 (noneOf ":") <* char ':'
|
|
Packit Service |
d2f85f |
v <- many1 (noneOf ":;") <* optional (char ';') <* spaces
|
|
Packit Service |
d2f85f |
return (trim p, trim v)
|
|
Packit Service |
d2f85f |
|
|
Packit Service |
d2f85f |
styleAttrParser :: Parser [(String, String)]
|
|
Packit Service |
d2f85f |
styleAttrParser = many1 ruleParser
|
|
Packit Service |
d2f85f |
|
|
Packit Service |
d2f85f |
orElse :: Eq a => a -> a -> a -> a
|
|
Packit Service |
d2f85f |
orElse v x y = if v == x then y else x
|
|
Packit Service |
d2f85f |
|
|
Packit Service |
d2f85f |
foldOrElse :: Eq a => a -> [a] -> a
|
|
Packit Service |
d2f85f |
foldOrElse v xs = foldr (orElse v) v xs
|
|
Packit Service |
d2f85f |
|
|
Packit Service |
d2f85f |
eitherToMaybe :: Either a b -> Maybe b
|
|
Packit Service |
d2f85f |
eitherToMaybe (Right x) = Just x
|
|
Packit Service |
d2f85f |
eitherToMaybe _ = Nothing
|
|
Packit Service |
d2f85f |
|
|
Packit Service |
d2f85f |
-- | takes a list of keys/properties and a CSS string and
|
|
Packit Service |
d2f85f |
-- returns the corresponding key-value-pairs.
|
|
Packit Service |
d2f85f |
pickStylesToKVs :: [String] -> String -> [(String, String)]
|
|
Packit Service |
d2f85f |
pickStylesToKVs props styleAttr =
|
|
Packit Service |
d2f85f |
case parse styleAttrParser "" styleAttr of
|
|
Packit Service |
d2f85f |
Left _ -> []
|
|
Packit Service |
d2f85f |
Right styles -> filter (\s -> fst s `elem` props) styles
|
|
Packit Service |
d2f85f |
|
|
Packit Service |
d2f85f |
-- | takes a list of key/property synonyms and a CSS string and maybe
|
|
Packit Service |
d2f85f |
-- returns the value of the first match (in order of the supplied list)
|
|
Packit Service |
d2f85f |
pickStyleAttrProps :: [String] -> String -> Maybe String
|
|
Packit Service |
d2f85f |
pickStyleAttrProps lookupProps styleAttr = do
|
|
Packit Service |
d2f85f |
styles <- eitherToMaybe $ parse styleAttrParser "" styleAttr
|
|
Packit Service |
d2f85f |
foldOrElse Nothing $ map (`lookup` styles) lookupProps
|