1212
1313@interface DTLocalizableStringScanner ()
1414
15- - (BOOL )_scanMacro ;
15+ - (BOOL )_processMacroAtRange : ( NSRange ) range ;
1616
1717@end
1818
1919@implementation DTLocalizableStringScanner
2020{
2121 NSURL *_url;
2222 NSDictionary *_validMacros;
23- NSCharacterSet *_validMacroCharacters;
24-
25- NSUInteger _minMacroNameLength;
26- NSUInteger _maxMacroNameLength;
23+ NSRegularExpression *_validMacroRegex;
2724
2825 unichar *_characters;
26+ NSString *_charactersAsString;
2927 NSUInteger _stringLength;
3028 NSUInteger _currentIndex;
3129}
3230
3331@synthesize entryFoundCallback=_entryFoundCallback;
3432
35- - (id )initWithContentsOfURL : (NSURL *)url encoding : (NSStringEncoding )encoding validMacros : (NSDictionary *)validMacros
33+ - (id )initWithContentsOfURL : (NSURL *)url encoding : (NSStringEncoding )encoding validMacros : (NSDictionary *)validMacros validMacroRegex : (NSRegularExpression *)validMacroRegex
34+
3635{
3736 self = [super init ];
3837
3938 if (self)
4039 {
41- NSString *string = [[NSString alloc ] initWithContentsOfURL: url encoding: encoding error: NULL ];
40+ _charactersAsString = [[NSString alloc ] initWithContentsOfURL: url encoding: encoding error: NULL ];
4241
43- if (!string )
42+ if (!_charactersAsString )
4443 {
4544 return nil ;
4645 }
4746
48- _stringLength = [string length ];
47+ _stringLength = [_charactersAsString length ];
4948 _characters = calloc (_stringLength, sizeof (unichar ));
50- [string getCharacters: _characters range: NSMakeRange (0 , _stringLength)];
49+ [_charactersAsString getCharacters: _characters range: NSMakeRange (0 , _stringLength)];
5150 _currentIndex = 0 ;
5251
5352 _url = [url copy ]; // to have a reference later
5453 _validMacros = validMacros;
55-
56- // prebuild the valid characters
57- NSString *allChars = [[_validMacros allKeys ] componentsJoinedByString: @" " ];
58- _validMacroCharacters = [NSCharacterSet characterSetWithCharactersInString: allChars];
59-
60- // get longest and shortest macro name
61- _minMacroNameLength = NSIntegerMax;
62- _maxMacroNameLength = 0 ;
63-
64- for (NSString *oneMacro in [_validMacros allKeys ])
65- {
66- NSUInteger l = [oneMacro length ];
67-
68- if (l<_minMacroNameLength)
69- {
70- _minMacroNameLength = l;
71- }
72- else if (l>_maxMacroNameLength)
73- {
74- _maxMacroNameLength = l;
75- }
76- }
54+ _validMacroRegex = validMacroRegex;
55+
7756 }
7857
7958 return self;
@@ -91,24 +70,10 @@ - (void)main
9170{
9271 @autoreleasepool
9372 {
94- while (_currentIndex < _stringLength)
95- {
96- unichar character = _characters[_currentIndex];
97- if ([_validMacroCharacters characterIsMember: character])
98- {
99-
100- NSUInteger macroStartIndex = _currentIndex;
101- if (![self _scanMacro ])
102- {
103- _currentIndex = macroStartIndex + 1 ;
104- }
105- }
106- else
107- {
108- // not a character that can be part of a macro name; keep going
109- _currentIndex++;
110- }
111- }
73+ [_validMacroRegex enumerateMatchesInString: _charactersAsString options: 0 range: NSMakeRange (0 , [_charactersAsString length ]) usingBlock: ^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){
74+ NSRange matchRange = [match range ];
75+ [self _processMacroAtRange: matchRange];
76+ }];
11277 }
11378}
11479
@@ -224,33 +189,15 @@ - (NSString *)_scanParameter
224189 return [[NSString alloc ] initWithCharacters: (_characters+parameterStartIndex) length: length];
225190}
226191
227- - (BOOL )_scanMacro
192+ - (BOOL )_processMacroAtRange : ( NSRange ) range
228193{
229- NSUInteger macroStartIndex = _currentIndex;
230-
231- // read as much of the macroName as possible
232- while ([_validMacroCharacters characterIsMember: _characters[_currentIndex]])
233- {
234- _currentIndex++;
235- }
236-
237- NSUInteger macroNameLength = _currentIndex - macroStartIndex;
238-
239- if (macroNameLength < _minMacroNameLength || macroNameLength > _maxMacroNameLength)
240- {
241- // too short or too long to be one of our macros
242- return NO ;
243- }
244-
245- // pull out the macroName:
246- NSString *macroName = [[NSString alloc ] initWithCharactersNoCopy: (_characters+macroStartIndex) length: macroNameLength freeWhenDone: NO ];
247-
248- if ([_validMacros objectForKey: macroName])
249- {
250- // we found a macro name!
251-
194+ NSString *macroName = [_charactersAsString substringWithRange: range];
195+
196+ _currentIndex = range.location + range.length ;
197+
252198 NSMutableArray *parameters = [[NSMutableArray alloc ] initWithCapacity: 10 ];
253199
200+
254201 // skip any whitespace between here and the (
255202 [self _scanWhitespace ];
256203
@@ -321,9 +268,9 @@ - (BOOL)_scanMacro
321268 }
322269
323270 return YES ;
271+ } else {
272+ NSLog (@" mismaatch" );
324273 }
325-
326- }
327274
328275 return NO ;
329276}
0 commit comments