{- | Create a @.less@ file from a @.ase@ file. For each color in the @.ase@ the @.css@ will contain an entry: color-ase-n Where @n@ is an integer based on the order the color was found in the @.ase@ file. -} module Data.AdobeSwatchExchange.LESS where import Control.Monad.State (State, evalState, get, put) import Data.AdobeSwatchExchange as ASE (ASEBlock(CE, GroupStart, GroupEnd), ColorEntry(color), AdobeSwatchExchange, Color(RGB), blocks, colorToHex, getASE) import qualified Data.ByteString.Lazy as B import Numeric (showHex) import Text.PrettyPrint.HughesPJ (Doc, (<>), (<+>), ($+$), braces, colon, empty, int, semi, text, vcat) -- | generate a less document from an 'AdobeSwatchExchange' ase2less :: AdobeSwatchExchange -> Doc ase2less ase = vcat $ evalState (mapM genColor (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 :: ASEBlock -> State Int Doc genColor (CE colorEntry) = do n <- get put $! (n + 1) let colorAse = text "@color-ase-" <> int n return $ colorAse <> colon <+> (text $ colorToHex (color colorEntry)) <> semi $+$ text ".fg-color-ase-" <> int n <+> braces (text "color:" <+> colorAse <> semi) $+$ text ".bg-color-ase-" <> int n <+> braces (text "background-color:" <+> colorAse <> semi) $+$ text ".border-color-ase-" <> int n <+> braces (text "border-color:" <+> colorAse <> semi) $+$ text "" genColor (GroupStart name) = return $ text "/* Group" <+> text name <+> text "*/" -- FIXME: what if name contains */ genColor _ = return empty