summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 6f95e18)
raw | patch | inline | side by side (parent: 6f95e18)
author | JazzyNico <nicoduf@yahoo.fr> | |
Fri, 14 Jan 2011 11:04:37 +0000 (12:04 +0100) | ||
committer | JazzyNico <nicoduf@yahoo.fr> | |
Fri, 14 Jan 2011 11:04:37 +0000 (12:04 +0100) |
share/extensions/svg2fxg.xsl | patch | blob | history | |
share/extensions/svg2xaml.xsl | patch | blob | history |
index 7569d0db7deadc3a3ee44c1ccf9cd296e3eb0255..4ccd62f27498167c9369fb2f63d2b00b51f6787c 100755 (executable)
* Text tspan
* Text flowPara
* Text flowRegion (text frame)
+ * Get font size
* Font size
* Font weight
* Font family
</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, ';')">
<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">
index 185ebe25d59128288ca197f9acfdffab702cb0c3..a21da1290938d6232f734d7a9b2c750d54a2c2ec 100755 (executable)
<!--
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
<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">
</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']">
<!--
<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>
</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>
<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>
<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>
<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>
<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="." /-->
</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>
</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>
+
+<!--
+ // 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
-Blank template. Title is ignored and desc is converted to Tag in the mode="desc" 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>
+
+<!--
+ // Misc ignored stuff (markers, patterns, styles) //
+-->
+<xsl:template mode="forward" match="*[name(.) = 'marker' or name(.) = 'pattern' or name(.) = 'style']">
+
</xsl:template>
-<!-- Unknown tags -->
+<!--
+ // 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: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>
- <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>
- </xsl:choose>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </p>
</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:comment>
- <xsl:value-of select="name(.)" />
- </xsl:comment>
+ <!--
+ // 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="$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 test="@font-size">
+ <xsl:value-of select="@font-size" />
</xsl:when>
- <xsl:otherwise>
- <!-- For instance LinearGradient.Transform -->
+ <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="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_size, ';')">
+ <xsl:value-of select="substring-before($font_size, ';')" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$font_size" />
+ </xsl:otherwise>
</xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
- </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:when test="name(..) = 'g' or name(..) = 'svg'">
+ <xsl:apply-templates mode="get_font_size" select="parent::*"/>
+ </xsl:when>
</xsl:choose>
</xsl:template>
-
<!--
-// Objects //
-
-* Image
-* Text
-* Lines
-* Rectangle
-* Polygon
-* Polyline
-* Path
-* Ellipse
-* Circle
+ // Text font size //
+ SVG: font-size, XAML: FontSize
-->
-
-<!-- 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: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="$value != ''">
<xsl:call-template name="convert_unit">
- <xsl:with-param name="convert_value" select="@height" />
+ <xsl:with-param name="convert_value" select="$value" />
</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>
+ </xsl:when>
+ <xsl:otherwise>12</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
</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, ';')" />
- </xsl:when>
- <xsl:otherwise><xsl:value-of select="$font_size" /></xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
+<!--
+ // 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="@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: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>
+
+<!--
+ // 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="@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:variable name="font_family" select="normalize-space(substring-after(@style, 'font-family:'))" />
+ <xsl:choose>
+ <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: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>
+
+<!--
+ // 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="@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: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>
+
+<!--
+ // 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>
+
+<!--
+ // 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>
+
+<!--
+ // 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 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_style" /></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="@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="@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="@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: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: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($fill, ';')">
- <xsl:value-of select="substring-before($fill, ';')" />
+ <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: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="$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>
</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="." />
</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="." />
</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>
<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="." />
</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>
<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="." />
</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="." />
</Path>
</xsl:template>
-<!-- Ellipse -->
+<!--
+ // Ellipse object //
+ SVG: ellipse, XAML: Ellipse
+-->
<xsl:template mode="forward" match="*[name(.) = 'ellipse']">
<Ellipse>
<xsl:variable name="cx">
<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="." />
</Ellipse>
</xsl:template>
-<!-- Circle -->
+<!--
+ // Circle object //
+ SVG: circle, XAML: Ellipse
+-->
<xsl:template mode="forward" match="*[name(.) = 'circle']">
<Ellipse>
<xsl:variable name="cx">
<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="." />
</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