File: math_semantic_util.js

package info (click to toggle)
chromium-browser 41.0.2272.118-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 2,189,132 kB
  • sloc: cpp: 9,691,462; ansic: 3,341,451; python: 712,689; asm: 518,779; xml: 208,926; java: 169,820; sh: 119,353; perl: 68,907; makefile: 28,311; yacc: 13,305; objc: 11,385; tcl: 3,186; cs: 2,225; sql: 2,217; lex: 2,215; lisp: 1,349; pascal: 1,256; awk: 407; ruby: 155; sed: 53; php: 14; exp: 11
file content (135 lines) | stat: -rw-r--r-- 3,731 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// 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 Utility functions for semantic tree computations.
 */

goog.provide('cvox.SemanticUtil');


/**
 * @constructor
 */
cvox.SemanticUtil = function() { };


/**
 * Merges keys of objects into an array.
 * @param {...Object.<string, string>} objects Optional objects.
 * @return {Array.<string>} Array of all keys of the objects.
 */
cvox.SemanticUtil.objectsToKeys = function(objects) {
  objects = Array.prototype.slice.call(arguments, 0);
  var keys = [];
  return keys.concat.apply(keys, objects.map(Object.keys));
};


/**
 * Merges values of objects into an array.
 * @param {...Object.<string, string>} objects Optional objects.
 * @return {Array.<string>} Array of all values of the objects.
 */
cvox.SemanticUtil.objectsToValues = function(objects) {
  objects = Array.prototype.slice.call(arguments, 0);
  var result = [];
  var collectValues = function(obj) {
    for (var key in obj) {
      result.push(obj[key]);
    }
  };
  objects.forEach(collectValues);
  return result;
};


/**
 * Transforms a unicode character into numeric representation. Returns null if
 * the input string is not a valid unicode character.
 * @param {string} unicode Character.
 * @return {?number} The decimal representation if it exists.
 */
cvox.SemanticUtil.unicodeToNumber = function(unicode) {
  if (!unicode || unicode.length > 2) {
    return null;
  }
  // Treating surrogate pairs.
  if (unicode.length == 2) {
    var hi = unicode.charCodeAt(0);
    var low = unicode.charCodeAt(1);
    if (0xD800 <= hi && hi <= 0xDBFF && !isNaN(low)) {
      return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
    }
    return null;
  }
  return unicode.charCodeAt(0);
};


/**
 * Transforms a numberic representation of a unicode character into its
 * corresponding string.
 * @param {number} number Unicode point.
 * @return {string} The string representation.
 */
cvox.SemanticUtil.numberToUnicode = function(number) {
  if (number >= 0x10000) {
    var hi = (number - 0x10000) / 0x0400 + 0xD800;
    var lo = (number - 0x10000) % 0x0400 + 0xDC00;
    return String.fromCharCode(hi, lo);
  }
  return String.fromCharCode(number);
};


/**
 * Returns the tagname of an element node in upper case.
 * @param {Element} node The node.
 * @return {string} The node's tagname.
 */
cvox.SemanticUtil.tagName = function(node) {
  return node.tagName.toUpperCase();
};


/**
 * List of MathML Tags that are to be ignored.
 * @type {Array.<string>}
 * @const
 */
cvox.SemanticUtil.IGNORETAGS = [
  'MERROR', 'MPHANTOM', 'MSPACE', 'MACTION', 'MALIGNGROUP', 'MALIGNMARK',
  'MACTION'
];


/**
 * List of MathML Tags to be ignore if they have no children.
 * @type {Array.<string>}
 * @const
 */
cvox.SemanticUtil.EMPTYTAGS = ['MATH', 'MROW', 'MPADDED', 'MSTYLE'];


/**
 * Removes elements from a list of MathML nodes that are either to be ignored or
 * ignored if they have empty children.
 * Observe that this is currently not recursive, i.e. will not take care of
 * pathological cases, where content is hidden in incorrectly used tags!
 * @param {Array.<Element>} nodes The node list to be cleaned.
 * @return {Array.<Element>} The cleansed list.
 */
cvox.SemanticUtil.purgeNodes = function(nodes) {
  var nodeArray = [];
  for (var i = 0, node; node = nodes[i]; i++) {
    var tagName = cvox.SemanticUtil.tagName(node);
    if (cvox.SemanticUtil.IGNORETAGS.indexOf(tagName) != -1) continue;
    if (cvox.SemanticUtil.EMPTYTAGS.indexOf(tagName) != -1 &&
        node.childNodes.length == 0)
    continue;
    nodeArray.push(node);
  }
  return nodeArray;
};