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;
};
|