61 '/', '.', '*', '+', '?', '|', ', '^',
62 '(', ')', '[', ']', '{', '}', '\\'
100 return [[
self alloc] init];
107 + (id)stringWithHash:(
unsigned)aHash
109 var hashString = parseInt(aHash, 10).toString(16);
110 return "000000".substring(0, MAX(6 - hashString.length, 0)) + hashString;
123 reason:"stringWithString: the string can't be 'nil'"];
125 return [[
self alloc] initWithString:aString];
136 return String(aString);
138 var result =
new String(aString);
140 result.isa = [
self class];
154 reason:"initWithFormat: the format can't be 'nil'"];
156 self = ObjectiveJ.sprintf.apply(
this, Array.prototype.slice.call(arguments, 2));
170 reason:"initWithFormat: the format can't be 'nil'"];
172 return ObjectiveJ.sprintf.apply(
this, Array.prototype.slice.call(arguments, 2));
197 return self.charAt(anIndex);
213 return self + ObjectiveJ.sprintf.apply(
this, Array.prototype.slice.call(arguments, 2));
223 return self + aString;
238 - (
CPString)stringByPaddingToLength:(
unsigned)aLength withString:(
CPString)aString startingAtIndex:(CPUInteger)anIndex
240 if (
self.length == aLength)
243 if (aLength <
self.length)
244 return self.substr(0, aLength);
247 substring = aString.substring(anIndex),
248 difference = aLength -
self.
length;
250 while ((difference -= substring.length) >= 0)
253 if (-difference < substring.length)
254 string += substring.substring(0, -difference);
271 - (CPArray)componentsSeparatedByString:(
CPString)aString
273 return self.split(aString);
283 return self.substr(anIndex);
293 if (aRange.location < 0 ||
CPMaxRange(aRange) >
self.length)
296 return self.substr(aRange.location, aRange.length);
308 if (anIndex >
self.length)
311 return self.substring(0, anIndex);
345 - (CPRange)rangeOfString:(
CPString)aString options:(
int)aMask
370 - (CPRange)rangeOfString:(
CPString)aString options:(
int)aMask range:(CPrange)aRange
376 var
string = (aRange == nil) ?
self : [
self substringWithRange:aRange],
381 string =
string.toLowerCase();
382 aString = aString.toLowerCase();
392 location =
string.lastIndexOf(aString);
399 location =
string.indexOf(aString);
423 return self.replace(
new RegExp([target stringByEscapingRegexControlCharacters],
"g"), replacement);
435 - (
CPString)stringByReplacingOccurrencesOfString:(
CPString)target withString:(
CPString)replacement options:(
int)options range:(CPRange)searchRange
437 var
start =
self.substring(0, searchRange.location),
438 stringSegmentToSearch =
self.substr(searchRange.location, searchRange.length),
439 end =
self.substring(searchRange.location + searchRange.length,
self.length),
444 regExp =
new RegExp(target,
"gi");
446 regExp =
new RegExp(target,
"g");
448 return start +
'' + stringSegmentToSearch.replace(regExp, replacement) +
'' + end;
458 - (
CPString)stringByReplacingCharactersInRange:(CPRange)range withString:(
CPString)replacement
460 return '' +
self.substring(0, range.location) + replacement +
self.substring(range.location + range.length,
self.length);
488 - (CPComparisonResult)caseInsensitiveCompare:(
CPString)aString
502 - (CPComparisonResult)compare:(
CPString)aString options:(
int)aMask
515 lhs = lhs.toLowerCase();
516 rhs = rhs.toLowerCase();
541 - (CPComparisonResult)compare:(
CPString)aString options:(
int)aMask range:(CPRange)range
546 return [lhs compare:rhs options:aMask];
556 return aString && aString !=
"" &&
self.indexOf(aString) == 0;
566 return aString && aString !=
"" &&
self.
length >= aString.
length &&
self.lastIndexOf(aString) == (
self.length - aString.
length);
571 if (
self === anObject)
574 if (!anObject || ![anObject isKindOfClass:[
CPString class]])
586 return self == String(aString);
598 UID = objj_generateObjectUID();
626 min = MIN([lhs length], [rhs length]);
630 lhs = [lhs lowercaseString];
631 rhs = [rhs lowercaseString];
634 for (; len < min; len++)
636 if ([lhs characterAtIndex:len] !== [rhs characterAtIndex:len])
648 var parts =
self.split(/\b/g),
652 for (; i < count; i++)
654 if (i == 0 || (/\s$/).test(parts[i - 1]))
655 parts[i] = parts[i].substring(0, 1).toUpperCase() + parts[i].substring(1).toLowerCase();
657 parts[i] = parts[i].toLowerCase();
659 return parts.join(
"");
667 return self.toLowerCase();
675 return self.toUpperCase();
683 return self.stripDiacritics();
689 - (double)doubleValue
691 return parseFloat(
self, 10);
700 var replaceRegExp =
new RegExp(
"^\\s*[\\+,\\-]?0*");
701 return RegExp(
"^[Y,y,t,T,1-9]").test(
self.replace(replaceRegExp,
''));
709 return parseFloat(
self, 10);
717 return parseInt(
self, 10);
725 return parseInt(
self, 10);
734 - (CPArray)pathComponents
736 if (
self.length === 0)
742 var result =
self.split(
'/');
744 if (result[0] ===
"")
747 var index = result.length - 1;
751 if (result[index] ===
"")
756 while (result[index] ===
"")
757 result.splice(index--, 1);
773 var size = components.
length,
777 firstIsSlash =
false;
781 var component = components[i],
782 lenMinusOne = component.length - 1;
784 if (lenMinusOne >= 0 && (component !==
"/" || firstRound))
786 if (lenMinusOne > 0 && component.indexOf(
"/",lenMinusOne) === lenMinusOne)
787 component = component.substring(0, lenMinusOne);
791 if (component ===
"/")
795 else if (!firstIsSlash)
798 firstIsSlash =
false;
816 return self.substr(
self.lastIndexOf(
'.') + 1);
827 lastIndex = components.
length - 1,
828 lastComponent = components[lastIndex];
830 return lastIndex > 0 && lastComponent ===
"/" ? components[lastIndex - 1] : lastComponent;
842 addComponents = aString && aString !==
"/" ? [aString
pathComponents] : [];
856 if (ext.indexOf(
'/') >= 0 ||
self.
length === 0 ||
self ===
"/")
860 last = components.
length - 1;
862 if (last > 0 && components[last] ===
"/")
863 components.splice(last--, 1);
865 components[last] = components[last] +
"." + ext;
878 if (
self.length === 0)
880 else if (
self ===
"/")
884 last = components.
length - 1;
886 if (components[last] ===
"/")
889 components.splice(last, components.length - last);
904 if (extension ===
"")
906 else if (
self.lastIndexOf(
'.') < 1)
909 return self.substr(0, [
self length] - (extension.length + 1));
928 return JSON.stringify(anObject);
934 - (JSObject)objectFromJSON
936 return JSON.parse(
self);
953 g += FLOOR(RAND() * 0xF).toString(0xF);
960 var
diacritics = [[192,198],[200,203],[204,207],[210,214],[217,220],[224,230],
961 [231,231],[232,235],[236,239],[242,246],[249,252]],
962 normalized = [65,69,73,79,85,97,99,101,105,111,117];
964 String.prototype.stripDiacritics =
function()
968 for (var indexSource = 0; indexSource < this.length; indexSource++)
970 var code = this.charCodeAt(indexSource);
976 if (code >= drange[0] && code <= drange[drange.length - 1])
983 output += String.fromCharCode(code);
Used to implement exception handling (creating & raising).
CPDiacriticInsensitiveSearch
An object representation of nil.
var CPStringRegexTrimWhitespace
CPString substringWithRange:(CPRange aRange)
CPString commonPrefixWithString:options:(CPString aString, [options] int aMask)
void raise:reason:(CPString aName, [reason] CPString aReason)
String prototype stripDiacritics
CPInvalidArgumentException
CPRange rangeOfString:options:(CPString aString, [options] int aMask)
function CPMaxRange(aRange)
An immutable string (collection of characters).
CPString substringToIndex:(unsigned anIndex)
CPString absoluteString()
var CPStringRegexSpecialCharacters
BOOL isEqualToString:(CPString aString)
CPComparisonResult compare:options:(CPString aString, [options] int aMask)
var CPStringRegexEscapeExpression
global CPInvalidArgumentException global CPRangeException CPCaseInsensitiveSearch
CPRange rangeOfString:options:range:(CPString aString, [options] int aMask, [range] CPrange aRange)
CPString stripDiacritics()
FrameUpdater prototype start
id URLWithString:(CPString URLString)
CPString stringByEscapingRegexControlCharacters()
CPString pathWithComponents:(CPArray components)
CPRange function CPMakeRange(location, length)
FrameUpdater prototype description