26 var _builtInCharacterSets = {};
58 _inverted = !_inverted;
66 - (BOOL)hasMemberInPlane:(
int)aPlane
71 + (id)characterSetWithCharactersInString:(
CPString)aString
73 return [[_CPStringContentCharacterSet alloc] initWithString:aString];
76 + (id)characterSetWithRange:(CPRange)aRange
78 return [[_CPRangeCharacterSet alloc] initWithRange:aRange];
142 + (id)_sharedCharacterSetWithName:(
id)csname
144 var cs = _builtInCharacterSets[csname];
149 ranges = [CPArray array],
150 rangeArray = eval(csname);
152 for (; i < rangeArray.length; i+= 2)
154 var loc = rangeArray[i],
155 length = rangeArray[i + 1],
157 [ranges addObject:range];
160 cs = [[_CPRangeCharacterSet alloc] initWithRanges:ranges];
161 _builtInCharacterSets[csname] = cs;
167 - (void)_setInverted:flag
180 if (
self = [super
init])
182 _inverted = [aCoder decodeBoolForKey:CPCharacterSetInvertedKey];
190 [aCoder encodeBool:_inverted forKey:CPCharacterSetInvertedKey];
203 - (id)initWithRange:(CPRange)r
205 return [
self initWithRanges:[CPArray arrayWithObject:r]];
209 - (id)initWithRanges:(CPArray)ranges
223 var
set = [[_CPRangeCharacterSet alloc] initWithRanges:_ranges];
224 [set _setInverted:_inverted];
230 var
set = [[_CPRangeCharacterSet alloc] initWithRanges:_ranges];
235 - (BOOL)characterIsMember:(
CPString)aCharacter
237 var c = aCharacter.charCodeAt(0),
238 enu = [_ranges objectEnumerator],
241 while ((range = [enu nextObject]) !== nil)
250 - (BOOL)hasMemberInPlane:(
int)plane
260 var enu = [_ranges objectEnumerator],
263 while ((range = [enu nextObject]) !== nil)
272 - (void)addCharactersInRange:(CPRange)aRange
274 [_ranges addObject:aRange];
277 - (void)addCharactersInString:(
CPString)aString
281 for (; i < aString.
length; i++)
283 var code = aString.charCodeAt(i),
286 [_ranges addObject:range];
313 var
set = [[_CPStringContentCharacterSet alloc] initWithString:_string];
314 [set _setInverted:_inverted];
321 var
set = [[_CPStringContentCharacterSet alloc] initWithString:_string];
327 - (BOOL)characterIsMember:(
CPString)c
329 return (_string.indexOf(c.charAt(0)) !== -1) === !_inverted;
334 return [
super description] + " {
string =
'" + _string + "'}
"; 337 - (BOOL)hasMemberInPlane:(int)plane 339 // JavaScript strings can only return char codes 340 // up to 0xFFFF (per the ECMA standard), so 341 // they all live in the Basic Multilingual Plane 344 return _string.length && plane === 0; 347 - (void)addCharactersInRange:(CPRange)aRange // Needs _inverted support 349 var i = aRange.location, 350 count = aRange.location + aRange.length; 352 for (; i < count; i++) 354 var s = String.fromCharCode(i); 356 if (![self characterIsMember:s]) 357 _string = [_string stringByAppendingString:s]; 361 - (void)addCharactersInString:(CPString)aString // Needs _inverted support 365 for (; i < aString.length; i++) 367 var s = aString.charAt(i); 369 if (![self characterIsMember:s]) 370 _string = [_string stringByAppendingString:s]; 374 - (BOOL)isEqual:(CPCharacterSet)aCharacterSet 376 if (self === aCharacterSet) 379 if (!aCharacterSet || ![aCharacterSet isKindOfClass:[self class]]) 382 return [self _isEqualToStringContentCharacterSet:aCharacterSet]; 385 - (BOOL)_isEqualToStringContentCharacterSet:(_CPStringContentCharacterSet)aCharacterSet 390 return _string === aCharacterSet._string && _inverted === aCharacterSet._inverted; 395 var _CPStringContentCharacterSetStringKey = @"_CPStringContentCharacterSetStringKey
"; 397 @implementation _CPStringContentCharacterSet (CPCoding) 399 - (id)initWithCoder:(CPCoder)aCoder 401 if (self = [super initWithCoder:aCoder]) 403 _string = [aCoder decodeObjectForKey:_CPStringContentCharacterSetStringKey] 409 - (void)encodeWithCoder:(CPCoder)aCoder 411 [super encodeWithCoder:aCoder]; 413 [aCoder encodeObject:_string forKey:_CPStringContentCharacterSetStringKey]; 418 _CPCharacterSetTrimAtBeginning = 1 << 1; 419 _CPCharacterSetTrimAtEnd = 1 << 2; 421 @implementation CPString (CPCharacterSetAdditions) 435 - (CPArray)componentsSeparatedByCharactersInSet:(CPCharacterSet)separator 438 [CPException raise:CPInvalidArgumentException 439 reason:"componentsSeparatedByCharactersInSet: the separator can
't be 'nil
'"]; 441 var components = [CPMutableArray array], 442 componentRange = CPMakeRange(0, 0), 445 for (; i < self.length; i++) 447 if ([separator characterIsMember:self.charAt(i)]) 449 componentRange.length = i - componentRange.location; 450 [components addObject:[self substringWithRange:componentRange]]; 451 componentRange.location += componentRange.length + 1; 455 componentRange.length = self.length - componentRange.location; 456 [components addObject:[self substringWithRange:componentRange]]; 461 // As per the Cocoa method. 462 - (id)stringByTrimmingCharactersInSet:(CPCharacterSet)set 464 return [self _stringByTrimmingCharactersInSet:set options:_CPCharacterSetTrimAtBeginning | _CPCharacterSetTrimAtEnd]; 467 // private method evilness! 468 // CPScanner's scanUpToString:... methods rely on
this 470 - (id)_stringByTrimmingCharactersInSet:(
CPCharacterSet)set options:(
int)options
474 if (options & _CPCharacterSetTrimAtBeginning)
476 var cutEdgeBeginning = 0;
478 while (cutEdgeBeginning <
self.length && [
set characterIsMember:
self.charAt(cutEdgeBeginning)])
481 str = str.substr(cutEdgeBeginning);
484 if (options & _CPCharacterSetTrimAtEnd)
486 var cutEdgeEnd = str.length;
488 while (cutEdgeEnd > 0 && [
set characterIsMember:str.charAt(cutEdgeEnd - 1)])
491 str = str.substr(0, cutEdgeEnd);
uppercaseLetterCharacterSet
whitespaceAndNewlineCharacterSet
var CPCharacterSetInvertedKey
function CPEmptyRange(aRange)
An immutable string (collection of characters).
Defines methods for use when archiving & restoring (enc/decoding).
function CPLocationInRange(aLocation, aRange)
CPRange function CPMakeRange(location, length)
lowercaseLetterCharacterSet
FrameUpdater prototype description