Blame src/Text/Pandoc/CSS.hs

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