| Index: third_party/google_input_tools/third_party/closure_library/closure/goog/string/string.js
|
| diff --git a/third_party/google_input_tools/third_party/closure_library/closure/goog/string/string.js b/third_party/google_input_tools/third_party/closure_library/closure/goog/string/string.js
|
| index 90ee58cedc6d78d58a4a244ebcec416386d85d95..065a1a8409b4e453833be736d94409b00394c699 100644
|
| --- a/third_party/google_input_tools/third_party/closure_library/closure/goog/string/string.js
|
| +++ b/third_party/google_input_tools/third_party/closure_library/closure/goog/string/string.js
|
| @@ -14,6 +14,7 @@
|
|
|
| /**
|
| * @fileoverview Utilities for string manipulation.
|
| + * @author arv@google.com (Erik Arvidsson)
|
| */
|
|
|
|
|
| @@ -32,6 +33,12 @@ goog.define('goog.string.DETECT_DOUBLE_ESCAPING', false);
|
|
|
|
|
| /**
|
| + * @define {boolean} Whether to force non-dom html unescaping.
|
| + */
|
| +goog.define('goog.string.FORCE_NON_DOM_HTML_UNESCAPING', false);
|
| +
|
| +
|
| +/**
|
| * Common Unicode string characters.
|
| * @enum {string}
|
| */
|
| @@ -142,9 +149,9 @@ goog.string.collapseWhitespace = function(str) {
|
| /**
|
| * Checks if a string is empty or contains only whitespaces.
|
| * @param {string} str The string to check.
|
| - * @return {boolean} True if {@code str} is empty or whitespace only.
|
| + * @return {boolean} Whether {@code str} is empty or whitespace only.
|
| */
|
| -goog.string.isEmpty = function(str) {
|
| +goog.string.isEmptyOrWhitespace = function(str) {
|
| // testing length == 0 first is actually slower in all browsers (about the
|
| // same in Opera).
|
| // Since IE doesn't include non-breaking-space (0xa0) in their \s character
|
| @@ -155,17 +162,54 @@ goog.string.isEmpty = function(str) {
|
|
|
|
|
| /**
|
| + * Checks if a string is empty.
|
| + * @param {string} str The string to check.
|
| + * @return {boolean} Whether {@code str} is empty.
|
| + */
|
| +goog.string.isEmptyString = function(str) {
|
| + return str.length == 0;
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Checks if a string is empty or contains only whitespaces.
|
| + *
|
| + * TODO(user): Deprecate this when clients have been switched over to
|
| + * goog.string.isEmptyOrWhitespace.
|
| + *
|
| + * @param {string} str The string to check.
|
| + * @return {boolean} Whether {@code str} is empty or whitespace only.
|
| + */
|
| +goog.string.isEmpty = goog.string.isEmptyOrWhitespace;
|
| +
|
| +
|
| +/**
|
| * Checks if a string is null, undefined, empty or contains only whitespaces.
|
| * @param {*} str The string to check.
|
| - * @return {boolean} True if{@code str} is null, undefined, empty, or
|
| + * @return {boolean} Whether {@code str} is null, undefined, empty, or
|
| * whitespace only.
|
| + * @deprecated Use goog.string.isEmptyOrWhitespace(goog.string.makeSafe(str))
|
| + * instead.
|
| */
|
| -goog.string.isEmptySafe = function(str) {
|
| - return goog.string.isEmpty(goog.string.makeSafe(str));
|
| +goog.string.isEmptyOrWhitespaceSafe = function(str) {
|
| + return goog.string.isEmptyOrWhitespace(goog.string.makeSafe(str));
|
| };
|
|
|
|
|
| /**
|
| + * Checks if a string is null, undefined, empty or contains only whitespaces.
|
| + *
|
| + * TODO(user): Deprecate this when clients have been switched over to
|
| + * goog.string.isEmptyOrWhitespaceSafe.
|
| + *
|
| + * @param {*} str The string to check.
|
| + * @return {boolean} Whether {@code str} is null, undefined, empty, or
|
| + * whitespace only.
|
| + */
|
| +goog.string.isEmptySafe = goog.string.isEmptyOrWhitespaceSafe;
|
| +
|
| +
|
| +/**
|
| * Checks if a string is all breaking whitespace.
|
| * @param {string} str The string to check.
|
| * @return {boolean} Whether the string is all breaking whitespace.
|
| @@ -209,7 +253,7 @@ goog.string.isAlphaNumeric = function(str) {
|
| /**
|
| * Checks if a character is a space character.
|
| * @param {string} ch Character to check.
|
| - * @return {boolean} True if {code ch} is a space.
|
| + * @return {boolean} True if {@code ch} is a space.
|
| */
|
| goog.string.isSpace = function(ch) {
|
| return ch == ' ';
|
| @@ -219,7 +263,7 @@ goog.string.isSpace = function(ch) {
|
| /**
|
| * Checks if a character is a valid unicode character.
|
| * @param {string} ch Character to check.
|
| - * @return {boolean} True if {code ch} is a valid unicode character.
|
| + * @return {boolean} True if {@code ch} is a valid unicode character.
|
| */
|
| goog.string.isUnicodeChar = function(ch) {
|
| return ch.length == 1 && ch >= ' ' && ch <= '~' ||
|
| @@ -289,12 +333,17 @@ goog.string.collapseBreakingSpaces = function(str) {
|
| * @param {string} str The string to trim.
|
| * @return {string} A trimmed copy of {@code str}.
|
| */
|
| -goog.string.trim = function(str) {
|
| - // Since IE doesn't include non-breaking-space (0xa0) in their \s character
|
| - // class (as required by section 7.2 of the ECMAScript spec), we explicitly
|
| - // include it in the regexp to enforce consistent cross-browser behavior.
|
| - return str.replace(/^[\s\xa0]+|[\s\xa0]+$/g, '');
|
| -};
|
| +goog.string.trim = (goog.TRUSTED_SITE && String.prototype.trim) ?
|
| + function(str) {
|
| + return str.trim();
|
| + } :
|
| + function(str) {
|
| + // Since IE doesn't include non-breaking-space (0xa0) in their \s
|
| + // character class (as required by section 7.2 of the ECMAScript spec),
|
| + // we explicitly include it in the regexp to enforce consistent
|
| + // cross-browser behavior.
|
| + return str.replace(/^[\s\xa0]+|[\s\xa0]+$/g, '');
|
| + };
|
|
|
|
|
| /**
|
| @@ -620,10 +669,10 @@ goog.string.ALL_RE_ = (goog.string.DETECT_DOUBLE_ESCAPING ?
|
| */
|
| goog.string.unescapeEntities = function(str) {
|
| if (goog.string.contains(str, '&')) {
|
| - // We are careful not to use a DOM if we do not have one. We use the []
|
| - // notation so that the JSCompiler will not complain about these objects and
|
| - // fields in the case where we have no DOM.
|
| - if ('document' in goog.global) {
|
| + // We are careful not to use a DOM if we do not have one or we explicitly
|
| + // requested non-DOM html unescaping.
|
| + if (!goog.string.FORCE_NON_DOM_HTML_UNESCAPING &&
|
| + 'document' in goog.global) {
|
| return goog.string.unescapeEntitiesUsingDom_(str);
|
| } else {
|
| // Fall back on pure XML entities
|
| @@ -660,6 +709,7 @@ goog.string.unescapeEntitiesWithDocument = function(str, document) {
|
| * @return {string} The unescaped {@code str} string.
|
| */
|
| goog.string.unescapeEntitiesUsingDom_ = function(str, opt_document) {
|
| + /** @type {!Object<string, string>} */
|
| var seen = {'&': '&', '<': '<', '>': '>', '"': '"'};
|
| var div;
|
| if (opt_document) {
|
| @@ -862,8 +912,7 @@ goog.string.truncateMiddle = function(str, chars,
|
|
|
| /**
|
| * Special chars that need to be escaped for goog.string.quote.
|
| - * @private
|
| - * @type {Object}
|
| + * @private {!Object<string, string>}
|
| */
|
| goog.string.specialEscapeChars_ = {
|
| '\0': '\\0',
|
| @@ -880,8 +929,7 @@ goog.string.specialEscapeChars_ = {
|
|
|
| /**
|
| * Character mappings used internally for goog.string.escapeChar.
|
| - * @private
|
| - * @type {Object}
|
| + * @private {!Object<string, string>}
|
| */
|
| goog.string.jsEscapeCache_ = {
|
| '\'': '\\\''
|
| @@ -966,24 +1014,6 @@ goog.string.escapeChar = function(c) {
|
|
|
|
|
| /**
|
| - * Takes a string and creates a map (Object) in which the keys are the
|
| - * characters in the string. The value for the key is set to true. You can
|
| - * then use goog.object.map or goog.array.map to change the values.
|
| - * @param {string} s The string to build the map from.
|
| - * @return {!Object} The map of characters used.
|
| - */
|
| -// TODO(arv): It seems like we should have a generic goog.array.toMap. But do
|
| -// we want a dependency on goog.array in goog.string?
|
| -goog.string.toMap = function(s) {
|
| - var rv = {};
|
| - for (var i = 0; i < s.length; i++) {
|
| - rv[s.charAt(i)] = true;
|
| - }
|
| - return rv;
|
| -};
|
| -
|
| -
|
| -/**
|
| * Determines whether a string contains a substring.
|
| * @param {string} str The string to search.
|
| * @param {string} subString The substring to search for.
|
| @@ -1296,7 +1326,7 @@ goog.string.createUniqueString = function() {
|
| */
|
| goog.string.toNumber = function(str) {
|
| var num = Number(str);
|
| - if (num == 0 && goog.string.isEmpty(str)) {
|
| + if (num == 0 && goog.string.isEmptyOrWhitespace(str)) {
|
| return NaN;
|
| }
|
| return num;
|
| @@ -1404,6 +1434,25 @@ goog.string.toTitleCase = function(str, opt_delimiters) {
|
|
|
|
|
| /**
|
| + * Capitalizes a string, i.e. converts the first letter to uppercase
|
| + * and all other letters to lowercase, e.g.:
|
| + *
|
| + * goog.string.capitalize('one') => 'One'
|
| + * goog.string.capitalize('ONE') => 'One'
|
| + * goog.string.capitalize('one two') => 'One two'
|
| + *
|
| + * Note that this function does not trim initial whitespace.
|
| + *
|
| + * @param {string} str String value to capitalize.
|
| + * @return {string} String value with first letter in uppercase.
|
| + */
|
| +goog.string.capitalize = function(str) {
|
| + return String(str.charAt(0)).toUpperCase() +
|
| + String(str.substr(1)).toLowerCase();
|
| +};
|
| +
|
| +
|
| +/**
|
| * Parse a string in decimal or hexidecimal ('0xFFFF') form.
|
| *
|
| * To parse a particular radix, please use parseInt(string, radix) directly. See
|
| @@ -1452,7 +1501,7 @@ goog.string.parseInt = function(value) {
|
| * @param {number} limit The limit to the number of splits. The resulting array
|
| * will have a maximum length of limit+1. Negative numbers are the same
|
| * as zero.
|
| - * @return {!Array.<string>} The string, split.
|
| + * @return {!Array<string>} The string, split.
|
| */
|
|
|
| goog.string.splitLimit = function(str, separator, limit) {
|
| @@ -1474,3 +1523,43 @@ goog.string.splitLimit = function(str, separator, limit) {
|
| return returnVal;
|
| };
|
|
|
| +
|
| +/**
|
| + * Computes the Levenshtein edit distance between two strings.
|
| + * @param {string} a
|
| + * @param {string} b
|
| + * @return {number} The edit distance between the two strings.
|
| + */
|
| +goog.string.editDistance = function(a, b) {
|
| + var v0 = [];
|
| + var v1 = [];
|
| +
|
| + if (a == b) {
|
| + return 0;
|
| + }
|
| +
|
| + if (!a.length || !b.length) {
|
| + return Math.max(a.length, b.length);
|
| + }
|
| +
|
| + for (var i = 0; i < b.length + 1; i++) {
|
| + v0[i] = i;
|
| + }
|
| +
|
| + for (var i = 0; i < a.length; i++) {
|
| + v1[0] = i + 1;
|
| +
|
| + for (var j = 0; j < b.length; j++) {
|
| + var cost = a[i] != b[j];
|
| + // Cost for the substring is the minimum of adding one character, removing
|
| + // one character, or a swap.
|
| + v1[j + 1] = Math.min(v1[j] + 1, v0[j + 1] + 1, v0[j] + cost);
|
| + }
|
| +
|
| + for (var j = 0; j < v0.length; j++) {
|
| + v0[j] = v1[j];
|
| + }
|
| + }
|
| +
|
| + return v1[b.length];
|
| +};
|
|
|