24 #define _CPMaxRange(aRange) ((aRange).location + (aRange).length)
65 '/',
'.',
'*',
'+',
'?',
'|',
'$',
'^',
66 '(',
')',
'[',
']',
'{',
'}',
'\\'
105 return [[
self alloc] init];
112 + (id)stringWithHash:(
unsigned)aHash
114 var hashString = parseInt(aHash, 10).toString(16);
115 return "000000".substring(0, MAX(6 - hashString.length, 0)) + hashString;
128 reason:"stringWithString: the string can't be 'nil'"];
130 return [[
self alloc] initWithString:aString];
141 return String(aString);
143 var result =
new String(aString);
145 result.isa = [
self class];
159 reason:"initWithFormat: the format can't be 'nil'"];
161 self = ObjectiveJ.sprintf.apply(
this, Array.prototype.slice.call(arguments, 2));
175 reason:"initWithFormat: the format can't be 'nil'"];
177 return ObjectiveJ.sprintf.apply(
this, Array.prototype.slice.call(arguments, 2));
202 return charAt(anIndex);
218 return self + ObjectiveJ.sprintf.apply(
this, Array.prototype.slice.call(arguments, 2));
228 return self + aString;
243 - (
CPString)stringByPaddingToLength:(
unsigned)aLength withString:(
CPString)aString startingAtIndex:(
unsigned)anIndex
245 if (length == aLength)
248 if (aLength < length)
249 return substr(0, aLength);
252 substring = aString.substring(anIndex),
253 difference = aLength - length;
255 while ((difference -= substring.length) >= 0)
258 if (-difference < substring.length)
259 string += substring.substring(0, -difference);
278 return split(aString);
288 return substr(anIndex);
298 if (aRange.location < 0 || _CPMaxRange(aRange) > length)
301 return substr(aRange.location, aRange.length);
313 if (anIndex > length)
316 return substring(0, anIndex);
349 - (CPRange)rangeOfString:(
CPString)aString options:(
int)aMask
373 - (CPRange)rangeOfString:(
CPString)aString options:(
int)aMask range:(CPrange)aRange
379 var
string = (aRange == nil) ?
self : [
self substringWithRange:aRange],
384 string =
string.toLowerCase();
385 aString = aString.toLowerCase();
390 location =
string.lastIndexOf(aString);
397 location =
string.indexOf(aString);
421 return self.replace(
new RegExp([target stringByEscapingRegexControlCharacters],
"g"), replacement);
433 - (
CPString)stringByReplacingOccurrencesOfString:(
CPString)target withString:(
CPString)replacement options:(
int)options range:(CPRange)searchRange
435 var start = substring(0, searchRange.location),
436 stringSegmentToSearch = substr(searchRange.location, searchRange.length),
437 end = substring(searchRange.location + searchRange.length,
self.length),
442 regExp =
new RegExp(target,
"gi");
444 regExp =
new RegExp(target,
"g");
446 return start +
'' + stringSegmentToSearch.replace(regExp, replacement) +
'' + end;
456 - (
CPString)stringByReplacingCharactersInRange:(CPRange)range withString:(
CPString)replacement
458 return '' + substring(0, range.location) + replacement + substring(range.location + range.length,
self.length);
486 - (CPComparisonResult)caseInsensitiveCompare:(
CPString)aString
497 - (CPComparisonResult)compare:(
CPString)aString options:(
int)aMask
504 lhs = lhs.toLowerCase();
505 rhs = rhs.toLowerCase();
510 lhs = lhs.stripDiacritics();
511 rhs = rhs.stripDiacritics();
530 - (CPComparisonResult)compare:(
CPString)aString options:(
int)aMask range:(CPRange)range
535 return [lhs compare:rhs options:aMask];
545 return aString && aString !=
"" && indexOf(aString) == 0;
555 return aString && aString !=
"" && length >= aString.
length && lastIndexOf(aString) == (length - aString.
length);
560 if (
self === anObject)
563 if (!anObject || ![anObject isKindOfClass:[
CPString class]])
575 return self == String(aString);
587 UID = objj_generateObjectUID();
615 min = MIN([lhs length], [rhs length]);
619 lhs = [lhs lowercaseString];
620 rhs = [rhs lowercaseString];
623 for (; len < min; len++)
625 if ([lhs characterAtIndex:len] !== [rhs characterAtIndex:len])
637 var parts =
self.split(/\b/g),
641 for (; i < count; i++)
643 if (i == 0 || (/\s$/).test(parts[i - 1]))
644 parts[i] = parts[i].substring(0, 1).toUpperCase() + parts[i].substring(1).toLowerCase();
646 parts[i] = parts[i].toLowerCase();
648 return parts.join(
"");
656 return toLowerCase();
664 return toUpperCase();
670 - (double)doubleValue
672 return parseFloat(
self, 10);
681 var replaceRegExp =
new RegExp(
"^\\s*[\\+,\\-]?0*");
682 return RegExp(
"^[Y,y,t,T,1-9]").test(
self.replace(replaceRegExp,
''));
690 return parseFloat(
self, 10);
698 return parseInt(
self, 10);
715 var result = split(
'/');
717 if (result[0] ===
"")
720 var index = result.length - 1;
724 if (result[index] ===
"")
729 while (result[index] ===
"")
730 result.splice(index--, 1);
746 var size = components.length,
750 firstIsSlash =
false;
754 var component = components[i],
755 lenMinusOne = component.length - 1;
757 if (lenMinusOne >= 0 && (component !==
"/" || firstRound))
759 if (lenMinusOne > 0 && component.indexOf(
"/",lenMinusOne) === lenMinusOne)
760 component = component.substring(0, lenMinusOne);
764 if (component ===
"/")
768 else if (!firstIsSlash)
771 firstIsSlash =
false;
789 return substr(lastIndexOf(
'.') + 1);
800 lastIndex = components.length - 1,
801 lastComponent = components[lastIndex];
803 return lastIndex > 0 && lastComponent ===
"/" ? components[lastIndex - 1] : lastComponent;
815 addComponents = aString && aString !==
"/" ? [aString
pathComponents] : [];
829 if (ext.indexOf(
'/') >= 0 || length === 0 ||
self ===
"/")
833 last = components.length - 1;
835 if (last > 0 && components[last] ===
"/")
836 components.splice(last--, 1);
838 components[last] = components[last] +
"." + ext;
853 else if (
self ===
"/")
857 last = components.length - 1;
859 if (components[last] ===
"/")
862 components.splice(last, components.length - last);
877 if (extension ===
"")
879 else if (lastIndexOf(
'.') < 1)
882 return substr(0, [
self length] - (extension.length + 1));
901 return JSON.stringify(anObject);
907 - (JSObject)objectFromJSON
909 return JSON.parse(
self);
926 g += FLOOR(RAND() * 0xF).toString(0xF);
934 var
diacritics = [[192,198],[224,230],[231,231],[232,235],[236,239],[242,246],[249,252]],
937 String.prototype.stripDiacritics =
function()
941 for (var indexSource = 0; indexSource < this.length; indexSource++)
943 var code = this.charCodeAt(indexSource);
949 if (code >= drange[0] && code <= drange[drange.length - 1])
956 output += String.fromCharCode(code);