module Graphics.Static.Javascript
(
jsBool
, jsInt
, jsDouble
, jsColor
, jsStyle
, jsLineCap
, jsLineJoin
, jsTextAlign
, jsTextBaseline
, jsRepeat
, jsComposite
, comma
) where
import Control.Monad.Writer
import Data.Double.Conversion.Text (toFixed)
import Data.Text (pack)
import Data.Text.Lazy.Builder (Builder, fromText, singleton)
import Graphics.Static.Types
build :: Show a => a -> Builder
build = fromText .pack . show
comma :: Builder
comma = singleton ','
quote :: Builder -> Builder
quote b = singleton '\'' <> b <> singleton '\''
jsBool :: Bool -> Builder
jsBool True = "true"
jsBool False = "false"
jsInt :: Int -> Builder
jsInt = fromText . pack . show
jsDouble :: Double -> Builder
jsDouble = fromText . toFixed 4
jsColor :: Color -> Builder
jsColor (Hex t) = quote . fromText $ t
jsColor (RGB r g b) = quote $ "rgb(" <> (build r)
<> comma <> (build g)
<> comma <> (build b) <> singleton ')'
jsColor (RGBA r g b a) = quote $ "rgba(" <> (build r)
<> comma <> (build g)
<> comma <> (build b)
<> comma <> (jsDouble a) <> singleton ')'
jsStyle :: Style -> Builder
jsStyle (ColorStyle c) = jsColor c
jsStyle (GradientStyle (LG n)) = "gradient_" <> (build n)
jsStyle (GradientStyle (RG n)) = "gradient_" <> (build n)
jsStyle (PatternStyle n) = "pattern_" <> (build n)
jsLineCap :: LineCapStyle -> Builder
jsLineCap LineCapButt = "butt"
jsLineCap LineCapRound = "round"
jsLineCap LineCapSquare = "square"
jsLineJoin :: LineJoinStyle -> Builder
jsLineJoin LineJoinMiter = "miter"
jsLineJoin LineJoinRound = "round"
jsLineJoin LineJoinBevel = "bevel"
jsTextAlign :: TextAlignStyle -> Builder
jsTextAlign TextAlignStart = "start"
jsTextAlign TextAlignEnd = "end"
jsTextAlign TextAlignCenter = "center"
jsTextAlign TextAlignLeft = "left"
jsTextAlign TextAlignRight = "right"
jsTextBaseline :: TextBaselineStyle -> Builder
jsTextBaseline TextBaselineTop = "top"
jsTextBaseline TextBaselineHanging = "hanging"
jsTextBaseline TextBaselineMiddle = "middle"
jsTextBaseline TextBaselineIdeographic = "ideographic"
jsTextBaseline TextBaselineBottom = "bottom"
jsRepeat :: RepeatStyle -> Builder
jsRepeat Repeat = quote "repeat"
jsRepeat RepeatX = quote "repeat-x"
jsRepeat RepeatY = quote "repeat-y"
jsRepeat NoRepeat = quote "no-repeat"
jsComposite :: CompositeOperation -> Builder
jsComposite SourceAtop = "source-atop"
jsComposite SourceIn = "source-in"
jsComposite SourceOut = "source-out"
jsComposite SourceOver = "source-over"
jsComposite DestinationAtop = "destination-atop"
jsComposite DestinationIn = "destination-in"
jsComposite DestinationOut = "destination-out"
jsComposite DestinationOver = "destination-over"
jsComposite Darker = "darker"
jsComposite Xor = "xor"
jsComposite Copy = "copy"