{- |
Create a @.css@ file from a @.ase@ file. For each color in the @.ase@ the @.css@ will contain three entries:
fg-color-ase-n
bg-color-ase-n
border-color-ase-n
Where @n@ is an integer based on the order the color was found in the @.ase@ file.
-}
module Data.AdobeSwatchExchange.CSS where
import Control.Monad.State (State, get, put, evalState)
import Data.AdobeSwatchExchange as ASE (ASEBlock(CE), ColorEntry(color), AdobeSwatchExchange, Color(RGB), blocks, colorToHex, getASE)
import qualified Data.ByteString.Lazy as B
import Language.Css.Build ((<:>), (/.), cword, ruleSets, star)
import Language.Css.Build.Idents as CSS (backgroundColor, borderColor, color)
import Language.Css.Syntax (Expr, RuleSet, StyleSheet)
import Numeric (showHex)
-- | generate a 'StyleSheet' from an 'AdobeSwatchExchange'
ase2css :: AdobeSwatchExchange -> StyleSheet
ase2css ase =
ruleSets (concat $ evalState (mapM genBlock (blocks ase)) 1)
-- | generate a color rules from an indexed @ColorEntry@
--
-- generates:
--
-- fg-color-ase-n
-- bg-color-ase-n
-- border-color-ase-n
--
-- Currently only 'RGB' color is supported. Since CSS only supports
-- rgb, supporting other colors would require the conversion to RGB
-- color space. Feel free to send a patch!
-- genColor :: (Int, ASEBlock) -> (Int, [RuleSet])
genBlock :: ASEBlock -> State Int [RuleSet]
genBlock (CE colorEntry) =
do n <- get
put $! (n + 1)
return [ (star /. ("fg-color-ase-" ++ Prelude.show n))
[ CSS.color <:> (cword $ colorToHex (ASE.color colorEntry))
]
, (star /. ("bg-color-ase-" ++ Prelude.show n))
[ backgroundColor <:> (cword $ colorToHex (ASE.color colorEntry))
]
, (star /. ("border-color-ase-" ++ Prelude.show n))
[ borderColor <:> (cword $ colorToHex (ASE.color colorEntry))
]
]
-- in theory, we should generate CSS comments for the GroupName, but
-- language-css does not support comments :-/
genBlock _ = return []