format
This commit is contained in:
parent
816c5c4f58
commit
e9ae88daf5
1 changed files with 44 additions and 33 deletions
75
traceur.xsl
75
traceur.xsl
|
@ -6,14 +6,16 @@
|
|||
<xsl:output method="xml" indent="yes" />
|
||||
|
||||
<!-- Déclaration des variables initiales -->
|
||||
<xsl:variable name="initial-x" select="0" as="xs:double" />
|
||||
<xsl:variable
|
||||
name="initial-y" select="0" as="xs:double" />
|
||||
<xsl:variable name="initial-x" select="0"
|
||||
as="xs:double" />
|
||||
<xsl:variable name="initial-y" select="0"
|
||||
as="xs:double" />
|
||||
<xsl:variable name="initial-angle" select="0"
|
||||
as="xs:double" />
|
||||
|
||||
<xsl:template match="/tortue">
|
||||
<xsl:processing-instruction name="xml-model">href="traceur.xsd"</xsl:processing-instruction>
|
||||
|
||||
<traceur>
|
||||
<!-- Appel du template pour traiter les commandes
|
||||
avec les valeurs initiales des paramètres -->
|
||||
|
@ -24,8 +26,8 @@
|
|||
select="$initial-x" />
|
||||
<xsl:with-param name="y"
|
||||
select="$initial-y" />
|
||||
<xsl:with-param
|
||||
name="angle" select="$initial-angle" />
|
||||
<xsl:with-param name="angle"
|
||||
select="$initial-angle" />
|
||||
<xsl:with-param name="states"
|
||||
select="()" />
|
||||
</xsl:call-template>
|
||||
|
@ -54,7 +56,8 @@
|
|||
<xsl:choose>
|
||||
<!-- Si la commande est une ligne -->
|
||||
<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"
|
||||
select="number($current-command)" />
|
||||
<xsl:variable name="radians"
|
||||
|
@ -64,13 +67,14 @@
|
|||
<xsl:variable name="new-y"
|
||||
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
|
||||
x="{format-number($new-x, '#.######')}"
|
||||
y="{format-number($new-y, '#.######')}" />
|
||||
|
||||
<!-- Rappel récursif du template avec la mise à jour des coordonnées et des
|
||||
commandes restantes -->
|
||||
<!-- Rappel récursif du template avec la mise à jour
|
||||
des coordonnées et des commandes restantes -->
|
||||
<xsl:call-template
|
||||
name="process-commands">
|
||||
<xsl:with-param
|
||||
|
@ -88,12 +92,13 @@
|
|||
|
||||
<!-- Si la commande est un 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"
|
||||
select="($angle + number($current-command)) mod 360" />
|
||||
|
||||
<!-- Rappel récursif du template sans changer de position mais en mettant à jour
|
||||
l'angle -->
|
||||
<!-- Rappel récursif du template sans changer de
|
||||
position mais en mettant à jour l'angle -->
|
||||
<xsl:call-template
|
||||
name="process-commands">
|
||||
<xsl:with-param
|
||||
|
@ -111,7 +116,8 @@
|
|||
|
||||
<!-- Si la commande est un 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"
|
||||
select="number($current-command)" />
|
||||
<xsl:variable name="radians"
|
||||
|
@ -121,13 +127,14 @@
|
|||
<xsl:variable name="new-y"
|
||||
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
|
||||
x="{format-number($new-x, '#.######')}"
|
||||
y="{format-number($new-y, '#.######')}" />
|
||||
|
||||
<!-- Rappel récursif du template avec la mise à jour des coordonnées et des
|
||||
commandes restantes -->
|
||||
<!-- Rappel récursif du template avec la mise à jour
|
||||
des coordonnées et des commandes restantes -->
|
||||
<xsl:call-template
|
||||
name="process-commands">
|
||||
<xsl:with-param
|
||||
|
@ -145,7 +152,7 @@
|
|||
|
||||
<!-- Si la commande est un store -->
|
||||
<xsl:when test="local-name($current-command) = 'store'">
|
||||
<!-- On enregistre le nouvelle état-->
|
||||
<!-- On enregistre le nouvelle état -->
|
||||
<xsl:variable name="new-state">
|
||||
<state x="{$x}" y="{$y}" angle="{$angle}" />
|
||||
</xsl:variable>
|
||||
|
@ -154,39 +161,43 @@
|
|||
name="new-states" select="($states, $new-state)" />
|
||||
<xsl:call-template
|
||||
name="process-commands">
|
||||
<xsl:with-param
|
||||
name="commands" select="$commands[position() > 1]" />
|
||||
<xsl:with-param
|
||||
name="x" select="$x" />
|
||||
<xsl:with-param
|
||||
name="y" select="$y" />
|
||||
<xsl:with-param
|
||||
name="angle" select="$angle" />
|
||||
<xsl:with-param name="commands"
|
||||
select="$commands[position() > 1]" />
|
||||
<xsl:with-param name="x"
|
||||
select="$x" />
|
||||
<xsl:with-param name="y"
|
||||
select="$y" />
|
||||
<xsl:with-param name="angle"
|
||||
select="$angle" />
|
||||
<xsl:with-param name="states"
|
||||
select="$new-states" />
|
||||
</xsl:call-template>
|
||||
</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">
|
||||
<!-- On séléctionne notre state (Revoir pourquoi ceci marche) -->
|
||||
<xsl:variable
|
||||
name="state" select="$states/state[1]" />
|
||||
name="state"
|
||||
select="$states/state[1]" />
|
||||
<xsl:variable
|
||||
name="remaining-states"
|
||||
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
|
||||
x="{format-number($states/state[last()]/@x, '#.######')}"
|
||||
y="{format-number($states/state[last()]/@y, '#.######')}" />
|
||||
|
||||
<!-- Appel récursif -->
|
||||
<xsl:call-template
|
||||
name="process-commands">
|
||||
<xsl:with-param
|
||||
name="commands" select="$commands[position() > 1]" />
|
||||
<xsl:with-param
|
||||
name="x" select="($state/@x)[last()]" />
|
||||
<xsl:with-param name="commands"
|
||||
select="$commands[position() > 1]" />
|
||||
<xsl:with-param name="x"
|
||||
select="($state/@x)[last()]" />
|
||||
<xsl:with-param name="y"
|
||||
select="($state/@y)[last()]" />
|
||||
<xsl:with-param name="angle"
|
||||
|
|
Reference in a new issue