mathcat 0.7.5

MathCAT: Math Capable Assistive Technology ('Speech and braille from MathML')
Documentation
---
# Provide an overview/outline/description of the math
# MathPlayer just tried to shorten things like "mfrac" by just saying "fraction"
#   For mrow, it say up to 5 operands and just say "and n more things" for the rest
# This results in strings of varying length. Given human memory is about 7 words long,
#   it would be better to aim for 7 words (maybe aim for a range of 6-10 words).
# Idea:
#   Start by generating a terse form of the speech
#   At every step when the strings are being joined
#     a) if the #words <= 7, return the joined string
#     b) otherwise, set verbosity to 'overview' and regenerate the expression and use that
# There is a balance that you want to maximize the info given, so 10 words is likely better then 3.
#   That might mean that at the top level, we may want to allow the first few children to expand

- name: default
  tag: math
  match: "."
  replace: [{x: "*[1]"}]

- name: default
  tag: [mi, mn, mo, mtext]
  match: "."
  replace: [{x: text()}]

- name: default
  tag: mfrac
  match: "."
  replace:
  - test:
      if: "IsNode(*[1], 'simple') and IsNode(*[2], 'simple')"
      then:
      - x: "*[1]"
      - t: "over"
      - x: "*[2]"
      else:
      - t: "fraction"

- name: default
  tag: msqrt
  match: "."
  replace:
  - t: "square root"
  - test:
      if: "IsNode(*[1], 'simple')"
      then:
      - test:
          if: "$Verbosity!='Terse'"
          then: {t: "of"}
      - x: "*[1]"

- name: default
  tag: mroot
  match: "."
  replace:
  - test:
      if: "*[2][self::m:mn]"
      then_test:
      - if: "*[2][.='2']"
        then: {t: "square root"}
      - else_if: "*[2][.='3']"
        then: {t: "cube root"}
      - else_if: "*[2][not(contains(., ','))]" # FI: Changed decimal point to decimal comma
        then: [{x: "ToOrdinal(*[2])"}, {t: "root"}]
      else:
      - test:
          if: "*[2][self::m:mi][string-length(.)=1]"
          then:
          - x: "*[2]"
          - pronounce: [{text: "-th"}, {ipa: "θ"}, {sapi5: "th"}, {eloquence: "T"}]
          else: {x: "*[2]"}
      - t: "root"
  - test:
      if: "IsNode(*[1], 'simple')"
      then:
      - test:
          if: "$Verbosity!='Terse'"
          then: {t: "of"}
      - x: "*[1]"

- name: default
  tag: mtable
  match:
  - "*[2][self::m:mtable] and"
  - "(IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|'))"
  replace:
  - t: "the"
  - x: count(*[2]/*)
  - t: "by"
  - x: count(*[2]/*[self::m:mtr][1]/*)
  - test:
      if: "*[1][.='|']" # just need to check the first bracket since we know it must be (, [, or |
      then: {t: "determinant"}
      else: {t: "matrix"}

- name: default
  tag: mtable
  match: "."
  replace:
  - t: "the"
  - x: count(*[2]/*)
  - t: "by"
  - x: count(*[2]/*[self::m:mtr][1]/*)
  - t: "table"

- name: short-mrow
  tag: mrow
  match: "count(*)<6"
  replace:
  - insert:
      nodes: "*"
      replace: [{pause: auto}]

- name: long-mrow
  tag: mrow
  match: "."
  replace:
  - x: "*[1]"
  - pause: auto
  - x: "*[2]"
  - pause: auto
  - x: "*[3]"
  - pause: auto
  - x: "*[4]"
  - pause: auto
  - x: "*[5]"
  - pause: auto
  - t: "and so on"

- include: "SimpleSpeak_Rules.yaml"