summaryrefslogtreecommitdiffstats
path: root/chromium/chrome/browser/resources/chromeos/chromevox/common/math_util.js
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/chrome/browser/resources/chromeos/chromevox/common/math_util.js')
-rw-r--r--chromium/chrome/browser/resources/chromeos/chromevox/common/math_util.js263
1 files changed, 263 insertions, 0 deletions
diff --git a/chromium/chrome/browser/resources/chromeos/chromevox/common/math_util.js b/chromium/chrome/browser/resources/chromeos/chromevox/common/math_util.js
new file mode 100644
index 00000000000..34641dedef9
--- /dev/null
+++ b/chromium/chrome/browser/resources/chromeos/chromevox/common/math_util.js
@@ -0,0 +1,263 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview DOM utility functions to aid in math expressions navigation.
+ */
+
+goog.provide('cvox.MathUtil');
+
+goog.require('cvox.ChromeVox');
+goog.require('cvox.XpathUtil');
+
+
+/**
+ * Checks if a node is in a given class of MathML nodes.
+ * @private
+ * @param {!Node} node The node to test.
+ * @param {Array.<string>} tags List of tag names.
+ * @return {boolean} True if node has a tag name included in tags.
+ */
+cvox.MathUtil.isMathmlNodeOfClass_ = function(node, tags) {
+ return tags.indexOf(node.tagName.toUpperCase()) != -1;
+};
+
+
+/**
+ * Checks if a node is in a given class of MathJax nodes.
+ * @private
+ * @param {!Node} node The node to test.
+ * @param {Array.<string>} tags List of tag names.
+ * @return {boolean} True if node has a tag name included in tags.
+ */
+cvox.MathUtil.isMathjaxNodeOfClass_ = function(node, tags) {
+ if (node.tagName == 'SPAN') {
+ var classes = node.className.split(' ');
+ return classes.some(function(x)
+ {return tags.indexOf(x.toUpperCase()) != -1;});
+ }
+ return false;
+};
+
+
+/**
+ * Checks if a node is an element node that belongs to a given class
+ * of MathML or MathJax nodes.
+ * @private
+ * @param {!Node} node The node to test.
+ * @param {Array.<string>} tags List of tag names.
+ * @return {boolean} True if node has a tag name included in tags.
+ */
+cvox.MathUtil.isMathNodeOfClass_ = function(node, tags) {
+ return (node.nodeType == Node.ELEMENT_NODE &&
+ (cvox.MathUtil.isMathmlNodeOfClass_(node, tags) ||
+ cvox.MathUtil.isMathjaxNodeOfClass_(node, tags)));
+};
+
+
+/**
+ * Array of MathML Token Elements.
+ * @type {!Array.<string>}
+ */
+cvox.MathUtil.TOKEN_LIST = ['MI', 'MN', 'MO', 'MTEXT', 'MSPACE', 'MS'];
+
+
+/**
+ * Checks if an element of a math expression is a Token Element.
+ * Token elements are the following:
+ * <mi> identifier.
+ * <mn> number.
+ * <mo> operator, fence, or separator.
+ * <mtext> text.
+ * <mspace> space.
+ * <ms> string literal.
+ * @param {!Node} element The element of the math expression.
+ * @return {boolean} True if element is a token.
+ */
+cvox.MathUtil.isToken = function(element) {
+ return cvox.MathUtil.isMathNodeOfClass_(element, cvox.MathUtil.TOKEN_LIST);
+};
+
+
+/**
+ * Array of MathML Layout Schemata.
+ * @type {!Array.<string>}
+ */
+cvox.MathUtil.LAYOUT_LIST = ['MROW', 'MFRAC', 'MSQRT', 'MROOT', 'MSTYLE',
+ 'MERROR', 'MPADDED', 'MPHANTOM', 'MFENCED',
+ 'MENCLOSE'];
+
+
+/**
+ * Checks if an element of a math expression is a Layout Schema.
+ * Layout elements are the following:
+ * <mrow> group any number of sub-expressions horizontally
+ * <mfrac> form a fraction from two sub-expressions
+ * <msqrt> form a square root (radical without an index)
+ * <mroot> form a radical with specified index
+ * <mstyle> style change
+ * <merror> enclose a syntax error message from a preprocessor
+ * <mpadded> adjust space around content
+ * <mphantom> make content invisible but preserve its size
+ * <mfenced> surround content with a pair of fences
+ * <menclose> enclose content with a stretching symbol such as a long
+ * division sign.
+ * @param {!Node} element The element of the math expression.
+ * @return {boolean} True if element is a layout schema.
+ */
+cvox.MathUtil.isLayout = function(element) {
+ return cvox.MathUtil.isMathNodeOfClass_(element, cvox.MathUtil.LAYOUT_LIST);
+};
+
+
+/**
+ * Array of MathML Script Schemata.
+ * @type {!Array.<string>}
+ */
+cvox.MathUtil.SCRIPT_LIST = ['MSUB', 'MSUP', 'MSUBSUP', 'MUNDER', 'MOVER',
+ 'MUNDEROVER', 'MMULTISCRIPTS', 'MPRESCRIPTS'];
+
+
+/**
+ * Checks if an element of a math expression is a Script Schema.
+ * Script elements are the following:
+ * <msub> attach a subscript to a base.
+ * <msup> attach a superscript to a base.
+ * <msubsup> attach a subscript-superscript pair to a base.
+ * <munder> attach an underscript to a base.
+ * <mover> attach an overscript to a base.
+ * <munderover> attach an underscript-overscript pair to a base.
+ * <mmultiscripts> attach prescripts and tensor indices to a base.
+ * Prescripts are optional.
+ * <mprescripts> two elements prescripts of mmultiscripts. Only makes sense
+ * in that environment (although not illegal outside)! Two
+ * arguments mandatory (can be <none/>).
+ * @param {!Node} element The element of the math expression.
+ * @return {boolean} True if element is a script schema.
+ */
+cvox.MathUtil.isScript = function(element) {
+ return cvox.MathUtil.isMathNodeOfClass_(element, cvox.MathUtil.SCRIPT_LIST);
+};
+
+
+/**
+ * Array of MathML Table and Matrix tokens.
+ * @type {!Array.<string>}
+ */
+cvox.MathUtil.TABLES_LIST = ['MTABLE', 'MLABELEDTR', 'MTR', 'MTD',
+ 'MALIGNGROUP', 'MALIGNMARK'];
+
+
+/**
+ * Checks if an element of a math expression is a Tables Schema.
+ * Tables elements are the following:
+ * <mtable> table or matrix.
+ * <mlabeledtr> row in a table or matrix with a label or equation number.
+ * <mtr> row in a table or matrix.
+ * <mtd> one entry in a table or matrix.
+ * <maligngroup> and
+ * <malignmark> alignment markers.
+ * @param {!Node} element The element of the math expression.
+ * @return {boolean} True if element is a tables schema.
+ */
+cvox.MathUtil.isTables = function(element) {
+ return cvox.MathUtil.isMathNodeOfClass_(element, cvox.MathUtil.TABLES_LIST);
+};
+
+
+/**
+ * Array of MathML Elementary Layout Schemata.
+ * @type {!Array.<string>}
+ */
+cvox.MathUtil.ELEMENTARY_LIST = ['MSTACK', 'MLONGDIV', 'MSGROUP', 'MSROW',
+ 'MSCARRIES', 'MSCARRY', 'MSLINE'];
+
+
+/**
+ * Checks if an element of a math expression is a Elementary Schema.
+ * Elementary elements are the following:
+ * <mstack> columns of aligned characters.
+ * <mlongdiv> similar to msgroup, with the addition of a divisor and result.
+ * <msgroup> a group of rows in an mstack that are shifted by similar amounts.
+ * <msrow> a row in an mstack.
+ * <mscarries> row in an mstack that whose contents represent carries
+ * or borrows.
+ * <mscarry> one entry in an mscarries.
+ * <msline> horizontal line inside of mstack.
+ * @param {!Node} element The element of the math expression.
+ * @return {boolean} True if element is a elementary schema.
+ */
+cvox.MathUtil.isElementary = function(element) {
+ return cvox.MathUtil.isMathNodeOfClass_(element,
+ cvox.MathUtil.ELEMENTARY_LIST);
+};
+
+
+/**
+ * Array of all valid tags in a MathML expression.
+ * This is a union of all other token lists.
+ * @type {!Array.<string>}
+ */
+cvox.MathUtil.MATHML_TAG_LIST = [cvox.MathUtil.TOKEN_LIST,
+ cvox.MathUtil.LAYOUT_LIST,
+ cvox.MathUtil.SCRIPT_LIST,
+ cvox.MathUtil.TABLES_LIST,
+ cvox.MathUtil.ELEMENTARY_LIST].reduce(
+ function(x, y) { return x.concat(y); });
+
+
+/**
+ * Checks if a node is valid element of a MathML expression.
+ * @param {!Node} element The element of the math expression.
+ * @return {boolean} True if element has a valid MathML tag.
+ */
+cvox.MathUtil.isMathmlTag = function(element) {
+ return cvox.MathUtil.isMathNodeOfClass_(element,
+ cvox.MathUtil.MATHML_TAG_LIST);
+};
+
+
+/**
+ * Array of MathML Whitespace and Alignment tokens.
+ * These are elements that can occur in the other token lists.
+ * @type {!Array.<string>}
+ */
+cvox.MathUtil.WHITESPACE_LIST = ['MSROW', 'MROW', 'MSPACE',
+ 'MPHANTOM', 'MPADDED'];
+
+
+/**
+ * Checks if an element of a math expression is whitespace or an
+ * alignment marker.
+ * @param {!Node} element The element of the math expression.
+ * @return {boolean} True if element is a whitespace node.
+ */
+cvox.MathUtil.isWhitespace = function(element) {
+ return cvox.MathUtil.isMathNodeOfClass_(element,
+ cvox.MathUtil.WHITESPACE_LIST);
+};
+
+
+/**
+ * Checks if an element of a math expression is a legal mathml markup element
+ * but not a whitespace or an alignment marker.
+ * @param {!Node} element The element of the math expression.
+ * @return {boolean} True if element is a non-whitespace node.
+ */
+cvox.MathUtil.isNotWhitespace = function(element) {
+ return (cvox.MathUtil.isMathmlTag(element) &&
+ !cvox.MathUtil.isWhitespace(element));
+};
+
+
+/**
+ * Computes the union of two arrays (not in a strictly set theoretical sense
+ * as all duplicate elements in either array still remain as duplicates!).
+ * @param {Array} a An array.
+ * @param {Array} b Another array.
+ * @return {Array} Union of a and b.
+ */
+cvox.MathUtil.union = function(a, b) {
+ return a.concat(b.filter(function(x) {return a.indexOf(x) < 0;}));
+};