This commit is contained in:
Mylloon 2024-05-06 14:35:12 +02:00
parent 816c5c4f58
commit e9ae88daf5
Signed by: Anri
GPG key ID: A82D63DFF8D1317F

View file

@ -6,14 +6,16 @@
<xsl:output method="xml" indent="yes" /> <xsl:output method="xml" indent="yes" />
<!-- Déclaration des variables initiales --> <!-- Déclaration des variables initiales -->
<xsl:variable name="initial-x" select="0" as="xs:double" /> <xsl:variable name="initial-x" select="0"
<xsl:variable as="xs:double" />
name="initial-y" select="0" as="xs:double" /> <xsl:variable name="initial-y" select="0"
as="xs:double" />
<xsl:variable name="initial-angle" select="0" <xsl:variable name="initial-angle" select="0"
as="xs:double" /> as="xs:double" />
<xsl:template match="/tortue"> <xsl:template match="/tortue">
<xsl:processing-instruction name="xml-model">href="traceur.xsd"</xsl:processing-instruction> <xsl:processing-instruction name="xml-model">href="traceur.xsd"</xsl:processing-instruction>
<traceur> <traceur>
<!-- Appel du template pour traiter les commandes <!-- Appel du template pour traiter les commandes
avec les valeurs initiales des paramètres --> avec les valeurs initiales des paramètres -->
@ -24,8 +26,8 @@
select="$initial-x" /> select="$initial-x" />
<xsl:with-param name="y" <xsl:with-param name="y"
select="$initial-y" /> select="$initial-y" />
<xsl:with-param <xsl:with-param name="angle"
name="angle" select="$initial-angle" /> select="$initial-angle" />
<xsl:with-param name="states" <xsl:with-param name="states"
select="()" /> select="()" />
</xsl:call-template> </xsl:call-template>
@ -54,7 +56,8 @@
<xsl:choose> <xsl:choose>
<!-- Si la commande est une ligne --> <!-- Si la commande est une ligne -->
<xsl:when test="local-name($current-command) = 'line'"> <xsl:when test="local-name($current-command) = 'line'">
<!-- Calcul de la distance à parcourir et conversion de l'angle en radians --> <!-- Calcul de la distance à parcourir
et conversion de l'angle en radians -->
<xsl:variable name="distance" <xsl:variable name="distance"
select="number($current-command)" /> select="number($current-command)" />
<xsl:variable name="radians" <xsl:variable name="radians"
@ -64,13 +67,14 @@
<xsl:variable name="new-y" <xsl:variable name="new-y"
select="$y + $distance * math:sin($radians)" /> select="$y + $distance * math:sin($radians)" />
<!-- Création de l'élément LINETO avec les nouvelles coordonnées calculées --> <!-- Création de l'élément LINETO
avec les nouvelles coordonnées calculées -->
<LINETO <LINETO
x="{format-number($new-x, '#.######')}" x="{format-number($new-x, '#.######')}"
y="{format-number($new-y, '#.######')}" /> y="{format-number($new-y, '#.######')}" />
<!-- Rappel récursif du template avec la mise à jour des coordonnées et des <!-- Rappel récursif du template avec la mise à jour
commandes restantes --> des coordonnées et des commandes restantes -->
<xsl:call-template <xsl:call-template
name="process-commands"> name="process-commands">
<xsl:with-param <xsl:with-param
@ -88,12 +92,13 @@
<!-- Si la commande est un turn --> <!-- Si la commande est un turn -->
<xsl:when test="local-name($current-command) = 'turn'"> <xsl:when test="local-name($current-command) = 'turn'">
<!-- Calcul du nouvel angle avec modulo 360 pour rester dans un cercle complet --> <!-- Calcul du nouvel angle avec modulo 360 pour rester
dans un cercle complet -->
<xsl:variable name="new-angle" <xsl:variable name="new-angle"
select="($angle + number($current-command)) mod 360" /> select="($angle + number($current-command)) mod 360" />
<!-- Rappel récursif du template sans changer de position mais en mettant à jour <!-- Rappel récursif du template sans changer de
l'angle --> position mais en mettant à jour l'angle -->
<xsl:call-template <xsl:call-template
name="process-commands"> name="process-commands">
<xsl:with-param <xsl:with-param
@ -111,7 +116,8 @@
<!-- Si la commande est un MOVE --> <!-- Si la commande est un MOVE -->
<xsl:when test="local-name($current-command) = 'move'"> <xsl:when test="local-name($current-command) = 'move'">
<!-- Calcul de la distance à parcourir et conversion de l'angle en radians --> <!-- Calcul de la distance à parcourir et conversion
de l'angle en radians -->
<xsl:variable name="distance" <xsl:variable name="distance"
select="number($current-command)" /> select="number($current-command)" />
<xsl:variable name="radians" <xsl:variable name="radians"
@ -121,13 +127,14 @@
<xsl:variable name="new-y" <xsl:variable name="new-y"
select="$y + $distance * math:sin($radians)" /> select="$y + $distance * math:sin($radians)" />
<!-- Création de l'élément MOVETO avec les nouvelles coordonnées calculées --> <!-- Création de l'élément MOVETO avec
les nouvelles coordonnées calculées -->
<MOVETO <MOVETO
x="{format-number($new-x, '#.######')}" x="{format-number($new-x, '#.######')}"
y="{format-number($new-y, '#.######')}" /> y="{format-number($new-y, '#.######')}" />
<!-- Rappel récursif du template avec la mise à jour des coordonnées et des <!-- Rappel récursif du template avec la mise à jour
commandes restantes --> des coordonnées et des commandes restantes -->
<xsl:call-template <xsl:call-template
name="process-commands"> name="process-commands">
<xsl:with-param <xsl:with-param
@ -154,39 +161,43 @@
name="new-states" select="($states, $new-state)" /> name="new-states" select="($states, $new-state)" />
<xsl:call-template <xsl:call-template
name="process-commands"> name="process-commands">
<xsl:with-param <xsl:with-param name="commands"
name="commands" select="$commands[position() > 1]" /> select="$commands[position() > 1]" />
<xsl:with-param <xsl:with-param name="x"
name="x" select="$x" /> select="$x" />
<xsl:with-param <xsl:with-param name="y"
name="y" select="$y" /> select="$y" />
<xsl:with-param <xsl:with-param name="angle"
name="angle" select="$angle" /> select="$angle" />
<xsl:with-param name="states" <xsl:with-param name="states"
select="$new-states" /> select="$new-states" />
</xsl:call-template> </xsl:call-template>
</xsl:when> </xsl:when>
<!-- Si la commande est un restore et que au moins 1 état est enregistré : --> <!-- Si la commande est un restore et que au moins
un état est enregistré -->
<xsl:when test="local-name($current-command) = 'restore' and count($states) >= 1"> <xsl:when test="local-name($current-command) = 'restore' and count($states) >= 1">
<!-- On séléctionne notre state (Revoir pourquoi ceci marche) --> <!-- On séléctionne notre state (Revoir pourquoi ceci marche) -->
<xsl:variable <xsl:variable
name="state" select="$states/state[1]" /> name="state"
select="$states/state[1]" />
<xsl:variable <xsl:variable
name="remaining-states" name="remaining-states"
select="subsequence($states/state, 1, count($states/state) - 1)" /> select="subsequence($states/state, 1, count($states/state) - 1)" />
<!-- Création de l'élément MOVETO avec les nouvelles coordonnées restaurées --> <!-- Création de l'élément MOVETO avec les nouvelles
coordonnées restaurées -->
<MOVETO <MOVETO
x="{format-number($states/state[last()]/@x, '#.######')}" x="{format-number($states/state[last()]/@x, '#.######')}"
y="{format-number($states/state[last()]/@y, '#.######')}" /> y="{format-number($states/state[last()]/@y, '#.######')}" />
<!-- Appel récursif -->
<xsl:call-template <xsl:call-template
name="process-commands"> name="process-commands">
<xsl:with-param <xsl:with-param name="commands"
name="commands" select="$commands[position() > 1]" /> select="$commands[position() > 1]" />
<xsl:with-param <xsl:with-param name="x"
name="x" select="($state/@x)[last()]" /> select="($state/@x)[last()]" />
<xsl:with-param name="y" <xsl:with-param name="y"
select="($state/@y)[last()]" /> select="($state/@y)[last()]" />
<xsl:with-param name="angle" <xsl:with-param name="angle"