<?xml version='1.0'?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:m="http://www.w3.org/1998/Math/MathML"
                xmlns:d="http://gold-saucer.afraid.org/mathml/text-to-speech"
                exclude-result-prefixes="m d"
                version='1.0'
                xml:lang="en">

<data xml:lang="en" 
      xmlns="http://gold-saucer.afraid.org/mathml/text-to-speech">
  <speak symbol="+">plus</speak>

  <speak symbol="&#x2212;">minus</speak>
  <speak symbol="&#xB1;">plus or minus</speak>
  <speak symbol="=">equals</speak>
  <speak symbol="("></speak>
  <speak symbol=")"></speak>

  <speak symbol="sin">sine</speak>
  <speak symbol="arcsin">arc sine</speak>
  <speak symbol="arccos">arc cos</speak>
  <speak symbol="arctan">arc tan</speak>


  <speak symbol="&#x22A5;">perp</speak>                      <!-- \perp -->

  <!-- Operator symbols -->
  <speak symbol="&#x22C5;">dot</speak>                       <!-- \cdot -->
  <speak symbol="&#x00B7;">centerdot</speak>                 <!-- \centerdot -->
  <speak symbol="&#x00B7;&#x00B7;&#x00B7;">dot dot dot</speak> <!-- \cdots -->
  <speak symbol="&#x00D7;">cross</speak>                     <!-- \times -->

  <!-- Miscellaneous simple symbols -->
  <speak symbol="&#x2200;">for all</speak>                   <!-- \forall -->
  <speak symbol="&#x2207;">dell</speak>                      <!-- \nabla -->

  <!-- Relation symbols -->
  <speak symbol="&#x2264;">less than or equal to</speak>     <!-- \leq -->
  <speak symbol="&#x2266;">less than or equal to</speak>     <!-- \leqq -->
  <speak symbol="&#x2265;">greater than or equal to</speak>  <!-- \geq -->
  <speak symbol="&#x2267;">greater than or equal to</speak>  <!-- \geqq -->

  <!-- Arrows -->
  <speak symbol="&#x2192;">to</speak>                        <!-- \to -->

  <!-- Miscellaneous relation symbols -->
  <speak symbol="&#x220a;">in</speak>                        <!-- \in -->
  
  <speak symbol="&#x221E;">infinity</speak>                  <!-- \infty -->

  <speak symbol="&#x222B;">integral</speak>                  <!-- \int -->
  <speak symbol="&#x222E;">the integral over a closed path</speak>

  <speak symbol="&#x2211;">sum</speak>                       <!-- \sum -->

  <!-- Roman letters -->
  <speak symbol="a"><PRON SUB="eh">a</PRON></speak>
  <speak symbol="A"><PRON SUB="eh">A</PRON></speak>
  <speak symbol="f"><PRON SUB="eff">f</PRON></speak>
  <speak symbol="F"><PRON SUB="eff">F</PRON></speak>

  <!-- Greek letters -->
  <speak symbol="&#x03B1;">alpha</speak>
  <speak symbol="&#x03B2;">beta</speak>
  <speak symbol="&#x03C7;">chi</speak>
  <speak symbol="&#x03B4;">delta</speak>
  <speak symbol="&#x0394;">Delta</speak>
  <speak symbol="&#x03DD;">di-gamma</speak>
  <speak symbol="&#x03F5;">epsilon</speak>
  <speak symbol="&#x03B7;">eta</speak>
  <speak symbol="&#x03B3;">gamma</speak>
  <speak symbol="&#x0393;">Gamma</speak>
  <speak symbol="&#x03B9;">iota</speak>
  <speak symbol="&#x03BA;">kappa</speak>
  <speak symbol="&#x03BB;">lambda</speak>
  <speak symbol="&#x039B;">Lambda</speak>
  <speak symbol="&#x03BC;">mu</speak>
  <speak symbol="&#x03BD;">nu</speak>
  <speak symbol="&#x03C9;">omega</speak>
  <speak symbol="&#x03A9;">Omega</speak>
  <speak symbol="&#x03C6;">fee</speak>
  <speak symbol="&#x03A6;">Fee</speak>
  <speak symbol="&#x03C0;">pi</speak>
  <speak symbol="&#x03A0;">Pi</speak>
  <speak symbol="&#x03C8;">sigh</speak>
  <speak symbol="&#x03A8;">Sigh</speak>
  <speak symbol="&#x03C1;">rho</speak>
  <speak symbol="&#x03C3;">sigma</speak>
  <speak symbol="&#x03A3;">Sigma</speak>
  <speak symbol="&#x03C4;">tau</speak>
  <speak symbol="&#x03B8;">theta</speak>
  <speak symbol="&#x0398;">Theta</speak>
  <speak symbol="&#x03C5;">upsilon</speak>
  <speak symbol="&#x03D2;">Upsilon</speak>
  <speak symbol="&#x03B5;">epsilon</speak>
  <speak symbol="&#x03F0;">kappa</speak>
  <speak symbol="&#x03D5;">phi</speak>
  <speak symbol="&#x03D6;">pi</speak>
  <speak symbol="&#x03F1;">rho</speak>
  <speak symbol="&#x03C2;">sigma</speak>
  <speak symbol="&#x03D1;">theta</speak>
  <speak symbol="&#x03BE;">xi</speak>
  <speak symbol="&#x039E;">Xi</speak>
  <speak symbol="&#x03B6;">zeta</speak>

</data>


<xsl:param name="tts-data" select="document('')" />

<xsl:strip-space elements="m:msup m:msub m:mrow m:mfrac m:mroot m:msqrt" />

<xsl:key name="dict" match="d:speak" use="@symbol" />

<xsl:output 
  method="xml" encoding="utf-8" standalone="yes" />

<xsl:template match="m:*">
  <xsl:apply-templates />
  <xsl:text> </xsl:text>
</xsl:template>

<xsl:template match="m:mrow">
  <xsl:choose>
    <xsl:when test="count(*)=3
                    and *[1]/self::m:mo[string(.)='|']
                    and *[3]/self::m:mo[string(.)='|']">
      <xsl:text>absolute value of </xsl:text>
      <xsl:apply-templates select="*[2]" />
    </xsl:when>
    <xsl:otherwise>
      <xsl:apply-templates />
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="m:munder">
  <xsl:choose>
    <xsl:when test="m:mi[position()=1 and string(.)='lim']">
      <xsl:text>limit as </xsl:text>
      <xsl:apply-templates />
    </xsl:when>
    <xsl:otherwise>
      <xsl:apply-templates />
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="m:math">
  <SABLE>
    <SPEAKER NAME="male1">
    <RATE SPEED="-20%">
    <xsl:apply-templates />
    </RATE>
    </SPEAKER>
  </SABLE>
</xsl:template>

<xsl:template match="m:mroot">
  <xsl:apply-templates select="*[2]" />
  <xsl:text>root of </xsl:text>
  <xsl:apply-templates select="*[1]" />
  <xsl:text> </xsl:text>
</xsl:template>

<xsl:template match="m:msqrt">
  <xsl:text>square root of </xsl:text>
  <xsl:apply-templates />
  <xsl:text> </xsl:text>
</xsl:template>

<xsl:template match="m:mi">
  <xsl:call-template name="speak-symbol" />
</xsl:template>

<xsl:template name="speak-symbol">
  <xsl:param name="char" select="text()" />
  <xsl:for-each select="$tts-data">
    <xsl:variable name="dict-entry" select="key('dict', $char)[last()]" />

    <xsl:choose>
      <xsl:when test="$dict-entry">
        <xsl:copy-of select="$dict-entry/node()" />
      </xsl:when>

      <xsl:otherwise>
        <xsl:value-of select="$char" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:for-each>
  <xsl:text> </xsl:text>
</xsl:template>

<xsl:template match="m:msup">
  <xsl:apply-templates select="*[1]" />
  <xsl:choose>
    <xsl:when test="*[2]/self::m:mn[string(.) = '2']">
      <xsl:text>squared </xsl:text>
    </xsl:when>
    <xsl:when test="*[2]/self::m:mn[string(.) = '3']">
      <xsl:text>cubed </xsl:text>
    </xsl:when>
    <xsl:when test="*[2]/self::m:mrow[string(m:mo[1])='&#x2212;' and string(m:mn[2]='1')]">
      <xsl:text>inverse </xsl:text>
    </xsl:when>
    <xsl:otherwise>
      <xsl:text>to the power of </xsl:text>
      <xsl:apply-templates select="*[2]" />
    </xsl:otherwise>
  </xsl:choose>      
</xsl:template>

<xsl:template match="m:mo">
  <xsl:call-template name="speak-symbol" />
</xsl:template>

<xsl:template match="m:mfrac">
  <xsl:apply-templates select="*[1]" />

  <xsl:choose>
    <xsl:when test="*[1]/self::m:mrow">
      <xsl:text>all over </xsl:text>
    </xsl:when>
    <xsl:otherwise>
      <xsl:text>over </xsl:text>
    </xsl:otherwise>
  </xsl:choose>

  <xsl:apply-templates select="*[2]" />
  <xsl:text> </xsl:text>
</xsl:template>

</xsl:stylesheet>

