packages feed

blaze-svg (empty) → 0.1.0.0

raw patch · 9 files changed

+4481/−0 lines, 9 filesdep +basedep +blaze-htmldep +bytestringsetup-changed

Dependencies added: base, blaze-html, bytestring, mtl

Files

+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2012, Deepak Jois++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++    * Redistributions of source code must retain the above copyright+      notice, this list of conditions and the following disclaimer.++    * Redistributions in binary form must reproduce the above+      copyright notice, this list of conditions and the following+      disclaimer in the documentation and/or other materials provided+      with the distribution.++    * Neither the name of Deepak Jois nor the names of other+      contributors may be used to endorse or promote products derived+      from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ Text/Blaze/Svg.hs view
@@ -0,0 +1,14 @@+{-# LANGUAGE OverloadedStrings #-}+module Text.Blaze.Svg+    (+      Svg+    , Path+    , mkPath+    , m, mr+    , z+    , l, lr, h, hr, v, vr+    , c, cr, s, sr+    , q, qr, t, tr+    ) where++import Text.Blaze.Svg.Internal
+ Text/Blaze/Svg/Internal.hs view
@@ -0,0 +1,189 @@+module Text.Blaze.Svg.Internal where++import Control.Monad.State+import Data.Monoid (mappend, mempty)++import Text.Blaze+import Text.Blaze.Internal++-- | Type to represent an SVG document fragment+type Svg = HtmlM ()++-- | Type to accumulate an SVG path+type Path = State AttributeValue ()++-- | Construct SVG path values using path instruction combinators.+-- See simple example below of how you can use @mkPath@ to+-- specify a path using the path instruction combinators+-- that are included as part of the same module+--+-- More information available at: <http://www.w3.org/TR/SVG/paths.html>+--+-- > import Text.Blaze.Svg11 ((!), mkPath, l, m)+-- > import qualified Text.Blaze.Svg11 as S+-- > import qualified Text.Blaze.Svg11.Attributes as A+-- >+-- > svgDoc :: S.Svg+-- > svgDoc = S.docTypeSvg ! A.version "1.1" ! A.width "150" ! A.height "100" $ do+-- >  path ! d makeSimplePath+-- >+-- > makeSimplePath :: S.AttributeValue+-- > makeSimplePath =  mkPath do+-- >   l 2 3+-- >   m 4 5+mkPath :: Path -> AttributeValue+mkPath path = snd $ runState path mempty++appendToPath :: [String] -> Path+appendToPath  = modify . flip mappend . toValue . join++-- | Moveto+m :: Show a => a -> a -> Path+m x y = appendToPath+  [ "M "+  , show x, ",", show y+  , " "+  ]++-- | Moveto (relative)+mr :: Show a => a -> a -> Path+mr dx dy = appendToPath+  [ "m "+  , show dx, ",", show dy+  , " "+  ]++-- | ClosePath+z :: Path+z = modify (`mappend` toValue "Z")++-- | Lineto+l :: Show a => a -> a -> Path+l x y = appendToPath+  [ "L "+  , show x, ",", show y+  , " "+  ]++-- | Lineto (relative)+lr :: Show a => a -> a -> Path+lr dx dy = appendToPath+  [ "l "+  , show dx, ",", show dy+  , " "+  ]++-- | Horizontal lineto+h :: Show a => a -> Path+h x = appendToPath+  [ "H "+  , show x+  , " "+  ]++-- | Horizontal lineto (relative)+hr :: Show a => a -> Path+hr dx = appendToPath+  [ "h "+  , show dx+  , " "+  ]+++-- | Vertical lineto+v :: Show a => a -> Path+v y = appendToPath+  [ "V "+  , show y+  , " "+  ]++-- | Vertical lineto (relative)+vr :: Show a => a -> Path+vr dy = appendToPath+  [ "v "+  , show dy+  , " "+  ]++-- | Cubic Bezier curve+c :: Show a => a -> a -> a -> a -> a -> a -> Path+c c1x c1y c2x c2y x y = appendToPath+  [ "C "+  , show c1x, ",", show c1y+  , " "+  , show c2x, ",", show c2y+  , " "+  , show x, " ", show y+  ]++-- | Cubic Bezier curve (relative)+cr :: Show a => a -> a -> a -> a -> a -> a -> Path+cr dc1x dc1y dc2x dc2y dx dy = appendToPath+  [ "c "+  , show dc1x, ",", show dc1y+  , " "+  , show dc2x, ",", show dc2y+  , " "+  , show dx, " ", show dy+  ]++-- | Smooth Cubic Bezier curve+s :: Show a => a -> a -> a -> a -> Path+s c2x c2y x y = appendToPath+  [ "S "+  , show c2x, ",", show c2y+  , " "+  , show x, ",", show y+  , " "+  ]++-- | Smooth Cubic Bezier curve (relative)+sr :: Show a => a -> a -> a -> a -> Path+sr dc2x dc2y dx dy = appendToPath+  [ "s "+  , show dc2x, ",", show dc2y+  , " "+  , show dx, ",", show dy+  , " "+  ]++-- | Quadratic Bezier curve+q :: Show a => a -> a -> a -> a -> Path+q cx cy x y = appendToPath+  [ "Q "+  , show cx, ",", show cy+  , " "+  , show x, ",", show y+  , " "+  ]++-- | Quadratic Bezier curve (relative)+qr :: Show a => a -> a -> a -> a  -> Path+qr dcx dcy dx dy = appendToPath+  [ "q "+  , show dcx, ",", show dcy+  , " "+  , show dx, ",", show dy+  , " "+  ]++-- | Smooth Quadratic Bezier curve+t  :: Show a => a -> a -> Path+t x y = appendToPath+  [ "T "+  , " "+  , show x, ",", show y+  , " "+  ]++-- | Smooth Quadratic Bezier curve (relative)+tr :: Show a => a -> a -> Path+tr x y = appendToPath+  [ "t "+  , " "+  , show x, ",", show y+  , " "+  ]++
+ Text/Blaze/Svg11.hs view
@@ -0,0 +1,862 @@+-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:69+--+{-# LANGUAGE OverloadedStrings #-}+-- | This module exports SVG combinators used to create documents.+--+module Text.Blaze.Svg11+    ( module Text.Blaze+    , module Text.Blaze.Svg+    , docType+    , docTypeSvg+    , a+    , altglyph+    , altglyphdef+    , altglyphitem+    , animate+    , animatecolor+    , animatemotion+    , animatetransform+    , circle+    , clippath+    , colorProfile+    , cursor+    , defs+    , desc+    , ellipse+    , feblend+    , fecolormatrix+    , fecomponenttransfer+    , fecomposite+    , feconvolvematrix+    , fediffuselighting+    , fedisplacementmap+    , fedistantlight+    , feflood+    , fefunca+    , fefuncb+    , fefuncg+    , fefuncr+    , fegaussianblur+    , feimage+    , femerge+    , femergenode+    , femorphology+    , feoffset+    , fepointlight+    , fespecularlighting+    , fespotlight+    , fetile+    , feturbulence+    , filter_+    , font+    , fontFace+    , fontFaceFormat+    , fontFaceName+    , fontFaceSrc+    , fontFaceUri+    , foreignobject+    , g+    , glyph+    , glyphref+    , hkern+    , image+    , line+    , lineargradient+    , marker+    , mask+    , metadata+    , missingGlyph+    , mpath+    , path+    , pattern+    , polygon+    , polyline+    , radialgradient+    , rect+    , script+    , set+    , stop+    , style+    , svg+    , switch+    , symbol+    , text_+    , textpath+    , title+    , tref+    , tspan+    , use+    , view+    , vkern+    ) where++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:78+--+import Prelude ((>>), (.), ($))++import Text.Blaze+import Text.Blaze.Svg+import Text.Blaze.Internal++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:157+--+-- | Combinator for the document type. This should be placed at the top+-- of every SVG page.+--+-- > <?xml version="1.0" encoding="UTF-8"?>+-- > <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"+-- >     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">+--+docType :: Svg  -- ^ The document type SVG.+docType = preEscapedText "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n    \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n"+{-# INLINE docType #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:172+--+-- | Combinator for the @\<svg>@ element. This combinator will also+-- insert the correct doctype.+--+-- > <?xml version="1.0" encoding="UTF-8"?>+-- > <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"+-- >     "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">+-- > <svg><span>foo</span></svg>+--+docTypeSvg :: Svg  -- ^ Inner SVG.+            -> Svg  -- ^ Resulting SVG.+docTypeSvg inner = docType >> (svg ! attribute "xmlns" " xmlns=\"" "http://www.w3.org/2000/svg" ! attribute "xmlns:xlink" " xmlns:xlink=\"" "http://www.w3.org/1999/xlink"  $ inner)+{-# INLINE docTypeSvg #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:188+--+-- | Combinator for the @\<a>@ element.+--+a :: Svg  -- ^ Inner SVG.+  -> Svg  -- ^ Resulting SVG.+a = Parent "a" "<a" "</a>"+{-# INLINE a #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<altGlyph />@ element.+--+altglyph :: Svg  -- ^ Resulting SVG.+altglyph = Leaf "altGlyph" "<altGlyph" " />"+{-# INLINE altglyph #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<altGlyphDef />@ element.+--+altglyphdef :: Svg  -- ^ Resulting SVG.+altglyphdef = Leaf "altGlyphDef" "<altGlyphDef" " />"+{-# INLINE altglyphdef #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<altGlyphItem />@ element.+--+altglyphitem :: Svg  -- ^ Resulting SVG.+altglyphitem = Leaf "altGlyphItem" "<altGlyphItem" " />"+{-# INLINE altglyphitem #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<animate />@ element.+--+animate :: Svg  -- ^ Resulting SVG.+animate = Leaf "animate" "<animate" " />"+{-# INLINE animate #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<animateColor />@ element.+--+animatecolor :: Svg  -- ^ Resulting SVG.+animatecolor = Leaf "animateColor" "<animateColor" " />"+{-# INLINE animatecolor #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<animateMotion />@ element.+--+animatemotion :: Svg  -- ^ Resulting SVG.+animatemotion = Leaf "animateMotion" "<animateMotion" " />"+{-# INLINE animatemotion #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<animateTransform />@ element.+--+animatetransform :: Svg  -- ^ Resulting SVG.+animatetransform = Leaf "animateTransform" "<animateTransform" " />"+{-# INLINE animatetransform #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<circle />@ element.+--+circle :: Svg  -- ^ Resulting SVG.+circle = Leaf "circle" "<circle" " />"+{-# INLINE circle #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<clipPath />@ element.+--+clippath :: Svg  -- ^ Resulting SVG.+clippath = Leaf "clipPath" "<clipPath" " />"+{-# INLINE clippath #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<color-profile />@ element.+--+colorProfile :: Svg  -- ^ Resulting SVG.+colorProfile = Leaf "color-profile" "<color-profile" " />"+{-# INLINE colorProfile #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<cursor />@ element.+--+cursor :: Svg  -- ^ Resulting SVG.+cursor = Leaf "cursor" "<cursor" " />"+{-# INLINE cursor #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:188+--+-- | Combinator for the @\<defs>@ element.+--+defs :: Svg  -- ^ Inner SVG.+     -> Svg  -- ^ Resulting SVG.+defs = Parent "defs" "<defs" "</defs>"+{-# INLINE defs #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<desc />@ element.+--+desc :: Svg  -- ^ Resulting SVG.+desc = Leaf "desc" "<desc" " />"+{-# INLINE desc #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<ellipse />@ element.+--+ellipse :: Svg  -- ^ Resulting SVG.+ellipse = Leaf "ellipse" "<ellipse" " />"+{-# INLINE ellipse #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feBlend />@ element.+--+feblend :: Svg  -- ^ Resulting SVG.+feblend = Leaf "feBlend" "<feBlend" " />"+{-# INLINE feblend #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feColorMatrix />@ element.+--+fecolormatrix :: Svg  -- ^ Resulting SVG.+fecolormatrix = Leaf "feColorMatrix" "<feColorMatrix" " />"+{-# INLINE fecolormatrix #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feComponentTransfer />@ element.+--+fecomponenttransfer :: Svg  -- ^ Resulting SVG.+fecomponenttransfer = Leaf "feComponentTransfer" "<feComponentTransfer" " />"+{-# INLINE fecomponenttransfer #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feComposite />@ element.+--+fecomposite :: Svg  -- ^ Resulting SVG.+fecomposite = Leaf "feComposite" "<feComposite" " />"+{-# INLINE fecomposite #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feConvolveMatrix />@ element.+--+feconvolvematrix :: Svg  -- ^ Resulting SVG.+feconvolvematrix = Leaf "feConvolveMatrix" "<feConvolveMatrix" " />"+{-# INLINE feconvolvematrix #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feDiffuseLighting />@ element.+--+fediffuselighting :: Svg  -- ^ Resulting SVG.+fediffuselighting = Leaf "feDiffuseLighting" "<feDiffuseLighting" " />"+{-# INLINE fediffuselighting #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feDisplacementMap />@ element.+--+fedisplacementmap :: Svg  -- ^ Resulting SVG.+fedisplacementmap = Leaf "feDisplacementMap" "<feDisplacementMap" " />"+{-# INLINE fedisplacementmap #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feDistantLight />@ element.+--+fedistantlight :: Svg  -- ^ Resulting SVG.+fedistantlight = Leaf "feDistantLight" "<feDistantLight" " />"+{-# INLINE fedistantlight #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feFlood />@ element.+--+feflood :: Svg  -- ^ Resulting SVG.+feflood = Leaf "feFlood" "<feFlood" " />"+{-# INLINE feflood #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feFuncA />@ element.+--+fefunca :: Svg  -- ^ Resulting SVG.+fefunca = Leaf "feFuncA" "<feFuncA" " />"+{-# INLINE fefunca #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feFuncB />@ element.+--+fefuncb :: Svg  -- ^ Resulting SVG.+fefuncb = Leaf "feFuncB" "<feFuncB" " />"+{-# INLINE fefuncb #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feFuncG />@ element.+--+fefuncg :: Svg  -- ^ Resulting SVG.+fefuncg = Leaf "feFuncG" "<feFuncG" " />"+{-# INLINE fefuncg #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feFuncR />@ element.+--+fefuncr :: Svg  -- ^ Resulting SVG.+fefuncr = Leaf "feFuncR" "<feFuncR" " />"+{-# INLINE fefuncr #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feGaussianBlur />@ element.+--+fegaussianblur :: Svg  -- ^ Resulting SVG.+fegaussianblur = Leaf "feGaussianBlur" "<feGaussianBlur" " />"+{-# INLINE fegaussianblur #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feImage />@ element.+--+feimage :: Svg  -- ^ Resulting SVG.+feimage = Leaf "feImage" "<feImage" " />"+{-# INLINE feimage #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feMerge />@ element.+--+femerge :: Svg  -- ^ Resulting SVG.+femerge = Leaf "feMerge" "<feMerge" " />"+{-# INLINE femerge #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feMergeNode />@ element.+--+femergenode :: Svg  -- ^ Resulting SVG.+femergenode = Leaf "feMergeNode" "<feMergeNode" " />"+{-# INLINE femergenode #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feMorphology />@ element.+--+femorphology :: Svg  -- ^ Resulting SVG.+femorphology = Leaf "feMorphology" "<feMorphology" " />"+{-# INLINE femorphology #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feOffset />@ element.+--+feoffset :: Svg  -- ^ Resulting SVG.+feoffset = Leaf "feOffset" "<feOffset" " />"+{-# INLINE feoffset #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<fePointLight />@ element.+--+fepointlight :: Svg  -- ^ Resulting SVG.+fepointlight = Leaf "fePointLight" "<fePointLight" " />"+{-# INLINE fepointlight #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feSpecularLighting />@ element.+--+fespecularlighting :: Svg  -- ^ Resulting SVG.+fespecularlighting = Leaf "feSpecularLighting" "<feSpecularLighting" " />"+{-# INLINE fespecularlighting #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feSpotLight />@ element.+--+fespotlight :: Svg  -- ^ Resulting SVG.+fespotlight = Leaf "feSpotLight" "<feSpotLight" " />"+{-# INLINE fespotlight #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feTile />@ element.+--+fetile :: Svg  -- ^ Resulting SVG.+fetile = Leaf "feTile" "<feTile" " />"+{-# INLINE fetile #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<feTurbulence />@ element.+--+feturbulence :: Svg  -- ^ Resulting SVG.+feturbulence = Leaf "feTurbulence" "<feTurbulence" " />"+{-# INLINE feturbulence #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<filter />@ element.+--+filter_ :: Svg  -- ^ Resulting SVG.+filter_ = Leaf "filter" "<filter" " />"+{-# INLINE filter_ #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<font />@ element.+--+font :: Svg  -- ^ Resulting SVG.+font = Leaf "font" "<font" " />"+{-# INLINE font #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<font-face />@ element.+--+fontFace :: Svg  -- ^ Resulting SVG.+fontFace = Leaf "font-face" "<font-face" " />"+{-# INLINE fontFace #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<font-face-format />@ element.+--+fontFaceFormat :: Svg  -- ^ Resulting SVG.+fontFaceFormat = Leaf "font-face-format" "<font-face-format" " />"+{-# INLINE fontFaceFormat #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<font-face-name />@ element.+--+fontFaceName :: Svg  -- ^ Resulting SVG.+fontFaceName = Leaf "font-face-name" "<font-face-name" " />"+{-# INLINE fontFaceName #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<font-face-src />@ element.+--+fontFaceSrc :: Svg  -- ^ Resulting SVG.+fontFaceSrc = Leaf "font-face-src" "<font-face-src" " />"+{-# INLINE fontFaceSrc #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<font-face-uri />@ element.+--+fontFaceUri :: Svg  -- ^ Resulting SVG.+fontFaceUri = Leaf "font-face-uri" "<font-face-uri" " />"+{-# INLINE fontFaceUri #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<foreignObject />@ element.+--+foreignobject :: Svg  -- ^ Resulting SVG.+foreignobject = Leaf "foreignObject" "<foreignObject" " />"+{-# INLINE foreignobject #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:188+--+-- | Combinator for the @\<g>@ element.+--+g :: Svg  -- ^ Inner SVG.+  -> Svg  -- ^ Resulting SVG.+g = Parent "g" "<g" "</g>"+{-# INLINE g #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:188+--+-- | Combinator for the @\<glyph>@ element.+--+glyph :: Svg  -- ^ Inner SVG.+      -> Svg  -- ^ Resulting SVG.+glyph = Parent "glyph" "<glyph" "</glyph>"+{-# INLINE glyph #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<glyphRef />@ element.+--+glyphref :: Svg  -- ^ Resulting SVG.+glyphref = Leaf "glyphRef" "<glyphRef" " />"+{-# INLINE glyphref #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<hkern />@ element.+--+hkern :: Svg  -- ^ Resulting SVG.+hkern = Leaf "hkern" "<hkern" " />"+{-# INLINE hkern #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<image />@ element.+--+image :: Svg  -- ^ Resulting SVG.+image = Leaf "image" "<image" " />"+{-# INLINE image #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<line />@ element.+--+line :: Svg  -- ^ Resulting SVG.+line = Leaf "line" "<line" " />"+{-# INLINE line #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<linearGradient />@ element.+--+lineargradient :: Svg  -- ^ Resulting SVG.+lineargradient = Leaf "linearGradient" "<linearGradient" " />"+{-# INLINE lineargradient #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:188+--+-- | Combinator for the @\<marker>@ element.+--+marker :: Svg  -- ^ Inner SVG.+       -> Svg  -- ^ Resulting SVG.+marker = Parent "marker" "<marker" "</marker>"+{-# INLINE marker #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:188+--+-- | Combinator for the @\<mask>@ element.+--+mask :: Svg  -- ^ Inner SVG.+     -> Svg  -- ^ Resulting SVG.+mask = Parent "mask" "<mask" "</mask>"+{-# INLINE mask #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<metadata />@ element.+--+metadata :: Svg  -- ^ Resulting SVG.+metadata = Leaf "metadata" "<metadata" " />"+{-# INLINE metadata #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:188+--+-- | Combinator for the @\<missing-glyph>@ element.+--+missingGlyph :: Svg  -- ^ Inner SVG.+             -> Svg  -- ^ Resulting SVG.+missingGlyph = Parent "missing-glyph" "<missing-glyph" "</missing-glyph>"+{-# INLINE missingGlyph #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<mpath />@ element.+--+mpath :: Svg  -- ^ Resulting SVG.+mpath = Leaf "mpath" "<mpath" " />"+{-# INLINE mpath #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<path />@ element.+--+path :: Svg  -- ^ Resulting SVG.+path = Leaf "path" "<path" " />"+{-# INLINE path #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:188+--+-- | Combinator for the @\<pattern>@ element.+--+pattern :: Svg  -- ^ Inner SVG.+        -> Svg  -- ^ Resulting SVG.+pattern = Parent "pattern" "<pattern" "</pattern>"+{-# INLINE pattern #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<polygon />@ element.+--+polygon :: Svg  -- ^ Resulting SVG.+polygon = Leaf "polygon" "<polygon" " />"+{-# INLINE polygon #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<polyline />@ element.+--+polyline :: Svg  -- ^ Resulting SVG.+polyline = Leaf "polyline" "<polyline" " />"+{-# INLINE polyline #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<radialGradient />@ element.+--+radialgradient :: Svg  -- ^ Resulting SVG.+radialgradient = Leaf "radialGradient" "<radialGradient" " />"+{-# INLINE radialgradient #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<rect />@ element.+--+rect :: Svg  -- ^ Resulting SVG.+rect = Leaf "rect" "<rect" " />"+{-# INLINE rect #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<script />@ element.+--+script :: Svg  -- ^ Resulting SVG.+script = Leaf "script" "<script" " />"+{-# INLINE script #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<set />@ element.+--+set :: Svg  -- ^ Resulting SVG.+set = Leaf "set" "<set" " />"+{-# INLINE set #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<stop />@ element.+--+stop :: Svg  -- ^ Resulting SVG.+stop = Leaf "stop" "<stop" " />"+{-# INLINE stop #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<style />@ element.+--+style :: Svg  -- ^ Resulting SVG.+style = Leaf "style" "<style" " />"+{-# INLINE style #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:188+--+-- | Combinator for the @\<svg>@ element.+--+svg :: Svg  -- ^ Inner SVG.+    -> Svg  -- ^ Resulting SVG.+svg = Parent "svg" "<svg" "</svg>"+{-# INLINE svg #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:188+--+-- | Combinator for the @\<switch>@ element.+--+switch :: Svg  -- ^ Inner SVG.+       -> Svg  -- ^ Resulting SVG.+switch = Parent "switch" "<switch" "</switch>"+{-# INLINE switch #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:188+--+-- | Combinator for the @\<symbol>@ element.+--+symbol :: Svg  -- ^ Inner SVG.+       -> Svg  -- ^ Resulting SVG.+symbol = Parent "symbol" "<symbol" "</symbol>"+{-# INLINE symbol #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<text />@ element.+--+text_ :: Svg  -- ^ Resulting SVG.+text_ = Leaf "text" "<text" " />"+{-# INLINE text_ #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<textPath />@ element.+--+textpath :: Svg  -- ^ Resulting SVG.+textpath = Leaf "textPath" "<textPath" " />"+{-# INLINE textpath #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<title />@ element.+--+title :: Svg  -- ^ Resulting SVG.+title = Leaf "title" "<title" " />"+{-# INLINE title #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<tref />@ element.+--+tref :: Svg  -- ^ Resulting SVG.+tref = Leaf "tref" "<tref" " />"+{-# INLINE tref #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<tspan />@ element.+--+tspan :: Svg  -- ^ Resulting SVG.+tspan = Leaf "tspan" "<tspan" " />"+{-# INLINE tspan #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<use />@ element.+--+use :: Svg  -- ^ Resulting SVG.+use = Leaf "use" "<use" " />"+{-# INLINE use #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<view />@ element.+--+view :: Svg  -- ^ Resulting SVG.+view = Leaf "view" "<view" " />"+{-# INLINE view #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:207+--+-- | Combinator for the @\<vkern />@ element.+--+vkern :: Svg  -- ^ Resulting SVG.+vkern = Leaf "vkern" "<vkern" " />"+{-# INLINE vkern #-}
+ Text/Blaze/Svg11/Attributes.hs view
@@ -0,0 +1,2942 @@+-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:94+--+-- | This module exports combinators that provide you with the+-- ability to set attributes on SVG elements.+--+{-# LANGUAGE OverloadedStrings #-}+module Text.Blaze.Svg11.Attributes+    ( accentHeight+    , accumulate+    , additive+    , alignmentBaseline+    , alphabetic+    , amplitude+    , arabicForm+    , ascent+    , attributename+    , attributetype+    , azimuth+    , basefrequency+    , baseprofile+    , baselineShift+    , bbox+    , begin+    , bias+    , by+    , calcmode+    , capHeight+    , class_+    , clip+    , clipPath+    , clipRule+    , clippathunits+    , color+    , colorInterpolation+    , colorInterpolationFilters+    , colorProfile+    , colorRendering+    , contentscripttype+    , contentstyletype+    , cursor+    , cx+    , cy+    , d+    , descent+    , diffuseconstant+    , direction+    , display+    , divisor+    , dominantBaseline+    , dur+    , dx+    , dy+    , edgemode+    , elevation+    , enableBackground+    , end+    , exponent_+    , externalresourcesrequired+    , fill+    , fillOpacity+    , fillRule+    , filter_+    , filterres+    , filterunits+    , floodColor+    , floodOpacity+    , fontFamily+    , fontSize+    , fontSizeAdjust+    , fontStretch+    , fontStyle+    , fontVariant+    , fontWeight+    , format+    , from+    , fx+    , fy+    , g1+    , g2+    , glyphName+    , glyphOrientationHorizontal+    , glyphOrientationVertical+    , glyphref+    , gradienttransform+    , gradientunits+    , hanging+    , height+    , horizAdvX+    , horizOriginX+    , horizOriginY+    , id_+    , ideographic+    , imageRendering+    , in_+    , in2+    , intercept+    , k+    , k1+    , k2+    , k3+    , k4+    , kernelmatrix+    , kernelunitlength+    , kerning+    , keypoints+    , keysplines+    , keytimes+    , lang+    , lengthadjust+    , letterSpacing+    , lightingColor+    , limitingconeangle+    , local+    , markerEnd+    , markerMid+    , markerStart+    , markerheight+    , markerunits+    , markerwidth+    , mask+    , 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+    , overlinePosition+    , overlineThickness+    , panose1+    , path+    , pathlength+    , patterncontentunits+    , patterntransform+    , patternunits+    , pointerEvents+    , points+    , pointsatx+    , pointsaty+    , pointsatz+    , preservealpha+    , preserveaspectratio+    , primitiveunits+    , r+    , radius+    , refx+    , refy+    , renderingIntent+    , repeatcount+    , repeatdur+    , requiredextensions+    , requiredfeatures+    , restart+    , result+    , rotate+    , rx+    , ry+    , scale+    , seed+    , shapeRendering+    , slope+    , spacing+    , specularconstant+    , specularexponent+    , spreadmethod+    , startoffset+    , stddeviation+    , stemh+    , stemv+    , stitchtiles+    , stopColor+    , stopOpacity+    , strikethroughPosition+    , strikethroughThickness+    , string+    , stroke+    , strokeDasharray+    , strokeDashoffset+    , strokeLinecap+    , strokeLinejoin+    , strokeMiterlimit+    , strokeOpacity+    , strokeWidth+    , style+    , surfacescale+    , systemlanguage+    , tablevalues+    , target+    , targetx+    , targety+    , textAnchor+    , textDecoration+    , textRendering+    , textlength+    , title+    , to+    , transform+    , type_+    , u1+    , u2+    , underlinePosition+    , underlineThickness+    , unicode+    , unicodeBidi+    , unicodeRange+    , unitsPerEm+    , vAlphabetic+    , vHanging+    , vIdeographic+    , vMathematical+    , values+    , version+    , vertAdvY+    , vertOriginX+    , vertOriginY+    , viewbox+    , viewtarget+    , visibility+    , width+    , widths+    , wordSpacing+    , writingMode+    , x+    , xHeight+    , x1+    , x2+    , xchannelselector+    , xlinkActuate+    , xlinkArcrole+    , xlinkHref+    , xlinkRole+    , xlinkShow+    , xlinkTitle+    , xlinkType+    , xmlBase+    , xmlLang+    , xmlSpace+    , y+    , y1+    , y2+    , ychannelselector+    , z+    , zoomandpan+    ) where++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:100+--+import Prelude ()++import Text.Blaze.Internal (Attribute, AttributeValue, attribute)++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @accent-height@ attribute.+--+accentHeight :: AttributeValue  -- ^ Attribute value.+             -> Attribute       -- ^ Resulting attribute.+accentHeight = attribute "accent-height" " accent-height=\""+{-# INLINE accentHeight #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @accumulate@ attribute.+--+accumulate :: AttributeValue  -- ^ Attribute value.+           -> Attribute       -- ^ Resulting attribute.+accumulate = attribute "accumulate" " accumulate=\""+{-# INLINE accumulate #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @additive@ attribute.+--+additive :: AttributeValue  -- ^ Attribute value.+         -> Attribute       -- ^ Resulting attribute.+additive = attribute "additive" " additive=\""+{-# INLINE additive #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @alignment-baseline@ attribute.+--+alignmentBaseline :: AttributeValue  -- ^ Attribute value.+                  -> Attribute       -- ^ Resulting attribute.+alignmentBaseline = attribute "alignment-baseline" " alignment-baseline=\""+{-# INLINE alignmentBaseline #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @alphabetic@ attribute.+--+alphabetic :: AttributeValue  -- ^ Attribute value.+           -> Attribute       -- ^ Resulting attribute.+alphabetic = attribute "alphabetic" " alphabetic=\""+{-# INLINE alphabetic #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @amplitude@ attribute.+--+amplitude :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+amplitude = attribute "amplitude" " amplitude=\""+{-# INLINE amplitude #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @arabic-form@ attribute.+--+arabicForm :: AttributeValue  -- ^ Attribute value.+           -> Attribute       -- ^ Resulting attribute.+arabicForm = attribute "arabic-form" " arabic-form=\""+{-# INLINE arabicForm #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @ascent@ attribute.+--+ascent :: AttributeValue  -- ^ Attribute value.+       -> Attribute       -- ^ Resulting attribute.+ascent = attribute "ascent" " ascent=\""+{-# INLINE ascent #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @attributeName@ attribute.+--+attributename :: AttributeValue  -- ^ Attribute value.+              -> Attribute       -- ^ Resulting attribute.+attributename = attribute "attributeName" " attributeName=\""+{-# INLINE attributename #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @attributeType@ attribute.+--+attributetype :: AttributeValue  -- ^ Attribute value.+              -> Attribute       -- ^ Resulting attribute.+attributetype = attribute "attributeType" " attributeType=\""+{-# INLINE attributetype #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @azimuth@ attribute.+--+azimuth :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+azimuth = attribute "azimuth" " azimuth=\""+{-# INLINE azimuth #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @baseFrequency@ attribute.+--+basefrequency :: AttributeValue  -- ^ Attribute value.+              -> Attribute       -- ^ Resulting attribute.+basefrequency = attribute "baseFrequency" " baseFrequency=\""+{-# INLINE basefrequency #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @baseProfile@ attribute.+--+baseprofile :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+baseprofile = attribute "baseProfile" " baseProfile=\""+{-# INLINE baseprofile #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @baseline-shift@ attribute.+--+baselineShift :: AttributeValue  -- ^ Attribute value.+              -> Attribute       -- ^ Resulting attribute.+baselineShift = attribute "baseline-shift" " baseline-shift=\""+{-# INLINE baselineShift #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @bbox@ attribute.+--+bbox :: AttributeValue  -- ^ Attribute value.+     -> Attribute       -- ^ Resulting attribute.+bbox = attribute "bbox" " bbox=\""+{-# INLINE bbox #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @begin@ attribute.+--+begin :: AttributeValue  -- ^ Attribute value.+      -> Attribute       -- ^ Resulting attribute.+begin = attribute "begin" " begin=\""+{-# INLINE begin #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @bias@ attribute.+--+bias :: AttributeValue  -- ^ Attribute value.+     -> Attribute       -- ^ Resulting attribute.+bias = attribute "bias" " bias=\""+{-# INLINE bias #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @by@ attribute.+--+by :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+by = attribute "by" " by=\""+{-# INLINE by #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @calcMode@ attribute.+--+calcmode :: AttributeValue  -- ^ Attribute value.+         -> Attribute       -- ^ Resulting attribute.+calcmode = attribute "calcMode" " calcMode=\""+{-# INLINE calcmode #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @cap-height@ attribute.+--+capHeight :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+capHeight = attribute "cap-height" " cap-height=\""+{-# INLINE capHeight #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @class@ attribute.+--+class_ :: AttributeValue  -- ^ Attribute value.+       -> Attribute       -- ^ Resulting attribute.+class_ = attribute "class" " class=\""+{-# INLINE class_ #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @clip@ attribute.+--+clip :: AttributeValue  -- ^ Attribute value.+     -> Attribute       -- ^ Resulting attribute.+clip = attribute "clip" " clip=\""+{-# INLINE clip #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @clip-path@ attribute.+--+clipPath :: AttributeValue  -- ^ Attribute value.+         -> Attribute       -- ^ Resulting attribute.+clipPath = attribute "clip-path" " clip-path=\""+{-# INLINE clipPath #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @clip-rule@ attribute.+--+clipRule :: AttributeValue  -- ^ Attribute value.+         -> Attribute       -- ^ Resulting attribute.+clipRule = attribute "clip-rule" " clip-rule=\""+{-# INLINE clipRule #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @clipPathUnits@ attribute.+--+clippathunits :: AttributeValue  -- ^ Attribute value.+              -> Attribute       -- ^ Resulting attribute.+clippathunits = attribute "clipPathUnits" " clipPathUnits=\""+{-# INLINE clippathunits #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @color@ attribute.+--+color :: AttributeValue  -- ^ Attribute value.+      -> Attribute       -- ^ Resulting attribute.+color = attribute "color" " color=\""+{-# INLINE color #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @color-interpolation@ attribute.+--+colorInterpolation :: AttributeValue  -- ^ Attribute value.+                   -> Attribute       -- ^ Resulting attribute.+colorInterpolation = attribute "color-interpolation" " color-interpolation=\""+{-# INLINE colorInterpolation #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @color-interpolation-filters@ attribute.+--+colorInterpolationFilters :: AttributeValue  -- ^ Attribute value.+                          -> Attribute       -- ^ Resulting attribute.+colorInterpolationFilters = attribute "color-interpolation-filters" " color-interpolation-filters=\""+{-# INLINE colorInterpolationFilters #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @color-profile@ attribute.+--+colorProfile :: AttributeValue  -- ^ Attribute value.+             -> Attribute       -- ^ Resulting attribute.+colorProfile = attribute "color-profile" " color-profile=\""+{-# INLINE colorProfile #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @color-rendering@ attribute.+--+colorRendering :: AttributeValue  -- ^ Attribute value.+               -> Attribute       -- ^ Resulting attribute.+colorRendering = attribute "color-rendering" " color-rendering=\""+{-# INLINE colorRendering #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @contentScriptType@ attribute.+--+contentscripttype :: AttributeValue  -- ^ Attribute value.+                  -> Attribute       -- ^ Resulting attribute.+contentscripttype = attribute "contentScriptType" " contentScriptType=\""+{-# INLINE contentscripttype #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @contentStyleType@ attribute.+--+contentstyletype :: AttributeValue  -- ^ Attribute value.+                 -> Attribute       -- ^ Resulting attribute.+contentstyletype = attribute "contentStyleType" " contentStyleType=\""+{-# INLINE contentstyletype #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @cursor@ attribute.+--+cursor :: AttributeValue  -- ^ Attribute value.+       -> Attribute       -- ^ Resulting attribute.+cursor = attribute "cursor" " cursor=\""+{-# INLINE cursor #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @cx@ attribute.+--+cx :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+cx = attribute "cx" " cx=\""+{-# INLINE cx #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @cy@ attribute.+--+cy :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+cy = attribute "cy" " cy=\""+{-# INLINE cy #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @d@ attribute.+--+d :: AttributeValue  -- ^ Attribute value.+  -> Attribute       -- ^ Resulting attribute.+d = attribute "d" " d=\""+{-# INLINE d #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @descent@ attribute.+--+descent :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+descent = attribute "descent" " descent=\""+{-# INLINE descent #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @diffuseConstant@ attribute.+--+diffuseconstant :: AttributeValue  -- ^ Attribute value.+                -> Attribute       -- ^ Resulting attribute.+diffuseconstant = attribute "diffuseConstant" " diffuseConstant=\""+{-# INLINE diffuseconstant #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @direction@ attribute.+--+direction :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+direction = attribute "direction" " direction=\""+{-# INLINE direction #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @display@ attribute.+--+display :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+display = attribute "display" " display=\""+{-# INLINE display #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @divisor@ attribute.+--+divisor :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+divisor = attribute "divisor" " divisor=\""+{-# INLINE divisor #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @dominant-baseline@ attribute.+--+dominantBaseline :: AttributeValue  -- ^ Attribute value.+                 -> Attribute       -- ^ Resulting attribute.+dominantBaseline = attribute "dominant-baseline" " dominant-baseline=\""+{-# INLINE dominantBaseline #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @dur@ attribute.+--+dur :: AttributeValue  -- ^ Attribute value.+    -> Attribute       -- ^ Resulting attribute.+dur = attribute "dur" " dur=\""+{-# INLINE dur #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @dx@ attribute.+--+dx :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+dx = attribute "dx" " dx=\""+{-# INLINE dx #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @dy@ attribute.+--+dy :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+dy = attribute "dy" " dy=\""+{-# INLINE dy #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @edgeMode@ attribute.+--+edgemode :: AttributeValue  -- ^ Attribute value.+         -> Attribute       -- ^ Resulting attribute.+edgemode = attribute "edgeMode" " edgeMode=\""+{-# INLINE edgemode #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @elevation@ attribute.+--+elevation :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+elevation = attribute "elevation" " elevation=\""+{-# INLINE elevation #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @enable-background@ attribute.+--+enableBackground :: AttributeValue  -- ^ Attribute value.+                 -> Attribute       -- ^ Resulting attribute.+enableBackground = attribute "enable-background" " enable-background=\""+{-# INLINE enableBackground #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @end@ attribute.+--+end :: AttributeValue  -- ^ Attribute value.+    -> Attribute       -- ^ Resulting attribute.+end = attribute "end" " end=\""+{-# INLINE end #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @exponent@ attribute.+--+exponent_ :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+exponent_ = attribute "exponent" " exponent=\""+{-# INLINE exponent_ #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @externalResourcesRequired@ attribute.+--+externalresourcesrequired :: AttributeValue  -- ^ Attribute value.+                          -> Attribute       -- ^ Resulting attribute.+externalresourcesrequired = attribute "externalResourcesRequired" " externalResourcesRequired=\""+{-# INLINE externalresourcesrequired #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @fill@ attribute.+--+fill :: AttributeValue  -- ^ Attribute value.+     -> Attribute       -- ^ Resulting attribute.+fill = attribute "fill" " fill=\""+{-# INLINE fill #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @fill-opacity@ attribute.+--+fillOpacity :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+fillOpacity = attribute "fill-opacity" " fill-opacity=\""+{-# INLINE fillOpacity #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @fill-rule@ attribute.+--+fillRule :: AttributeValue  -- ^ Attribute value.+         -> Attribute       -- ^ Resulting attribute.+fillRule = attribute "fill-rule" " fill-rule=\""+{-# INLINE fillRule #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @filter@ attribute.+--+filter_ :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+filter_ = attribute "filter" " filter=\""+{-# INLINE filter_ #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @filterRes@ attribute.+--+filterres :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+filterres = attribute "filterRes" " filterRes=\""+{-# INLINE filterres #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @filterUnits@ attribute.+--+filterunits :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+filterunits = attribute "filterUnits" " filterUnits=\""+{-# INLINE filterunits #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @flood-color@ attribute.+--+floodColor :: AttributeValue  -- ^ Attribute value.+           -> Attribute       -- ^ Resulting attribute.+floodColor = attribute "flood-color" " flood-color=\""+{-# INLINE floodColor #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @flood-opacity@ attribute.+--+floodOpacity :: AttributeValue  -- ^ Attribute value.+             -> Attribute       -- ^ Resulting attribute.+floodOpacity = attribute "flood-opacity" " flood-opacity=\""+{-# INLINE floodOpacity #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @font-family@ attribute.+--+fontFamily :: AttributeValue  -- ^ Attribute value.+           -> Attribute       -- ^ Resulting attribute.+fontFamily = attribute "font-family" " font-family=\""+{-# INLINE fontFamily #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @font-size@ attribute.+--+fontSize :: AttributeValue  -- ^ Attribute value.+         -> Attribute       -- ^ Resulting attribute.+fontSize = attribute "font-size" " font-size=\""+{-# INLINE fontSize #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @font-size-adjust@ attribute.+--+fontSizeAdjust :: AttributeValue  -- ^ Attribute value.+               -> Attribute       -- ^ Resulting attribute.+fontSizeAdjust = attribute "font-size-adjust" " font-size-adjust=\""+{-# INLINE fontSizeAdjust #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @font-stretch@ attribute.+--+fontStretch :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+fontStretch = attribute "font-stretch" " font-stretch=\""+{-# INLINE fontStretch #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @font-style@ attribute.+--+fontStyle :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+fontStyle = attribute "font-style" " font-style=\""+{-# INLINE fontStyle #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @font-variant@ attribute.+--+fontVariant :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+fontVariant = attribute "font-variant" " font-variant=\""+{-# INLINE fontVariant #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @font-weight@ attribute.+--+fontWeight :: AttributeValue  -- ^ Attribute value.+           -> Attribute       -- ^ Resulting attribute.+fontWeight = attribute "font-weight" " font-weight=\""+{-# INLINE fontWeight #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @format@ attribute.+--+format :: AttributeValue  -- ^ Attribute value.+       -> Attribute       -- ^ Resulting attribute.+format = attribute "format" " format=\""+{-# INLINE format #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @from@ attribute.+--+from :: AttributeValue  -- ^ Attribute value.+     -> Attribute       -- ^ Resulting attribute.+from = attribute "from" " from=\""+{-# INLINE from #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @fx@ attribute.+--+fx :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+fx = attribute "fx" " fx=\""+{-# INLINE fx #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @fy@ attribute.+--+fy :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+fy = attribute "fy" " fy=\""+{-# INLINE fy #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @g1@ attribute.+--+g1 :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+g1 = attribute "g1" " g1=\""+{-# INLINE g1 #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @g2@ attribute.+--+g2 :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+g2 = attribute "g2" " g2=\""+{-# INLINE g2 #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @glyph-name@ attribute.+--+glyphName :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+glyphName = attribute "glyph-name" " glyph-name=\""+{-# INLINE glyphName #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @glyph-orientation-horizontal@ attribute.+--+glyphOrientationHorizontal :: AttributeValue  -- ^ Attribute value.+                           -> Attribute       -- ^ Resulting attribute.+glyphOrientationHorizontal = attribute "glyph-orientation-horizontal" " glyph-orientation-horizontal=\""+{-# INLINE glyphOrientationHorizontal #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @glyph-orientation-vertical@ attribute.+--+glyphOrientationVertical :: AttributeValue  -- ^ Attribute value.+                         -> Attribute       -- ^ Resulting attribute.+glyphOrientationVertical = attribute "glyph-orientation-vertical" " glyph-orientation-vertical=\""+{-# INLINE glyphOrientationVertical #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @glyphRef@ attribute.+--+glyphref :: AttributeValue  -- ^ Attribute value.+         -> Attribute       -- ^ Resulting attribute.+glyphref = attribute "glyphRef" " glyphRef=\""+{-# INLINE glyphref #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @gradientTransform@ attribute.+--+gradienttransform :: AttributeValue  -- ^ Attribute value.+                  -> Attribute       -- ^ Resulting attribute.+gradienttransform = attribute "gradientTransform" " gradientTransform=\""+{-# INLINE gradienttransform #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @gradientUnits@ attribute.+--+gradientunits :: AttributeValue  -- ^ Attribute value.+              -> Attribute       -- ^ Resulting attribute.+gradientunits = attribute "gradientUnits" " gradientUnits=\""+{-# INLINE gradientunits #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @hanging@ attribute.+--+hanging :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+hanging = attribute "hanging" " hanging=\""+{-# INLINE hanging #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @height@ attribute.+--+height :: AttributeValue  -- ^ Attribute value.+       -> Attribute       -- ^ Resulting attribute.+height = attribute "height" " height=\""+{-# INLINE height #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @horiz-adv-x@ attribute.+--+horizAdvX :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+horizAdvX = attribute "horiz-adv-x" " horiz-adv-x=\""+{-# INLINE horizAdvX #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @horiz-origin-x@ attribute.+--+horizOriginX :: AttributeValue  -- ^ Attribute value.+             -> Attribute       -- ^ Resulting attribute.+horizOriginX = attribute "horiz-origin-x" " horiz-origin-x=\""+{-# INLINE horizOriginX #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @horiz-origin-y@ attribute.+--+horizOriginY :: AttributeValue  -- ^ Attribute value.+             -> Attribute       -- ^ Resulting attribute.+horizOriginY = attribute "horiz-origin-y" " horiz-origin-y=\""+{-# INLINE horizOriginY #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @id@ attribute.+--+id_ :: AttributeValue  -- ^ Attribute value.+    -> Attribute       -- ^ Resulting attribute.+id_ = attribute "id" " id=\""+{-# INLINE id_ #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @ideographic@ attribute.+--+ideographic :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+ideographic = attribute "ideographic" " ideographic=\""+{-# INLINE ideographic #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @image-rendering@ attribute.+--+imageRendering :: AttributeValue  -- ^ Attribute value.+               -> Attribute       -- ^ Resulting attribute.+imageRendering = attribute "image-rendering" " image-rendering=\""+{-# INLINE imageRendering #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @in@ attribute.+--+in_ :: AttributeValue  -- ^ Attribute value.+    -> Attribute       -- ^ Resulting attribute.+in_ = attribute "in" " in=\""+{-# INLINE in_ #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @in2@ attribute.+--+in2 :: AttributeValue  -- ^ Attribute value.+    -> Attribute       -- ^ Resulting attribute.+in2 = attribute "in2" " in2=\""+{-# INLINE in2 #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @intercept@ attribute.+--+intercept :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+intercept = attribute "intercept" " intercept=\""+{-# INLINE intercept #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @k@ attribute.+--+k :: AttributeValue  -- ^ Attribute value.+  -> Attribute       -- ^ Resulting attribute.+k = attribute "k" " k=\""+{-# INLINE k #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @k1@ attribute.+--+k1 :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+k1 = attribute "k1" " k1=\""+{-# INLINE k1 #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @k2@ attribute.+--+k2 :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+k2 = attribute "k2" " k2=\""+{-# INLINE k2 #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @k3@ attribute.+--+k3 :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+k3 = attribute "k3" " k3=\""+{-# INLINE k3 #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @k4@ attribute.+--+k4 :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+k4 = attribute "k4" " k4=\""+{-# INLINE k4 #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @kernelMatrix@ attribute.+--+kernelmatrix :: AttributeValue  -- ^ Attribute value.+             -> Attribute       -- ^ Resulting attribute.+kernelmatrix = attribute "kernelMatrix" " kernelMatrix=\""+{-# INLINE kernelmatrix #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @kernelUnitLength@ attribute.+--+kernelunitlength :: AttributeValue  -- ^ Attribute value.+                 -> Attribute       -- ^ Resulting attribute.+kernelunitlength = attribute "kernelUnitLength" " kernelUnitLength=\""+{-# INLINE kernelunitlength #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @kerning@ attribute.+--+kerning :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+kerning = attribute "kerning" " kerning=\""+{-# INLINE kerning #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @keyPoints@ attribute.+--+keypoints :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+keypoints = attribute "keyPoints" " keyPoints=\""+{-# INLINE keypoints #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @keySplines@ attribute.+--+keysplines :: AttributeValue  -- ^ Attribute value.+           -> Attribute       -- ^ Resulting attribute.+keysplines = attribute "keySplines" " keySplines=\""+{-# INLINE keysplines #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @keyTimes@ attribute.+--+keytimes :: AttributeValue  -- ^ Attribute value.+         -> Attribute       -- ^ Resulting attribute.+keytimes = attribute "keyTimes" " keyTimes=\""+{-# INLINE keytimes #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @lang@ attribute.+--+lang :: AttributeValue  -- ^ Attribute value.+     -> Attribute       -- ^ Resulting attribute.+lang = attribute "lang" " lang=\""+{-# INLINE lang #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @lengthAdjust@ attribute.+--+lengthadjust :: AttributeValue  -- ^ Attribute value.+             -> Attribute       -- ^ Resulting attribute.+lengthadjust = attribute "lengthAdjust" " lengthAdjust=\""+{-# INLINE lengthadjust #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @letter-spacing@ attribute.+--+letterSpacing :: AttributeValue  -- ^ Attribute value.+              -> Attribute       -- ^ Resulting attribute.+letterSpacing = attribute "letter-spacing" " letter-spacing=\""+{-# INLINE letterSpacing #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @lighting-color@ attribute.+--+lightingColor :: AttributeValue  -- ^ Attribute value.+              -> Attribute       -- ^ Resulting attribute.+lightingColor = attribute "lighting-color" " lighting-color=\""+{-# INLINE lightingColor #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @limitingConeAngle@ attribute.+--+limitingconeangle :: AttributeValue  -- ^ Attribute value.+                  -> Attribute       -- ^ Resulting attribute.+limitingconeangle = attribute "limitingConeAngle" " limitingConeAngle=\""+{-# INLINE limitingconeangle #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @local@ attribute.+--+local :: AttributeValue  -- ^ Attribute value.+      -> Attribute       -- ^ Resulting attribute.+local = attribute "local" " local=\""+{-# INLINE local #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @marker-end@ attribute.+--+markerEnd :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+markerEnd = attribute "marker-end" " marker-end=\""+{-# INLINE markerEnd #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @marker-mid@ attribute.+--+markerMid :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+markerMid = attribute "marker-mid" " marker-mid=\""+{-# INLINE markerMid #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @marker-start@ attribute.+--+markerStart :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+markerStart = attribute "marker-start" " marker-start=\""+{-# INLINE markerStart #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @markerHeight@ attribute.+--+markerheight :: AttributeValue  -- ^ Attribute value.+             -> Attribute       -- ^ Resulting attribute.+markerheight = attribute "markerHeight" " markerHeight=\""+{-# INLINE markerheight #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @markerUnits@ attribute.+--+markerunits :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+markerunits = attribute "markerUnits" " markerUnits=\""+{-# INLINE markerunits #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @markerWidth@ attribute.+--+markerwidth :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+markerwidth = attribute "markerWidth" " markerWidth=\""+{-# INLINE markerwidth #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @mask@ attribute.+--+mask :: AttributeValue  -- ^ Attribute value.+     -> Attribute       -- ^ Resulting attribute.+mask = attribute "mask" " mask=\""+{-# INLINE mask #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @maskContentUnits@ attribute.+--+maskcontentunits :: AttributeValue  -- ^ Attribute value.+                 -> Attribute       -- ^ Resulting attribute.+maskcontentunits = attribute "maskContentUnits" " maskContentUnits=\""+{-# INLINE maskcontentunits #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @maskUnits@ attribute.+--+maskunits :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+maskunits = attribute "maskUnits" " maskUnits=\""+{-# INLINE maskunits #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @mathematical@ attribute.+--+mathematical :: AttributeValue  -- ^ Attribute value.+             -> Attribute       -- ^ Resulting attribute.+mathematical = attribute "mathematical" " mathematical=\""+{-# INLINE mathematical #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @max@ attribute.+--+max_ :: AttributeValue  -- ^ Attribute value.+     -> Attribute       -- ^ Resulting attribute.+max_ = attribute "max" " max=\""+{-# INLINE max_ #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @media@ attribute.+--+media :: AttributeValue  -- ^ Attribute value.+      -> Attribute       -- ^ Resulting attribute.+media = attribute "media" " media=\""+{-# INLINE media #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @method@ attribute.+--+method :: AttributeValue  -- ^ Attribute value.+       -> Attribute       -- ^ Resulting attribute.+method = attribute "method" " method=\""+{-# INLINE method #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @min@ attribute.+--+min_ :: AttributeValue  -- ^ Attribute value.+     -> Attribute       -- ^ Resulting attribute.+min_ = attribute "min" " min=\""+{-# INLINE min_ #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @mode@ attribute.+--+mode :: AttributeValue  -- ^ Attribute value.+     -> Attribute       -- ^ Resulting attribute.+mode = attribute "mode" " mode=\""+{-# INLINE mode #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @name@ attribute.+--+name :: AttributeValue  -- ^ Attribute value.+     -> Attribute       -- ^ Resulting attribute.+name = attribute "name" " name=\""+{-# INLINE name #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @numOctaves@ attribute.+--+numoctaves :: AttributeValue  -- ^ Attribute value.+           -> Attribute       -- ^ Resulting attribute.+numoctaves = attribute "numOctaves" " numOctaves=\""+{-# INLINE numoctaves #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @offset@ attribute.+--+offset :: AttributeValue  -- ^ Attribute value.+       -> Attribute       -- ^ Resulting attribute.+offset = attribute "offset" " offset=\""+{-# INLINE offset #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @onabort@ attribute.+--+onabort :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+onabort = attribute "onabort" " onabort=\""+{-# INLINE onabort #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @onactivate@ attribute.+--+onactivate :: AttributeValue  -- ^ Attribute value.+           -> Attribute       -- ^ Resulting attribute.+onactivate = attribute "onactivate" " onactivate=\""+{-# INLINE onactivate #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @onbegin@ attribute.+--+onbegin :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+onbegin = attribute "onbegin" " onbegin=\""+{-# INLINE onbegin #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @onclick@ attribute.+--+onclick :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+onclick = attribute "onclick" " onclick=\""+{-# INLINE onclick #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @onend@ attribute.+--+onend :: AttributeValue  -- ^ Attribute value.+      -> Attribute       -- ^ Resulting attribute.+onend = attribute "onend" " onend=\""+{-# INLINE onend #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @onerror@ attribute.+--+onerror :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+onerror = attribute "onerror" " onerror=\""+{-# INLINE onerror #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @onfocusin@ attribute.+--+onfocusin :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+onfocusin = attribute "onfocusin" " onfocusin=\""+{-# INLINE onfocusin #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @onfocusout@ attribute.+--+onfocusout :: AttributeValue  -- ^ Attribute value.+           -> Attribute       -- ^ Resulting attribute.+onfocusout = attribute "onfocusout" " onfocusout=\""+{-# INLINE onfocusout #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @onload@ attribute.+--+onload :: AttributeValue  -- ^ Attribute value.+       -> Attribute       -- ^ Resulting attribute.+onload = attribute "onload" " onload=\""+{-# INLINE onload #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @onmousedown@ attribute.+--+onmousedown :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+onmousedown = attribute "onmousedown" " onmousedown=\""+{-# INLINE onmousedown #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @onmousemove@ attribute.+--+onmousemove :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+onmousemove = attribute "onmousemove" " onmousemove=\""+{-# INLINE onmousemove #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @onmouseout@ attribute.+--+onmouseout :: AttributeValue  -- ^ Attribute value.+           -> Attribute       -- ^ Resulting attribute.+onmouseout = attribute "onmouseout" " onmouseout=\""+{-# INLINE onmouseout #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @onmouseover@ attribute.+--+onmouseover :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+onmouseover = attribute "onmouseover" " onmouseover=\""+{-# INLINE onmouseover #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @onmouseup@ attribute.+--+onmouseup :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+onmouseup = attribute "onmouseup" " onmouseup=\""+{-# INLINE onmouseup #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @onrepeat@ attribute.+--+onrepeat :: AttributeValue  -- ^ Attribute value.+         -> Attribute       -- ^ Resulting attribute.+onrepeat = attribute "onrepeat" " onrepeat=\""+{-# INLINE onrepeat #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @onresize@ attribute.+--+onresize :: AttributeValue  -- ^ Attribute value.+         -> Attribute       -- ^ Resulting attribute.+onresize = attribute "onresize" " onresize=\""+{-# INLINE onresize #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @onscroll@ attribute.+--+onscroll :: AttributeValue  -- ^ Attribute value.+         -> Attribute       -- ^ Resulting attribute.+onscroll = attribute "onscroll" " onscroll=\""+{-# INLINE onscroll #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @onunload@ attribute.+--+onunload :: AttributeValue  -- ^ Attribute value.+         -> Attribute       -- ^ Resulting attribute.+onunload = attribute "onunload" " onunload=\""+{-# INLINE onunload #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @onzoom@ attribute.+--+onzoom :: AttributeValue  -- ^ Attribute value.+       -> Attribute       -- ^ Resulting attribute.+onzoom = attribute "onzoom" " onzoom=\""+{-# INLINE onzoom #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @opacity@ attribute.+--+opacity :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+opacity = attribute "opacity" " opacity=\""+{-# INLINE opacity #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @operator@ attribute.+--+operator :: AttributeValue  -- ^ Attribute value.+         -> Attribute       -- ^ Resulting attribute.+operator = attribute "operator" " operator=\""+{-# INLINE operator #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @order@ attribute.+--+order :: AttributeValue  -- ^ Attribute value.+      -> Attribute       -- ^ Resulting attribute.+order = attribute "order" " order=\""+{-# INLINE order #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @orient@ attribute.+--+orient :: AttributeValue  -- ^ Attribute value.+       -> Attribute       -- ^ Resulting attribute.+orient = attribute "orient" " orient=\""+{-# INLINE orient #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @orientation@ attribute.+--+orientation :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+orientation = attribute "orientation" " orientation=\""+{-# INLINE orientation #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @origin@ attribute.+--+origin :: AttributeValue  -- ^ Attribute value.+       -> Attribute       -- ^ Resulting attribute.+origin = attribute "origin" " origin=\""+{-# INLINE origin #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @overflow@ attribute.+--+overflow :: AttributeValue  -- ^ Attribute value.+         -> Attribute       -- ^ Resulting attribute.+overflow = attribute "overflow" " overflow=\""+{-# INLINE overflow #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @overline-position@ attribute.+--+overlinePosition :: AttributeValue  -- ^ Attribute value.+                 -> Attribute       -- ^ Resulting attribute.+overlinePosition = attribute "overline-position" " overline-position=\""+{-# INLINE overlinePosition #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @overline-thickness@ attribute.+--+overlineThickness :: AttributeValue  -- ^ Attribute value.+                  -> Attribute       -- ^ Resulting attribute.+overlineThickness = attribute "overline-thickness" " overline-thickness=\""+{-# INLINE overlineThickness #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @panose-1@ attribute.+--+panose1 :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+panose1 = attribute "panose-1" " panose-1=\""+{-# INLINE panose1 #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @path@ attribute.+--+path :: AttributeValue  -- ^ Attribute value.+     -> Attribute       -- ^ Resulting attribute.+path = attribute "path" " path=\""+{-# INLINE path #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @pathLength@ attribute.+--+pathlength :: AttributeValue  -- ^ Attribute value.+           -> Attribute       -- ^ Resulting attribute.+pathlength = attribute "pathLength" " pathLength=\""+{-# INLINE pathlength #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @patternContentUnits@ attribute.+--+patterncontentunits :: AttributeValue  -- ^ Attribute value.+                    -> Attribute       -- ^ Resulting attribute.+patterncontentunits = attribute "patternContentUnits" " patternContentUnits=\""+{-# INLINE patterncontentunits #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @patternTransform@ attribute.+--+patterntransform :: AttributeValue  -- ^ Attribute value.+                 -> Attribute       -- ^ Resulting attribute.+patterntransform = attribute "patternTransform" " patternTransform=\""+{-# INLINE patterntransform #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @patternUnits@ attribute.+--+patternunits :: AttributeValue  -- ^ Attribute value.+             -> Attribute       -- ^ Resulting attribute.+patternunits = attribute "patternUnits" " patternUnits=\""+{-# INLINE patternunits #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @pointer-events@ attribute.+--+pointerEvents :: AttributeValue  -- ^ Attribute value.+              -> Attribute       -- ^ Resulting attribute.+pointerEvents = attribute "pointer-events" " pointer-events=\""+{-# INLINE pointerEvents #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @points@ attribute.+--+points :: AttributeValue  -- ^ Attribute value.+       -> Attribute       -- ^ Resulting attribute.+points = attribute "points" " points=\""+{-# INLINE points #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @pointsAtX@ attribute.+--+pointsatx :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+pointsatx = attribute "pointsAtX" " pointsAtX=\""+{-# INLINE pointsatx #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @pointsAtY@ attribute.+--+pointsaty :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+pointsaty = attribute "pointsAtY" " pointsAtY=\""+{-# INLINE pointsaty #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @pointsAtZ@ attribute.+--+pointsatz :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+pointsatz = attribute "pointsAtZ" " pointsAtZ=\""+{-# INLINE pointsatz #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @preserveAlpha@ attribute.+--+preservealpha :: AttributeValue  -- ^ Attribute value.+              -> Attribute       -- ^ Resulting attribute.+preservealpha = attribute "preserveAlpha" " preserveAlpha=\""+{-# INLINE preservealpha #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @preserveAspectRatio@ attribute.+--+preserveaspectratio :: AttributeValue  -- ^ Attribute value.+                    -> Attribute       -- ^ Resulting attribute.+preserveaspectratio = attribute "preserveAspectRatio" " preserveAspectRatio=\""+{-# INLINE preserveaspectratio #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @primitiveUnits@ attribute.+--+primitiveunits :: AttributeValue  -- ^ Attribute value.+               -> Attribute       -- ^ Resulting attribute.+primitiveunits = attribute "primitiveUnits" " primitiveUnits=\""+{-# INLINE primitiveunits #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @r@ attribute.+--+r :: AttributeValue  -- ^ Attribute value.+  -> Attribute       -- ^ Resulting attribute.+r = attribute "r" " r=\""+{-# INLINE r #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @radius@ attribute.+--+radius :: AttributeValue  -- ^ Attribute value.+       -> Attribute       -- ^ Resulting attribute.+radius = attribute "radius" " radius=\""+{-# INLINE radius #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @refX@ attribute.+--+refx :: AttributeValue  -- ^ Attribute value.+     -> Attribute       -- ^ Resulting attribute.+refx = attribute "refX" " refX=\""+{-# INLINE refx #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @refY@ attribute.+--+refy :: AttributeValue  -- ^ Attribute value.+     -> Attribute       -- ^ Resulting attribute.+refy = attribute "refY" " refY=\""+{-# INLINE refy #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @rendering-intent@ attribute.+--+renderingIntent :: AttributeValue  -- ^ Attribute value.+                -> Attribute       -- ^ Resulting attribute.+renderingIntent = attribute "rendering-intent" " rendering-intent=\""+{-# INLINE renderingIntent #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @repeatCount@ attribute.+--+repeatcount :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+repeatcount = attribute "repeatCount" " repeatCount=\""+{-# INLINE repeatcount #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @repeatDur@ attribute.+--+repeatdur :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+repeatdur = attribute "repeatDur" " repeatDur=\""+{-# INLINE repeatdur #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @requiredExtensions@ attribute.+--+requiredextensions :: AttributeValue  -- ^ Attribute value.+                   -> Attribute       -- ^ Resulting attribute.+requiredextensions = attribute "requiredExtensions" " requiredExtensions=\""+{-# INLINE requiredextensions #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @requiredFeatures@ attribute.+--+requiredfeatures :: AttributeValue  -- ^ Attribute value.+                 -> Attribute       -- ^ Resulting attribute.+requiredfeatures = attribute "requiredFeatures" " requiredFeatures=\""+{-# INLINE requiredfeatures #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @restart@ attribute.+--+restart :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+restart = attribute "restart" " restart=\""+{-# INLINE restart #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @result@ attribute.+--+result :: AttributeValue  -- ^ Attribute value.+       -> Attribute       -- ^ Resulting attribute.+result = attribute "result" " result=\""+{-# INLINE result #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @rotate@ attribute.+--+rotate :: AttributeValue  -- ^ Attribute value.+       -> Attribute       -- ^ Resulting attribute.+rotate = attribute "rotate" " rotate=\""+{-# INLINE rotate #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @rx@ attribute.+--+rx :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+rx = attribute "rx" " rx=\""+{-# INLINE rx #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @ry@ attribute.+--+ry :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+ry = attribute "ry" " ry=\""+{-# INLINE ry #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @scale@ attribute.+--+scale :: AttributeValue  -- ^ Attribute value.+      -> Attribute       -- ^ Resulting attribute.+scale = attribute "scale" " scale=\""+{-# INLINE scale #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @seed@ attribute.+--+seed :: AttributeValue  -- ^ Attribute value.+     -> Attribute       -- ^ Resulting attribute.+seed = attribute "seed" " seed=\""+{-# INLINE seed #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @shape-rendering@ attribute.+--+shapeRendering :: AttributeValue  -- ^ Attribute value.+               -> Attribute       -- ^ Resulting attribute.+shapeRendering = attribute "shape-rendering" " shape-rendering=\""+{-# INLINE shapeRendering #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @slope@ attribute.+--+slope :: AttributeValue  -- ^ Attribute value.+      -> Attribute       -- ^ Resulting attribute.+slope = attribute "slope" " slope=\""+{-# INLINE slope #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @spacing@ attribute.+--+spacing :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+spacing = attribute "spacing" " spacing=\""+{-# INLINE spacing #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @specularConstant@ attribute.+--+specularconstant :: AttributeValue  -- ^ Attribute value.+                 -> Attribute       -- ^ Resulting attribute.+specularconstant = attribute "specularConstant" " specularConstant=\""+{-# INLINE specularconstant #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @specularExponent@ attribute.+--+specularexponent :: AttributeValue  -- ^ Attribute value.+                 -> Attribute       -- ^ Resulting attribute.+specularexponent = attribute "specularExponent" " specularExponent=\""+{-# INLINE specularexponent #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @spreadMethod@ attribute.+--+spreadmethod :: AttributeValue  -- ^ Attribute value.+             -> Attribute       -- ^ Resulting attribute.+spreadmethod = attribute "spreadMethod" " spreadMethod=\""+{-# INLINE spreadmethod #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @startOffset@ attribute.+--+startoffset :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+startoffset = attribute "startOffset" " startOffset=\""+{-# INLINE startoffset #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @stdDeviation@ attribute.+--+stddeviation :: AttributeValue  -- ^ Attribute value.+             -> Attribute       -- ^ Resulting attribute.+stddeviation = attribute "stdDeviation" " stdDeviation=\""+{-# INLINE stddeviation #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @stemh@ attribute.+--+stemh :: AttributeValue  -- ^ Attribute value.+      -> Attribute       -- ^ Resulting attribute.+stemh = attribute "stemh" " stemh=\""+{-# INLINE stemh #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @stemv@ attribute.+--+stemv :: AttributeValue  -- ^ Attribute value.+      -> Attribute       -- ^ Resulting attribute.+stemv = attribute "stemv" " stemv=\""+{-# INLINE stemv #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @stitchTiles@ attribute.+--+stitchtiles :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+stitchtiles = attribute "stitchTiles" " stitchTiles=\""+{-# INLINE stitchtiles #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @stop-color@ attribute.+--+stopColor :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+stopColor = attribute "stop-color" " stop-color=\""+{-# INLINE stopColor #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @stop-opacity@ attribute.+--+stopOpacity :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+stopOpacity = attribute "stop-opacity" " stop-opacity=\""+{-# INLINE stopOpacity #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @strikethrough-position@ attribute.+--+strikethroughPosition :: AttributeValue  -- ^ Attribute value.+                      -> Attribute       -- ^ Resulting attribute.+strikethroughPosition = attribute "strikethrough-position" " strikethrough-position=\""+{-# INLINE strikethroughPosition #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @strikethrough-thickness@ attribute.+--+strikethroughThickness :: AttributeValue  -- ^ Attribute value.+                       -> Attribute       -- ^ Resulting attribute.+strikethroughThickness = attribute "strikethrough-thickness" " strikethrough-thickness=\""+{-# INLINE strikethroughThickness #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @string@ attribute.+--+string :: AttributeValue  -- ^ Attribute value.+       -> Attribute       -- ^ Resulting attribute.+string = attribute "string" " string=\""+{-# INLINE string #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @stroke@ attribute.+--+stroke :: AttributeValue  -- ^ Attribute value.+       -> Attribute       -- ^ Resulting attribute.+stroke = attribute "stroke" " stroke=\""+{-# INLINE stroke #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @stroke-dasharray@ attribute.+--+strokeDasharray :: AttributeValue  -- ^ Attribute value.+                -> Attribute       -- ^ Resulting attribute.+strokeDasharray = attribute "stroke-dasharray" " stroke-dasharray=\""+{-# INLINE strokeDasharray #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @stroke-dashoffset@ attribute.+--+strokeDashoffset :: AttributeValue  -- ^ Attribute value.+                 -> Attribute       -- ^ Resulting attribute.+strokeDashoffset = attribute "stroke-dashoffset" " stroke-dashoffset=\""+{-# INLINE strokeDashoffset #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @stroke-linecap@ attribute.+--+strokeLinecap :: AttributeValue  -- ^ Attribute value.+              -> Attribute       -- ^ Resulting attribute.+strokeLinecap = attribute "stroke-linecap" " stroke-linecap=\""+{-# INLINE strokeLinecap #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @stroke-linejoin@ attribute.+--+strokeLinejoin :: AttributeValue  -- ^ Attribute value.+               -> Attribute       -- ^ Resulting attribute.+strokeLinejoin = attribute "stroke-linejoin" " stroke-linejoin=\""+{-# INLINE strokeLinejoin #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @stroke-miterlimit@ attribute.+--+strokeMiterlimit :: AttributeValue  -- ^ Attribute value.+                 -> Attribute       -- ^ Resulting attribute.+strokeMiterlimit = attribute "stroke-miterlimit" " stroke-miterlimit=\""+{-# INLINE strokeMiterlimit #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @stroke-opacity@ attribute.+--+strokeOpacity :: AttributeValue  -- ^ Attribute value.+              -> Attribute       -- ^ Resulting attribute.+strokeOpacity = attribute "stroke-opacity" " stroke-opacity=\""+{-# INLINE strokeOpacity #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @stroke-width@ attribute.+--+strokeWidth :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+strokeWidth = attribute "stroke-width" " stroke-width=\""+{-# INLINE strokeWidth #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @style@ attribute.+--+style :: AttributeValue  -- ^ Attribute value.+      -> Attribute       -- ^ Resulting attribute.+style = attribute "style" " style=\""+{-# INLINE style #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @surfaceScale@ attribute.+--+surfacescale :: AttributeValue  -- ^ Attribute value.+             -> Attribute       -- ^ Resulting attribute.+surfacescale = attribute "surfaceScale" " surfaceScale=\""+{-# INLINE surfacescale #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @systemLanguage@ attribute.+--+systemlanguage :: AttributeValue  -- ^ Attribute value.+               -> Attribute       -- ^ Resulting attribute.+systemlanguage = attribute "systemLanguage" " systemLanguage=\""+{-# INLINE systemlanguage #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @tableValues@ attribute.+--+tablevalues :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+tablevalues = attribute "tableValues" " tableValues=\""+{-# INLINE tablevalues #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @target@ attribute.+--+target :: AttributeValue  -- ^ Attribute value.+       -> Attribute       -- ^ Resulting attribute.+target = attribute "target" " target=\""+{-# INLINE target #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @targetX@ attribute.+--+targetx :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+targetx = attribute "targetX" " targetX=\""+{-# INLINE targetx #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @targetY@ attribute.+--+targety :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+targety = attribute "targetY" " targetY=\""+{-# INLINE targety #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @text-anchor@ attribute.+--+textAnchor :: AttributeValue  -- ^ Attribute value.+           -> Attribute       -- ^ Resulting attribute.+textAnchor = attribute "text-anchor" " text-anchor=\""+{-# INLINE textAnchor #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @text-decoration@ attribute.+--+textDecoration :: AttributeValue  -- ^ Attribute value.+               -> Attribute       -- ^ Resulting attribute.+textDecoration = attribute "text-decoration" " text-decoration=\""+{-# INLINE textDecoration #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @text-rendering@ attribute.+--+textRendering :: AttributeValue  -- ^ Attribute value.+              -> Attribute       -- ^ Resulting attribute.+textRendering = attribute "text-rendering" " text-rendering=\""+{-# INLINE textRendering #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @textLength@ attribute.+--+textlength :: AttributeValue  -- ^ Attribute value.+           -> Attribute       -- ^ Resulting attribute.+textlength = attribute "textLength" " textLength=\""+{-# INLINE textlength #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @title@ attribute.+--+title :: AttributeValue  -- ^ Attribute value.+      -> Attribute       -- ^ Resulting attribute.+title = attribute "title" " title=\""+{-# INLINE title #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @to@ attribute.+--+to :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+to = attribute "to" " to=\""+{-# INLINE to #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @transform@ attribute.+--+transform :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+transform = attribute "transform" " transform=\""+{-# INLINE transform #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @type@ attribute.+--+type_ :: AttributeValue  -- ^ Attribute value.+      -> Attribute       -- ^ Resulting attribute.+type_ = attribute "type" " type=\""+{-# INLINE type_ #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @u1@ attribute.+--+u1 :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+u1 = attribute "u1" " u1=\""+{-# INLINE u1 #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @u2@ attribute.+--+u2 :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+u2 = attribute "u2" " u2=\""+{-# INLINE u2 #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @underline-position@ attribute.+--+underlinePosition :: AttributeValue  -- ^ Attribute value.+                  -> Attribute       -- ^ Resulting attribute.+underlinePosition = attribute "underline-position" " underline-position=\""+{-# INLINE underlinePosition #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @underline-thickness@ attribute.+--+underlineThickness :: AttributeValue  -- ^ Attribute value.+                   -> Attribute       -- ^ Resulting attribute.+underlineThickness = attribute "underline-thickness" " underline-thickness=\""+{-# INLINE underlineThickness #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @unicode@ attribute.+--+unicode :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+unicode = attribute "unicode" " unicode=\""+{-# INLINE unicode #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @unicode-bidi@ attribute.+--+unicodeBidi :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+unicodeBidi = attribute "unicode-bidi" " unicode-bidi=\""+{-# INLINE unicodeBidi #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @unicode-range@ attribute.+--+unicodeRange :: AttributeValue  -- ^ Attribute value.+             -> Attribute       -- ^ Resulting attribute.+unicodeRange = attribute "unicode-range" " unicode-range=\""+{-# INLINE unicodeRange #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @units-per-em@ attribute.+--+unitsPerEm :: AttributeValue  -- ^ Attribute value.+           -> Attribute       -- ^ Resulting attribute.+unitsPerEm = attribute "units-per-em" " units-per-em=\""+{-# INLINE unitsPerEm #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @v-alphabetic@ attribute.+--+vAlphabetic :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+vAlphabetic = attribute "v-alphabetic" " v-alphabetic=\""+{-# INLINE vAlphabetic #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @v-hanging@ attribute.+--+vHanging :: AttributeValue  -- ^ Attribute value.+         -> Attribute       -- ^ Resulting attribute.+vHanging = attribute "v-hanging" " v-hanging=\""+{-# INLINE vHanging #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @v-ideographic@ attribute.+--+vIdeographic :: AttributeValue  -- ^ Attribute value.+             -> Attribute       -- ^ Resulting attribute.+vIdeographic = attribute "v-ideographic" " v-ideographic=\""+{-# INLINE vIdeographic #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @v-mathematical@ attribute.+--+vMathematical :: AttributeValue  -- ^ Attribute value.+              -> Attribute       -- ^ Resulting attribute.+vMathematical = attribute "v-mathematical" " v-mathematical=\""+{-# INLINE vMathematical #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @values@ attribute.+--+values :: AttributeValue  -- ^ Attribute value.+       -> Attribute       -- ^ Resulting attribute.+values = attribute "values" " values=\""+{-# INLINE values #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @version@ attribute.+--+version :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+version = attribute "version" " version=\""+{-# INLINE version #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @vert-adv-y@ attribute.+--+vertAdvY :: AttributeValue  -- ^ Attribute value.+         -> Attribute       -- ^ Resulting attribute.+vertAdvY = attribute "vert-adv-y" " vert-adv-y=\""+{-# INLINE vertAdvY #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @vert-origin-x@ attribute.+--+vertOriginX :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+vertOriginX = attribute "vert-origin-x" " vert-origin-x=\""+{-# INLINE vertOriginX #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @vert-origin-y@ attribute.+--+vertOriginY :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+vertOriginY = attribute "vert-origin-y" " vert-origin-y=\""+{-# INLINE vertOriginY #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @viewBox@ attribute.+--+viewbox :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+viewbox = attribute "viewBox" " viewBox=\""+{-# INLINE viewbox #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @viewTarget@ attribute.+--+viewtarget :: AttributeValue  -- ^ Attribute value.+           -> Attribute       -- ^ Resulting attribute.+viewtarget = attribute "viewTarget" " viewTarget=\""+{-# INLINE viewtarget #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @visibility@ attribute.+--+visibility :: AttributeValue  -- ^ Attribute value.+           -> Attribute       -- ^ Resulting attribute.+visibility = attribute "visibility" " visibility=\""+{-# INLINE visibility #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @width@ attribute.+--+width :: AttributeValue  -- ^ Attribute value.+      -> Attribute       -- ^ Resulting attribute.+width = attribute "width" " width=\""+{-# INLINE width #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @widths@ attribute.+--+widths :: AttributeValue  -- ^ Attribute value.+       -> Attribute       -- ^ Resulting attribute.+widths = attribute "widths" " widths=\""+{-# INLINE widths #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @word-spacing@ attribute.+--+wordSpacing :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+wordSpacing = attribute "word-spacing" " word-spacing=\""+{-# INLINE wordSpacing #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @writing-mode@ attribute.+--+writingMode :: AttributeValue  -- ^ Attribute value.+            -> Attribute       -- ^ Resulting attribute.+writingMode = attribute "writing-mode" " writing-mode=\""+{-# INLINE writingMode #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @x@ attribute.+--+x :: AttributeValue  -- ^ Attribute value.+  -> Attribute       -- ^ Resulting attribute.+x = attribute "x" " x=\""+{-# INLINE x #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @x-height@ attribute.+--+xHeight :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+xHeight = attribute "x-height" " x-height=\""+{-# INLINE xHeight #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @x1@ attribute.+--+x1 :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+x1 = attribute "x1" " x1=\""+{-# INLINE x1 #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @x2@ attribute.+--+x2 :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+x2 = attribute "x2" " x2=\""+{-# INLINE x2 #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @xChannelSelector@ attribute.+--+xchannelselector :: AttributeValue  -- ^ Attribute value.+                 -> Attribute       -- ^ Resulting attribute.+xchannelselector = attribute "xChannelSelector" " xChannelSelector=\""+{-# INLINE xchannelselector #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @xlink:actuate@ attribute.+--+xlinkActuate :: AttributeValue  -- ^ Attribute value.+             -> Attribute       -- ^ Resulting attribute.+xlinkActuate = attribute "xlink:actuate" " xlink:actuate=\""+{-# INLINE xlinkActuate #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @xlink:arcrole@ attribute.+--+xlinkArcrole :: AttributeValue  -- ^ Attribute value.+             -> Attribute       -- ^ Resulting attribute.+xlinkArcrole = attribute "xlink:arcrole" " xlink:arcrole=\""+{-# INLINE xlinkArcrole #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @xlink:href@ attribute.+--+xlinkHref :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+xlinkHref = attribute "xlink:href" " xlink:href=\""+{-# INLINE xlinkHref #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @xlink:role@ attribute.+--+xlinkRole :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+xlinkRole = attribute "xlink:role" " xlink:role=\""+{-# INLINE xlinkRole #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @xlink:show@ attribute.+--+xlinkShow :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+xlinkShow = attribute "xlink:show" " xlink:show=\""+{-# INLINE xlinkShow #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @xlink:title@ attribute.+--+xlinkTitle :: AttributeValue  -- ^ Attribute value.+           -> Attribute       -- ^ Resulting attribute.+xlinkTitle = attribute "xlink:title" " xlink:title=\""+{-# INLINE xlinkTitle #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @xlink:type@ attribute.+--+xlinkType :: AttributeValue  -- ^ Attribute value.+          -> Attribute       -- ^ Resulting attribute.+xlinkType = attribute "xlink:type" " xlink:type=\""+{-# INLINE xlinkType #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @xml:base@ attribute.+--+xmlBase :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+xmlBase = attribute "xml:base" " xml:base=\""+{-# INLINE xmlBase #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @xml:lang@ attribute.+--+xmlLang :: AttributeValue  -- ^ Attribute value.+        -> Attribute       -- ^ Resulting attribute.+xmlLang = attribute "xml:lang" " xml:lang=\""+{-# INLINE xmlLang #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @xml:space@ attribute.+--+xmlSpace :: AttributeValue  -- ^ Attribute value.+         -> Attribute       -- ^ Resulting attribute.+xmlSpace = attribute "xml:space" " xml:space=\""+{-# INLINE xmlSpace #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @y@ attribute.+--+y :: AttributeValue  -- ^ Attribute value.+  -> Attribute       -- ^ Resulting attribute.+y = attribute "y" " y=\""+{-# INLINE y #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @y1@ attribute.+--+y1 :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+y1 = attribute "y1" " y1=\""+{-# INLINE y1 #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @y2@ attribute.+--+y2 :: AttributeValue  -- ^ Attribute value.+   -> Attribute       -- ^ Resulting attribute.+y2 = attribute "y2" " y2=\""+{-# INLINE y2 #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @yChannelSelector@ attribute.+--+ychannelselector :: AttributeValue  -- ^ Attribute value.+                 -> Attribute       -- ^ Resulting attribute.+ychannelselector = attribute "yChannelSelector" " yChannelSelector=\""+{-# INLINE ychannelselector #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @z@ attribute.+--+z :: AttributeValue  -- ^ Attribute value.+  -> Attribute       -- ^ Resulting attribute.+z = attribute "z" " z=\""+{-# INLINE z #-}++-- WARNING: The next block of code was automatically generated by+-- Util/GenerateSvgCombinators.hs:222+--+-- | Combinator for the @zoomAndPan@ attribute.+--+zoomandpan :: AttributeValue  -- ^ Attribute value.+           -> Attribute       -- ^ Resulting attribute.+zoomandpan = attribute "zoomAndPan" " zoomAndPan=\""+{-# INLINE zoomandpan #-}
+ Util/GenerateSvgCombinators.hs view
@@ -0,0 +1,329 @@+{-# LANGUAGE CPP #-}++#define DO_NOT_EDIT (doNotEdit __FILE__ __LINE__)++-- | Generates code for SVG tags.+--+module Util.GenerateSvgCombinators where++import Control.Arrow ((&&&))+import Data.List (sort, sortBy, intersperse, intercalate)+import Data.Ord (comparing)+import System.Directory (createDirectoryIfMissing)+import System.FilePath ((</>), (<.>))+import Data.Map (Map)+import qualified Data.Map as M+import Data.Char (toLower)+import qualified Data.Set as S++import Util.Sanitize (sanitize, prelude)++-- | Datatype for an SVG variant.+--+data SvgVariant = SvgVariant+    { version     :: [String]+    , docType     :: [String]+    , parents     :: [String]+    , leafs       :: [String]+    , attributes  :: [String]+    , selfClosing :: Bool+    } deriving (Eq)++instance Show SvgVariant where+    show = map toLower . intercalate "-" . version++-- | Get the full module name for an SVG variant.+--+getModuleName :: SvgVariant -> String+getModuleName = ("Text.Blaze." ++) . intercalate "." . version++-- | Get the attribute module name for an SVG variant.+--+getAttributeModuleName :: SvgVariant -> String+getAttributeModuleName = (++ ".Attributes") . getModuleName++-- | Check if a given name causes a name clash.+--+isNameClash :: SvgVariant -> String -> Bool+isNameClash v t+    -- Both an element and an attribute+    | (t `elem` parents v || t `elem` leafs v) && t `elem` attributes v = True+    -- Already a prelude function+    | sanitize t `S.member` prelude = True+    | otherwise = False++-- | Write an SVG variant.+--+writeSvgVariant :: SvgVariant -> IO ()+writeSvgVariant svgVariant = do+    -- Make a directory.+    createDirectoryIfMissing True basePath++    let tags =  zip parents' (repeat makeParent)+             ++ zip leafs' (repeat (makeLeaf $ selfClosing svgVariant))+        sortedTags = sortBy (comparing fst) tags+        appliedTags = map (\(x, f) -> f x) sortedTags++    -- Write the main module.+    writeFile' (basePath <.> "hs") $ removeTrailingNewlines $ unlines+        [ DO_NOT_EDIT+        , "{-# LANGUAGE OverloadedStrings #-}"+        , "-- | This module exports SVG combinators used to create documents."+        , "--"+        , exportList modulName $ "module Text.Blaze"+                                : "module Text.Blaze.Svg"+                                : "docType"+                                : "docTypeSvg"+                                : map (sanitize . fst) sortedTags+        , DO_NOT_EDIT+        , "import Prelude ((>>), (.), ($))"+        , ""+        , "import Text.Blaze"+        , "import Text.Blaze.Svg"+        , "import Text.Blaze.Internal"+        , ""+        , makeDocType $ docType svgVariant+        , makeDocTypeSvg $ docType svgVariant+        , unlines appliedTags+        ]++    let sortedAttributes = sort attributes'++    -- Write the attribute module.+    writeFile' (basePath </> "Attributes.hs") $ removeTrailingNewlines $ unlines+        [ DO_NOT_EDIT+        , "-- | This module exports combinators that provide you with the"+        , "-- ability to set attributes on SVG elements."+        , "--"+        , "{-# LANGUAGE OverloadedStrings #-}"+        , exportList attributeModuleName $ map sanitize sortedAttributes+        , DO_NOT_EDIT+        , "import Prelude ()"+        , ""+        , "import Text.Blaze.Internal (Attribute, AttributeValue, attribute)"+        , ""+        , unlines (map makeAttribute sortedAttributes)+        ]+  where+    basePath = "Text" </> "Blaze" </> foldl1 (</>) version'+    modulName = getModuleName svgVariant+    attributeModuleName = getAttributeModuleName svgVariant+    attributes' = attributes svgVariant+    parents'    = parents svgVariant+    leafs'      = leafs svgVariant+    version'    = version svgVariant+    removeTrailingNewlines = reverse . drop 2 . reverse+    writeFile' file content = do+        putStrLn ("Generating " ++ file)+        writeFile file content++-- | Create a string, consisting of @x@ spaces, where @x@ is the length of the+-- argument.+--+spaces :: String -> String+spaces = flip replicate ' ' . length++-- | Join blocks of code with a newline in between.+--+unblocks :: [String] -> String+unblocks = unlines . intersperse "\n"++-- | A warning to not edit the generated code.+--+doNotEdit :: FilePath -> Int -> String+doNotEdit fileName lineNumber = init $ unlines+    [ "-- WARNING: The next block of code was automatically generated by"+    , "-- " ++ fileName ++ ":" ++ show lineNumber+    , "--"+    ]++-- | Generate an export list for a Haskell module.+--+exportList :: String   -- ^ Module name.+           -> [String] -- ^ List of functions.+           -> String   -- ^ Resulting string.+exportList _    []            = error "exportList without functions."+exportList name (f:functions) = unlines $+    [ "module " ++ name+    , "    ( " ++ f+    ] +++    map ("    , " ++) functions +++    [ "    ) where"]++-- | Generate a function for a doctype.+--+makeDocType :: [String] -> String+makeDocType lines' = unlines+    [ DO_NOT_EDIT+    , "-- | Combinator for the document type. This should be placed at the top"+    , "-- of every SVG page."+    , "--"+    , unlines (map ("-- > " ++) lines') ++ "--"+    , "docType :: Svg  -- ^ The document type SVG."+    , "docType = preEscapedText " ++ show (unlines lines')+    , "{-# INLINE docType #-}"+    ]++-- | Generate a function for the SVG tag (including the doctype).+--+makeDocTypeSvg :: [String]  -- ^ The doctype.+                -> String    -- ^ Resulting combinator function.+makeDocTypeSvg lines' = unlines+    [ DO_NOT_EDIT+    , "-- | Combinator for the @\\<svg>@ element. This combinator will also"+    , "-- insert the correct doctype."+    , "--"+    , unlines (map ("-- > " ++) lines') ++ "-- > <svg><span>foo</span></svg>"+    , "--"+    , "docTypeSvg :: Svg  -- ^ Inner SVG."+    , "            -> Svg  -- ^ Resulting SVG."+    , "docTypeSvg inner = docType >> (svg ! attribute \"xmlns\" \" xmlns=\\\"\" \"http://www.w3.org/2000/svg\" ! attribute \"xmlns:xlink\" \" xmlns:xlink=\\\"\" \"http://www.w3.org/1999/xlink\"  $ inner)"+    , "{-# INLINE docTypeSvg #-}"+    ]++-- | Generate a function for an SVG tag that can be a parent.+--+makeParent :: String -> String+makeParent tag = unlines+    [ DO_NOT_EDIT+    , "-- | Combinator for the @\\<" ++ tag ++ ">@ element."+    , "--"+    , function        ++ " :: Svg  -- ^ Inner SVG."+    , spaces function ++ " -> Svg  -- ^ Resulting SVG."+    , function        ++ " = Parent \"" ++ tag ++ "\" \"<" ++ tag+                      ++ "\" \"</" ++ tag ++ ">\"" ++ modifier+    , "{-# INLINE " ++ function ++ " #-}"+    ]+  where+    function = sanitize tag+    modifier = if tag `elem` ["style", "script"] then " . external" else ""++-- | Generate a function for an SVG tag that must be a leaf.+--+makeLeaf :: Bool    -- ^ Make leaf tags self-closing+         -> String  -- ^ Tag for the combinator+         -> String  -- ^ Combinator code+makeLeaf closing tag = unlines+    [ DO_NOT_EDIT+    , "-- | Combinator for the @\\<" ++ tag ++ " />@ element."+    , "--"+    , function ++ " :: Svg  -- ^ Resulting SVG."+    , function ++ " = Leaf \"" ++ tag ++ "\" \"<" ++ tag ++ "\" " ++ "\""+               ++ (if closing then " /" else "") ++ ">\""+    , "{-# INLINE " ++ function ++ " #-}"+    ]+  where+    function = sanitize tag++-- | Generate a function for an SVG attribute.+--+makeAttribute :: String -> String+makeAttribute name = unlines+    [ DO_NOT_EDIT+    , "-- | Combinator for the @" ++ name ++ "@ attribute."+    , "--"+    , function        ++ " :: AttributeValue  -- ^ Attribute value."+    , spaces function ++ " -> Attribute       -- ^ Resulting attribute."+    , function        ++ " = attribute \"" ++ name ++ "\" \" "+                      ++ name ++ "=\\\"\""+    , "{-# INLINE " ++ function ++ " #-}"+    ]+  where+    function = sanitize name++-- | SVG 1.1+-- Reference: https://developer.mozilla.org/en/SVG+--+svg11 :: SvgVariant+svg11 = SvgVariant+    { version = ["Svg11"]+    , docType =+        [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+        , "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\""+        , "    \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">"+        ]+    , parents =+        [ "a","defs","glyph","g","marker","mask","missing-glyph","pattern", "svg"+        , "switch", "symbol"+        ]+    , leafs =+        [ "altGlyph", "altGlyphDef", "altGlyphItem", "animate", "animateColor"+        , "animateMotion", "animateTransform", "circle", "clipPath"+        , "color-profile" , "cursor", "desc", "ellipse", "feBlend"+        , "feColorMatrix", "feComponentTransfer" , "feComposite"+        , "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap"+        , "feDistantLight", "feFlood", "feFuncA", "feFuncB" , "feFuncG"+        , "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode"+        , "feMorphology", "feOffset", "fePointLight", "feSpecularLighting"+        , "feSpotLight" , "feTile", "feTurbulence", "filter", "font"+        , "font-face", "font-face-format" , "font-face-name", "font-face-src"+        , "font-face-uri", "foreignObject" , "glyphRef", "hkern", "image"+        , "line", "linearGradient" , "metadata", "mpath", "path"+        , "polygon" , "polyline", "radialGradient", "rect", "script", "set"+        , "stop", "style" , "text", "textPath", "title", "tref", "tspan", "use"+        , "view", "vkern"+        ]+    , attributes =+        [ "accent-height", "accumulate", "additive", "alphabetic", "amplitude"+        , "arabic-form", "ascent", "attributeName", "attributeType", "azimuth"+        , "baseFrequency", "baseProfile", "bbox", "begin", "bias", "by", "calcMode"+        , "cap-height", "class", "clipPathUnits", "contentScriptType"+        , "contentStyleType", "cx", "cy", "d", "descent", "diffuseConstant", "divisor"+        , "dur", "dx", "dy", "edgeMode", "elevation", "end", "exponent"+        , "externalResourcesRequired", "fill", "filterRes", "filterUnits", "font-family"+        , "font-size", "font-stretch", "font-style", "font-variant", "font-weight"+        , "format", "from", "fx", "fy", "g1", "g2", "glyph-name", "glyphRef"+        , "gradientTransform", "gradientUnits", "hanging", "height", "horiz-adv-x"+        , "horiz-origin-x", "horiz-origin-y", "id", "ideographic", "in", "in2"+        , "intercept", "k", "k1", "k2", "k3", "k4", "kernelMatrix", "kernelUnitLength"+        , "keyPoints", "keySplines", "keyTimes", "lang", "lengthAdjust"+        , "limitingConeAngle", "local", "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", "operator", "order"+        , "orient", "orientation", "origin", "overline-position", "overline-thickness"+        , "panose-1", "path", "pathLength", "patternContentUnits", "patternTransform"+        , "patternUnits", "points", "pointsAtX", "pointsAtY", "pointsAtZ"+        , "preserveAlpha", "preserveAspectRatio", "primitiveUnits", "r", "radius"+        , "refX", "refY", "rendering-intent", "repeatCount", "repeatDur"+        , "requiredExtensions", "requiredFeatures", "restart", "result", "rotate", "rx"+        , "ry", "scale", "seed", "slope", "spacing", "specularConstant"+        , "specularExponent", "spreadMethod", "startOffset", "stdDeviation", "stemh"+        , "stemv", "stitchTiles", "strikethrough-position", "strikethrough-thickness"+        , "string", "style", "surfaceScale", "systemLanguage", "tableValues", "target"+        , "targetX", "targetY", "textLength", "title", "to", "transform", "type", "u1"+        , "u2", "underline-position", "underline-thickness", "unicode", "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", "width", "widths", "x", "x-height", "x1", "x2"+        , "xChannelSelector", "xlink:actuate", "xlink:arcrole", "xlink:href"+        , "xlink:role", "xlink:show", "xlink:title", "xlink:type", "xml:base"+        , "xml:lang", "xml:space", "y", "y1", "y2", "yChannelSelector", "z", "zoomAndPan"+        -- Presentation Attributes+        , "alignment-baseline", "baseline-shift", "clip-path", "clip-rule"+        , "clip", "color-interpolation-filters", "color-interpolation"+        , "color-profile", "color-rendering", "color", "cursor", "direction"+        , "display", "dominant-baseline", "enable-background", "fill-opacity"+        , "fill-rule", "filter", "flood-color", "flood-opacity"+        , "font-size-adjust", "glyph-orientation-horizontal"+        , "glyph-orientation-vertical", "image-rendering", "kerning", "letter-spacing"+        , "lighting-color", "marker-end", "marker-mid", "marker-start", "mask"+        , "opacity", "overflow", "pointer-events", "shape-rendering", "stop-color"+        , "stop-opacity", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap"+        , "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width"+        , "stroke", "text-anchor", "text-decoration", "text-rendering", "unicode-bidi"+        , "visibility", "word-spacing", "writing-mode"+        ]+    , selfClosing = True+    }++-- | A map of SVG variants, per version, lowercase.+--+svgVariants :: Map String SvgVariant+svgVariants = M.fromList $ map (show &&& id)+    [ svg11 ]++main :: IO ()+main = mapM_ (writeSvgVariant . snd) $ M.toList svgVariants
+ Util/Sanitize.hs view
@@ -0,0 +1,78 @@+-- | A program to sanitize an HTML tag to a Haskell function.+--+module Util.Sanitize+    ( sanitize+    , keywords+    , prelude+    ) where++import Data.Char (toLower, toUpper)+import Data.Set (Set)+import qualified Data.Set as S++-- | Sanitize a tag. This function returns a name that can be used as+-- combinator in haskell source code.+--+-- Examples:+--+-- > sanitize "class" == "class_"+-- > sanitize "http-equiv" == "httpEquiv"+--+sanitize :: String -> String+sanitize = appendUnderscore . removeDashOrColon . map toLower+  where+    -- Remove a dash, replacing it by camelcase notation+    --+    -- Example:+    --+    -- > removeDashOrColon "foo-bar" == "fooBar"+    --+    removeDashOrColon ('-' : x : xs) = toUpper x : removeDashOrColon xs+    removeDashOrColon (':' : x : xs) = toUpper x : removeDashOrColon xs+    removeDashOrColon (x : xs) = x : removeDashOrColon xs+    removeDashOrColon [] = []++    appendUnderscore t | t `S.member` keywords = t ++ "_"+                       | t `S.member` prelude  = t ++ "_"+                       | otherwise             = t++-- | A set of standard Haskell keywords, which cannot be used as combinators.+--+keywords :: Set String+keywords = S.fromList+    [ "case", "class", "data", "default", "deriving", "do", "else", "if"+    , "import", "in", "infix", "infixl", "infixr", "instance" , "let", "module"+    , "newtype", "of", "then", "type", "where"+    ]++-- | Set of functions from the Prelude, which we do not use as combinators.+--+prelude :: Set String+prelude = S.fromList+    [ "abs", "acos", "acosh", "all", "and", "any", "appendFile", "asTypeOf"+    , "asin", "asinh", "atan", "atan2", "atanh", "break", "catch", "ceiling"+    , "compare", "concat", "concatMap", "const", "cos", "cosh", "curry", "cycle"+    , "decodeFloat", "div", "divMod", "drop", "dropWhile", "either", "elem"+    , "encodeFloat", "enumFrom", "enumFromThen", "enumFromThenTo", "enumFromTo"+    , "error", "even", "exp", "exponent", "fail", "filter", "flip"+    , "floatDigits", "floatRadix", "floatRange", "floor", "fmap", "foldl"+    , "foldl1", "foldr", "foldr1", "fromEnum", "fromInteger", "fromIntegral"+    , "fromRational", "fst", "gcd", "getChar", "getContents", "getLine", "head"+    , "id", "init", "interact", "ioError", "isDenormalized", "isIEEE"+    , "isInfinite", "isNaN", "isNegativeZero", "iterate", "last", "lcm"+    , "length", "lex", "lines", "log", "logBase", "lookup", "map", "mapM"+    , "mapM_", "max", "maxBound", "maximum", "maybe", "min", "minBound"+    , "minimum", "mod", "negate", "not", "notElem", "null", "odd", "or"+    , "otherwise", "pi", "pred", "print", "product", "properFraction", "putChar"+    , "putStr", "putStrLn", "quot", "quotRem", "read", "readFile", "readIO"+    , "readList", "readLn", "readParen", "reads", "readsPrec", "realToFrac"+    , "recip", "rem", "repeat", "replicate", "return", "reverse", "round"+    , "scaleFloat", "scanl", "scanl1", "scanr", "scanr1", "seq", "sequence"+    , "sequence_", "show", "showChar", "showList", "showParen", "showString"+    , "shows", "showsPrec", "significand", "signum", "sin", "sinh", "snd"+    , "span", "splitAt", "sqrt", "subtract", "succ", "sum", "tail", "take"+    , "takeWhile", "tan", "tanh", "toEnum", "toInteger", "toRational"+    , "truncate", "text", "uncurry", "undefined", "unlines", "until", "unwords", "unzip"+    , "unzip3", "userError", "words", "writeFile", "zip", "zip3", "zipWith"+    , "zipWith3"+    ]
+ blaze-svg.cabal view
@@ -0,0 +1,35 @@+name:                blaze-svg+version:             0.1.0.0+synopsis:            SVG combinator library+description:         SVG combinator library+homepage:            https://github.com/deepakjois/blaze-svg+license:             BSD3+license-file:        LICENSE+author:              Deepak Jois+maintainer:          deepak.jois@gmail.com+category:            Graphics+build-type:          Simple+cabal-version:       >=1.6++Extra-source-files:+  Util/Sanitize.hs+  Util/GenerateSvgCombinators.hs++Library+  Ghc-Options:       -Wall++  Exposed-modules:+    Text.Blaze.Svg+    Text.Blaze.Svg.Internal+    Text.Blaze.Svg11+    Text.Blaze.Svg11.Attributes++  Build-depends:+    base          >= 4  && < 5,+    mtl           >= 2  && < 3,+    blaze-html    >= 0.4 && < 0.5,+    bytestring    >= 0.9++Source-repository head+  Type:     git+  Location: http://github.com/deepakjois/blaze-svg.git