Fork me on GitHub



new EditableMathlist(config: [string]:any, target: HTMLElement)private


  • Method names that begin with an underbar _ are private and meant to be used only by the implementation of the class.
  • Method names that end with an underbar _ are selectors. They can be invoked by calling MathField.$perform(). They will be dispatched to an instance of MathEditableList as necessary. Note that the selector name does not include the underbar.

For example:

config : [string]:any
target : HTMLElement

A target object passed as the first argument of callback functions. Typically, a MathField.

root : MathAtom[]

The root element of the math expression.

path : Object[]

The path to the element that is the anchor for the selection.

extent : number

Number of atoms in the selection. 0 if the selection is collapsed.

config : [string]:any
suppressChangeNotifications : boolean

If true, the handlers for notification change won't be called.



Internal primitive to add a column/row in a matrix


Delete sibling atoms





ancestor(ancestor: number): MathAtomprivate

ancestor : number

distance from self to ancestor.

  • ancestor = 0: self
  • ancestor = 1: parent
  • ancestor = 2: grand-parent
  • etc...

: MathAtom   


The atom where the selection starts. When the selection is extended the anchor remains fixed. The anchor could be either before or after the focus.


Apply a style (color, background) to the selection.

If the style is already applied to the selection, remove it. If the selection has the style partially applied (i.e. only some sections), remove it from those sections, and apply it to the entire selection.

commandOffsets(): objectprivate

Return a {start:, end:} for the offsets of the command around the insertion point, or null.

  • start is the first atom which is of type command
  • end is after the last atom of type command
: object   

commitCommandStringBeforeInsertionPoint(): stringprivate

: string   

contains(atom: MathAtom): booleanprivate

atom : MathAtom
: boolean   

True if atom is within the selection range

decorateCommandStringAroundInsertionPoint(value: boolean)private

value : boolean

If true, decorate the command string around the insertion point with an error indicator (red dotted underline). If false, remove it.


Delete multiple characters

delete_(dir: number)private

dir : number

If the selection is not collapsed, and dir is negative, delete backwards, starting with the anchor atom. That is, delete(-1) will delete only the anchor atom. If dir = 0, delete only if the selection is not collapsed


Delete everything in the field









Offset of the first atom not included in the selection i.e. max value of siblings.length endOffset - startOffset = extent

extend(dist: number)private

Change the range of the selection

dist : number

The change (positive or negative) to the extent of the selection. The anchor point does not move.


If the selection is in a numerator, the selection will be extended to include the denominator.




Extend the selection to the end of the math field.



Extend the selection until the next boundary is reached. A boundary is defined by an atom of a different type (mbin, mord, etc...) than the current focus. For example, in "1234+x=y", if the focus is between "1" and "2", invoking extendToNextBoundary_ would extend the selection to "234".




Extend the selection until the previous boundary is reached. A boundary is defined by an atom of a different type (mbin, mord, etc...) than the current focus. For example, in "1+23456", if the focus is between "5" and "6", invoking extendToPreviousBoundary would extend the selection to "2345".




If the selection is in a denominator, the selection will be extended to include the numerator.

extractArgBeforeInsertionPoint(): stringprivate

: string   

extractCommandStringAroundInsertionPoint(): stringprivate

: string   

filter(cb: function, dir: number): MathAtom[]private

Iterate over each atom in the expression, starting with the focus.

Return an array of all the paths for which the callback predicate returned true.

cb : function

A predicate being passed a path and the atom at this path. Return true to include the designated atom in the result.

dir : number

+1 to iterate forward, -1 to iterate backward.

: MathAtom[]   

The atoms for which the predicate is true

forEach(cb: function)private


cb : function

A callback called for each atom in the mathlist.

forEachSelected(cb: function)private

cb : function

A callback called for each selected atom in the mathlist.

getSelectedAtoms(): MathAtom[]private

: MathAtom[]   

The currently selected atoms, or null if the selection is collapsed

insert(s: string, options: [string]:any)private

s : string
options : [string]:any
options.insertionMode : "replaceSelection" | "replaceAll" | "insertBefore" | "insertAfter"

  • 'replaceSelection' (default)
    • 'replaceAll'
    • 'insertBefore'
    • 'insertAfter'

options.selectionMode : "placeholder" | "after" | "before"

Describes where the selection will be after the insertion:

  • 'placeholder': the selection will be the first available placeholder in the item that has been inserted) (default)
  • 'after': the selection will be an insertion point after the item that has been inserted),
  • 'before': the selection will be an insertion point before the item that has been inserted) or 'item' (the item that was inserted will be selected).

options.placeholder : string

The placeholder string, if necessary

options.format : "auto" | "latex"

The format of the string s:

  • 'auto': the string is interpreted as a latex fragment or command or ASCIIMath (default)
  • 'latex': the string is interpreted strictly as a latex fragment

options.smartFence : boolean

If true, promote plain fences, e.g. (, as \left...\right or \mleft...\mright

options.suppressChangeNotifications : boolean

If true, the handlers for the contentWillChange, contentDidChange, selectionWillChange and selectionDidChange notifications will not be invoked. Default false. : object


If necessary, insert a first atom in the sibling list. If there's already a first atom, do nothing. The first atom is used as a 'placeholder' to hold the blinking caret when the caret is positioned at the very beginning of the mathlist.

isCollapsed(): booleanprivate

: boolean   

True if the selection is an insertion point.


Move to the next/previous expression boundary

leap(): booleanprivate

Move to the next/previous placeholder or empty child list.

: boolean   

False if no placeholder found and did not move












If cursor is currently in:

  • superscript: move to subscript, creating it if necessary
  • subscript: move to superscript, creating it if necessary
  • numerator: move to denominator
  • denominator: move to numerator
  • otherwise: move to superscript





Switch the cursor to the subscript and select it. If there is no subscript yet, create one.


Switch the cursor to the superscript and select it. If there is no subscript yet, create one.



Move the anchor to the next permissible atom


Select all the atoms in the math field.


Select all the atoms in the current group, that is all the siblings. When the selection is in a numerator, the group is the numerator. When the selection is a superscript or subscript, the group is the supsub. When the selection is in a text zone, the "group" is a word.

setExtent(extent: number)private

extent : number

setPath(selection: string | Array, extent: number): booleanprivate

selection : string | Array
extent : number

the length of the selection

: boolean   

true if the path has actually changed

setRange(from: string[], to: string[], options: object): booleanprivate

Extend the selection between from and to nodes

from : string[]
to : string[]
options : object

  • options.extendToWordBoundary

: boolean   

true if the range was actually changed

setSelection(offset: number, extent?: number | string, relation: string): booleanprivate

offset : number

  • >0: index of the child in the group where the selection will start from
  • <0: index counting from the end of the group

extent : number | string = 0

Number of items in the selection:

  • 0: collapsed selection, single insertion point
  • >0: selection extending after the offset
  • <0: selection extending before the offset
  • 'end': selection extending to the end of the group
  • 'start': selection extending to the beginning of the group

relation : string

e.g. 'body', 'superscript', etc...

: boolean   

False if the relation is invalid (no such children)

sibling(): MathAtomprivate

Sibling, relative to anchor sibling(0) = start of selection sibling(-1) = sibling immediately left of start offset

: MathAtom   

siblings(): MathAtom[]private

: MathAtom[]   

array of children of the parent

skip(dir: number, options: [string]:any)private

Move the selection focus to the next/previous point of interest. A point of interest is an atom of a different type (mbin, mord, etc...) than the current focus. If extend is true, the selection will be extended. Otherwise, it is collapsed, then moved.

dir : number

+1 to skip forward, -1 to skip back

options : [string]:any


Offset of the first atom included in the selection i.e. =1 => selection starts with and includes first atom With expression x= and atoms :

  • 0:

  • 1: x

  • 2: =

  • if caret is before x: start = 0, end = 0

  • if caret is after x: start = 1, end = 1

  • if x is selected: start = 1, end = 2

  • if x= is selected: start = 1, end = 3

toString(): stringprivate

Return a string representation of the selection.

: string   
To Do:
  • This is a bad name for this function, since it doesn't return a representation of the content, which one might expect...


Swap the characters to either side of the insertion point and advances the insertion point past both of them. Does nothing to a selected range of text.