blob: 625feadbb0c81f7886de3043870398d45777a4b8 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
{- |
Module : Text.Pandoc.CSS
Copyright : © 2006-2021 John MacFarlane <jgm@berkeley.edu>,
2015-2016 Mauro Bieg,
2015 Ophir Lifshitz <hangfromthefloor@gmail.com>
License : GNU GPL, version 2 or above
Maintainer : John MacFarlane <jgm@berkeley@edu>
Stability : alpha
Portability : portable
Tools for working with CSS.
-}
module Text.Pandoc.CSS
( cssAttributes
, pickStyleAttrProps
, pickStylesToKVs
)
where
import Data.Maybe (mapMaybe, listToMaybe)
import Data.Text (Text, pack)
import Text.Pandoc.Shared (trim)
import Text.Parsec
import Text.Parsec.Text
ruleParser :: Parser (Text, Text)
ruleParser = do
p <- many1 (noneOf ":") <* char ':'
v <- many1 (noneOf ":;") <* optional (char ';') <* spaces
return (trim $ pack p, trim $ pack v)
styleAttrParser :: Parser [(Text, Text)]
styleAttrParser = many1 ruleParser
-- | Parses a style string, returning the CSS attributes.
-- Returns an empty list on failure.
cssAttributes :: Text -> [(Text, Text)]
cssAttributes styleString =
-- Use Data.Either.fromRight once GHC 8.0 is no longer supported
case parse styleAttrParser "" styleString of
Left _ -> []
Right x -> x
-- | takes a list of keys/properties and a CSS string and
-- returns the corresponding key-value-pairs.
pickStylesToKVs :: [Text] -> Text -> [(Text, Text)]
pickStylesToKVs props styleAttr =
filter (\s -> fst s `elem` props) $ cssAttributes styleAttr
-- | takes a list of key/property synonyms and a CSS string and maybe
-- returns the value of the first match (in order of the supplied list)
pickStyleAttrProps :: [Text] -> Text -> Maybe Text
pickStyleAttrProps lookupProps styleAttr = do
styles <- either (const Nothing) Just $ parse styleAttrParser "" styleAttr
listToMaybe $ mapMaybe (`lookup` styles) lookupProps
|