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
344 return _string.
length && plane === 0;
347 - (void)addCharactersInRange:(CPRange)aRange
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
365 for (; i < aString.
length; i++)
367 var s = aString.charAt(i);
369 if (![
self characterIsMember:s])
370 _string = [_string stringByAppendingString:s];
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;
439 reason:"componentsSeparatedByCharactersInSet: the separator can't be 'nil'"];
445 for (; i <
self.length; i++)
447 if ([separator characterIsMember:
self.charAt(i)])
449 componentRange.length = i - componentRange.location;
451 componentRange.location += componentRange.length + 1;
455 componentRange.length =
self.length - componentRange.location;
464 return [
self _stringByTrimmingCharactersInSet:set options:_CPCharacterSetTrimAtBeginning | _CPCharacterSetTrimAtEnd];
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);
Used to implement exception handling (creating & raising).
id lowercaseLetterCharacterSet()
id punctuationCharacterSet()
id uppercaseLetterCharacterSet()
CPString substringWithRange:(CPRange aRange)
id alphanumericCharacterSet()
void raise:reason:(CPString aName, [reason] CPString aReason)
id whitespaceCharacterSet()
id decimalDigitCharacterSet()
var CPCharacterSetInvertedKey
function CPEmptyRange(aRange)
An immutable string (collection of characters).
id decomposableCharacterSet()
id whitespaceAndNewlineCharacterSet()
Defines methods for use when archiving & restoring (enc/decoding).
function CPLocationInRange(aLocation, aRange)
CPRange function CPMakeRange(location, length)