diff options
| author | Nicolas Dufour <nicoduf@yahoo.fr> | 2011-01-14 11:04:37 +0000 |
|---|---|---|
| committer | JazzyNico <nicoduf@yahoo.fr> | 2011-01-14 11:04:37 +0000 |
| commit | 8bd2cb17e339c04bffc3c2466eecb26dc5bb6887 (patch) | |
| tree | 945a5e91a341e3fd1c929a9408aca3c3b1c41ffd | |
| parent | Filters. New custom predefined filters (all ABCs, Neon draw, Color shilf, Sil... (diff) | |
| download | inkscape-8bd2cb17e339c04bffc3c2466eecb26dc5bb6887.tar.gz inkscape-8bd2cb17e339c04bffc3c2466eecb26dc5bb6887.zip | |
Extensions. Text support improvement in XAML and FXG export.
(bzr r10004)
| -rwxr-xr-x | share/extensions/svg2fxg.xsl | 29 | ||||
| -rwxr-xr-x | share/extensions/svg2xaml.xsl | 2223 |
2 files changed, 1690 insertions, 562 deletions
diff --git a/share/extensions/svg2fxg.xsl b/share/extensions/svg2fxg.xsl index 7569d0db7..4ccd62f27 100755 --- a/share/extensions/svg2fxg.xsl +++ b/share/extensions/svg2fxg.xsl @@ -1737,6 +1737,7 @@ extension-element-prefixes="math"> * Text tspan * Text flowPara * Text flowRegion (text frame) + * Get font size * Font size * Font weight * Font family @@ -1865,15 +1866,14 @@ extension-element-prefixes="math"> </xsl:template> <!-- - // Text font size // - SVG: font-size, FXG: fontSize + // Get text font size // --> -<xsl:template mode="font_size" match="*"> - <xsl:variable name="value"> - <xsl:if test="@font-size"> +<xsl:template mode="get_font_size" match="*"> + <xsl:choose> + <xsl:when test="@font-size"> <xsl:value-of select="@font-size" /> - </xsl:if> - <xsl:if test="@style and contains(@style, 'font-size:')"> + </xsl:when> + <xsl:when test="@style and contains(@style, 'font-size:')"> <xsl:variable name="font_size" select="normalize-space(substring-after(@style, 'font-size:'))" /> <xsl:choose> <xsl:when test="contains($font_size, ';')"> @@ -1883,7 +1883,20 @@ extension-element-prefixes="math"> <xsl:value-of select="$font_size" /> </xsl:otherwise> </xsl:choose> - </xsl:if> + </xsl:when> + <xsl:when test="name(..) = 'g' or name(..) = 'svg'"> + <xsl:apply-templates mode="get_font_size" select="parent::*"/> + </xsl:when> + </xsl:choose> +</xsl:template> + +<!-- + // Text font size // + SVG: font-size, FXG: fontSize +--> +<xsl:template mode="font_size" match="*"> + <xsl:variable name="value"> + <xsl:apply-templates mode="get_font_size" select="." /> </xsl:variable> <xsl:if test="$value != ''"> <xsl:attribute name="fontSize"> diff --git a/share/extensions/svg2xaml.xsl b/share/extensions/svg2xaml.xsl index 185ebe25d..a21da1290 100755 --- a/share/extensions/svg2xaml.xsl +++ b/share/extensions/svg2xaml.xsl @@ -3,7 +3,7 @@ <!-- Copyright (c) 2005-2007 authors: Original version: Toine de Greef (a.degreef@chello.nl) -Modified (2010) by Nicolas Dufour (nicoduf@yahoo.fr) (blur support, units +Modified (2010-2011) by Nicolas Dufour (nicoduf@yahoo.fr) (blur support, units convertion, comments, and some other fixes) Permission is hereby granted, free of charge, to any person obtaining a copy @@ -41,8 +41,16 @@ exclude-result-prefixes="rdf xlink xs exsl libxslt"> <xsl:param name="silverlight_compatible" select="1" /> -<!-- Root template. -Everything starts here! --> +<!-- + // Containers // + + * Root templace + * Groups +--> + +<!-- + // Root template // +--> <xsl:template match="/"> <xsl:choose> <xsl:when test="$silverlight_compatible = 1"> @@ -56,8 +64,10 @@ Everything starts here! --> </xsl:choose> </xsl:template> -<!-- SVG and groups -(including layers) --> +<!-- + // SVG and groups // + (including layers) +--> <xsl:template mode="forward" match="*[name(.) = 'svg' or name(.) = 'g']"> <xsl:choose> <xsl:when test="name(.) = 'svg' or @transform or @viewBox or @id or @clip-path or (@style and contains(@style, 'clip-path:url(#')) or (@width and not(contains(@width, '%'))) or @x or @y or (@height and not(contains(@height, '%'))) or *[name(.) = 'linearGradient' or name(.) = 'radialGradient' or name(.) = 'defs' or name(.) = 'clipPath']"> @@ -66,58 +76,79 @@ Everything starts here! --> <!-- <xsl:apply-templates mode="clip" select="." /> --> - <xsl:if test="@style and contains(@style, 'display:none')"><xsl:attribute name="Visibility">Collapsed</xsl:attribute></xsl:if> + <xsl:if test="@style and contains(@style, 'display:none')"> + <xsl:attribute name="Visibility">Collapsed</xsl:attribute> + </xsl:if> <xsl:if test="@style and contains(@style, 'opacity:')"> - <xsl:attribute name="Opacity"> + <xsl:attribute name="Opacity"> <xsl:choose> - <xsl:when test="contains(substring-after(@style, 'opacity:'), ';')"><xsl:value-of select="substring-before(substring-after(@style, 'opacity:'), ';')" /></xsl:when> - <xsl:otherwise><xsl:value-of select="substring-after(@style, 'opacity:')" /></xsl:otherwise> + <xsl:when test="contains(substring-after(@style, 'opacity:'), ';')"> + <xsl:value-of select="substring-before(substring-after(@style, 'opacity:'), ';')" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="substring-after(@style, 'opacity:')" /> + </xsl:otherwise> </xsl:choose> - </xsl:attribute> + </xsl:attribute> </xsl:if> <xsl:if test="@width and not(contains(@width, '%'))"> - <xsl:attribute name="Width"> + <xsl:attribute name="Width"> <xsl:call-template name="convert_unit"> - <xsl:with-param name="convert_value" select="@width" /> + <xsl:with-param name="convert_value" select="@width" /> </xsl:call-template> - </xsl:attribute></xsl:if> - <xsl:if test="@height and not(contains(@height, '%'))"> - <xsl:attribute name="Height"> + </xsl:attribute> + </xsl:if> + <xsl:if test="@height and not(contains(@height, '%'))"> + <xsl:attribute name="Height"> <xsl:call-template name="convert_unit"> - <xsl:with-param name="convert_value" select="@height" /> + <xsl:with-param name="convert_value" select="@height" /> </xsl:call-template> - </xsl:attribute></xsl:if> + </xsl:attribute> + </xsl:if> <xsl:if test="@x"> - <xsl:attribute name="Canvas.Left"> + <xsl:attribute name="Canvas.Left"> <xsl:call-template name="convert_unit"> - <xsl:with-param name="convert_value" select="@x" /> + <xsl:with-param name="convert_value" select="@x" /> </xsl:call-template> - </xsl:attribute></xsl:if> + </xsl:attribute></xsl:if> <xsl:if test="@y"> - <xsl:attribute name="Canvas.Top"> + <xsl:attribute name="Canvas.Top"> <xsl:call-template name="convert_unit"> - <xsl:with-param name="convert_value" select="@y" /> + <xsl:with-param name="convert_value" select="@y" /> </xsl:call-template> - </xsl:attribute></xsl:if> + </xsl:attribute> + </xsl:if> <xsl:if test="@viewBox"> - <xsl:variable name="viewBox"><xsl:value-of select="normalize-space(translate(@viewBox, ',', ' '))" /></xsl:variable> - <xsl:attribute name="Width"><xsl:value-of select="substring-before(substring-after(substring-after($viewBox, ' '), ' '), ' ')" /></xsl:attribute> - <xsl:attribute name="Height"><xsl:value-of select="substring-after(substring-after(substring-after($viewBox, ' '), ' '), ' ')" /></xsl:attribute> + <xsl:variable name="viewBox"> + <xsl:value-of select="normalize-space(translate(@viewBox, ',', ' '))" /> + </xsl:variable> + <xsl:attribute name="Width"> + <xsl:value-of select="substring-before(substring-after(substring-after($viewBox, ' '), ' '), ' ')" /> + </xsl:attribute> + <xsl:attribute name="Height"> + <xsl:value-of select="substring-after(substring-after(substring-after($viewBox, ' '), ' '), ' ')" /> + </xsl:attribute> <Canvas.RenderTransform> <TranslateTransform> - <xsl:attribute name="X"><xsl:value-of select="-number(substring-before($viewBox, ' '))" /></xsl:attribute> - <xsl:attribute name="Y"><xsl:value-of select="-number(substring-before(substring-after($viewBox, ' '), ' '))" /></xsl:attribute> + <xsl:attribute name="X"> + <xsl:value-of select="-number(substring-before($viewBox, ' '))" /> + </xsl:attribute> + <xsl:attribute name="Y"> + <xsl:value-of select="-number(substring-before(substring-after($viewBox, ' '), ' '))" /> + </xsl:attribute> </TranslateTransform> </Canvas.RenderTransform> </xsl:if> - <xsl:if test="@transform"> - <Canvas> - <Canvas.RenderTransform> - <TransformGroup><xsl:apply-templates mode="transform" select="." /></TransformGroup> - </Canvas.RenderTransform> - <xsl:apply-templates mode="forward" select="*" /> - </Canvas> - </xsl:if> + <xsl:if test="@transform"> + <Canvas> + <Canvas.RenderTransform> + <TransformGroup> + <xsl:apply-templates mode="transform" select="." /> + </TransformGroup> + </Canvas.RenderTransform> + <xsl:apply-templates mode="forward" select="*" /> + </Canvas> + </xsl:if> <xsl:if test="*[name(.) = 'linearGradient' or name(.) = 'radialGradient' or name(.) = 'defs' or name(.) = 'clipPath']"> <Canvas.Resources> @@ -135,67 +166,284 @@ Everything starts here! --> </xsl:choose> </xsl:template> -<!-- -// Resources (defs) // +<!-- + // Transforms // + All the matrix, translate, rotate... stuff. + Fixme: XAML transforms don't show the same result as SVG ones with the same values. + + * Parse transform + * Apply transform +--> + +<!-- + // Parse transform // +--> +<xsl:template name="parse_transform"> + <xsl:param name="input" /> + <xsl:choose> + + <!-- Matrix transform --> + <xsl:when test="starts-with($input, 'matrix(')"> + <MatrixTransform> + <xsl:attribute name="Matrix"> + <xsl:value-of select="normalize-space(translate(substring-before(substring-after($input, 'matrix('), ')'), ',', ' '))" /> + </xsl:attribute> + </MatrixTransform> + <xsl:call-template name="parse_transform"> + <xsl:with-param name="input" select="substring-after($input, ') ')" /> + </xsl:call-template> + </xsl:when> + + <!-- Scale transform --> + <xsl:when test="starts-with($input, 'scale(')"> + <ScaleTransform> + <xsl:variable name="scale" select="normalize-space(translate(substring-before(substring-after($input, 'scale('), ')'), ',', ' '))" /> + <xsl:choose> + <xsl:when test="contains($scale, ' ')"> + <xsl:attribute name="ScaleX"> + <xsl:value-of select="substring-before($scale, ' ')" /> + </xsl:attribute> + <xsl:attribute name="ScaleY"> + <xsl:value-of select="substring-after($scale, ' ')" /> + </xsl:attribute> + </xsl:when> + <xsl:otherwise> + <xsl:attribute name="ScaleX"> + <xsl:value-of select="$scale" /> + </xsl:attribute> + <xsl:attribute name="ScaleY"> + <xsl:value-of select="$scale" /> + </xsl:attribute> + </xsl:otherwise> + </xsl:choose> + </ScaleTransform> + <xsl:call-template name="parse_transform"> + <xsl:with-param name="input" select="substring-after($input, ') ')" /> + </xsl:call-template> + </xsl:when> + + <!-- Rotate transform --> + <xsl:when test="starts-with($input, 'rotate(')"> + <RotateTransform> + <xsl:attribute name="Angle"> + <xsl:value-of select="normalize-space(translate(substring-before(substring-after($input, 'rotate('), ')'), ',', ' '))" /> + </xsl:attribute> + <xsl:if test="@rx"> + <xsl:attribute name="CenterX"> + <xsl:value-of select="@rx" /> + </xsl:attribute> + </xsl:if> + <xsl:if test="@ry"> + <xsl:attribute name="CenterY"> + <xsl:value-of select="@ry" /> + </xsl:attribute> + </xsl:if> + </RotateTransform> + <xsl:call-template name="parse_transform"> + <xsl:with-param name="input" select="substring-after($input, ') ')" /> + </xsl:call-template> + </xsl:when> + + <!-- Skew transform --> + <xsl:when test="starts-with($input, 'skewX(')"> + <SkewTransform> + <xsl:attribute name="AngleX"> + <xsl:value-of select="normalize-space(translate(substring-before(substring-after($input, 'skewX('), ')'), ',', ' '))" /> + </xsl:attribute> + <xsl:call-template name="parse_transform"> + <xsl:with-param name="input" select="substring-after($input, ') ')" /> + </xsl:call-template> + </SkewTransform> + </xsl:when> + <xsl:when test="starts-with($input, 'skewY(')"> + <SkewTransform> + <xsl:attribute name="AngleY"> + <xsl:value-of select="normalize-space(translate(substring-before(substring-after($input, 'skewY('), ')'), ',', ' '))" /> + </xsl:attribute> + <xsl:call-template name="parse_transform"> + <xsl:with-param name="input" select="substring-after($input, ') ')" /> + </xsl:call-template> + </SkewTransform> + </xsl:when> + + <!-- Translate transform --> + <xsl:when test="starts-with($input, 'translate(')"> + <TranslateTransform> + <xsl:variable name="translate" select="normalize-space(translate(substring-before(substring-after($input, 'translate('), ')'), ',', ' '))" /> + <xsl:choose> + <xsl:when test="contains($translate, ' ')"> + <xsl:attribute name="X"> + <xsl:value-of select="substring-before($translate, ' ')" /> + </xsl:attribute> + <xsl:attribute name="Y"> + <xsl:value-of select="substring-after($translate, ' ')" /> + </xsl:attribute> + </xsl:when> + <xsl:otherwise> + <xsl:attribute name="X"> + <xsl:value-of select="$translate" /> + </xsl:attribute> + </xsl:otherwise> + </xsl:choose> + </TranslateTransform> + <xsl:call-template name="parse_transform"> + <xsl:with-param name="input" select="substring-after($input, ') ')" /> + </xsl:call-template> + </xsl:when> + </xsl:choose> +</xsl:template> + +<!-- + // Apply transform // +--> +<xsl:template mode="transform" match="*"> + <xsl:param name="mapped_type" /> + <xsl:if test="@transform or @gradientTransform"> + <xsl:variable name="transform"> + <xsl:choose> + <xsl:when test="@transform"> + <xsl:value-of select="@transform" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="@gradientTransform" /> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:variable name="transform_nodes"> + <xsl:call-template name="parse_transform"> + <xsl:with-param name="input" select="$transform" /> + </xsl:call-template> + </xsl:variable> + + <xsl:choose> + <xsl:when test="$mapped_type and $mapped_type != ''"> + <xsl:element name="{$mapped_type}.RenderTransform"> + <xsl:choose> + <xsl:when test="count(libxslt:node-set($transform_nodes)/*) = 1"> + <xsl:copy-of select="libxslt:node-set($transform_nodes)" /> + </xsl:when> + <xsl:when test="count(libxslt:node-set($transform_nodes)/*) > 1"> + <TransformGroup> + <xsl:copy-of select="libxslt:node-set($transform_nodes)" /> + </TransformGroup> + </xsl:when> + </xsl:choose> + </xsl:element> + </xsl:when> + <xsl:otherwise> + <!-- For instance LinearGradient.Transform --> + <xsl:choose> + <xsl:when test="count(libxslt:node-set($transform_nodes)/*) = 1"> + <xsl:copy-of select="libxslt:node-set($transform_nodes)" /> + </xsl:when> + <xsl:when test="count(libxslt:node-set($transform_nodes)/*) > 1"> + <TransformGroup> + <xsl:copy-of select="libxslt:node-set($transform_nodes)" /> + </TransformGroup> + </xsl:when> + </xsl:choose> + </xsl:otherwise> + </xsl:choose> + </xsl:if> +</xsl:template> -* Resources ids -* Generic defs template -* Generic filters template -* Filter effects -* Linked filter effects -* Linear gradients -* Radial gradients -* Generic gradient stops -* Clipping +<!-- + // Resources (defs) // + + * Resources ids + * Generic defs template + * Generic filters template + * Filter effects + * Linked filter effects + * Linear gradients + * Radial gradients + * Generic gradient stops + * Clipping --> -<!-- Resources ids --> +<!-- + // Resources ids // +--> <xsl:template mode="resources" match="*"> <!-- should be in-depth --> <xsl:if test="ancestor::*[name(.) = 'defs']"><xsl:attribute name="x:Key"><xsl:value-of select="@id" /></xsl:attribute></xsl:if> </xsl:template> -<!-- Generic defs template --> -<xsl:template mode="forward" match="defs"> +<!-- + // Generic defs template // +--> +<xsl:template mode="forward" match="*[name(.) = 'defs']"> <xsl:apply-templates mode="forward" /> </xsl:template> -<!-- Generic filters template -Limited to one filter (can be improved) --> +<!-- + // Generic filters template // + Limited to one filter (can be improved) +--> <xsl:template mode="forward" match="*[name(.) = 'filter']"> <xsl:if test="count(*) = 1"> <xsl:apply-templates mode="forward" /> </xsl:if> </xsl:template> -<!-- Filter effects --> +<!-- + // GaussianBlur filter effects // + Blur values approximated with d = floor(s * 3*sqrt(2*pi)/4 + 0.5) from: + http://www.w3.org/TR/SVG/filters.html#feGaussianBlurElement + + Not supported by XAML: + * Horizontal and vertical blur. +--> <xsl:template mode="forward" match="*[name(.) = 'feGaussianBlur']"> - <BlurEffect> - <xsl:if test="../@id"><xsl:attribute name="x:Key"><xsl:value-of select="../@id" /></xsl:attribute></xsl:if> - <xsl:if test="@stdDeviation"><xsl:attribute name="Radius"><xsl:value-of select="round(@stdDeviation * 3)" /></xsl:attribute></xsl:if> - </BlurEffect> + <BlurEffect> + <xsl:if test="../@id"><xsl:attribute name="x:Key"><xsl:value-of select="../@id" /></xsl:attribute></xsl:if> + <xsl:if test="@stdDeviation"> + <xsl:variable name="blur" select="normalize-space(translate(@stdDeviation, ',', ' '))" /> + <xsl:choose> + <xsl:when test="not(contains($blur, ' '))"> + <xsl:attribute name="Radius"> + <xsl:value-of select="floor($blur * 1.88 + 0.5)" /> + </xsl:attribute> + </xsl:when> + <xsl:otherwise> + <xsl:attribute name="Radius"> + <xsl:value-of select="floor(substring-before($blur, ' ') * 1.88 + 0.5)" /> + </xsl:attribute> + </xsl:otherwise> + </xsl:choose> + </xsl:if> + </BlurEffect> </xsl:template> -<!-- Linked filter effect --> +<!-- + // Linked filter effect // + Only supports blurs +--> <xsl:template mode="filter_effect" match="*"> -<xsl:choose> + <xsl:choose> <xsl:when test="@filter and starts-with(@filter, 'url(#')"> - <xsl:attribute name="Effect"> - <xsl:value-of select="concat('{StaticResource ', substring-before(substring-after(@filter, 'url(#'), ')'), '}')" /> - </xsl:attribute> + <xsl:attribute name="Effect"> + <xsl:value-of select="concat('{StaticResource ', substring-before(substring-after(@filter, 'url(#'), ')'), '}')" /> + </xsl:attribute> </xsl:when> <xsl:when test="@style and contains(@style, 'filter:url(#')"> - <xsl:attribute name="Effect"> - <xsl:value-of select="concat('{StaticResource ', substring-before(substring-after(@style, 'filter:url(#'), ')'), '}')" /> - </xsl:attribute> + <xsl:attribute name="Effect"> + <xsl:value-of select="concat('{StaticResource ', substring-before(substring-after(@style, 'filter:url(#'), ')'), '}')" /> + </xsl:attribute> </xsl:when> -</xsl:choose> + </xsl:choose> </xsl:template> -<!-- Linear gradient --> +<!-- + // Linear gradient // +--> <xsl:template mode="forward" match="*[name(.) = 'linearGradient']"> <LinearGradientBrush> - <xsl:if test="@id"><xsl:attribute name="x:Key"><xsl:value-of select="@id" /></xsl:attribute></xsl:if> + <xsl:if test="@id"> + <xsl:attribute name="x:Key"> + <xsl:value-of select="@id" /> + </xsl:attribute> + </xsl:if> <xsl:attribute name="MappingMode"> <xsl:choose> <xsl:when test="@gradientUnits = 'userSpaceOnUse' ">Absolute</xsl:when> @@ -215,24 +463,36 @@ Limited to one filter (can be improved) --> <xsl:when test="@x1 and @y1 and @x2 and @y2"> <xsl:choose> <xsl:when test="contains(@x1, '%') and contains(@y1, '%')"> - <xsl:attribute name="StartPoint"><xsl:value-of select="concat(substring-before(@x1, '%') div 100, ',', substring-before(@y1,'%') div 100)" /></xsl:attribute> + <xsl:attribute name="StartPoint"> + <xsl:value-of select="concat(substring-before(@x1, '%') div 100, ',', substring-before(@y1,'%') div 100)" /> + </xsl:attribute> </xsl:when> <xsl:otherwise> - <xsl:attribute name="StartPoint"><xsl:value-of select="concat(@x1, ',', @y1)" /></xsl:attribute> + <xsl:attribute name="StartPoint"> + <xsl:value-of select="concat(@x1, ',', @y1)" /> + </xsl:attribute> </xsl:otherwise> </xsl:choose> <xsl:choose> <xsl:when test="contains(@x2, '%') and contains(@y2, '%')"> - <xsl:attribute name="EndPoint"><xsl:value-of select="concat(substring-before(@x2, '%') div 100, ',', substring-before(@y2,'%') div 100)" /></xsl:attribute> + <xsl:attribute name="EndPoint"> + <xsl:value-of select="concat(substring-before(@x2, '%') div 100, ',', substring-before(@y2,'%') div 100)" /> + </xsl:attribute> </xsl:when> <xsl:otherwise> - <xsl:attribute name="EndPoint"><xsl:value-of select="concat(@x2, ',', @y2)" /></xsl:attribute> + <xsl:attribute name="EndPoint"> + <xsl:value-of select="concat(@x2, ',', @y2)" /> + </xsl:attribute> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> - <xsl:attribute name="StartPoint"><xsl:value-of select="'0,0'" /></xsl:attribute> - <xsl:attribute name="EndPoint"><xsl:value-of select="'1,1'" /></xsl:attribute> + <xsl:attribute name="StartPoint"> + <xsl:value-of select="'0,0'" /> + </xsl:attribute> + <xsl:attribute name="EndPoint"> + <xsl:value-of select="'1,1'" /> + </xsl:attribute> </xsl:otherwise> </xsl:choose> <LinearGradientBrush.GradientStops> @@ -242,22 +502,30 @@ Limited to one filter (can be improved) --> <xsl:variable name="reference_id" select="@xlink:href" /> <xsl:apply-templates mode="forward" select="//*[name(.) = 'linearGradient' and $reference_id = concat('#', @id)]/*" /> </xsl:when> - <xsl:otherwise><xsl:apply-templates mode="forward" /></xsl:otherwise> + <xsl:otherwise> + <xsl:apply-templates mode="forward" /> + </xsl:otherwise> </xsl:choose> </GradientStopCollection> </LinearGradientBrush.GradientStops> <xsl:if test="@gradientTransform"> - <LinearGradientBrush.Transform> - <xsl:apply-templates mode="transform" select="." /> - </LinearGradientBrush.Transform> - </xsl:if> + <LinearGradientBrush.Transform> + <xsl:apply-templates mode="transform" select="." /> + </LinearGradientBrush.Transform> + </xsl:if> </LinearGradientBrush> </xsl:template> -<!-- Radial gradient --> +<!-- + // Radial gradient // +--> <xsl:template mode="forward" match="*[name(.) = 'radialGradient']"> <RadialGradientBrush> - <xsl:if test="@id"><xsl:attribute name="x:Key"><xsl:value-of select="@id" /></xsl:attribute></xsl:if> + <xsl:if test="@id"> + <xsl:attribute name="x:Key"> + <xsl:value-of select="@id" /> + </xsl:attribute> + </xsl:if> <xsl:attribute name="MappingMode"> <xsl:choose> <xsl:when test="@gradientUnits = 'userSpaceOnUse' ">Absolute</xsl:when> @@ -300,12 +568,20 @@ Limited to one filter (can be improved) --> <xsl:if test="@r"> <xsl:choose> <xsl:when test="contains(@r, '%')"> - <xsl:attribute name="RadiusX"><xsl:value-of select="number(substring-before(@r, '%')) div 100" /></xsl:attribute> - <xsl:attribute name="RadiusY"><xsl:value-of select="number(substring-before(@r, '%')) div 100" /></xsl:attribute> + <xsl:attribute name="RadiusX"> + <xsl:value-of select="number(substring-before(@r, '%')) div 100" /> + </xsl:attribute> + <xsl:attribute name="RadiusY"> + <xsl:value-of select="number(substring-before(@r, '%')) div 100" /> + </xsl:attribute> </xsl:when> <xsl:otherwise> - <xsl:attribute name="RadiusX"><xsl:value-of select="@r" /></xsl:attribute> - <xsl:attribute name="RadiusY"><xsl:value-of select="@r" /></xsl:attribute> + <xsl:attribute name="RadiusX"> + <xsl:value-of select="@r" /> + </xsl:attribute> + <xsl:attribute name="RadiusY"> + <xsl:value-of select="@r" /> + </xsl:attribute> </xsl:otherwise> </xsl:choose> </xsl:if> @@ -316,19 +592,23 @@ Limited to one filter (can be improved) --> <xsl:variable name="reference_id" select="@xlink:href" /> <xsl:apply-templates mode="forward" select="//*[name(.) = 'linearGradient' and $reference_id = concat('#', @id)]/*" /> </xsl:when> - <xsl:otherwise><xsl:apply-templates mode="forward" /></xsl:otherwise> + <xsl:otherwise> + <xsl:apply-templates mode="forward" /> + </xsl:otherwise> </xsl:choose> </GradientStopCollection> </RadialGradientBrush.GradientStops> <xsl:if test="@gradientTransform"> - <RadialGradientBrush.Transform> - <xsl:apply-templates mode="transform" select="." /> - </RadialGradientBrush.Transform> + <RadialGradientBrush.Transform> + <xsl:apply-templates mode="transform" select="." /> + </RadialGradientBrush.Transform> </xsl:if> </RadialGradientBrush> </xsl:template> -<!-- Generic gradient stops --> +<!-- + // Gradient stop // +--> <xsl:template mode="forward" match="*[name(.) = 'stop']"> <GradientStop> <!--xsl:apply-templates mode="stop_opacity" select="." /--> @@ -338,37 +618,52 @@ Limited to one filter (can be improved) --> </GradientStop> </xsl:template> -<!-- Clipping --> +<!-- + // Clipping // +--> <xsl:template mode="clip" match="*"> <xsl:choose> - <xsl:when test="@clip-path and defs/clipPath/path/@d"><xsl:attribute name="Clip"><xsl:value-of select="defs/clipPath/path/@d" /></xsl:attribute></xsl:when> - <xsl:when test="@clip-path and starts-with(@clip-path, 'url(#')"><xsl:attribute name="Clip"><xsl:value-of select="concat('{StaticResource ', substring-before(substring-after(@clip-path, 'url(#'), ')'), '}')" /></xsl:attribute></xsl:when> - <xsl:when test="@style and contains(@style, 'clip-path:url(#')"><xsl:attribute name="Clip"><xsl:value-of select="concat('{StaticResource ', substring-before(substring-after(@style, 'url(#'), ')'), '}')" /></xsl:attribute></xsl:when> - <xsl:when test="clipPath"><xsl:apply-templates mode="forward" /></xsl:when> + <xsl:when test="@clip-path and defs/clipPath/path/@d"> + <xsl:attribute name="Clip"> + <xsl:value-of select="defs/clipPath/path/@d" /> + </xsl:attribute> + </xsl:when> + <xsl:when test="@clip-path and starts-with(@clip-path, 'url(#')"> + <xsl:attribute name="Clip"> + <xsl:value-of select="concat('{StaticResource ', substring-before(substring-after(@clip-path, 'url(#'), ')'), '}')" /> + </xsl:attribute> + </xsl:when> + <xsl:when test="@style and contains(@style, 'clip-path:url(#')"> + <xsl:attribute name="Clip"> + <xsl:value-of select="concat('{StaticResource ', substring-before(substring-after(@style, 'url(#'), ')'), '}')" /> + </xsl:attribute> + </xsl:when> + <xsl:when test="clipPath"> + <xsl:apply-templates mode="forward" /> + </xsl:when> </xsl:choose> </xsl:template> <!-- // Misc templates // -* Object description -* Id converter -* Decimal to hexadecimal converter -* Unit to pixel converter -* Title and description -* Misc ignored stuff (markers, patterns, styles) -* Symbols -* Use -* RDF and foreign objects -* Unknows tags + * Id converter + * Decimal to hexadecimal converter + * Unit to pixel converter + * Object description + * Title and description + * Switch + * Symbols + * Use + * RDF and foreign objects + * Misc ignored stuff (markers, patterns, styles) + * Unknows tags --> -<!-- Object description --> -<xsl:template mode="desc" match="*"> - <xsl:if test="*[name(.) = 'desc']/text()"><xsl:attribute name="Tag"><xsl:value-of select="*[name(.) = 'desc']/text()" /></xsl:attribute></xsl:if> -</xsl:template> - -<!-- Id converter. Removes "-" from the original id. --> +<!-- + // Id converter // + Removes "-" from the original id +--> <xsl:template mode="id" match="*"> <xsl:if test="@id"> <xsl:attribute name="Name"><xsl:value-of select="translate(@id, '- ', '')" /></xsl:attribute> @@ -378,89 +673,140 @@ Limited to one filter (can be improved) --> </xsl:if> </xsl:template> -<!-- Decimal to hexadecimal converter --> +<!-- + // Decimal to hexadecimal converter // +--> <xsl:template name="to_hex"> <xsl:param name="convert" /> <xsl:value-of select="concat(substring('0123456789ABCDEF', 1 + floor(round($convert) div 16), 1), substring('0123456789ABCDEF', 1 + round($convert) mod 16, 1))" /> </xsl:template> -<!-- Unit to pixel converter -Values with units (except %) are converted to pixels and rounded. -Unknown units are kept. --> +<!-- + // Unit to pixel converter // + Values with units (except %) are converted to pixels and rounded. + Unknown units are kept. + em, ex and % not implemented +--> <xsl:template name="convert_unit"> <xsl:param name="convert_value" /> - <xsl:choose> - <xsl:when test="contains($convert_value, 'px')"> - <xsl:value-of select="round(translate($convert_value, 'px', ''))" /> - </xsl:when> - <xsl:when test="contains($convert_value, 'pt')"> - <xsl:value-of select="round(translate($convert_value, 'pt', '') * 1.25)" /> - </xsl:when> - <xsl:when test="contains($convert_value, 'pc')"> - <xsl:value-of select="round(translate($convert_value, 'pc', '') * 15)" /> - </xsl:when> - <xsl:when test="contains($convert_value, 'mm')"> - <xsl:value-of select="round(translate($convert_value, 'mm', '') * 3.543307)" /> - </xsl:when> - <xsl:when test="contains($convert_value, 'cm')"> - <xsl:value-of select="round(translate($convert_value, 'cm', '') * 35.43307)" /> - </xsl:when> - <xsl:when test="contains($convert_value, 'in')"> - <xsl:value-of select="round(translate($convert_value, 'in', '') * 90)" /> - </xsl:when> - <xsl:when test="contains($convert_value, 'ft')"> - <xsl:value-of select="round(translate($convert_value, 'ft', '') * 1080)" /> - </xsl:when> - <xsl:when test="not(string(number($convert_value))='NaN')"> - <xsl:value-of select="round($convert_value)" /> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="$convert_value" /> - </xsl:otherwise> - </xsl:choose> + <xsl:choose> + <xsl:when test="contains($convert_value, 'px')"> + <xsl:value-of select="round(translate($convert_value, 'px', ''))" /> + </xsl:when> + <xsl:when test="contains($convert_value, 'pt')"> + <xsl:value-of select="round(translate($convert_value, 'pt', '') * 1.25)" /> + </xsl:when> + <xsl:when test="contains($convert_value, 'pc')"> + <xsl:value-of select="round(translate($convert_value, 'pc', '') * 15)" /> + </xsl:when> + <xsl:when test="contains($convert_value, 'mm')"> + <xsl:value-of select="round(translate($convert_value, 'mm', '') * 3.543307)" /> + </xsl:when> + <xsl:when test="contains($convert_value, 'cm')"> + <xsl:value-of select="round(translate($convert_value, 'cm', '') * 35.43307)" /> + </xsl:when> + <xsl:when test="contains($convert_value, 'in')"> + <xsl:value-of select="round(translate($convert_value, 'in', '') * 90)" /> + </xsl:when> + <xsl:when test="contains($convert_value, 'ft')"> + <xsl:value-of select="round(translate($convert_value, 'ft', '') * 1080)" /> + </xsl:when> + <xsl:when test="not(string(number($convert_value))='NaN')"> + <xsl:value-of select="round($convert_value)" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$convert_value" /> + </xsl:otherwise> + </xsl:choose> </xsl:template> -<!-- Title and description -Blank template. Title is ignored and desc is converted to Tag in the mode="desc" template +<!-- + // Object description // +--> +<xsl:template mode="desc" match="*"> + <xsl:if test="*[name(.) = 'desc']/text()"> + <xsl:attribute name="Tag"> + <xsl:value-of select="*[name(.) = 'desc']/text()" /> + </xsl:attribute> + </xsl:if> +</xsl:template> + +<!-- + // Title and description // + Title is ignored and desc is converted to Tag in the mode="desc" template --> <xsl:template mode="forward" match="*[name(.) = 'title' or name(.) = 'desc']"> - <!-- --> + </xsl:template> -<!-- Misc ignored stuff (markers, patterns, styles) --> -<xsl:template mode="forward" match="*[name(.) = 'marker' or name(.) = 'pattern' or name(.) = 'style']"> - <!-- --> +<!-- + // Switch // +--> +<xsl:template mode="forward" match="*[name(.) = 'switch']"> + <xsl:apply-templates mode="forward" /> </xsl:template> -<!-- Symbols --> +<!-- + // Symbols // +--> <xsl:template mode="forward" match="*[name(.) = 'symbol']"> <Style> - <xsl:if test="@id"><xsl:attribute name="x:Key"><xsl:value-of select="@id" /></xsl:attribute></xsl:if> + <xsl:if test="@id"> + <xsl:attribute name="x:Key"> + <xsl:value-of select="@id" /> + </xsl:attribute> + </xsl:if> <Canvas> <xsl:apply-templates mode="forward" /> </Canvas> </Style> </xsl:template> -<!-- Use --> +<!-- + // Use // + (since it is not supported by Inkscape, not implemented yet) +--> <xsl:template mode="forward" match="*[name(.) = 'use']"> <Canvas> - <xsl:if test="@xlink:href"><xsl:attribute name="Style"><xsl:value-of select="@xlink:href" /></xsl:attribute></xsl:if> + <xsl:if test="@xlink:href"> + <xsl:attribute name="Style"> + <xsl:value-of select="@xlink:href" /> + </xsl:attribute> + </xsl:if> <!--xsl:apply-templates mode="transform" select="." /--> <xsl:apply-templates mode="forward" /> </Canvas> </xsl:template> -<!-- RDF and foreign objects --> +<!-- + // RDF and foreign objects // +--> <xsl:template mode="forward" match="rdf:RDF | *[name(.) = 'foreignObject']"> - <!-- --> + </xsl:template> -<!-- Unknown tags --> +<!-- + // Misc ignored stuff (markers, patterns, styles) // +--> +<xsl:template mode="forward" match="*[name(.) = 'marker' or name(.) = 'pattern' or name(.) = 'style']"> + +</xsl:template> + +<!-- + // Unknown tags // + With generic and mode="forward" templates +--> <xsl:template match="*"> -<xsl:comment><xsl:value-of select="concat('Unknown tag: ', name(.))" /></xsl:comment> + <xsl:comment> + <xsl:value-of select="concat('Unknown tag: ', name(.))" /> + </xsl:comment> </xsl:template> +<xsl:template mode="forward" match="*"> + <xsl:comment> + <xsl:value-of select="concat('Unknown tag: ', name(.))" /> + </xsl:comment> +</xsl:template> <!-- // Colors and patterns // @@ -486,36 +832,84 @@ Blank template. Title is ignored and desc is converted to Tag in the mode="desc" * Gradient stop offset --> -<!-- Generic color template --> +<!-- + // Generic color template // +--> <xsl:template name="template_color"> <xsl:param name="colorspec" /> <xsl:param name="opacityspec" /> <xsl:choose> <xsl:when test="starts-with($colorspec, 'rgb(') and not(contains($colorspec , '%'))"> <xsl:value-of select="'#'" /> - <xsl:if test="$opacityspec != '' and number($opacityspec) != 1"><xsl:call-template name="to_hex"><xsl:with-param name="convert"><xsl:value-of select="round(number($opacityspec) * 255)" /></xsl:with-param></xsl:call-template></xsl:if> - <xsl:call-template name="to_hex"><xsl:with-param name="convert"><xsl:value-of select="substring-before(substring-after($colorspec, 'rgb('), ',')" /></xsl:with-param></xsl:call-template> - <xsl:call-template name="to_hex"><xsl:with-param name="convert"><xsl:value-of select="substring-before(substring-after(substring-after($colorspec, 'rgb('), ','), ',')" /></xsl:with-param></xsl:call-template> - <xsl:call-template name="to_hex"><xsl:with-param name="convert"><xsl:value-of select="substring-before(substring-after(substring-after(substring-after($colorspec, 'rgb('), ','), ','), ')')" /></xsl:with-param></xsl:call-template> + <xsl:if test="$opacityspec != '' and number($opacityspec) != 1"> + <xsl:call-template name="to_hex"> + <xsl:with-param name="convert"> + <xsl:value-of select="round(number($opacityspec) * 255)" /> + </xsl:with-param> + </xsl:call-template> + </xsl:if> + <xsl:call-template name="to_hex"> + <xsl:with-param name="convert"> + <xsl:value-of select="substring-before(substring-after($colorspec, 'rgb('), ',')" /> + </xsl:with-param> + </xsl:call-template> + <xsl:call-template name="to_hex"> + <xsl:with-param name="convert"> + <xsl:value-of select="substring-before(substring-after(substring-after($colorspec, 'rgb('), ','), ',')" /> + </xsl:with-param> + </xsl:call-template> + <xsl:call-template name="to_hex"> + <xsl:with-param name="convert"> + <xsl:value-of select="substring-before(substring-after(substring-after(substring-after($colorspec, 'rgb('), ','), ','), ')')" /> + </xsl:with-param> + </xsl:call-template> </xsl:when> <xsl:when test="starts-with($colorspec, 'rgb(') and contains($colorspec , '%')"> <xsl:value-of select="'#'" /> - <xsl:if test="$opacityspec != '' and number($opacityspec) != 1"><xsl:call-template name="to_hex"><xsl:with-param name="convert"><xsl:value-of select="round(number($opacityspec) * 255)" /></xsl:with-param></xsl:call-template></xsl:if> - <xsl:call-template name="to_hex"><xsl:with-param name="convert"><xsl:value-of select="number(substring-before(substring-after($colorspec, 'rgb('), '%,')) * 255 div 100" /></xsl:with-param></xsl:call-template> - <xsl:call-template name="to_hex"><xsl:with-param name="convert"><xsl:value-of select="number(substring-before(substring-after(substring-after($colorspec, 'rgb('), ','), '%,')) * 255 div 100" /></xsl:with-param></xsl:call-template> - <xsl:call-template name="to_hex"><xsl:with-param name="convert"><xsl:value-of select="number(substring-before(substring-after(substring-after(substring-after($colorspec, 'rgb('), ','), ','), '%)')) * 255 div 100" /></xsl:with-param></xsl:call-template> + <xsl:if test="$opacityspec != '' and number($opacityspec) != 1"> + <xsl:call-template name="to_hex"> + <xsl:with-param name="convert"> + <xsl:value-of select="round(number($opacityspec) * 255)" /> + </xsl:with-param> + </xsl:call-template> + </xsl:if> + <xsl:call-template name="to_hex"> + <xsl:with-param name="convert"> + <xsl:value-of select="number(substring-before(substring-after($colorspec, 'rgb('), '%,')) * 255 div 100" /> + </xsl:with-param> + </xsl:call-template> + <xsl:call-template name="to_hex"> + <xsl:with-param name="convert"> + <xsl:value-of select="number(substring-before(substring-after(substring-after($colorspec, 'rgb('), ','), '%,')) * 255 div 100" /> + </xsl:with-param> + </xsl:call-template> + <xsl:call-template name="to_hex"> + <xsl:with-param name="convert"> + <xsl:value-of select="number(substring-before(substring-after(substring-after(substring-after($colorspec, 'rgb('), ','), ','), '%)')) * 255 div 100" /> + </xsl:with-param> + </xsl:call-template> </xsl:when> <xsl:when test="starts-with($colorspec, '#')"> <xsl:value-of select="'#'" /> - <xsl:if test="$opacityspec != ''"><xsl:call-template name="to_hex"><xsl:with-param name="convert"><xsl:value-of select="round(number($opacityspec) * 255)" /></xsl:with-param></xsl:call-template></xsl:if> + <xsl:if test="$opacityspec != ''"> + <xsl:call-template name="to_hex"> + <xsl:with-param name="convert"> + <xsl:value-of select="round(number($opacityspec) * 255)" /> + </xsl:with-param> + </xsl:call-template> + </xsl:if> <xsl:choose> <xsl:when test="string-length(substring-after($colorspec, '#')) = 3"> - <xsl:variable name="colorspec3"><xsl:value-of select="translate(substring-after($colorspec, '#'), 'abcdefgh', 'ABCDEFGH')" /></xsl:variable> + <xsl:variable name="colorspec3"> + <xsl:value-of select="translate(substring-after($colorspec, '#'), 'abcdefgh', 'ABCDEFGH')" /> + </xsl:variable> <xsl:value-of select="concat(substring($colorspec3, 1, 1), substring($colorspec3, 1, 1))" /> <xsl:value-of select="concat(substring($colorspec3, 2, 1), substring($colorspec3, 2, 1))" /> <xsl:value-of select="concat(substring($colorspec3, 3, 1), substring($colorspec3, 3, 1))" /> </xsl:when> - <xsl:otherwise><xsl:value-of select="translate(substring-after($colorspec, '#'), 'abcdefgh', 'ABCDEFGH')" /></xsl:otherwise> + <xsl:otherwise> + <xsl:value-of select="translate(substring-after($colorspec, '#'), 'abcdefgh', 'ABCDEFGH')" /> + </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> @@ -523,68 +917,134 @@ Blank template. Title is ignored and desc is converted to Tag in the mode="desc" <xsl:choose> <xsl:when test="$named_color_hex and $named_color_hex != ''"> <xsl:value-of select="'#'" /> - <xsl:if test="$opacityspec != '' and number($opacityspec) != 1"><xsl:call-template name="to_hex"><xsl:with-param name="convert"><xsl:value-of select="number($opacityspec) * 255" /></xsl:with-param></xsl:call-template></xsl:if> + <xsl:if test="$opacityspec != '' and number($opacityspec) != 1"> + <xsl:call-template name="to_hex"> + <xsl:with-param name="convert"> + <xsl:value-of select="number($opacityspec) * 255" /> + </xsl:with-param> + </xsl:call-template> + </xsl:if> <xsl:value-of select="substring-after($named_color_hex, '#')" /> </xsl:when> - <xsl:otherwise><xsl:value-of select="$colorspec" /></xsl:otherwise> + <xsl:otherwise> + <xsl:value-of select="$colorspec" /> + </xsl:otherwise> </xsl:choose> </xsl:otherwise> </xsl:choose> </xsl:template> -<!-- Fill --> +<!-- + // Fill // +--> <xsl:template mode="fill" match="*"> - <xsl:choose> - <xsl:when test="@fill and starts-with(@fill, 'url(#')"><xsl:value-of select="concat('{StaticResource ', substring-before(substring-after(@fill, 'url(#'), ')'), '}')" /></xsl:when> - <xsl:when test="@fill"><xsl:value-of select="@fill" /></xsl:when> - <xsl:when test="@style and contains(@style, 'fill:') and starts-with(substring-after(@style, 'fill:'), 'url(#')"><xsl:value-of select="concat('{StaticResource ', substring-before(substring-after(@style, 'url(#'), ')'), '}')" /></xsl:when> - <xsl:when test="@style and contains(@style, 'fill:')"> - <xsl:variable name="Fill" select="substring-after(@style, 'fill:')" /> - <xsl:choose> - <xsl:when test="contains($Fill, ';')"> - <xsl:value-of select="substring-before($Fill, ';')" /> - </xsl:when> - <xsl:otherwise><xsl:value-of select="$Fill" /></xsl:otherwise> - </xsl:choose> - </xsl:when> - <xsl:when test="name(..) = 'g' or name(..) = 'svg'"><xsl:apply-templates mode="fill" select="parent::*"/></xsl:when> - </xsl:choose> + <xsl:variable name="value"> + <xsl:choose> + <xsl:when test="@fill and starts-with(@fill, 'url(#')"> + <xsl:value-of select="concat('{StaticResource ', substring-before(substring-after(@fill, 'url(#'), ')'), '}')" /> + </xsl:when> + <xsl:when test="@fill"> + <xsl:value-of select="@fill" /> + </xsl:when> + <xsl:when test="@style and contains(@style, 'fill:') and starts-with(substring-after(@style, 'fill:'), 'url(#')"> + <xsl:value-of select="concat('{StaticResource ', substring-before(substring-after(@style, 'url(#'), ')'), '}')" /> + </xsl:when> + <xsl:when test="@style and contains(@style, 'fill:')"> + <xsl:variable name="Fill" select="substring-after(@style, 'fill:')" /> + <xsl:choose> + <xsl:when test="contains($Fill, ';')"> + <xsl:value-of select="substring-before($Fill, ';')" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$Fill" /> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + <xsl:when test="name(..) = 'g' or name(..) = 'svg'"> + <xsl:apply-templates mode="fill" select="parent::*"/> + </xsl:when> + </xsl:choose> + </xsl:variable> + <xsl:if test="$value"> + <!-- Removes unwanted characters in the color link (TODO: export to a specific template)--> + <xsl:value-of select="normalize-space(translate($value, '"', ''))" /> + </xsl:if> </xsl:template> -<!-- Fill opacity --> +<!-- + // Fill opacity // +--> <xsl:template mode="fill_opacity" match="*"> + <xsl:variable name="value"> <xsl:choose> - <xsl:when test="@fill-opacity"><xsl:value-of select="@fill-opacity" /></xsl:when> + <xsl:when test="@fill-opacity"> + <xsl:value-of select="@fill-opacity" /> + </xsl:when> <xsl:when test="@style and contains(@style, 'fill-opacity:')"> <xsl:variable name="Opacity" select="substring-after(@style, 'fill-opacity:')" /> <xsl:choose> - <xsl:when test="contains($Opacity, ';')"><xsl:value-of select="substring-before($Opacity, ';')" /></xsl:when> - <xsl:otherwise><xsl:value-of select="$Opacity" /></xsl:otherwise> + <xsl:when test="contains($Opacity, ';')"> + <xsl:value-of select="substring-before($Opacity, ';')" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$Opacity" /> + </xsl:otherwise> </xsl:choose> </xsl:when> - <xsl:when test="name(..) = 'g' or name(..) = 'svg'"><xsl:apply-templates mode="fill_opacity" select="parent::*" /></xsl:when> + <xsl:when test="name(..) = 'g' or name(..) = 'svg'"> + <xsl:apply-templates mode="fill_opacity" select="parent::*" /> + </xsl:when> + <xsl:otherwise>1</xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:choose> + <xsl:when test="$value < 0">0</xsl:when> + <xsl:when test="$value > 1">1</xsl:when> + <xsl:otherwise> + <xsl:value-of select="$value" /> + </xsl:otherwise> </xsl:choose> </xsl:template> -<!-- Fill rule --> +<!-- + // Fill rule // +--> <xsl:template mode="fill_rule" match="*"> <xsl:choose> - <xsl:when test="@fill-rule and (@fill-rule = 'nonzero' or @fill-rule = 'evenodd')"><xsl:attribute name="FillRule"><xsl:value-of select="@fill-rule" /></xsl:attribute></xsl:when> + <xsl:when test="@fill-rule and (@fill-rule = 'nonzero' or @fill-rule = 'evenodd')"> + <xsl:attribute name="FillRule"> + <xsl:value-of select="@fill-rule" /> + </xsl:attribute> + </xsl:when> <xsl:when test="@style and contains(@style, 'fill-rule:')"> - <xsl:variable name="FillRule" select="substring-after(@style, 'fill-rule:')" /> + <xsl:variable name="FillRule" select="normalize-space(substring-after(@style, 'fill-rule:'))" /> <xsl:choose> <xsl:when test="contains($FillRule, ';')"> - <xsl:if test="substring-before($FillRule, ';') = 'nonzero' or substring-before($FillRule, ';') = 'evenodd'"><xsl:attribute name="FillRule"><xsl:value-of select="substring-before($FillRule, ';')" /></xsl:attribute></xsl:if> + <xsl:if test="substring-before($FillRule, ';') = 'nonzero' or substring-before($FillRule, ';') = 'evenodd'"> + <xsl:attribute name="FillRule"> + <xsl:value-of select="substring-before($FillRule, ';')" /> + </xsl:attribute> + </xsl:if> + </xsl:when> + <xsl:when test="$FillRule = 'nonzero' or $FillRule = 'evenodd'"> + <xsl:attribute name="FillRule"> + <xsl:value-of select="$FillRule" /> + </xsl:attribute> </xsl:when> - <xsl:when test="$FillRule = 'nonzero' or $FillRule = 'evenodd'"><xsl:attribute name="FillRule"><xsl:value-of select="$FillRule" /></xsl:attribute></xsl:when> </xsl:choose> </xsl:when> - <xsl:when test="name(..) = 'g' or name(..) = 'svg'"><xsl:apply-templates mode="fill_rule" select="parent::*"/></xsl:when> - <xsl:otherwise><xsl:attribute name="FillRule">NonZero</xsl:attribute></xsl:otherwise> + <xsl:when test="name(..) = 'g' or name(..) = 'svg'"> + <xsl:apply-templates mode="fill_rule" select="parent::*"/> + </xsl:when> + <xsl:otherwise> + <xsl:attribute name="FillRule">NonZero</xsl:attribute> + </xsl:otherwise> </xsl:choose> </xsl:template> -<!-- Generic fill template --> +<!-- + // Generic fill template // +--> <xsl:template mode="template_fill" match="*"> <xsl:variable name="fill"><xsl:apply-templates mode="fill" select="." /></xsl:variable> <xsl:variable name="fill_opacity"><xsl:apply-templates mode="fill_opacity" select="." /></xsl:variable> @@ -594,9 +1054,13 @@ Blank template. Title is ignored and desc is converted to Tag in the mode="desc" <xsl:when test="$fill != ''"> <xsl:call-template name="template_color"> <xsl:with-param name="colorspec"> - <xsl:if test="$fill != 'none'"><xsl:value-of select="$fill" /></xsl:if> + <xsl:if test="$fill != 'none'"> + <xsl:value-of select="$fill" /> + </xsl:if> + </xsl:with-param> + <xsl:with-param name="opacityspec"> + <xsl:value-of select="$fill_opacity" /> </xsl:with-param> - <xsl:with-param name="opacityspec"><xsl:value-of select="$fill_opacity" /></xsl:with-param> </xsl:call-template> </xsl:when> <xsl:otherwise>#000000</xsl:otherwise> @@ -605,129 +1069,234 @@ Blank template. Title is ignored and desc is converted to Tag in the mode="desc" </xsl:if> </xsl:template> -<!-- Stroke --> +<!-- + // Stroke // +--> <xsl:template mode="stroke" match="*"> <xsl:choose> - <xsl:when test="@stroke and starts-with(@stroke, 'url(#')"><xsl:value-of select="concat('{StaticResource ', substring-before(substring-after(@stroke, 'url(#'), ')'), '}')" /></xsl:when> - <xsl:when test="@stroke and @stroke != 'none'"><xsl:value-of select="@stroke" /></xsl:when> - <xsl:when test="@style and contains(@style, 'stroke:') and starts-with(substring-after(@style, 'stroke:'), 'url(#')"><xsl:value-of select="concat('{StaticResource ', substring-before(substring-after(@style, 'url(#'), ')'), '}')" /></xsl:when> + <xsl:when test="@stroke and starts-with(@stroke, 'url(#')"> + <xsl:value-of select="concat('{StaticResource ', substring-before(substring-after(@stroke, 'url(#'), ')'), '}')" /> + </xsl:when> + <xsl:when test="@stroke and @stroke != 'none'"> + <xsl:value-of select="@stroke" /> + </xsl:when> + <xsl:when test="@style and contains(@style, 'stroke:') and starts-with(substring-after(@style, 'stroke:'), 'url(#')"> + <xsl:value-of select="concat('{StaticResource ', substring-before(substring-after(@style, 'url(#'), ')'), '}')" /> + </xsl:when> <xsl:when test="@style and contains(@style, 'stroke:')"> <xsl:variable name="Stroke" select="substring-after(@style, 'stroke:')" /> <xsl:choose> <xsl:when test="contains($Stroke, ';')"> - <xsl:if test="substring-before($Stroke, ';') != 'none'"><xsl:value-of select="substring-before($Stroke, ';')" /></xsl:if> + <xsl:if test="substring-before($Stroke, ';') != 'none'"> + <xsl:value-of select="substring-before($Stroke, ';')" /> + </xsl:if> + </xsl:when> + <xsl:when test="$Stroke != 'none'"> + <xsl:value-of select="$Stroke" /> </xsl:when> - <xsl:when test="$Stroke != 'none'"><xsl:value-of select="$Stroke" /></xsl:when> </xsl:choose> </xsl:when> - <xsl:when test="name(..) = 'g' or name(..) = 'svg'"><xsl:apply-templates mode="stroke" select="parent::*"/></xsl:when> + <xsl:when test="name(..) = 'g' or name(..) = 'svg'"> + <xsl:apply-templates mode="stroke" select="parent::*"/> + </xsl:when> </xsl:choose> </xsl:template> -<!-- Stroke opacity --> +<!-- + // Stroke opacity // +--> <xsl:template mode="stroke_opacity" match="*"> + <xsl:variable name="value"> <xsl:choose> - <xsl:when test="@stroke-opacity"><xsl:value-of select="@stroke-opacity" /></xsl:when> + <xsl:when test="@stroke-opacity"> + <xsl:value-of select="@stroke-opacity" /> + </xsl:when> <xsl:when test="@style and contains(@style, 'stroke-opacity:')"> <xsl:variable name="Opacity" select="substring-after(@style, 'stroke-opacity:')" /> <xsl:choose> - <xsl:when test="contains($Opacity, ';')"><xsl:value-of select="substring-before($Opacity, ';')" /></xsl:when> - <xsl:otherwise><xsl:value-of select="$Opacity" /></xsl:otherwise> + <xsl:when test="contains($Opacity, ';')"> + <xsl:value-of select="substring-before($Opacity, ';')" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$Opacity" /> + </xsl:otherwise> </xsl:choose> </xsl:when> - <xsl:when test="name(..) = 'g' or name(..) = 'svg'"><xsl:apply-templates mode="stroke_opacity" select="parent::*" /></xsl:when> + <xsl:when test="name(..) = 'g' or name(..) = 'svg'"> + <xsl:apply-templates mode="stroke_opacity" select="parent::*" /> + </xsl:when> + <xsl:otherwise>1</xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:choose> + <xsl:when test="$value < 0">0</xsl:when> + <xsl:when test="$value > 1">1</xsl:when> + <xsl:otherwise> + <xsl:value-of select="$value" /> + </xsl:otherwise> </xsl:choose> </xsl:template> -<!-- Generic stroke template --> +<!-- + // Generic stroke template // + --> <xsl:template mode="template_stroke" match="*"> - <xsl:variable name="stroke"><xsl:apply-templates mode="stroke" select="." /></xsl:variable> - <xsl:variable name="stroke_opacity"><xsl:apply-templates mode="stroke_opacity" select="." /></xsl:variable> + <xsl:variable name="stroke"> + <xsl:apply-templates mode="stroke" select="." /> + </xsl:variable> + <xsl:variable name="stroke_opacity"> + <xsl:apply-templates mode="stroke_opacity" select="." /> + </xsl:variable> + <xsl:variable name="stroke_width"> + <xsl:apply-templates mode="stroke_width" select="." /> + </xsl:variable> + + <xsl:if test="$stroke_width != ''"> + <xsl:attribute name="StrokeThickness"> + <xsl:value-of select="$stroke_width" /> + </xsl:attribute> + </xsl:if> <xsl:if test="$stroke != ''"> <xsl:attribute name="Stroke"> <xsl:call-template name="template_color"> - <xsl:with-param name="colorspec"><xsl:value-of select="$stroke" /></xsl:with-param> - <xsl:with-param name="opacityspec"><xsl:value-of select="$stroke_opacity" /></xsl:with-param> + <xsl:with-param name="colorspec"> + <xsl:value-of select="$stroke" /> + </xsl:with-param> + <xsl:with-param name="opacityspec"> + <xsl:value-of select="$stroke_opacity" /> + </xsl:with-param> </xsl:call-template> </xsl:attribute> </xsl:if> </xsl:template> -<!-- Stroke width --> +<!-- + // Stroke width // +--> <xsl:template mode="stroke_width" match="*"> <xsl:choose> <xsl:when test="@stroke-width"> - <xsl:attribute name="StrokeThickness"><xsl:value-of select="@stroke-width" /></xsl:attribute> + <xsl:call-template name="convert_unit"> + <xsl:with-param name="convert_value"> + <xsl:value-of select="@stroke-width" /> + </xsl:with-param> + </xsl:call-template> </xsl:when> <xsl:when test="@style and contains(@style, 'stroke-width:')"> - <xsl:attribute name="StrokeThickness"> - <xsl:call-template name="convert_unit"> - <xsl:with-param name="convert_value"> - <xsl:choose> - <xsl:when test="contains(substring-after(@style, 'stroke-width:'), ';')"><xsl:value-of select="substring-before(substring-after(@style, 'stroke-width:'), ';')" /></xsl:when> - <xsl:otherwise><xsl:value-of select="substring-after(@style, 'stroke-width:')" /></xsl:otherwise> - </xsl:choose> - </xsl:with-param> - </xsl:call-template> - </xsl:attribute> + <xsl:call-template name="convert_unit"> + <xsl:with-param name="convert_value"> + <xsl:choose> + <xsl:when test="contains(substring-after(@style, 'stroke-width:'), ';')"> + <xsl:value-of select="substring-before(substring-after(@style, 'stroke-width:'), ';')" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="substring-after(@style, 'stroke-width:')" /> + </xsl:otherwise> + </xsl:choose> + </xsl:with-param> + </xsl:call-template> + </xsl:when> + <xsl:when test="name(..) = 'g' or name(..) = 'svg'"> + <xsl:apply-templates mode="stroke_width" select="parent::*"/> </xsl:when> - <xsl:when test="name(..) = 'g' or name(..) = 'svg'"><xsl:apply-templates mode="stroke_width" select="parent::*"/></xsl:when> </xsl:choose> </xsl:template> -<!-- Stroke miterlimit --> +<!-- + // Stroke miterlimit // +--> <xsl:template mode="stroke_miterlimit" match="*"> <xsl:choose> - <xsl:when test="@stroke-miterlimit"><xsl:attribute name="StrokeMiterLimit"><xsl:value-of select="@stroke-miterlimit" /></xsl:attribute></xsl:when> + <xsl:when test="@stroke-miterlimit"> + <xsl:attribute name="StrokeMiterLimit"> + <xsl:value-of select="@stroke-miterlimit" /> + </xsl:attribute> + </xsl:when> <xsl:when test="@style and contains(@style, 'stroke-miterlimit:')"> <xsl:variable name="StrokeMiterLimit" select="substring-after(@style, 'stroke-miterlimit:')" /> <xsl:attribute name="StrokeMiterLimit"> <xsl:choose> - <xsl:when test="contains($StrokeMiterLimit, ';')"><xsl:value-of select="substring-before($StrokeMiterLimit, ';')" /></xsl:when> - <xsl:otherwise><xsl:value-of select="$StrokeMiterLimit" /></xsl:otherwise> + <xsl:when test="contains($StrokeMiterLimit, ';')"> + <xsl:value-of select="substring-before($StrokeMiterLimit, ';')" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$StrokeMiterLimit" /> + </xsl:otherwise> </xsl:choose> </xsl:attribute> </xsl:when> - <xsl:when test="name(..) = 'g' or name(..) = 'svg'"><xsl:apply-templates mode="stroke_miterlimit" select="parent::*"/></xsl:when> + <xsl:when test="name(..) = 'g' or name(..) = 'svg'"> + <xsl:apply-templates mode="stroke_miterlimit" select="parent::*"/> + </xsl:when> </xsl:choose> </xsl:template> -<!-- Stroke dasharray --> +<!-- + // Stroke dasharray // +--> <xsl:template mode="stroke_dasharray" match="*"> <!-- stroke-dasharray="10,30,20,30" becomes StrokeDashArray="1 3 2 3" ?? --> <xsl:choose> - <xsl:when test="@stroke-dasharray and @stroke-dasharray != 'none'"><xsl:attribute name="StrokeDashArray"><xsl:value-of select="@stroke-dasharray" /></xsl:attribute></xsl:when> + <xsl:when test="@stroke-dasharray and @stroke-dasharray != 'none'"> + <xsl:attribute name="StrokeDashArray"> + <xsl:value-of select="@stroke-dasharray" /> + </xsl:attribute> + </xsl:when> <xsl:when test="@style and contains(@style, 'stroke-dasharray:')"> <xsl:variable name="StrokeDashArray" select="substring-after(@style, 'stroke-dasharray:')" /> <xsl:choose> <xsl:when test="contains($StrokeDashArray, ';')"> - <xsl:if test="substring-before($StrokeDashArray, ';') != 'none'"><xsl:attribute name="StrokeDashArray"><xsl:value-of select="substring-before($StrokeDashArray, ';')" /></xsl:attribute></xsl:if> + <xsl:if test="substring-before($StrokeDashArray, ';') != 'none'"> + <xsl:attribute name="StrokeDashArray"> + <xsl:value-of select="substring-before($StrokeDashArray, ';')" /> + </xsl:attribute> + </xsl:if> + </xsl:when> + <xsl:when test="$StrokeDashArray != 'none'"> + <xsl:attribute name="StrokeDashArray"> + <xsl:value-of select="$StrokeDashArray" /> + </xsl:attribute> </xsl:when> - <xsl:when test="$StrokeDashArray != 'none'"><xsl:attribute name="StrokeDashArray"><xsl:value-of select="$StrokeDashArray" /></xsl:attribute></xsl:when> </xsl:choose> </xsl:when> - <xsl:when test="name(..) = 'g' or name(..) = 'svg'"><xsl:apply-templates mode="stroke_dasharray" select="parent::*"/></xsl:when> + <xsl:when test="name(..) = 'g' or name(..) = 'svg'"> + <xsl:apply-templates mode="stroke_dasharray" select="parent::*"/> + </xsl:when> </xsl:choose> </xsl:template> -<!-- Stroke dashoffset --> +<!-- + // Stroke dashoffset // +--> <xsl:template mode="stroke_dashoffset" match="*"> <xsl:choose> - <xsl:when test="@stroke-dashoffset"><xsl:attribute name="StrokeDashOffset"><xsl:value-of select="@stroke-dashoffset" /></xsl:attribute></xsl:when> + <xsl:when test="@stroke-dashoffset"> + <xsl:attribute name="StrokeDashOffset"> + <xsl:value-of select="@stroke-dashoffset" /> + </xsl:attribute> + </xsl:when> <xsl:when test="@style and contains(@style, 'stroke-dashoffset:')"> <xsl:variable name="StrokeDashOffset" select="substring-after(@style, 'stroke-dashoffset:')" /> <xsl:attribute name="StrokeDashOffset"> <xsl:choose> - <xsl:when test="contains($StrokeDashOffset, ';')"><xsl:value-of select="substring-before($StrokeDashOffset, ';')" /></xsl:when> - <xsl:otherwise><xsl:value-of select="$StrokeDashOffset" /></xsl:otherwise> + <xsl:when test="contains($StrokeDashOffset, ';')"> + <xsl:value-of select="substring-before($StrokeDashOffset, ';')" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$StrokeDashOffset" /> + </xsl:otherwise> </xsl:choose> </xsl:attribute> </xsl:when> - <xsl:when test="name(..) = 'g' or name(..) = 'svg'"><xsl:apply-templates mode="stroke_dashoffset" select="parent::*"/></xsl:when> + <xsl:when test="name(..) = 'g' or name(..) = 'svg'"> + <xsl:apply-templates mode="stroke_dashoffset" select="parent::*"/> + </xsl:when> </xsl:choose> </xsl:template> -<!-- Linejoin SVG to XAML converter --> +<!-- + // Linejoin SVG to XAML converter // +--> <xsl:template name="linejoin_svg_to_xaml"> <xsl:param name="linejoin" /> <xsl:choose> @@ -737,31 +1306,50 @@ Blank template. Title is ignored and desc is converted to Tag in the mode="desc" </xsl:choose> </xsl:template> -<!-- Stroke linejoin --> +<!-- + // Stroke linejoin // +--> <xsl:template mode="stroke_linejoin" match="*"> <xsl:choose> <xsl:when test="@stroke-miterlimit"> <xsl:attribute name="StrokeLineJoin"> - <xsl:call-template name="linejoin_svg_to_xaml"><xsl:with-param name="linejoin"><xsl:value-of select="@stroke-linejoin" /></xsl:with-param></xsl:call-template> - </xsl:attribute></xsl:when> + <xsl:call-template name="linejoin_svg_to_xaml"> + <xsl:with-param name="linejoin"> + <xsl:value-of select="@stroke-linejoin" /> + </xsl:with-param> + </xsl:call-template> + </xsl:attribute> + </xsl:when> <xsl:when test="@style and contains(@style, 'stroke-linejoin:')"> <xsl:variable name="StrokeLineJoin" select="substring-after(@style, 'stroke-linejoin:')" /> <xsl:attribute name="StrokeLineJoin"> <xsl:choose> <xsl:when test="contains($StrokeLineJoin, ';')"> - <xsl:call-template name="linejoin_svg_to_xaml"><xsl:with-param name="linejoin"><xsl:value-of select="substring-before($StrokeLineJoin, ';')" /></xsl:with-param></xsl:call-template> + <xsl:call-template name="linejoin_svg_to_xaml"> + <xsl:with-param name="linejoin"> + <xsl:value-of select="substring-before($StrokeLineJoin, ';')" /> + </xsl:with-param> + </xsl:call-template> </xsl:when> <xsl:otherwise> - <xsl:call-template name="linejoin_svg_to_xaml"><xsl:with-param name="linejoin"><xsl:value-of select="$StrokeLineJoin" /></xsl:with-param></xsl:call-template> + <xsl:call-template name="linejoin_svg_to_xaml"> + <xsl:with-param name="linejoin"> + <xsl:value-of select="$StrokeLineJoin" /> + </xsl:with-param> + </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:attribute> </xsl:when> - <xsl:when test="name(..) = 'g' or name(..) = 'svg'"><xsl:apply-templates mode="stroke_linejoin" select="parent::*"/></xsl:when> + <xsl:when test="name(..) = 'g' or name(..) = 'svg'"> + <xsl:apply-templates mode="stroke_linejoin" select="parent::*"/> + </xsl:when> </xsl:choose> </xsl:template> -<!-- Linecap SVG to XAML converter --> +<!-- + // Linecap SVG to XAML converter // +--> <xsl:template name="linecap_svg_to_xaml"> <xsl:param name="linecap" /> <xsl:choose> @@ -771,118 +1359,201 @@ Blank template. Title is ignored and desc is converted to Tag in the mode="desc" </xsl:choose> </xsl:template> -<!-- Stroke linecap --> +<!-- + // Stroke linecap // +--> <xsl:template mode="stroke_linecap" match="*"> <xsl:choose> <xsl:when test="@stroke-linecap"> <xsl:attribute name="StrokeStartLineCap"> - <xsl:call-template name="linecap_svg_to_xaml"><xsl:with-param name="linecap"><xsl:value-of select="@stroke-linecap" /></xsl:with-param></xsl:call-template> + <xsl:call-template name="linecap_svg_to_xaml"> + <xsl:with-param name="linecap"> + <xsl:value-of select="@stroke-linecap" /> + </xsl:with-param> + </xsl:call-template> </xsl:attribute> <xsl:attribute name="StrokeEndLineCap"> - <xsl:call-template name="linecap_svg_to_xaml"><xsl:with-param name="linecap"><xsl:value-of select="@stroke-linecap" /></xsl:with-param></xsl:call-template> - </xsl:attribute></xsl:when> + <xsl:call-template name="linecap_svg_to_xaml"> + <xsl:with-param name="linecap"> + <xsl:value-of select="@stroke-linecap" /> + </xsl:with-param> + </xsl:call-template> + </xsl:attribute> + </xsl:when> <xsl:when test="@style and contains(@style, 'stroke-linecap:')"> <xsl:variable name="StrokeStartLineCap" select="substring-after(@style, 'stroke-linecap:')" /> <xsl:variable name="StrokeEndLineCap" select="substring-after(@style, 'stroke-linecap:')" /> <xsl:attribute name="StrokeStartLineCap"> <xsl:choose> <xsl:when test="contains($StrokeStartLineCap, ';')"> - <xsl:call-template name="linecap_svg_to_xaml"><xsl:with-param name="linecap"><xsl:value-of select="substring-before($StrokeStartLineCap, ';')" /></xsl:with-param></xsl:call-template> + <xsl:call-template name="linecap_svg_to_xaml"> + <xsl:with-param name="linecap"> + <xsl:value-of select="substring-before($StrokeStartLineCap, ';')" /> + </xsl:with-param> + </xsl:call-template> </xsl:when> <xsl:otherwise> - <xsl:call-template name="linecap_svg_to_xaml"><xsl:with-param name="linecap"><xsl:value-of select="$StrokeStartLineCap" /></xsl:with-param></xsl:call-template> + <xsl:call-template name="linecap_svg_to_xaml"> + <xsl:with-param name="linecap"> + <xsl:value-of select="$StrokeStartLineCap" /> + </xsl:with-param> + </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:attribute> <xsl:attribute name="StrokeEndLineCap"> <xsl:choose> <xsl:when test="contains($StrokeEndLineCap, ';')"> - <xsl:call-template name="linecap_svg_to_xaml"><xsl:with-param name="linecap"><xsl:value-of select="substring-before($StrokeEndLineCap, ';')" /></xsl:with-param></xsl:call-template> + <xsl:call-template name="linecap_svg_to_xaml"> + <xsl:with-param name="linecap"> + <xsl:value-of select="substring-before($StrokeEndLineCap, ';')" /> + </xsl:with-param> + </xsl:call-template> </xsl:when> <xsl:otherwise> - <xsl:call-template name="linecap_svg_to_xaml"><xsl:with-param name="linecap"><xsl:value-of select="$StrokeEndLineCap" /></xsl:with-param></xsl:call-template> + <xsl:call-template name="linecap_svg_to_xaml"> + <xsl:with-param name="linecap"> + <xsl:value-of select="$StrokeEndLineCap" /> + </xsl:with-param> + </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:attribute> </xsl:when> - <xsl:when test="name(..) = 'g' or name(..) = 'svg'"><xsl:apply-templates mode="stroke_linecap" select="parent::*"/></xsl:when> + <xsl:when test="name(..) = 'g' or name(..) = 'svg'"> + <xsl:apply-templates mode="stroke_linecap" select="parent::*"/> + </xsl:when> </xsl:choose> </xsl:template> -<!-- Gradient stops --> +<!-- + // Gradient stops // +--> <xsl:template mode="stop_color" match="*"> <xsl:variable name="Opacity"> <xsl:choose> - <xsl:when test="@stop-opacity"><xsl:value-of select="@stop-opacity" /></xsl:when> + <xsl:when test="@stop-opacity"> + <xsl:value-of select="@stop-opacity" /> + </xsl:when> <xsl:when test="@style and contains(@style, 'stop-opacity:')"> <xsl:variable name="temp_opacity" select="substring-after(@style, 'stop-opacity:')" /> <xsl:choose> - <xsl:when test="contains($temp_opacity, ';')"><xsl:value-of select="substring-before($temp_opacity, ';')" /></xsl:when> - <xsl:otherwise><xsl:value-of select="$temp_opacity" /></xsl:otherwise> + <xsl:when test="contains($temp_opacity, ';')"> + <xsl:value-of select="substring-before($temp_opacity, ';')" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$temp_opacity" /> + </xsl:otherwise> </xsl:choose> </xsl:when> - <xsl:otherwise><xsl:value-of select="''" /></xsl:otherwise> + <xsl:otherwise> + <xsl:value-of select="''" /> + </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="hex_opacity"> <xsl:choose> - <xsl:when test="$Opacity != ''"><xsl:call-template name="to_hex"><xsl:with-param name="convert"><xsl:value-of select="number($Opacity) * 255" /></xsl:with-param></xsl:call-template> </xsl:when> - <xsl:otherwise><xsl:value-of select="$Opacity" /></xsl:otherwise> + <xsl:when test="$Opacity != ''"> + <xsl:call-template name="to_hex"> + <xsl:with-param name="convert"> + <xsl:value-of select="number($Opacity) * 255" /> + </xsl:with-param> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$Opacity" /> + </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="stopcolor"> <xsl:choose> <xsl:when test="@stop-color"> - <xsl:call-template name="template_color"><xsl:with-param name="colorspec"><xsl:value-of select="@stop-color" /></xsl:with-param></xsl:call-template> + <xsl:call-template name="template_color"> + <xsl:with-param name="colorspec"> + <xsl:value-of select="@stop-color" /> + </xsl:with-param> + </xsl:call-template> </xsl:when> <xsl:when test="@style and contains(@style, 'stop-color:')"> <xsl:variable name="Color" select="substring-after(@style, 'stop-color:')" /> <xsl:choose> <xsl:when test="contains($Color, ';')"> - <xsl:call-template name="template_color"><xsl:with-param name="colorspec"><xsl:value-of select="substring-before($Color, ';')" /></xsl:with-param></xsl:call-template> + <xsl:call-template name="template_color"> + <xsl:with-param name="colorspec"> + <xsl:value-of select="substring-before($Color, ';')" /> + </xsl:with-param> + </xsl:call-template> </xsl:when> <xsl:otherwise> - <xsl:call-template name="template_color"><xsl:with-param name="colorspec"><xsl:value-of select="$Color" /></xsl:with-param></xsl:call-template> + <xsl:call-template name="template_color"> + <xsl:with-param name="colorspec"> + <xsl:value-of select="$Color" /> + </xsl:with-param> + </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:when> - <xsl:when test="name(..) = 'g' or name(..) = 'svg'"><xsl:apply-templates mode="stop_color" select="parent::*"/></xsl:when> + <xsl:when test="name(..) = 'g' or name(..) = 'svg'"> + <xsl:apply-templates mode="stop_color" select="parent::*"/> + </xsl:when> <xsl:otherwise>#000</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:attribute name="Color"> <xsl:choose> - <xsl:when test="$hex_opacity != '' and starts-with($stopcolor, '#')"><xsl:value-of select="concat('#', $hex_opacity, substring-after($stopcolor, '#'))" /></xsl:when> - <xsl:otherwise><xsl:value-of select="$stopcolor" /></xsl:otherwise> + <xsl:when test="$hex_opacity != '' and starts-with($stopcolor, '#')"> + <xsl:value-of select="concat('#', $hex_opacity, substring-after($stopcolor, '#'))" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$stopcolor" /> + </xsl:otherwise> </xsl:choose> </xsl:attribute> </xsl:template> -<!-- Gradient stop opacity --> +<!-- + // Gradient stop opacity // +--> <xsl:template mode="stop_opacity" match="*"> <xsl:choose> - <xsl:when test="@stop-opacity"><xsl:attribute name="Opacity"><xsl:value-of select="@stop-opacity" /></xsl:attribute></xsl:when> + <xsl:when test="@stop-opacity"> + <xsl:attribute name="Opacity"> + <xsl:value-of select="@stop-opacity" /> + </xsl:attribute> + </xsl:when> <xsl:when test="@style and contains(@style, 'stop-opacity:')"> <xsl:variable name="Opacity" select="substring-after(@style, 'stop-opacity:')" /> <xsl:attribute name="Opacity"> <xsl:choose> - <xsl:when test="contains($Opacity, ';')"><xsl:value-of select="substring-before($Opacity, ';')" /></xsl:when> - <xsl:otherwise><xsl:value-of select="$Opacity" /></xsl:otherwise> + <xsl:when test="contains($Opacity, ';')"> + <xsl:value-of select="substring-before($Opacity, ';')" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$Opacity" /> + </xsl:otherwise> </xsl:choose> </xsl:attribute> </xsl:when> - <xsl:when test="name(..) = 'g' or name(..) = 'svg'"><xsl:apply-templates mode="stop_opacity" select="parent::*"/></xsl:when> + <xsl:when test="name(..) = 'g' or name(..) = 'svg'"> + <xsl:apply-templates mode="stop_opacity" select="parent::*"/> + </xsl:when> </xsl:choose> </xsl:template> -<!-- Gradient stop offset --> +<!-- + // Gradient stop offset // +--> <xsl:template mode="offset" match="*"> <xsl:choose> <xsl:when test="@offset"> <xsl:attribute name="Offset"> <xsl:choose> - <xsl:when test="contains(@offset, '%')"><xsl:value-of select="number(substring-before(@offset, '%')) div 100" /></xsl:when> - <xsl:otherwise><xsl:value-of select="@offset" /></xsl:otherwise> + <xsl:when test="contains(@offset, '%')"> + <xsl:value-of select="number(substring-before(@offset, '%')) div 100" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="@offset" /> + </xsl:otherwise> </xsl:choose> </xsl:attribute> </xsl:when> @@ -890,260 +1561,606 @@ Blank template. Title is ignored and desc is converted to Tag in the mode="desc" <xsl:variable name="Offset" select="substring-after(@style, 'offset:')" /> <xsl:attribute name="Offset"> <xsl:choose> - <xsl:when test="contains($Offset, '%')"><xsl:value-of select="number(substring-before($Offset, '%')) div 100" /></xsl:when> - <xsl:when test="contains($Offset, ';')"><xsl:value-of select="substring-before($Offset, ';')" /></xsl:when> - <xsl:otherwise><xsl:value-of select="$Offset" /></xsl:otherwise> + <xsl:when test="contains($Offset, '%')"> + <xsl:value-of select="number(substring-before($Offset, '%')) div 100" /> + </xsl:when> + <xsl:when test="contains($Offset, ';')"> + <xsl:value-of select="substring-before($Offset, ';')" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$Offset" /> + </xsl:otherwise> </xsl:choose> </xsl:attribute> </xsl:when> - <xsl:when test="name(..) = 'g' or name(..) = 'svg'"><xsl:apply-templates mode="stop_offset" select="parent::*"/></xsl:when> + <xsl:when test="name(..) = 'g' or name(..) = 'svg'"> + <xsl:apply-templates mode="stop_offset" select="parent::*"/> + </xsl:when> </xsl:choose> </xsl:template> <!-- -// Transforms // -All the matrix, translate, rotate... stuff. -Fixme: XAML transforms don't show the same result as SVG ones with the same values. + // Text specific templates // + + * Text tspan + * Text flowPara + * Text flowRegion (text frame) + * Get font size + * Font size + * Font weight + * Font family + * Font style + * Baseline shift + * Line height + * Writing mode + * Text decoration + * Text fill + * Text direction + * Text size + * Text position + * Text object + * FlowRoot object +--> -* Parse transform -* Apply transform -* Apply transform v2 + <!-- + // Text span // + SVG: tspan, flowSpan, FXG: span + + Not supported in FXG: + * span position --> +<xsl:template mode="forward" match="*[name(.) = 'tspan' or name(.) = 'flowSpan']"> + <span> + <xsl:if test="../@xml:space='preserve'"> + <xsl:attribute name="whiteSpaceCollapse">preserve</xsl:attribute> + </xsl:if> + <xsl:variable name="fill"> + <xsl:apply-templates mode="fill" select="." /> + </xsl:variable> + <xsl:variable name="fill_opacity"> + <xsl:apply-templates mode="fill_opacity" select="." /> + </xsl:variable> + <xsl:if test="starts-with($fill, '#') or (not(starts-with($fill, 'url')) and $fill != '' and $fill != 'none')"> + <xsl:attribute name="color"> + <xsl:call-template name="template_color"> + <xsl:with-param name="colorspec"> + <xsl:value-of select="$fill" /> + </xsl:with-param> + </xsl:call-template> + </xsl:attribute> + <xsl:attribute name="textAlpha"> + <xsl:value-of select="$fill_opacity" /> + </xsl:attribute> + </xsl:if> + <xsl:apply-templates mode="font_size" select="." /> + <xsl:apply-templates mode="font_weight" select="." /> + <xsl:apply-templates mode="font_family" select="." /> + <xsl:apply-templates mode="font_style" select="." /> + <xsl:apply-templates mode="text_fill" select="." /> + <xsl:apply-templates mode="text_decoration" select="." /> + <xsl:apply-templates mode="line_height" select="." /> + <xsl:apply-templates mode="baseline_shift" select="." /> + + <xsl:if test="text()"> + <xsl:value-of select="text()" /> + </xsl:if> + </span> +</xsl:template> -<!-- Parse transform --> -<xsl:template name="parse_transform"> - <xsl:param name="input" /> - <xsl:choose> - <xsl:when test="starts-with($input, 'matrix(')"> - <MatrixTransform><xsl:attribute name="Matrix"><xsl:value-of select="substring-before(substring-after($input, 'matrix('), ')')" /></xsl:attribute></MatrixTransform> - <xsl:call-template name="parse_transform"><xsl:with-param name="input" select="substring-after($input, ') ')" /></xsl:call-template> - </xsl:when> - <xsl:when test="starts-with($input, 'scale(')"> - <ScaleTransform> - <xsl:variable name="scale" select="substring-before(substring-after($input, 'scale('), ')')" /> + <!-- + // Text flowPara // + SVG: flowPara, flowDiv FXG: p + + Not supported in FXG: + * paragraph position +--> +<xsl:template mode="forward" match="*[name(.) = 'flowPara' or name(.) = 'flowDiv']"> + <p> + <xsl:if test="../@xml:space='preserve'"> + <xsl:attribute name="whiteSpaceCollapse">preserve</xsl:attribute> + </xsl:if> + <xsl:variable name="fill"> + <xsl:apply-templates mode="fill" select="." /> + </xsl:variable> + <xsl:variable name="fill_opacity"> + <xsl:apply-templates mode="fill_opacity" select="." /> + </xsl:variable> + <xsl:if test="starts-with($fill, '#') or (not(starts-with($fill, 'url')) and $fill != '' and $fill != 'none')"> + <xsl:attribute name="color"> + <xsl:call-template name="template_color"> + <xsl:with-param name="colorspec"> + <xsl:value-of select="$fill" /> + </xsl:with-param> + </xsl:call-template> + </xsl:attribute> + <xsl:attribute name="textAlpha"> + <xsl:value-of select="$fill_opacity" /> + </xsl:attribute> + </xsl:if> + <xsl:apply-templates mode="font_size" select="." /> + <xsl:apply-templates mode="font_weight" select="." /> + <xsl:apply-templates mode="font_family" select="." /> + <xsl:apply-templates mode="font_style" select="." /> + <xsl:apply-templates mode="text_fill" select="." /> + <xsl:apply-templates mode="text_decoration" select="." /> + <xsl:apply-templates mode="line_height" select="." /> + <xsl:apply-templates mode="baseline_shift" select="." /> + + <xsl:choose> + <xsl:when test="*[name(.) = 'flowSpan']/text()"> + <xsl:apply-templates mode="forward" /> + </xsl:when> + <xsl:otherwise> <xsl:choose> - <xsl:when test="contains($scale, ',')"> - <xsl:attribute name="ScaleX"><xsl:value-of select="substring-before($scale, ',')" /></xsl:attribute> - <xsl:attribute name="ScaleY"><xsl:value-of select="substring-after($scale, ',')" /></xsl:attribute> + <xsl:when test="@xml:space='preserve'"> + <xsl:copy-of select="translate(text(), '	

', ' ')" /> </xsl:when> <xsl:otherwise> - <xsl:attribute name="ScaleX"><xsl:value-of select="$scale" /></xsl:attribute> - <xsl:attribute name="ScaleY"><xsl:value-of select="$scale" /></xsl:attribute> + <xsl:copy-of select="normalize-space(translate(text(), '	

', ' '))" /> </xsl:otherwise> - </xsl:choose> - </ScaleTransform> - <xsl:call-template name="parse_transform"><xsl:with-param name="input" select="substring-after($input, ') ')" /></xsl:call-template> - </xsl:when> - <xsl:when test="starts-with($input, 'rotate(')"> - <RotateTransform> - <xsl:attribute name="Angle"><xsl:value-of select="substring-before(substring-after($input, 'rotate('), ')')" /></xsl:attribute> - <xsl:if test="@rx"><xsl:attribute name="CenterX"><xsl:value-of select="@rx" /></xsl:attribute></xsl:if> - <xsl:if test="@ry"><xsl:attribute name="CenterY"><xsl:value-of select="@ry" /></xsl:attribute></xsl:if> - </RotateTransform> - <xsl:call-template name="parse_transform"><xsl:with-param name="input" select="substring-after($input, ') ')" /></xsl:call-template> - </xsl:when> - <xsl:when test="starts-with($input, 'skewX(')"> - <SkewTransform> - <xsl:attribute name="AngleX"><xsl:value-of select="substring-before(substring-after($input, 'skewX('), ')')" /></xsl:attribute> - <xsl:call-template name="parse_transform"><xsl:with-param name="input" select="substring-after($input, ') ')" /></xsl:call-template> - </SkewTransform> + </xsl:choose> + </xsl:otherwise> + </xsl:choose> + </p> +</xsl:template> + + + <!-- + // Text flowRegion // +--> +<xsl:template mode="flow_region" match="*"> + <xsl:apply-templates mode="text_size" select="." /> + <xsl:apply-templates mode="text_position" select="." /> +</xsl:template> + +<!-- + // Get text font size // +--> +<xsl:template mode="get_font_size" match="*"> + <xsl:choose> + <xsl:when test="@font-size"> + <xsl:value-of select="@font-size" /> </xsl:when> - <xsl:when test="starts-with($input, 'skewY(')"> - <SkewTransform> - <xsl:attribute name="AngleY"><xsl:value-of select="substring-before(substring-after($input, 'skewY('), ')')" /></xsl:attribute> - <xsl:call-template name="parse_transform"><xsl:with-param name="input" select="substring-after($input, ') ')" /></xsl:call-template> - </SkewTransform> + <xsl:when test="@style and contains(@style, 'font-size:')"> + <xsl:variable name="font_size" select="normalize-space(substring-after(@style, 'font-size:'))" /> + <xsl:choose> + <xsl:when test="contains($font_size, ';')"> + <xsl:value-of select="substring-before($font_size, ';')" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$font_size" /> + </xsl:otherwise> + </xsl:choose> </xsl:when> - <xsl:when test="starts-with($input, 'translate(')"> - <TranslateTransform> - <xsl:variable name="translate" select="substring-before(substring-after($input, 'translate('), ')')" /> - <xsl:choose> - <xsl:when test="contains($translate, ',')"> - <xsl:attribute name="X"><xsl:value-of select="substring-before($translate, ',')" /></xsl:attribute> - <xsl:attribute name="Y"><xsl:value-of select="substring-after($translate, ',')" /></xsl:attribute> - </xsl:when> - <xsl:when test="contains($translate, ' ')"> - <xsl:attribute name="X"><xsl:value-of select="substring-before($translate, ' ')" /></xsl:attribute> - <xsl:attribute name="Y"><xsl:value-of select="substring-after($translate, ' ')" /></xsl:attribute> - </xsl:when> - <xsl:otherwise><xsl:attribute name="X"><xsl:value-of select="$translate" /></xsl:attribute></xsl:otherwise> - </xsl:choose> - </TranslateTransform> - <xsl:call-template name="parse_transform"><xsl:with-param name="input" select="substring-after($input, ') ')" /></xsl:call-template> + <xsl:when test="name(..) = 'g' or name(..) = 'svg'"> + <xsl:apply-templates mode="get_font_size" select="parent::*"/> </xsl:when> </xsl:choose> </xsl:template> - -<!-- Apply transform --> -<xsl:template mode="transform" match="*"> - <xsl:param name="mapped_type" /> - <xsl:if test="@transform or @gradientTransform"> - <xsl:variable name="transform"> +<!-- + // Text font size // + SVG: font-size, XAML: FontSize +--> +<xsl:template mode="font_size" match="*"> + <xsl:variable name="value"> + <xsl:apply-templates mode="get_font_size" select="." /> + </xsl:variable> + <xsl:if test="$value != ''"> + <xsl:attribute name="FontSize"> + <xsl:call-template name="convert_unit"> + <xsl:with-param name="convert_value" select="$value" /> + </xsl:call-template> + </xsl:attribute> + </xsl:if> + <xsl:attribute name="FontSize"> <xsl:choose> - <xsl:when test="@transform"><xsl:value-of select="@transform" /></xsl:when> - <xsl:otherwise><xsl:value-of select="@gradientTransform" /></xsl:otherwise> + <xsl:when test="$value != ''"> + <xsl:call-template name="convert_unit"> + <xsl:with-param name="convert_value" select="$value" /> + </xsl:call-template> + </xsl:when> + <xsl:otherwise>12</xsl:otherwise> </xsl:choose> - </xsl:variable> - <xsl:variable name="transform_nodes"> - <xsl:call-template name="parse_transform"> - <xsl:with-param name="input" select="$transform" /> - </xsl:call-template> - </xsl:variable> + </xsl:attribute> +</xsl:template> - <xsl:comment> - <xsl:value-of select="name(.)" /> - </xsl:comment> +<!-- + // Text font weight // + SVG: font-weight, XAML: FontWeight +--> +<xsl:template mode="font_weight" match="*"> + <xsl:variable name="value"> + <xsl:if test="@font-weight"> + <xsl:value-of select="@font-weight" /> + </xsl:if> + <xsl:if test="@style and contains(@style, 'font-weight:')"> + <xsl:variable name="font_weight" select="normalize-space(substring-after(@style, 'font-weight:'))" /> + <xsl:choose> + <xsl:when test="contains($font_weight, ';')"> + <xsl:value-of select="substring-before($font_weight, ';')" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$font_weight" /> + </xsl:otherwise> + </xsl:choose> + </xsl:if> + </xsl:variable> + <xsl:if test="$value != ''"> + <xsl:attribute name="FontWeight"> + <xsl:choose> + <xsl:when test="$value <= 100 or $value = 'lighter'">Thin</xsl:when> + <xsl:when test="$value > 100 and $value <= 200">ExtraLight</xsl:when> + <xsl:when test="$value > 200 and $value <= 300">Light</xsl:when> + <xsl:when test="($value > 300 and $value <= 400) or $value ='normal'">Normal</xsl:when> + <xsl:when test="$value > 400 and $value <= 500">Medium</xsl:when> + <xsl:when test="$value > 500 and $value <= 600">SemiBold</xsl:when> + <xsl:when test="($value > 600 and $value <= 700) or $value ='bold'">Bold</xsl:when> + <xsl:when test="$value > 700 and $value <= 800">ExtraBold</xsl:when> + <xsl:when test="$value > 800 and $value <= 900">Black</xsl:when> + <xsl:when test="$value > 900 or $value = 'bolder'">ExtraBlack</xsl:when> + <xsl:otherwise>normal</xsl:otherwise> + </xsl:choose> + </xsl:attribute> + </xsl:if> +</xsl:template> - <xsl:choose> - <xsl:when test="$mapped_type and $mapped_type != ''"> - <xsl:element name="{$mapped_type}.RenderTransform"> - <xsl:choose> - <xsl:when test="count(libxslt:node-set($transform_nodes)/*) = 1"><xsl:copy-of select="libxslt:node-set($transform_nodes)" /></xsl:when> - <xsl:when test="count(libxslt:node-set($transform_nodes)/*) > 1"><TransformGroup><xsl:copy-of select="libxslt:node-set($transform_nodes)" /></TransformGroup></xsl:when> - </xsl:choose> - </xsl:element> - </xsl:when> - <xsl:otherwise> - <!-- For instance LinearGradient.Transform --> +<!-- + // Text font family // + SVG: font-family, XAML: FontFamily +--> +<xsl:template mode="font_family" match="*"> + <xsl:variable name="value"> + <xsl:if test="@font-family"> + <xsl:value-of select="translate(@font-family, "'", '')" /> + </xsl:if> + <xsl:if test="@style and contains(@style, 'font-family:')"> + <xsl:variable name="font_family" select="normalize-space(substring-after(@style, 'font-family:'))" /> <xsl:choose> - <xsl:when test="count(libxslt:node-set($transform_nodes)/*) = 1"><xsl:copy-of select="libxslt:node-set($transform_nodes)" /></xsl:when> - <xsl:when test="count(libxslt:node-set($transform_nodes)/*) > 1"><TransformGroup><xsl:copy-of select="libxslt:node-set($transform_nodes)" /></TransformGroup></xsl:when> + <xsl:when test="contains($font_family, ';')"> + <xsl:value-of select="translate(substring-before($font_family, ';'), "'", '')" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="translate($font_family, "'", '')" /> + </xsl:otherwise> </xsl:choose> - </xsl:otherwise> - </xsl:choose> - </xsl:if> + </xsl:if> + </xsl:variable> + <xsl:if test="$value != ''"> + <xsl:attribute name="FontFamily"> + <xsl:choose> + <xsl:when test="$value='Sans'">Arial</xsl:when> + <xsl:otherwise> + <xsl:value-of select="$value" /> + </xsl:otherwise> + </xsl:choose> + </xsl:attribute> + </xsl:if> </xsl:template> -<!-- Apply transform v2 -Fixme: is this template still in use? --> -<xsl:template mode="transform2" match="*"> - <xsl:choose> - <xsl:when test="@transform"> - <Canvas> - <Canvas.RenderTransform> - <TransformGroup><xsl:apply-templates mode="transform" select="." /></TransformGroup> - </Canvas.RenderTransform> - <xsl:apply-templates mode="forward" select="." /> - </Canvas> - </xsl:when> - <xsl:otherwise> - <xsl:apply-templates mode="forward" select="." /> - </xsl:otherwise> - </xsl:choose> +<!-- + // Text font style // + SVG: font-style, XAML: FontStyle +--> +<xsl:template mode="font_style" match="*"> + <xsl:variable name="value"> + <xsl:if test="@font-style"> + <xsl:value-of select="@font-style" /> + </xsl:if> + <xsl:if test="@style and contains(@style, 'font-style:')"> + <xsl:variable name="font_style" select="normalize-space(substring-after(@style, 'font-style:'))" /> + <xsl:choose> + <xsl:when test="contains($font_style, ';')"> + <xsl:value-of select="substring-before($font_style, ';')" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$font_style" /> + </xsl:otherwise> + </xsl:choose> + </xsl:if> + </xsl:variable> + <xsl:if test="$value != ''"> + <xsl:attribute name="FontStyle"> + <xsl:value-of select="$value" /> + </xsl:attribute> + </xsl:if> </xsl:template> <!-- -// Objects // + // Text baseline shift // + SVG: baseline-shift, FXG: baselineShift +--> +<xsl:template mode="baseline_shift" match="*"> + <xsl:variable name="value"> + <xsl:if test="@baseline-shift"> + <xsl:value-of select="@baseline-shift" /> + </xsl:if> + <xsl:if test="@style and contains(@style, 'baseline-shift:') and not(contains(substring-after(@style, 'baseline-shift:'), ';'))"> + <xsl:value-of select="substring-after(@style, 'baseline-shift:')" /> + </xsl:if> + <xsl:if test="@style and contains(@style, 'baseline-shift:') and contains(substring-after(@style, 'baseline-shift:'), ';')"> + <xsl:value-of select="substring-before(substring-after(@style, 'baseline-shift:'), ';')" /> + </xsl:if> + </xsl:variable> + <xsl:if test="$value != ''"> + <xsl:attribute name="baselineShift"> + <xsl:choose> + <xsl:when test="$value='baseline'">0</xsl:when> + <xsl:when test="$value='super'">superscript</xsl:when> + <xsl:when test="$value='sub'">subscript</xsl:when> + <xsl:when test="translate($value, '%', '') < -1000">-1000</xsl:when> + <xsl:when test="translate($value, '%', '') > 1000">1000</xsl:when> + <xsl:otherwise> + <xsl:value-of select="translate($value, '%', '')" /> + </xsl:otherwise> + </xsl:choose> + <xsl:if test="contains($value, '%')">%</xsl:if> + </xsl:attribute> + </xsl:if> +</xsl:template> -* Image -* Text -* Lines -* Rectangle -* Polygon -* Polyline -* Path -* Ellipse -* Circle +<!-- + // Text line height // + SVG: line-height, FXG: lineHeight --> +<xsl:template mode="line_height" match="*"> + <xsl:variable name="value"> + <xsl:if test="@line-height"> + <xsl:value-of select="@line-height" /> + </xsl:if> + <xsl:if test="@style and contains(@style, 'line-height:')"> + <xsl:variable name="line_height" select="normalize-space(substring-after(@style, 'line-height:'))" /> + <xsl:choose> + <xsl:when test="contains($line_height, ';')"> + <xsl:value-of select="substring-before($line_height, ';')" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$line_height" /> + </xsl:otherwise> + </xsl:choose> + </xsl:if> + </xsl:variable> + <xsl:if test="$value != ''"> + <xsl:attribute name="lineHeight"> + <xsl:call-template name="convert_unit"> + <xsl:with-param name="convert_value" select="$value" /> + </xsl:call-template> + </xsl:attribute> + </xsl:if> +</xsl:template> -<!-- Image --> -<xsl:template mode="forward" match="*[name(.) = 'image']"> - <Image> - <xsl:apply-templates mode="id" select="." /> - <xsl:if test="@x"><xsl:attribute name="Canvas.Left"> - <xsl:call-template name="convert_unit"> - <xsl:with-param name="convert_value" select="@x" /> - </xsl:call-template> - </xsl:attribute></xsl:if> - <xsl:if test="@y"><xsl:attribute name="Canvas.Top"> - <xsl:call-template name="convert_unit"> - <xsl:with-param name="convert_value" select="@y" /> - </xsl:call-template> - </xsl:attribute></xsl:if> - <xsl:apply-templates mode="desc" select="." /> - <xsl:apply-templates mode="clip" select="." /> - <xsl:if test="@xlink:href"><xsl:attribute name="Source"><xsl:value-of select="@xlink:href" /></xsl:attribute></xsl:if> - <xsl:if test="@width"><xsl:attribute name="Width"> - <xsl:call-template name="convert_unit"> - <xsl:with-param name="convert_value" select="@width" /> - </xsl:call-template> - </xsl:attribute></xsl:if> - <xsl:if test="@height"><xsl:attribute name="Height"> - <xsl:call-template name="convert_unit"> - <xsl:with-param name="convert_value" select="@height" /> - </xsl:call-template> - </xsl:attribute></xsl:if> - <xsl:apply-templates mode="transform" select="."> - <xsl:with-param name="mapped_type" select="'Image'" /> - </xsl:apply-templates> - <!--xsl:apply-templates mode="transform" /--> - <xsl:apply-templates mode="forward" /> - </Image> +<!-- + // Text writing mode // + SVG: writing-mode, FXG: blockProgression + + Values inverted in FXG... +--> +<xsl:template mode="writing_mode" match="*"> + <xsl:variable name="value"> + <xsl:if test="@writing-mode"> + <xsl:value-of select="@writing-mode" /> + </xsl:if> + <xsl:if test="@style and contains(@style, 'writing-mode:') and not(contains(substring-after(@style, 'writing-mode:'), ';'))"> + <xsl:value-of select="substring-after(@style, 'writing-mode:')" /> + </xsl:if> + <xsl:if test="@style and contains(@style, 'writing-mode:') and contains(substring-after(@style, 'writing-mode:'), ';')"> + <xsl:value-of select="substring-before(substring-after(@style, 'writing-mode:'), ';')" /> + </xsl:if> + </xsl:variable> + <xsl:if test="$value != ''"> + <xsl:attribute name="blockProgression"> + <xsl:choose> + <xsl:when test="$value='tb'">rl</xsl:when> + <xsl:otherwise>tb</xsl:otherwise> + </xsl:choose> + </xsl:attribute> + <xsl:if test="$value='tb'"> + <xsl:attribute name="textRotation">rotate270</xsl:attribute> + </xsl:if> + </xsl:if> +</xsl:template> + +<!-- + // Text decoration // + SVG: text-decoration, FXG: textDecoration, lineThrough +--> +<xsl:template mode="text_decoration" match="*"> + <xsl:variable name="value"> + <xsl:if test="@text-decoration"> + <xsl:value-of select="@text-decoration" /> + </xsl:if> + <xsl:if test="@style and contains(@style, 'text-decoration:') and not(contains(substring-after(@style, 'text-decoration:'), ';'))"> + <xsl:value-of select="substring-after(@style, 'text-decoration:')" /> + </xsl:if> + <xsl:if test="@style and contains(@style, 'text-decoration:') and contains(substring-after(@style, 'text-decoration:'), ';')"> + <xsl:value-of select="substring-before(substring-after(@style, 'text-decoration:'), ';')" /> + </xsl:if> + </xsl:variable> + <xsl:if test="$value != ''"> + <xsl:choose> + <xsl:when test="$value='underline'"> + <xsl:attribute name="textDecoration">underline</xsl:attribute> + </xsl:when> + <xsl:when test="$value='line-through'"> + <xsl:attribute name="lineThrough">true</xsl:attribute> + </xsl:when> + </xsl:choose> + </xsl:if> </xsl:template> -<!-- Text --> -<xsl:template mode="forward" match="*[name(.) = 'text']"> - <TextBlock> - <xsl:if test="@font-size"><xsl:attribute name="FontSize"><xsl:value-of select="@font-size" /></xsl:attribute></xsl:if> - <xsl:if test="@style and contains(@style, 'font-size:')"> - <xsl:variable name="font_size" select="substring-after(@style, 'font-size:')" /> - <xsl:attribute name="FontSize"> - <xsl:choose> - <xsl:when test="contains($font_size, ';')"> - <xsl:value-of select="substring-before($font_size, ';')" /> +<!-- + // Text fill // + SVG: fill, fill-opacity, XAML: Foreground +--> +<xsl:template mode="text_fill" match="*"> + <xsl:variable name="fill"> + <xsl:apply-templates mode="fill" select="." /> + </xsl:variable> + <xsl:variable name="fill_opacity"> + <xsl:apply-templates mode="fill_opacity" select="." /> + </xsl:variable> + <xsl:if test="starts-with($fill, '#') or (not(starts-with($fill, 'url')) and $fill != '' and $fill != 'none')"> + <xsl:attribute name="Foreground"> + <xsl:call-template name="template_color"> + <xsl:with-param name="colorspec"> + <xsl:value-of select="$fill" /> + </xsl:with-param> + <xsl:with-param name="opacityspec"> + <xsl:choose> + <xsl:when test="$fill_opacity"> + <xsl:value-of select="$fill_opacity" /> </xsl:when> - <xsl:otherwise><xsl:value-of select="$font_size" /></xsl:otherwise> - </xsl:choose> - </xsl:attribute> + <xsl:otherwise>1</xsl:otherwise> + </xsl:choose> + </xsl:with-param> + </xsl:call-template> + </xsl:attribute> + </xsl:if> +</xsl:template> + +<!-- + // Text direction // + SVG: direction, unicode-bidi, FXG: direction +--> +<xsl:template mode="direction" match="*"> + <xsl:variable name="value"> + <xsl:if test="@direction"> + <xsl:value-of select="@direction" /> </xsl:if> - <xsl:if test="@font-weight"><xsl:attribute name="FontWeight"><xsl:value-of select="@font-weight" /></xsl:attribute></xsl:if> - <xsl:if test="@style and contains(@style, 'font-weight:')"> - <xsl:variable name="font_weight" select="substring-after(@style, 'font-weight:')" /> - <xsl:attribute name="FontWeight"> - <xsl:choose> - <xsl:when test="contains($font_weight, ';')"> - <xsl:value-of select="substring-before($font_weight, ';')" /> - </xsl:when> - <xsl:otherwise><xsl:value-of select="$font_weight" /></xsl:otherwise> - </xsl:choose> - </xsl:attribute> + <xsl:if test="@style and contains(@style, 'direction:') and not(contains(substring-after(@style, 'direction:'), ';'))"> + <xsl:value-of select="substring-after(@style, 'direction:')" /> </xsl:if> - <xsl:if test="@font-family"><xsl:attribute name="FontFamily"><xsl:value-of select="@font-family" /></xsl:attribute></xsl:if> - <xsl:if test="@style and contains(@style, 'font-family:')"> - <xsl:variable name="font_family" select="substring-after(@style, 'font-family:')" /> - <xsl:attribute name="FontFamily"> - <xsl:choose> - <xsl:when test="contains($font_family, ';')"> - <xsl:value-of select="substring-before($font_family, ';')" /> - </xsl:when> - <xsl:otherwise><xsl:value-of select="$font_family" /></xsl:otherwise> - </xsl:choose> - </xsl:attribute> + <xsl:if test="@style and contains(@style, 'direction:') and contains(substring-after(@style, 'direction:'), ';')"> + <xsl:value-of select="substring-before(substring-after(@style, 'direction:'), ';')" /> + </xsl:if> + </xsl:variable> + <xsl:variable name="bidi"> + <xsl:if test="@unicode-bidi"> + <xsl:value-of select="@unicode-bidi" /> </xsl:if> - <xsl:if test="@font-style"><xsl:attribute name="FontStyle"><xsl:value-of select="@font-style" /></xsl:attribute></xsl:if> - <xsl:if test="@style and contains(@style, 'font-style:')"> - <xsl:variable name="font_style" select="substring-after(@style, 'font-style:')" /> - <xsl:attribute name="FontStyle"> - <xsl:choose> - <xsl:when test="contains($font_style, ';')"> - <xsl:value-of select="substring-before($font_style, ';')" /> + <xsl:if test="@style and contains(@style, 'unicode-bidi:') and not(contains(substring-after(@style, 'unicode-bidi:'), ';'))"> + <xsl:value-of select="substring-after(@style, 'unicode-bidi:')" /> + </xsl:if> + <xsl:if test="@style and contains(@style, 'unicode-bidi:') and contains(substring-after(@style, 'unicode-bidi:'), ';')"> + <xsl:value-of select="substring-before(substring-after(@style, 'unicode-bidi:'), ';')" /> + </xsl:if> + </xsl:variable> + + <xsl:if test="$value != '' and ($bidi='embed' or $bidi='bidi-override')"> + <xsl:attribute name="direction"> + <xsl:choose> + <xsl:when test="$value='ltr'">ltr</xsl:when> + <xsl:when test="$value='rtl'">rtl</xsl:when> + </xsl:choose> + </xsl:attribute> + </xsl:if> +</xsl:template> + + <!-- + // Text size // +--> +<xsl:template mode="text_size" match="*"> + <xsl:if test="@width"> + <xsl:attribute name="Width"> + <xsl:call-template name="convert_unit"> + <xsl:with-param name="convert_value" select="@width" /> + </xsl:call-template> + </xsl:attribute> + </xsl:if> + <xsl:if test="@height"> + <xsl:attribute name="Height"> + <xsl:call-template name="convert_unit"> + <xsl:with-param name="convert_value" select="@height" /> + </xsl:call-template> + </xsl:attribute> + </xsl:if> +</xsl:template> + + <!-- + // Text position // +--> +<xsl:template mode="text_position" match="*"> + <!-- Keep the first x value only --> + <xsl:if test="@x"> + <xsl:attribute name="Canvas.Left"> + <xsl:choose> + <xsl:when test="contains(@x, ' ')"> + <xsl:call-template name="convert_unit"> + <xsl:with-param name="convert_value" select="substring-before(@x, ' ')" /> + </xsl:call-template> </xsl:when> - <xsl:otherwise><xsl:value-of select="$font_style" /></xsl:otherwise> + <xsl:otherwise> + <xsl:call-template name="convert_unit"> + <xsl:with-param name="convert_value" select="@x" /> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:attribute> + </xsl:if> + <!-- Keep the first y value only --> + <xsl:if test="@y"> + <xsl:attribute name="Canvas.Top"> + <xsl:variable name="top_val"> + <xsl:choose> + <xsl:when test="contains(@y, ' ')"> + <xsl:call-template name="convert_unit"> + <xsl:with-param name="convert_value" select="substring-before(@y, ' ')" /> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="convert_unit"> + <xsl:with-param name="convert_value" select="@y" /> + </xsl:call-template> + </xsl:otherwise> </xsl:choose> - </xsl:attribute> - </xsl:if> - <xsl:if test="@fill"><xsl:attribute name="Foreground"><xsl:value-of select="@fill" /></xsl:attribute></xsl:if> - <xsl:if test="@style and contains(@style, 'fill')"> - <xsl:variable name="fill" select="substring-after(@style, 'fill:')" /> - <xsl:attribute name="Foreground"> + </xsl:variable> + <xsl:variable name="size_val"> + <xsl:variable name="value"> + <xsl:apply-templates mode="get_font_size" select="." /> + </xsl:variable> <xsl:choose> - <xsl:when test="contains($fill, ';')"> - <xsl:value-of select="substring-before($fill, ';')" /> + <xsl:when test="$value != ''"> + <xsl:call-template name="convert_unit"> + <xsl:with-param name="convert_value" select="$value" /> + </xsl:call-template> </xsl:when> - <xsl:otherwise><xsl:value-of select="$fill" /></xsl:otherwise> + <xsl:otherwise>12</xsl:otherwise> </xsl:choose> - </xsl:attribute> - </xsl:if> + </xsl:variable> + <xsl:if test="$top_val != '' and $size_val != ''"> + <xsl:value-of select="$top_val - $size_val" /> + </xsl:if> + </xsl:attribute> + </xsl:if> +</xsl:template> + +<!-- + // Objects // + + * Text + * Lines + * Rectangle + * Polygon + * Polyline + * Path + * Ellipse + * Circle + * Image +--> + +<!-- + // Text objects // + SVG: text, XAML: TextBlock +--> +<xsl:template mode="forward" match="*[name(.) = 'text']"> + <TextBlock> + <xsl:apply-templates mode="font_size" select="." /> + <xsl:apply-templates mode="font_weight" select="." /> + <xsl:apply-templates mode="font_family" select="." /> + <xsl:apply-templates mode="font_style" select="." /> + <xsl:apply-templates mode="text_fill" select="." /> + <xsl:apply-templates mode="text_size" select="." /> + <xsl:apply-templates mode="text_position" select="." /> + <xsl:if test="@text-anchor"> <xsl:attribute name="HorizontalAlignment"> <xsl:choose> @@ -1153,48 +2170,62 @@ Fixme: is this template still in use? --> </xsl:choose> </xsl:attribute> </xsl:if> - <xsl:if test="@width"><xsl:attribute name="Width"> - <xsl:call-template name="convert_unit"> - <xsl:with-param name="convert_value" select="@width" /> - </xsl:call-template> - </xsl:attribute></xsl:if> - <xsl:if test="@height"><xsl:attribute name="Height"> - <xsl:call-template name="convert_unit"> - <xsl:with-param name="convert_value" select="@height" /> - </xsl:call-template> - </xsl:attribute></xsl:if> - <xsl:if test="@x"><xsl:attribute name="Canvas.Left"> - <xsl:call-template name="convert_unit"> - <xsl:with-param name="convert_value" select="@x" /> - </xsl:call-template> - </xsl:attribute></xsl:if> - <xsl:if test="@y"><xsl:attribute name="Canvas.Top"> - <xsl:call-template name="convert_unit"> - <xsl:with-param name="convert_value" select="@y" /> - </xsl:call-template> - </xsl:attribute></xsl:if> + <xsl:apply-templates mode="id" select="." /> <xsl:apply-templates mode="filter_effect" select="." /> <xsl:apply-templates mode="desc" select="." /> <xsl:apply-templates mode="clip" select="." /> <!--xsl:apply-templates mode="transform" select="." /--> <!--xsl:apply-templates mode="forward" /--> - <xsl:if test="text()"><xsl:value-of select="text()" /></xsl:if> - <xsl:if test="*[name(.) = 'tspan']/text()"><xsl:value-of select="*[name(.) = 'tspan']/text()" /></xsl:if> + + <xsl:choose> + <xsl:when test="*[name(.) = 'tspan']/text()"> + <xsl:apply-templates mode="forward" /> + </xsl:when> + <xsl:otherwise> + <xsl:choose> + <xsl:when test="@xml:space='preserve'"> + <xsl:copy-of select="translate(text(), '	

', ' ')" /> + </xsl:when> + <xsl:otherwise> + <xsl:copy-of select="normalize-space(translate(text(), '	

', ' '))" /> + </xsl:otherwise> + </xsl:choose> + </xsl:otherwise> + </xsl:choose> + </TextBlock> </xsl:template> -<!-- Lines --> +<!-- + // Line object // + SVG: line, XAML: Line +--> <xsl:template mode="forward" match="*[name(.) = 'line']"> <Line> - <xsl:if test="@x1"><xsl:attribute name="X1"><xsl:value-of select="@x1" /></xsl:attribute></xsl:if> - <xsl:if test="@y1"><xsl:attribute name="Y1"><xsl:value-of select="@y1" /></xsl:attribute></xsl:if> - <xsl:if test="@x2"><xsl:attribute name="X2"><xsl:value-of select="@x2" /></xsl:attribute></xsl:if> - <xsl:if test="@y2"><xsl:attribute name="Y2"><xsl:value-of select="@y2" /></xsl:attribute></xsl:if> + <xsl:if test="@x1"> + <xsl:attribute name="X1"> + <xsl:value-of select="@x1" /> + </xsl:attribute> + </xsl:if> + <xsl:if test="@y1"> + <xsl:attribute name="Y1"> + <xsl:value-of select="@y1" /> + </xsl:attribute> + </xsl:if> + <xsl:if test="@x2"> + <xsl:attribute name="X2"> + <xsl:value-of select="@x2" /> + </xsl:attribute> + </xsl:if> + <xsl:if test="@y2"> + <xsl:attribute name="Y2"> + <xsl:value-of select="@y2" /> + </xsl:attribute> + </xsl:if> <xsl:apply-templates mode="id" select="." /> <xsl:apply-templates mode="template_fill" select="." /> <xsl:apply-templates mode="template_stroke" select="." /> - <xsl:apply-templates mode="stroke_width" select="." /> <xsl:apply-templates mode="stroke_miterlimit" select="." /> <xsl:apply-templates mode="stroke_dasharray" select="." /> <xsl:apply-templates mode="stroke_dashoffset" select="." /> @@ -1211,38 +2242,63 @@ Fixme: is this template still in use? --> </Line> </xsl:template> -<!-- Rectangle --> +<!-- + // Rectangle object // + SVG: rect, XAML: Rectangle +--> <xsl:template mode="forward" match="*[name(.) = 'rect']"> <Rectangle> - <xsl:if test="@x"><xsl:attribute name="Canvas.Left"> - <xsl:call-template name="convert_unit"> - <xsl:with-param name="convert_value" select="@x" /> + <xsl:if test="@x"> + <xsl:attribute name="Canvas.Left"> + <xsl:call-template name="convert_unit"> + <xsl:with-param name="convert_value" select="@x" /> </xsl:call-template> - </xsl:attribute></xsl:if> - <xsl:if test="@y"><xsl:attribute name="Canvas.Top"> - <xsl:call-template name="convert_unit"> - <xsl:with-param name="convert_value" select="@y" /> - </xsl:call-template> - </xsl:attribute></xsl:if> - <xsl:if test="@width"><xsl:attribute name="Width"> + </xsl:attribute> + </xsl:if> + <xsl:if test="@y"> + <xsl:attribute name="Canvas.Top"> <xsl:call-template name="convert_unit"> - <xsl:with-param name="convert_value" select="@width" /> + <xsl:with-param name="convert_value" select="@y" /> </xsl:call-template> - </xsl:attribute></xsl:if> - <xsl:if test="@height"><xsl:attribute name="Height"> + </xsl:attribute> + </xsl:if> + <xsl:if test="@width"> + <xsl:attribute name="Width"> <xsl:call-template name="convert_unit"> - <xsl:with-param name="convert_value" select="@height" /> + <xsl:with-param name="convert_value" select="@width" /> </xsl:call-template> - </xsl:attribute></xsl:if> - <xsl:if test="@rx"><xsl:attribute name="RadiusX"><xsl:value-of select="@rx" /></xsl:attribute></xsl:if> - <xsl:if test="@ry"><xsl:attribute name="RadiusY"><xsl:value-of select="@ry" /></xsl:attribute></xsl:if> - <xsl:if test="@rx and not(@ry)"><xsl:attribute name="RadiusX"><xsl:value-of select="@rx" /></xsl:attribute><xsl:attribute name="RadiusY"><xsl:value-of select="@rx" /></xsl:attribute></xsl:if> + </xsl:attribute> + </xsl:if> + <xsl:if test="@height"> + <xsl:attribute name="Height"> + <xsl:call-template name="convert_unit"> + <xsl:with-param name="convert_value" select="@height" /> + </xsl:call-template> + </xsl:attribute> + </xsl:if> + <xsl:if test="@rx"> + <xsl:attribute name="RadiusX"> + <xsl:value-of select="@rx" /> + </xsl:attribute> + </xsl:if> + <xsl:if test="@ry"> + <xsl:attribute name="RadiusY"> + <xsl:value-of select="@ry" /> + </xsl:attribute> + </xsl:if> + <xsl:if test="@rx and not(@ry)"> + <xsl:attribute name="RadiusX"> + <xsl:value-of select="@rx" /> + </xsl:attribute> + <xsl:attribute name="RadiusY"> + <xsl:value-of select="@rx" /> + </xsl:attribute> + </xsl:if> <xsl:if test="@ry and not(@rx)"><xsl:attribute name="RadiusX"><xsl:value-of select="@ry" /></xsl:attribute><xsl:attribute name="RadiusY"><xsl:value-of select="@ry" /></xsl:attribute></xsl:if> <xsl:apply-templates mode="id" select="." /> <xsl:apply-templates mode="template_fill" select="." /> <xsl:apply-templates mode="template_stroke" select="." /> - <xsl:apply-templates mode="stroke_width" select="." /> <xsl:apply-templates mode="stroke_miterlimit" select="." /> <xsl:apply-templates mode="stroke_dasharray" select="." /> <xsl:apply-templates mode="stroke_dashoffset" select="." /> @@ -1261,7 +2317,10 @@ Fixme: is this template still in use? --> </Rectangle> </xsl:template> -<!-- Polygon --> +<!-- + // Polygon object // + SVG: polygon, XAML: Polygon +--> <xsl:template mode="forward" match="*[name(.) = 'polygon']"> <Polygon> <xsl:if test="@points"><xsl:attribute name="Points"><xsl:value-of select="@points" /></xsl:attribute></xsl:if> @@ -1269,7 +2328,6 @@ Fixme: is this template still in use? --> <xsl:apply-templates mode="fill_rule" select="." /> <xsl:apply-templates mode="template_fill" select="." /> <xsl:apply-templates mode="template_stroke" select="." /> - <xsl:apply-templates mode="stroke_width" select="." /> <xsl:apply-templates mode="stroke_miterlimit" select="." /> <xsl:apply-templates mode="stroke_dasharray" select="." /> <xsl:apply-templates mode="stroke_dashoffset" select="." /> @@ -1286,7 +2344,10 @@ Fixme: is this template still in use? --> </Polygon> </xsl:template> -<!-- Polyline --> +<!-- + // Polyline object // + SVG: polyline, XAML: Polyline +--> <xsl:template mode="forward" match="*[name(.) = 'polyline']"> <Polyline> <xsl:if test="@points"><xsl:attribute name="Points"><xsl:value-of select="@points" /></xsl:attribute></xsl:if> @@ -1294,7 +2355,6 @@ Fixme: is this template still in use? --> <xsl:apply-templates mode="fill_rule" select="." /> <xsl:apply-templates mode="template_fill" select="." /> <xsl:apply-templates mode="template_stroke" select="." /> - <xsl:apply-templates mode="stroke_width" select="." /> <xsl:apply-templates mode="stroke_miterlimit" select="." /> <xsl:apply-templates mode="stroke_dasharray" select="." /> <xsl:apply-templates mode="stroke_dashoffset" select="." /> @@ -1311,13 +2371,15 @@ Fixme: is this template still in use? --> </Polyline> </xsl:template> -<!-- Path --> +<!-- + // Path // + SVG: path, XAML: Path +--> <xsl:template mode="forward" match="*[name(.) = 'path']"> <Path> <xsl:apply-templates mode="id" select="." /> <xsl:apply-templates mode="template_fill" select="." /> <xsl:apply-templates mode="template_stroke" select="." /> - <xsl:apply-templates mode="stroke_width" select="." /> <xsl:apply-templates mode="stroke_miterlimit" select="." /> <xsl:apply-templates mode="stroke_dasharray" select="." /> <xsl:apply-templates mode="stroke_dashoffset" select="." /> @@ -1354,7 +2416,10 @@ Fixme: is this template still in use? --> </Path> </xsl:template> -<!-- Ellipse --> +<!-- + // Ellipse object // + SVG: ellipse, XAML: Ellipse +--> <xsl:template mode="forward" match="*[name(.) = 'ellipse']"> <Ellipse> <xsl:variable name="cx"> @@ -1380,7 +2445,6 @@ Fixme: is this template still in use? --> <xsl:apply-templates mode="id" select="." /> <xsl:apply-templates mode="template_fill" select="." /> <xsl:apply-templates mode="template_stroke" select="." /> - <xsl:apply-templates mode="stroke_width" select="." /> <xsl:apply-templates mode="stroke_miterlimit" select="." /> <xsl:apply-templates mode="stroke_dasharray" select="." /> <xsl:apply-templates mode="stroke_dashoffset" select="." /> @@ -1398,7 +2462,10 @@ Fixme: is this template still in use? --> </Ellipse> </xsl:template> -<!-- Circle --> +<!-- + // Circle object // + SVG: circle, XAML: Ellipse +--> <xsl:template mode="forward" match="*[name(.) = 'circle']"> <Ellipse> <xsl:variable name="cx"> @@ -1422,7 +2489,6 @@ Fixme: is this template still in use? --> <xsl:apply-templates mode="id" select="." /> <xsl:apply-templates mode="template_fill" select="." /> <xsl:apply-templates mode="template_stroke" select="." /> - <xsl:apply-templates mode="stroke_width" select="." /> <xsl:apply-templates mode="stroke_miterlimit" select="." /> <xsl:apply-templates mode="stroke_dasharray" select="." /> <xsl:apply-templates mode="stroke_dashoffset" select="." /> @@ -1440,6 +2506,55 @@ Fixme: is this template still in use? --> </Ellipse> </xsl:template> +<!-- + // Image object// + SVG: image, FXG: Image +--> +<xsl:template mode="forward" match="*[name(.) = 'image']"> + <Image> + <xsl:apply-templates mode="id" select="." /> + <xsl:if test="@x"> + <xsl:attribute name="Canvas.Left"> + <xsl:call-template name="convert_unit"> + <xsl:with-param name="convert_value" select="@x" /> + </xsl:call-template> + </xsl:attribute> + </xsl:if> + <xsl:if test="@y"> + <xsl:attribute name="Canvas.Top"> + <xsl:call-template name="convert_unit"> + <xsl:with-param name="convert_value" select="@y" /> + </xsl:call-template> + </xsl:attribute> + </xsl:if> + <xsl:apply-templates mode="desc" select="." /> + <xsl:apply-templates mode="clip" select="." /> + <xsl:if test="@xlink:href"> + <xsl:attribute name="Source"> + <xsl:value-of select="@xlink:href" /> + </xsl:attribute> + </xsl:if> + <xsl:if test="@width"> + <xsl:attribute name="Width"> + <xsl:call-template name="convert_unit"> + <xsl:with-param name="convert_value" select="@width" /> + </xsl:call-template> + </xsl:attribute> + </xsl:if> + <xsl:if test="@height"> + <xsl:attribute name="Height"> + <xsl:call-template name="convert_unit"> + <xsl:with-param name="convert_value" select="@height" /> + </xsl:call-template> + </xsl:attribute> + </xsl:if> + <xsl:apply-templates mode="transform" select="."> + <xsl:with-param name="mapped_type" select="'Image'" /> + </xsl:apply-templates> + <xsl:apply-templates mode="forward" /> + </Image> +</xsl:template> + <!-- // Geometry // * Generic clip path template |
