- Author:
- David Nickerson <nickerso@users.sourceforge.net>
- Date:
- 2009-07-16 02:00:03+12:00
- Desc:
- the starting point for the HH tutorial example
- Permanent Source URI:
- https://models.fieldml.org/workspace/a1/rawfile/f6a8f90307388eb4b040ee3566b84d88b59247f7/dojo-presentation/js/dojo/dojox/string/Builder.js
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); }
};