This repository has been archived on 2024-05-19. You can view files and clone it, but cannot push or open issues or pull requests.
l-systems/svg.xsl

97 lines
3.2 KiB
XML
Raw Normal View History

2024-05-04 02:42:50 +02:00
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
2024-05-06 14:40:26 +02:00
xmlns="http://www.w3.org/2000/svg">
<xsl:output indent="yes" />
2024-05-04 02:42:50 +02:00
2024-05-06 14:40:26 +02:00
<xsl:template match="/">
<svg version="1.0" xmlns:xlink="http://www.w3.org/1999/xlink">
<xsl:apply-templates select="traceur" />
</svg>
</xsl:template>
2024-05-04 02:42:50 +02:00
2024-05-06 14:40:26 +02:00
<!-- Template pour le traceur -->
<xsl:template match="traceur">
<!-- Dimensions arbitraires -->
<xsl:variable
name="width" select="1000" />
<xsl:variable
name="height" select="800" />
2024-05-06 14:40:26 +02:00
<xsl:variable name="scale">
<!-- Valeurs trouvés au fils de plusieurs tests -->
2024-05-06 21:54:25 +02:00
<xsl:variable name="dividende"
select="1.4" />
2024-05-06 14:40:26 +02:00
<xsl:variable name="x"
2024-05-06 21:54:25 +02:00
select="$width div max(*/@x) div $dividende" />
2024-05-06 14:40:26 +02:00
<xsl:variable name="y"
2024-05-06 21:54:25 +02:00
select="$height div max(*/@y) div $dividende" />
2024-05-06 14:40:26 +02:00
<!-- La plus petite valeur entre X et Y -->
<xsl:choose>
<xsl:when test="$y > $x">
2024-05-06 21:54:25 +02:00
<xsl:value-of select="$x" />
2024-05-06 14:40:26 +02:00
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$y" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
2024-05-06 14:40:26 +02:00
<!-- Translation pour être à peu près centré -->
<xsl:variable
2024-05-06 21:54:25 +02:00
name="transX" select="($width * 1.2) - max(*/@x ) * $scale" />
2024-05-06 14:40:26 +02:00
<xsl:variable
2024-05-06 21:54:25 +02:00
name="transY" select="$height - max(*/@y) * $scale" />
2024-05-06 21:37:18 +02:00
<g stroke="black"
stroke-width="{1 div $scale}"
2024-05-06 14:40:26 +02:00
transform="translate({$transX}, {$transY}) scale({$scale})">
2024-05-06 20:16:34 +02:00
<xsl:call-template name="generatePath" />
2024-05-06 14:40:26 +02:00
</g>
</xsl:template>
2024-05-04 02:42:50 +02:00
2024-05-06 20:16:34 +02:00
<!-- Tracés -->
2024-05-06 14:40:26 +02:00
<xsl:template name="generatePath">
2024-05-06 20:16:34 +02:00
<xsl:param name="idx"
select="1" />
<xsl:param name="x" select="0" />
<xsl:param name="y" select="0" />
<xsl:if
2024-05-06 20:29:18 +02:00
test="count(*) >= $idx">
2024-05-06 20:16:34 +02:00
<xsl:variable
name="action" select="*[position() = $idx]" />
2024-05-04 02:42:50 +02:00
2024-05-06 20:16:34 +02:00
<xsl:choose>
<!-- Déplacement -->
<xsl:when test="name($action) = 'MOVETO'">
<xsl:call-template name="generatePath">
<xsl:with-param name="idx" select="$idx + 1" />
<xsl:with-param name="x" select="$action/@x" />
<xsl:with-param name="y" select="$action/@y" />
</xsl:call-template>
</xsl:when>
2024-05-04 02:42:50 +02:00
2024-05-06 20:16:34 +02:00
<!-- Ecriture -->
<xsl:when test="name($action) = 'LINETO'">
<xsl:variable name="pos"
select="concat($x, ' ', $y)" />
<xsl:variable name="nouvellePos"
select="concat($action/@x, ' ', $action/@y)" />
<path
d="{concat('M', $pos, ' L', $nouvellePos)}" />
<xsl:call-template
name="generatePath">
<xsl:with-param name="idx" select="$idx + 1" />
<xsl:with-param name="x" select="$action/@x" />
<xsl:with-param name="y" select="$action/@y" />
</xsl:call-template>
</xsl:when>
</xsl:choose>
</xsl:if>
2024-05-06 14:40:26 +02:00
</xsl:template>
2024-05-04 02:42:50 +02:00
</xsl:transform>