123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- /*
- Copyright (c) 2004-2012, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
- */
- if(!dojo._hasResource["dojox.string.Builder"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
- dojo._hasResource["dojox.string.Builder"] = true;
- dojo.provide("dojox.string.Builder");
- dojox.string.Builder = function(/*String?*/str){
- // summary:
- // A fast buffer for creating large strings.
- //
- // length: Number
- // The current length of the internal string.
- // N.B. the public nature of the internal buffer is no longer
- // needed because the IE-specific fork is no longer needed--TRT.
- var b = "";
- this.length = 0;
-
- this.append = function(/* String... */s){
- // summary: Append all arguments to the end of the buffer
- if(arguments.length>1){
- /*
- This is a loop unroll was designed specifically for Firefox;
- it would seem that static index access on an Arguments
- object is a LOT faster than doing dynamic index access.
- Therefore, we create a buffer string and take advantage
- of JS's switch fallthrough. The peformance of this method
- comes very close to straight up string concatenation (+=).
- If the arguments object length is greater than 9, we fall
- back to standard dynamic access.
- This optimization seems to have no real effect on either
- Safari or Opera, so we just use it for all.
- It turns out also that this loop unroll can increase performance
- significantly with Internet Explorer, particularly when
- as many arguments are provided as possible.
- Loop unroll per suggestion from Kris Zyp, implemented by
- Tom Trenka.
- Note: added empty string to force a string cast if needed.
- */
- var tmp="", l=arguments.length;
- switch(l){
- case 9: tmp=""+arguments[8]+tmp;
- case 8: tmp=""+arguments[7]+tmp;
- case 7: tmp=""+arguments[6]+tmp;
- case 6: tmp=""+arguments[5]+tmp;
- case 5: tmp=""+arguments[4]+tmp;
- case 4: tmp=""+arguments[3]+tmp;
- case 3: tmp=""+arguments[2]+tmp;
- case 2: {
- b+=""+arguments[0]+arguments[1]+tmp;
- break;
- }
- default: {
- var i=0;
- while(i<arguments.length){
- tmp += arguments[i++];
- }
- b += tmp;
- }
- }
- } else {
- b += s;
- }
- this.length = b.length;
- return this; // dojox.string.Builder
- };
-
- this.concat = function(/*String...*/s){
- // summary:
- // Alias for append.
- return this.append.apply(this, arguments); // dojox.string.Builder
- };
-
- this.appendArray = function(/*Array*/strings) {
- // summary:
- // Append an array of items to the internal buffer.
- // Changed from String.prototype.concat.apply because of IE.
- return this.append.apply(this, strings); // dojox.string.Builder
- };
-
- this.clear = function(){
- // summary:
- // Remove all characters from the buffer.
- b = "";
- this.length = 0;
- return this; // dojox.string.Builder
- };
-
- this.replace = function(/* String */oldStr, /* String */ newStr){
- // summary:
- // Replace instances of one string with another in the buffer.
- b = b.replace(oldStr,newStr);
- this.length = b.length;
- return this; // dojox.string.Builder
- };
-
- this.remove = function(/* Number */start, /* Number? */len){
- // summary:
- // Remove len characters starting at index start. If len
- // is not provided, the end of the string is assumed.
- if(len===undefined){ len = b.length; }
- if(len == 0){ return this; }
- b = b.substr(0, start) + b.substr(start+len);
- this.length = b.length;
- return this; // dojox.string.Builder
- };
-
- this.insert = function(/* Number */index, /* String */str){
- // summary:
- // Insert string str starting at index.
- if(index == 0){
- b = str + b;
- }else{
- b = b.slice(0, index) + str + b.slice(index);
- }
- this.length = b.length;
- return this; // dojox.string.Builder
- };
-
- this.toString = function(){
- // summary:
- // Return the string representation of the internal buffer.
- return b; // String
- };
- // initialize the buffer.
- if(str){ this.append(str); }
- };
- }
|