thirdparty/jsdoctoolkit/app/frame/String.js
changeset 3041 c8f47f0b6697
equal deleted inserted replaced
3040:8f9580309846 3041:c8f47f0b6697
       
     1 /**
       
     2 	@name String
       
     3 	@class Additions to the core string object.
       
     4 */
       
     5 
       
     6 /** @author Steven Levithan, released as public domain. */
       
     7 String.prototype.trim = function() {
       
     8 	var str = this.replace(/^\s+/, '');
       
     9 	for (var i = str.length - 1; i >= 0; i--) {
       
    10 		if (/\S/.test(str.charAt(i))) {
       
    11 			str = str.substring(0, i + 1);
       
    12 			break;
       
    13 		}
       
    14 	}
       
    15 	return str;
       
    16 }
       
    17 /*t:
       
    18 	plan(6, "Testing String.prototype.trim.");
       
    19 	
       
    20 	var s = "   a bc   ".trim();
       
    21 	is(s, "a bc", "multiple spaces front and back are trimmed.");
       
    22 
       
    23 	s = "a bc\n\n".trim();
       
    24 	is(s, "a bc", "newlines only in back are trimmed.");
       
    25 	
       
    26 	s = "\ta bc".trim();
       
    27 	is(s, "a bc", "tabs only in front are trimmed.");
       
    28 	
       
    29 	s = "\n \t".trim();
       
    30 	is(s, "", "an all-space string is trimmed to empty.");
       
    31 	
       
    32 	s = "a b\nc".trim();
       
    33 	is(s, "a b\nc", "a string with no spaces in front or back is trimmed to itself.");
       
    34 	
       
    35 	s = "".trim();
       
    36 	is(s, "", "an empty string is trimmed to empty.");
       
    37 
       
    38 */
       
    39 
       
    40 String.prototype.balance = function(open, close) {
       
    41 	var i = 0;
       
    42 	while (this.charAt(i) != open) {
       
    43 		if (i == this.length) return [-1, -1];
       
    44 		i++;
       
    45 	}
       
    46 	
       
    47 	var j = i+1;
       
    48 	var balance = 1;
       
    49 	while (j < this.length) {
       
    50 		if (this.charAt(j) == open) balance++;
       
    51 		if (this.charAt(j) == close) balance--;
       
    52 		if (balance == 0) break;
       
    53 		j++;
       
    54 		if (j == this.length) return [-1, -1];
       
    55 	}
       
    56 	
       
    57 	return [i, j];
       
    58 }
       
    59 /*t:
       
    60 	plan(16, "Testing String.prototype.balance.");
       
    61 	
       
    62 	var s = "{abc}".balance("{","}");
       
    63 	is(s[0], 0, "opener in first is found.");
       
    64 	is(s[1], 4, "closer in last is found.");
       
    65 	
       
    66 	s = "ab{c}de".balance("{","}");
       
    67 	is(s[0], 2, "opener in middle is found.");
       
    68 	is(s[1], 4, "closer in middle is found.");
       
    69 	
       
    70 	s = "a{b{c}de}f".balance("{","}");
       
    71 	is(s[0], 1, "nested opener is found.");
       
    72 	is(s[1], 8, "nested closer is found.");
       
    73 	
       
    74 	s = "{}".balance("{","}");
       
    75 	is(s[0], 0, "opener with no content is found.");
       
    76 	is(s[1], 1, "closer with no content is found.");
       
    77 	
       
    78 	s = "".balance("{","}");
       
    79 	is(s[0], -1, "empty string opener is -1.");
       
    80 	is(s[1], -1, "empty string closer is -1.");
       
    81 	
       
    82 	s = "{abc".balance("{","}");
       
    83 	is(s[0], -1, "opener with no closer returns -1.");
       
    84 	is(s[1], -1, "no closer returns -1.");
       
    85 	
       
    86 	s = "abc".balance("{","}");
       
    87 	is(s[0], -1, "no opener or closer returns -1 for opener.");
       
    88 	is(s[1], -1, "no opener or closer returns -1 for closer.");
       
    89 	
       
    90 	s = "a<bc}de".balance("<","}");
       
    91 	is(s[0], 1, "unmatching opener is found.");
       
    92 	is(s[1], 4, "unmatching closer is found.");
       
    93 */