Skip to content

Navigation mislabels <msubsup> children when the superscript is a prime #807

Description

@TimArborealis

When an <msubsup> has a prime as its superscript, Enhanced and Simple navigation appear to assign the wrong structural roles to its children.

Possibly related to #415, but this seems to involve the special handling for prime/pseudo-script superscripts rather than the ordinary <msubsup> path.

MathML

<math id="0" display="block" xmlns="http://www.w3.org/1998/Math/MathML">
    <msubsup id="1">
        <mi id="2">x</mi>
        <mi id="3">i</mi>
        <mo id="4">′</mo>
    </msubsup>
</math>

Settings

  • Language: English
  • Speech style: SimpleSpeak
  • Speech verbosity: Medium
  • Overview: False
  • Navigation verbosity: Verbose
  • Auto zoom out: True

Tested through NVDA, with the latest build of MathCAT as an addon.

Observed behaviour

Enhanced and Simple

Both modes behave identically.

  1. ZoomIn

    • land on id="2"
    • hear: "zoom in; in base; x"
  2. MoveNext

    • land on id="3"
    • hear: "move right; in superscript; i"
  3. MoveNext

    • land on id="4"
    • hear: "move right; prime"

The structural labels appear to be shifted. In the source MathML, i is the subscript, not the superscript, and ′ is the superscript.

(Character navigation behaves as expected.)

Expected behaviour

My expectation for Enhanced and Simple is that the semantic structure should preserve the indexed base, similarly to an ordinary <msubsup>, while treating the prime specially rather than as an exponent:

skip-super(indexed-by(x, i), prime)

This would give two semantic parts: the indexed expression x sub i as the base, and the prime as the superscript.

I would therefore expect approximately:

  1. ZoomIn

    • land on the generated semantic node for x sub i
    • hear: "zoom in; in base; x sub i"
  2. MoveNext

    • land on id="4"
    • hear: "move right; in superscript; prime"
  3. MoveNext

    • reach the end of the expression

Possible cause

Rules/Intent/general.yaml contains a skip-super rule for both msup and msubsup:

name: skip-super
tag: [msup, msubsup]
...
- intent:
    name: "skip-super"
    ...
    children: [x: "*"]

For this <msubsup>, that gives the skip-super intent three children:

  1. x
  2. i
  3. ′

However, NavigationParts in Rules/Languages/en/definitions.yaml defines:

"skip-super": "base; superscript",

so skip-super has navigation names for only two children.

This appears consistent with the observed behaviour:

  • child 1 (x) → base
  • child 2 (i) → superscript
  • child 3 (′) → no navigation part name

The ordinary <msubsup> inference creates an indexed-by intent around the first two children before adding the superscript.

Perhaps the msubsup version of skip-super needs to preserve the indexed-by(base, subscript) structure rather than passing all three children directly to skip-super.

(Disclosure: I asked ChatGPT for help when digging into the possible cause, so these guesses might by all means be wrong.)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdiscussionRequires discussion to decide next stepsrulesPertains to Rules

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions