{-# LANGUAGE OverloadedStrings #-}

-------------------------------------------------------------------------------
-- |
-- Module      :  Graphics.Svg.Attributes
-- Copyright   :  (c) 2015 Jeffrey Rosenbluth
-- License     :  BSD-style (see LICENSE)
-- Maintainer  :  jeffrey.rosenbluth@gmail.com
--
-- SVG Attributes.
--
-------------------------------------------------------------------------------

module Graphics.Svg.Attributes
  ( (<<-)
  , (->>)
  , bindAttr
  , AttrTag(..)
  ) where

import Graphics.Svg.Core
import Data.Text (Text)

-- | Make an 'Attribute' from it's value constructor and it's text value.
--   by combining an 'AttrTag' with it's value.
--
-- > [bindAttr Width "100%, bindAttr Height "100%", bindAttr Fill "red"]
bindAttr :: AttrTag -> Text -> Attribute
bindAttr t v = makeAttribute (tag2text t) v

-- | Infix version of 'bindAttr'
-- Each argument is set using '<<-', the 'bindAttr' function or '->>'.
--
-- > [Width_ <<- "100%", Height_ <<- "100%", Fill_ <<- "red"]
infix 4  <<-
(<<-) :: AttrTag -> Text -> Attribute
(<<-) = bindAttr

-- | Infix version of 'bindAttr' with it's arguments reversed.
--
-- > ["100%" ->> Width_, "100%" ->> Height_, "red" ->> Fill_]
infix 4  ->>
(->>) :: Text -> AttrTag -> Attribute
(->>) = flip bindAttr

data AttrTag
  = Accent_height_
  | Accumulate_
  | Additive_
  | Alignment_baseline_
  | Alphabetic_
  | Amplitude_
  | Arabic_form_
  | Ascent_
  | AttributeName_
  | AttributeType_
  | Azimuth_
  | BaseFrequency_
  | Baseprofile_
  | Baseline_shift_
  | Bbox_
  | Begin_
  | Bias_
  | By_
  | CalcMode_
  | Cap_height_
  | Class_
  | Clip_
  | Clip_path_
  | Clip_rule_
  | ClipPathUnits_
  | Color_
  | Color_interpolation_
  | Color_interpolation_filters_
  | Color_profile_
  | Color_rendering_
  | ContentScriptType_
  | ContentStyleType_
  | Cursor_
  | Cx_
  | Cy_
  | D_
  | Descent_
  | DiffuseConstant_
  | Direction_
  | Display_
  | Divisor_
  | Dominant_baseline_
  | Dur_
  | Dx_
  | Dy_
  | EdgeMode_
  | Elevation_
  | Enable_background_
  | End_
  | Exponent_
  | ExternalResourcesRequired_
  | Fill_
  | Fill_opacity_
  | Fill_rule_
  | Filter_
  | FilterRes_
  | FilterUnits_
  | Flood_color_
  | Flood_opacity_
  | Font_family_
  | Font_size_
  | Font_size_adjust_
  | Font_stretch_
  | Font_style_
  | Font_variant_
  | Font_weight_
  | Format_
  | From_
  | Fx_
  | Fy_
  | G1_
  | G2_
  | Glyph_name_
  | Glyph_orientation_horizontal_
  | Glyph_orientation_vertical_
  | GradientTransform_
  | GradientUnits_
  | Hanging_
  | Height_
  | Horiz_adv_x_
  | Horiz_origin_x_
  | Horiz_origin_y_
  | Id_
  | Ideographic_
  | Image_rendering_
  | In_
  | In2_
  | Intercept_
  | K_
  | K1_
  | K2_
  | K3_
  | K4_
  | KernelMatrix_
  | KernelUnitLength_
  | Kerning_
  | KeyPoints_
  | KeySplines_
  | KeyTimes_
  | Lang_
  | LengthAdjust_
  | Letter_spacing_
  | Lighting_color_
  | LimitingConeAngle_
  | Local_
  | Marker_end_
  | Marker_mid_
  | Marker_start_
  | MarkerHeight_
  | MarkerUnits_
  | MarkerWidth_
  | MaskContentUnits_
  | MaskUnits_
  | Mathematical_
  | Max_
  | Media_
  | Method_
  | Min_
  | Mode_
  | Name_
  | NumOctaves_
  | Offset_
  | Onabort_
  | Onactivate_
  | Onbegin_
  | Onclick_
  | Onend_
  | Onerror_
  | Onfocusin_
  | Onfocusout_
  | Onload_
  | Onmousedown_
  | Onmousemove_
  | Onmouseout_
  | Onmouseover_
  | Onmouseup_
  | Onrepeat_
  | Onresize_
  | Onscroll_
  | Onunload_
  | Onzoom_
  | Opacity_
  | Operator_
  | Order_
  | Orient_
  | Orientation_
  | Origin_
  | Overflow_
  | Overline_position_
  | Overline_thickness_
  | Panose_1_
  | Paint_order_
  | Path_
  | PathLength_
  | PatternContentUnits_
  | PatternTransform_
  | PatternUnits_
  | Pointer_events_
  | Points_
  | PointsAtX_
  | PointsAtY_
  | PointsAtZ_
  | PreserveAlpha_
  | PreserveAspectRatio_
  | PrimitiveUnits_
  | R_
  | Radius_
  | RefX_
  | RefY_
  | Rendering_intent_
  | RepeatCount_
  | RepeatDur_
  | RequiredExtensions_
  | RequiredFeatures_
  | Restart_
  | Result_
  | Rotate_
  | Rx_
  | Ry_
  | Scale_
  | Seed_
  | Shape_rendering_
  | Slope_
  | Spacing_
  | SpecularConstant_
  | SpecularExponent_
  | SpreadMethod_
  | StartOffset_
  | StdDeviation_
  | Stemh_
  | Stemv_
  | StitchTiles_
  | Stop_color_
  | Stop_opacity_
  | Strikethrough_position_
  | Strikethrough_thickness_
  | String_
  | Stroke_
  | Stroke_dasharray_
  | Stroke_dashoffset_
  | Stroke_linecap_
  | Stroke_linejoin_
  | Stroke_miterlimit_
  | Stroke_opacity_
  | Stroke_width_
  | Style_
  | SurfaceScale_
  | SystemLanguage_
  | TableValues_
  | Target_
  | TargetX_
  | TargetY_
  | Text_anchor_
  | Text_decoration_
  | Text_rendering_
  | TextLength_
  | To_
  | Transform_
  | Type_
  | U1_
  | U2_
  | Underline_position_
  | Underline_thickness_
  | Unicode_
  | Unicode_bidi_
  | Unicode_range_
  | Units_per_em_
  | V_alphabetic_
  | V_hanging_
  | V_ideographic_
  | V_mathematical_
  | Values_
  | Version_
  | Vert_adv_y_
  | Vert_origin_x_
  | Vert_origin_y_
  | ViewBox_
  | ViewTarget_
  | Visibility_
  | Width_
  | Widths_
  | Word_spacing_
  | Writing_mode_
  | X_
  | X_height_
  | X1_
  | X2_
  | XChannelSelector_
  | XlinkActuate_
  | XlinkArcrole_
  | XlinkHref_
  | XlinkRole_
  | XlinkShow_
  | XlinkTitle_
  | XlinkType_
  | XmlBase_
  | XmlLang_
  | XmlSpace_
  | Y_
  | Y1_
  | Y2_
  | YChannelselector_
  | Z_
  | ZoomAndPan_

-- Link the tags to their svg strings.
tag2text :: AttrTag -> Text
tag2text Accent_height_ = "accent-height"
tag2text Accumulate_ = "accumulate"
tag2text Additive_ = "additive"
tag2text Alignment_baseline_ = "alignment-baseline"
tag2text Alphabetic_ = "alphabetic"
tag2text Amplitude_ = "amplitude"
tag2text Arabic_form_ = "arabic-form"
tag2text Ascent_ = "ascent"
tag2text AttributeName_ = "attributeName"
tag2text AttributeType_ = "attributeType"
tag2text Azimuth_ = "azimuth"
tag2text BaseFrequency_ = "baseFrequency"
tag2text Baseprofile_ = "baseprofile"
tag2text Baseline_shift_ = "baseline-shift"
tag2text Bbox_ = "bbox"
tag2text Begin_ = "begin"
tag2text Bias_ = "bias"
tag2text By_ = "by"
tag2text CalcMode_ = "calcMode"
tag2text Cap_height_ = "cap-height"
tag2text Class_ = "class"
tag2text Clip_ = "clip"
tag2text Clip_path_ = "clip-path"
tag2text Clip_rule_ = "clip-rule"
tag2text ClipPathUnits_ = "clipPathUnits"
tag2text Color_ = "color"
tag2text Color_interpolation_ = "color-interpolation"
tag2text Color_interpolation_filters_ = "color-interpolation-filters"
tag2text Color_profile_ = "color-profile"
tag2text Color_rendering_ = "color-rendering"
tag2text ContentScriptType_ = "contentScriptType"
tag2text ContentStyleType_ = "contentStyleType"
tag2text Cursor_ = "cursor"
tag2text Cx_ = "cx"
tag2text Cy_ = "cy"
tag2text D_ = "d"
tag2text Descent_ = "descent"
tag2text DiffuseConstant_ = "diffuseConstant"
tag2text Direction_ = "direction"
tag2text Display_ = "display"
tag2text Divisor_ = "divisor"
tag2text Dominant_baseline_ = "dominant-baseline"
tag2text Dur_ = "dur"
tag2text Dx_ = "dx"
tag2text Dy_ = "dy"
tag2text EdgeMode_ = "edgeMode"
tag2text Elevation_ = "elevation"
tag2text Enable_background_ = "enable-background"
tag2text End_ = "end"
tag2text Exponent_ = "exponent"
tag2text ExternalResourcesRequired_ = "externalResourcesRequired"
tag2text Fill_ = "fill"
tag2text Fill_opacity_ = "fill-opacity"
tag2text Fill_rule_ = "fill-rule"
tag2text Filter_ = "filter"
tag2text FilterRes_ = "filterRes"
tag2text FilterUnits_ = "filterUnits"
tag2text Flood_color_ = "flood-color"
tag2text Flood_opacity_ = "flood-opacity"
tag2text Font_family_ = "font-family"
tag2text Font_size_ = "font-size"
tag2text Font_size_adjust_ = "font-size-adjust"
tag2text Font_stretch_ = "font-stretch"
tag2text Font_style_ = "font-style"
tag2text Font_variant_ = "font-variant"
tag2text Font_weight_ = "font-weight"
tag2text Format_ = "format"
tag2text From_ = "from"
tag2text Fx_ = "fx"
tag2text Fy_ = "fy"
tag2text G1_ = "g1"
tag2text G2_ = "g2"
tag2text Glyph_name_ = "glyph-name"
tag2text Glyph_orientation_horizontal_ = "glyph-orientation-horizontal"
tag2text Glyph_orientation_vertical_ = "glyph-orientation-vertical"
tag2text GradientTransform_ = "gradientTransform"
tag2text GradientUnits_ = "gradientUnits"
tag2text Hanging_ = "hanging"
tag2text Height_ = "height"
tag2text Horiz_adv_x_ = "horiz-adv-x"
tag2text Horiz_origin_x_ = "horiz-origin-x"
tag2text Horiz_origin_y_ = "horiz-origin-y"
tag2text Id_ = "id"
tag2text Ideographic_ = "ideographic"
tag2text Image_rendering_ = "image-rendering"
tag2text In_ = "in"
tag2text In2_ = "in2"
tag2text Intercept_ = "intercept"
tag2text K_ = "k"
tag2text K1_ = "k1"
tag2text K2_ = "k2"
tag2text K3_ = "k3"
tag2text K4_ = "k4"
tag2text KernelMatrix_ = "kernelMatrix"
tag2text KernelUnitLength_ = "kernelUnitLength"
tag2text Kerning_ = "kerning"
tag2text KeyPoints_ = "keyPoints"
tag2text KeySplines_ = "keySplines"
tag2text KeyTimes_ = "keyTimes"
tag2text Lang_ = "lang"
tag2text LengthAdjust_ = "lengthAdjust"
tag2text Letter_spacing_ = "letter-spacing"
tag2text Lighting_color_ = "lighting-color"
tag2text LimitingConeAngle_ = "limitingConeAngle"
tag2text Local_ = "local"
tag2text Marker_end_ = "marker-end"
tag2text Marker_mid_ = "marker-mid"
tag2text Marker_start_ = "marker-start"
tag2text MarkerHeight_ = "markerHeight"
tag2text MarkerUnits_ = "markerUnits"
tag2text MarkerWidth_ = "markerWidth"
tag2text MaskContentUnits_ = "maskContentUnits"
tag2text MaskUnits_ = "maskUnits"
tag2text Mathematical_ = "mathematical"
tag2text Max_ = "max"
tag2text Media_ = "media"
tag2text Method_ = "method"
tag2text Min_ = "min"
tag2text Mode_ = "mode"
tag2text Name_ = "name"
tag2text NumOctaves_ = "numOctaves"
tag2text Offset_ = "offset"
tag2text Onabort_ = "onabort"
tag2text Onactivate_ = "onactivate"
tag2text Onbegin_ = "onbegin"
tag2text Onclick_ = "onclick"
tag2text Onend_ = "onend"
tag2text Onerror_ = "onerror"
tag2text Onfocusin_ = "onfocusin"
tag2text Onfocusout_ = "onfocusout"
tag2text Onload_ = "onload"
tag2text Onmousedown_ = "onmousedown"
tag2text Onmousemove_ = "onmousemove"
tag2text Onmouseout_ = "onmouseout"
tag2text Onmouseover_ = "onmouseover"
tag2text Onmouseup_ = "onmouseup"
tag2text Onrepeat_ = "onrepeat"
tag2text Onresize_ = "onresize"
tag2text Onscroll_ = "onscroll"
tag2text Onunload_ = "onunload"
tag2text Onzoom_ = "onzoom"
tag2text Opacity_ = "opacity"
tag2text Operator_ = "operator"
tag2text Order_ = "order"
tag2text Orient_ = "orient"
tag2text Orientation_ = "orientation"
tag2text Origin_ = "origin"
tag2text Overflow_ = "overflow"
tag2text Overline_position_ = "overline-position"
tag2text Overline_thickness_ = "overline-thickness"
tag2text Panose_1_ = "panose-1"
tag2text Paint_order_ = "paint-order"
tag2text Path_ = "path"
tag2text PathLength_ = "pathLength"
tag2text PatternContentUnits_ = "patternContentUnits"
tag2text PatternTransform_ = "patternTransform"
tag2text PatternUnits_ = "patternUnits"
tag2text Pointer_events_ = "pointer-events"
tag2text Points_ = "points"
tag2text PointsAtX_ = "pointsAtX"
tag2text PointsAtY_ = "pointsAtY"
tag2text PointsAtZ_ = "pointsAtZ"
tag2text PreserveAlpha_ = "preserveAlpha"
tag2text PreserveAspectRatio_ = "preserveAspectRatio"
tag2text PrimitiveUnits_ = "primitiveUnits"
tag2text R_ = "r"
tag2text Radius_ = "radius"
tag2text RefX_ = "refX"
tag2text RefY_ = "refY"
tag2text Rendering_intent_ = "rendering-intent"
tag2text RepeatCount_ = "repeatCount"
tag2text RepeatDur_ = "repeatDur"
tag2text RequiredExtensions_ = "requiredExtensions"
tag2text RequiredFeatures_ = "requiredFeatures"
tag2text Restart_ = "restart"
tag2text Result_ = "result"
tag2text Rotate_ = "rotate"
tag2text Rx_ = "rx"
tag2text Ry_ = "ry"
tag2text Scale_ = "scale"
tag2text Seed_ = "seed"
tag2text Shape_rendering_ = "shape-rendering"
tag2text Slope_ = "slope"
tag2text Spacing_ = "spacing"
tag2text SpecularConstant_ = "specularConstant"
tag2text SpecularExponent_ = "specularExponent"
tag2text SpreadMethod_ = "spreadMethod"
tag2text StartOffset_ = "startOffset"
tag2text StdDeviation_ = "stdDeviation"
tag2text Stemh_ = "stemh"
tag2text Stemv_ = "stemv"
tag2text StitchTiles_ = "stitchTiles"
tag2text Stop_color_ = "stop-color"
tag2text Stop_opacity_ = "stop-opacity"
tag2text Strikethrough_position_ = "strikethrough-position"
tag2text Strikethrough_thickness_ = "strikethrough-thickness"
tag2text String_ = "string"
tag2text Stroke_ = "stroke"
tag2text Stroke_dasharray_ = "stroke-dasharray"
tag2text Stroke_dashoffset_ = "stroke-dashoffset"
tag2text Stroke_linecap_ = "stroke-linecap"
tag2text Stroke_linejoin_ = "stroke-linejoin"
tag2text Stroke_miterlimit_ = "stroke-miterlimit"
tag2text Stroke_opacity_ = "stroke-opacity"
tag2text Stroke_width_ = "stroke-width"
tag2text Style_ = "style"
tag2text SurfaceScale_ = "surfaceScale"
tag2text SystemLanguage_ = "systemLanguage"
tag2text TableValues_ = "tableValues"
tag2text Target_ = "target"
tag2text TargetX_ = "targetX"
tag2text TargetY_ = "targetY"
tag2text Text_anchor_ = "text-anchor"
tag2text Text_decoration_ = "text-decoration"
tag2text Text_rendering_ = "text-rendering"
tag2text TextLength_ = "textLength"
tag2text To_ = "to"
tag2text Transform_ = "transform"
tag2text Type_ = "type"
tag2text U1_ = "u1"
tag2text U2_ = "u2"
tag2text Underline_position_ = "underline-position"
tag2text Underline_thickness_ = "underline-thickness"
tag2text Unicode_ = "unicode"
tag2text Unicode_bidi_ = "unicode-bidi"
tag2text Unicode_range_ = "unicode-range"
tag2text Units_per_em_ = "units-per-em"
tag2text V_alphabetic_ = "v-alphabetic"
tag2text V_hanging_ = "v-hanging"
tag2text V_ideographic_ = "v-ideographic"
tag2text V_mathematical_ = "v-mathematical"
tag2text Values_ = "values"
tag2text Version_ = "version"
tag2text Vert_adv_y_ = "vert-adv-y"
tag2text Vert_origin_x_ = "vert-origin-x"
tag2text Vert_origin_y_ = "vert-origin-y"
tag2text ViewBox_ = "viewBox"
tag2text ViewTarget_ = "viewTarget"
tag2text Visibility_ = "visibility"
tag2text Width_ = "width"
tag2text Widths_ = "widths"
tag2text Word_spacing_ = "word-spacing"
tag2text Writing_mode_ = "writing-mode"
tag2text X_ = "x"
tag2text X_height_ = "x-height"
tag2text X1_ = "x1"
tag2text X2_ = "x2"
tag2text XChannelSelector_ = "xChannelSelector"
tag2text XlinkActuate_ = "xlink:actuate"
tag2text XlinkArcrole_ = "xlink:arcrole"
tag2text XlinkHref_ = "xlink:href"
tag2text XlinkRole_ = "xlink:role"
tag2text XlinkShow_ = "xlink:show"
tag2text XlinkTitle_ = "xlink:title"
tag2text XlinkType_ = "xlink:type"
tag2text XmlBase_ = "xml:base"
tag2text XmlLang_ = "xml:lang"
tag2text XmlSpace_ = "xml:space"
tag2text Y_ = "y"
tag2text Y1_ = "y1"
tag2text Y2_ = "y2"
tag2text YChannelselector_ = "yChannelSelector"
tag2text Z_ = "z"
tag2text ZoomAndPan_ = "zoomAndPan"