diff options
author | Jason Wray <jason@mapbox.com> | 2018-01-10 01:01:14 -0500 |
---|---|---|
committer | Jason Wray <jason@mapbox.com> | 2018-01-10 14:25:27 -0500 |
commit | a39021086c777c65136ca01da79650a57dfbd9d2 (patch) | |
tree | 43a9c15e98f17b5aa6ae981de2bcebf2ef70aed0 | |
parent | fe5f5cebf9f3979567b6c42a62ad10a8ee10102c (diff) | |
download | qtlocation-mapboxgl-a39021086c777c65136ca01da79650a57dfbd9d2.tar.gz |
Refactor, add tests, and document
-rw-r--r-- | platform/darwin/src/MGLVectorSource_Private.h | 2 | ||||
-rw-r--r-- | platform/darwin/src/NSString+MGLAdditions.h | 14 | ||||
-rw-r--r-- | platform/darwin/src/NSString+MGLAdditions.m | 19 | ||||
-rw-r--r-- | platform/darwin/test/MGLNSStringAdditionsTests.m | 34 | ||||
-rw-r--r-- | platform/ios/ios.xcodeproj/project.pbxproj | 4 | ||||
-rw-r--r-- | platform/ios/src/MGLMapAccessibilityElement.mm | 17 | ||||
-rw-r--r-- | platform/ios/src/NSOrthography+MGLAdditions.h | 11 | ||||
-rw-r--r-- | platform/ios/src/NSOrthography+MGLAdditions.m | 10 | ||||
-rw-r--r-- | platform/ios/test/MGLMapAccessibilityElementTests.m | 12 | ||||
-rw-r--r-- | platform/ios/test/MGLNSOrthographyAdditionsTests.m | 19 |
10 files changed, 116 insertions, 26 deletions
diff --git a/platform/darwin/src/MGLVectorSource_Private.h b/platform/darwin/src/MGLVectorSource_Private.h index 233809aea2..7d19e03a99 100644 --- a/platform/darwin/src/MGLVectorSource_Private.h +++ b/platform/darwin/src/MGLVectorSource_Private.h @@ -6,6 +6,8 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readonly, getter=isMapboxStreets) BOOL mapboxStreets; ++ (NS_SET_OF(NSString *) *)mapboxStreetsLanguages; + + (NSString *)preferredMapboxStreetsLanguage; - (NS_DICTIONARY_OF(NSString *, NSString *) *)localizedKeysByKeyForPreferredLanguage:(nullable NSString *)preferredLanguage; diff --git a/platform/darwin/src/NSString+MGLAdditions.h b/platform/darwin/src/NSString+MGLAdditions.h index d82ecaa671..66e89fc66d 100644 --- a/platform/darwin/src/NSString+MGLAdditions.h +++ b/platform/darwin/src/NSString+MGLAdditions.h @@ -20,6 +20,20 @@ NS_ASSUME_NONNULL_BEGIN */ - (NSString *)mgl_titleCasedStringWithLocale:(NSLocale *)locale; +/** + Returns a transliterated representation of the receiver using the specified + script. If transliteration fails, the receiver will be returned. + + Only supports scripts for languages used by Mapbox Streets. + + On iOS 8 or older, this will method will always return the untransliterated + receiver. + + @param script The four-letter code representing the name of the script, as + specified by ISO 15924. + */ +- (NSString *)mgl_transliteratedStringWithScript:(NSString *)script; + @end @interface NSAttributedString (MGLAdditions) diff --git a/platform/darwin/src/NSString+MGLAdditions.m b/platform/darwin/src/NSString+MGLAdditions.m index cde4bddcc3..86cb546571 100644 --- a/platform/darwin/src/NSString+MGLAdditions.m +++ b/platform/darwin/src/NSString+MGLAdditions.m @@ -41,6 +41,25 @@ return string; } +- (NSString *)mgl_transliteratedStringWithScript:(NSString *)script { + if (@available(iOS 9.0, *)) { + NSMutableString *string = self.mutableCopy; + NSStringTransform transform; + if ([script isEqualToString:@"Latn"]) { + transform = NSStringTransformToLatin; + } else if ([script isEqualToString:@"Hans"]) { + // No transform available. + } else if ([script isEqualToString:@"Cyrl"]) { + transform = @"Any-Latin; Latin-Cyrillic"; + } else if ([script isEqualToString:@"Arab"]) { + transform = @"Any-Latin; Latin-Arabic"; + } + return transform ? [string stringByApplyingTransform:transform reverse:NO] : string; + } else { + return self; + } +} + @end @implementation NSAttributedString (MGLAdditions) diff --git a/platform/darwin/test/MGLNSStringAdditionsTests.m b/platform/darwin/test/MGLNSStringAdditionsTests.m index 03503b7f8a..ea6eb974cf 100644 --- a/platform/darwin/test/MGLNSStringAdditionsTests.m +++ b/platform/darwin/test/MGLNSStringAdditionsTests.m @@ -39,4 +39,38 @@ XCTAssertEqualObjects([@"Improve This iPhone" mgl_titleCasedStringWithLocale:locale], @"Improve This iPhone"); } +- (void)testTransliteratedString { + if (@available(iOS 9.0, *)) { + XCTAssertEqualObjects([@"Portland" mgl_transliteratedStringWithScript:@"Latn"], @"Portland"); + XCTAssertEqualObjects([@"Portland" mgl_transliteratedStringWithScript:@"Hans"], @"Portland"); + XCTAssertEqualObjects([@"Portland" mgl_transliteratedStringWithScript:@"Cyrl"], @"Портланд"); + XCTAssertEqualObjects([@"Portland" mgl_transliteratedStringWithScript:@"Arab"], @"پُرتلَند"); + XCTAssertEqualObjects([@"Portland" mgl_transliteratedStringWithScript:@"Fake"], @"Portland"); + + XCTAssertEqualObjects([@"北京" mgl_transliteratedStringWithScript:@"Latn"], @"běi jīng"); + XCTAssertEqualObjects([@"北京" mgl_transliteratedStringWithScript:@"Hans"], @"北京"); + XCTAssertEqualObjects([@"北京" mgl_transliteratedStringWithScript:@"Cyrl"], @"бе̌и йӣнг"); + XCTAssertEqualObjects([@"北京" mgl_transliteratedStringWithScript:@"Arab"], @"بِِ̌ جِينگ"); + XCTAssertEqualObjects([@"北京" mgl_transliteratedStringWithScript:@"Fake"], @"北京"); + + XCTAssertEqualObjects([@"Mосква" mgl_transliteratedStringWithScript:@"Latn"], @"Moskva"); + XCTAssertEqualObjects([@"Mосква" mgl_transliteratedStringWithScript:@"Hans"], @"Mосква"); + XCTAssertEqualObjects([@"Mосква" mgl_transliteratedStringWithScript:@"Cyrl"], @"Москва"); + XCTAssertEqualObjects([@"Mосква" mgl_transliteratedStringWithScript:@"Arab"], @"مُسكڤَ"); + XCTAssertEqualObjects([@"Mосква" mgl_transliteratedStringWithScript:@"Fake"], @"Mосква"); + + XCTAssertEqualObjects([@"ロンドン" mgl_transliteratedStringWithScript:@"Latn"], @"rondon"); + XCTAssertEqualObjects([@"ロンドン" mgl_transliteratedStringWithScript:@"Hans"], @"ロンドン"); + XCTAssertEqualObjects([@"ロンドン" mgl_transliteratedStringWithScript:@"Cyrl"], @"рондон"); + XCTAssertEqualObjects([@"ロンドン" mgl_transliteratedStringWithScript:@"Arab"], @"رُندُن"); + XCTAssertEqualObjects([@"ロンドン" mgl_transliteratedStringWithScript:@"Fake"], @"ロンドン"); + } else { + XCTAssertEqualObjects([@"Made-up Place" mgl_transliteratedStringWithScript:@"Latn"], @"Made-up Place"); + XCTAssertEqualObjects([@"Made-up Place" mgl_transliteratedStringWithScript:@"Hans"], @"Made-up Place"); + XCTAssertEqualObjects([@"Made-up Place" mgl_transliteratedStringWithScript:@"Cyrl"], @"Made-up Place"); + XCTAssertEqualObjects([@"Made-up Place" mgl_transliteratedStringWithScript:@"Arab"], @"Made-up Place"); + XCTAssertEqualObjects([@"Made-up Place" mgl_transliteratedStringWithScript:@"Fake"], @"Made-up Place"); + } +} + @end diff --git a/platform/ios/ios.xcodeproj/project.pbxproj b/platform/ios/ios.xcodeproj/project.pbxproj index cd2987aecd..fb268fab1d 100644 --- a/platform/ios/ios.xcodeproj/project.pbxproj +++ b/platform/ios/ios.xcodeproj/project.pbxproj @@ -231,6 +231,7 @@ 96036A02200565C700510F3D /* NSOrthography+MGLAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 960369FF200565C700510F3D /* NSOrthography+MGLAdditions.h */; }; 96036A03200565C700510F3D /* NSOrthography+MGLAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 96036A00200565C700510F3D /* NSOrthography+MGLAdditions.m */; }; 96036A04200565C700510F3D /* NSOrthography+MGLAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 96036A00200565C700510F3D /* NSOrthography+MGLAdditions.m */; }; + 96036A0620059BBA00510F3D /* MGLNSOrthographyAdditionsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 96036A0520059BBA00510F3D /* MGLNSOrthographyAdditionsTests.m */; }; 960D0C361ECF5AAF008E151F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 960D0C351ECF5AAF008E151F /* Images.xcassets */; }; 960D0C371ECF5AAF008E151F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 960D0C351ECF5AAF008E151F /* Images.xcassets */; }; 9620BB381E69FE1700705A1D /* MGLSDKUpdateChecker.h in Headers */ = {isa = PBXBuildFile; fileRef = 9620BB361E69FE1700705A1D /* MGLSDKUpdateChecker.h */; }; @@ -770,6 +771,7 @@ 92F2C3EC1F0E3C3A00268EC0 /* MGLRendererFrontend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLRendererFrontend.h; sourceTree = "<group>"; }; 960369FF200565C700510F3D /* NSOrthography+MGLAdditions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSOrthography+MGLAdditions.h"; sourceTree = "<group>"; }; 96036A00200565C700510F3D /* NSOrthography+MGLAdditions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSOrthography+MGLAdditions.m"; sourceTree = "<group>"; }; + 96036A0520059BBA00510F3D /* MGLNSOrthographyAdditionsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MGLNSOrthographyAdditionsTests.m; sourceTree = "<group>"; }; 960D0C351ECF5AAF008E151F /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; }; 9620BB361E69FE1700705A1D /* MGLSDKUpdateChecker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLSDKUpdateChecker.h; sourceTree = "<group>"; }; 9620BB371E69FE1700705A1D /* MGLSDKUpdateChecker.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = MGLSDKUpdateChecker.mm; sourceTree = "<group>"; }; @@ -1421,6 +1423,7 @@ 35E208A61D24210F00EC9A46 /* MGLNSDataAdditionsTests.m */, 1F95931C1E6DE2E900D5B294 /* MGLNSDateAdditionsTests.mm */, DAE7DEC11E245455007505A6 /* MGLNSStringAdditionsTests.m */, + 96036A0520059BBA00510F3D /* MGLNSOrthographyAdditionsTests.m */, DA2E885D1CC0382C00F24E7B /* MGLOfflinePackTests.m */, DA2E885E1CC0382C00F24E7B /* MGLOfflineRegionTests.m */, 55E2AD121E5B125400E8C587 /* MGLOfflineStorageTests.mm */, @@ -2388,6 +2391,7 @@ 40CFA6511D7875BB008103BD /* MGLShapeSourceTests.mm in Sources */, DA35A2C51CCA9F8300E826B2 /* MGLClockDirectionFormatterTests.m in Sources */, 35B8E08C1D6C8B5100E768D2 /* MGLPredicateTests.mm in Sources */, + 96036A0620059BBA00510F3D /* MGLNSOrthographyAdditionsTests.m in Sources */, 1F95931D1E6DE2E900D5B294 /* MGLNSDateAdditionsTests.mm in Sources */, DD58A4C61D822BD000E1F038 /* MGLExpressionTests.mm in Sources */, 3575798B1D502B0C000B822E /* MGLBackgroundStyleLayerTests.mm in Sources */, diff --git a/platform/ios/src/MGLMapAccessibilityElement.mm b/platform/ios/src/MGLMapAccessibilityElement.mm index e9bec1fa12..26de4f67e7 100644 --- a/platform/ios/src/MGLMapAccessibilityElement.mm +++ b/platform/ios/src/MGLMapAccessibilityElement.mm @@ -8,6 +8,7 @@ #import "NSBundle+MGLAdditions.h" #import "NSOrthography+MGLAdditions.h" +#import "NSString+MGLAdditions.h" @implementation MGLMapAccessibilityElement @@ -56,22 +57,8 @@ // Attempt to transform to the script of the preferred language, keeping // the original string if no transform exists or if transformation fails. if (@available(iOS 9.0, *)) { - NSStringTransform transform; NSString *dominantScript = [NSOrthography mgl_dominantScriptForMapboxStreetsLanguage:languageCode]; - - if ([dominantScript isEqualToString:@"Latn"]) { - transform = NSStringTransformToLatin; - } else if ([dominantScript isEqualToString:@"Hans"]) { - // Transform not available. - } else if ([dominantScript isEqualToString:@"Cyrl"]) { - transform = NSStringTransformLatinToCyrillic; - } else if ([dominantScript isEqualToString:@"Arab"]) { - transform = NSStringTransformLatinToArabic; - } - - if (transform) { - name = [name stringByApplyingTransform:transform reverse:NO]; - } + name = [name mgl_transliteratedStringWithScript:dominantScript]; } self.accessibilityLabel = name; diff --git a/platform/ios/src/NSOrthography+MGLAdditions.h b/platform/ios/src/NSOrthography+MGLAdditions.h index 0fad954c8a..a552fc7774 100644 --- a/platform/ios/src/NSOrthography+MGLAdditions.h +++ b/platform/ios/src/NSOrthography+MGLAdditions.h @@ -2,6 +2,17 @@ @interface NSOrthography (NSOrthography_MGLAdditions) +/** + Returns a four-letter ISO 15924 code representing the name of the dominant + script for a given language. + + On iOS 11 or newer, this method wraps + `+[NSOrthography defaultOrthographyForLanguage:]` and supports any language. + On iOS 10 and older, this method only returns values for Mapbox + Streets-supported languages. + + @param language The ISO-639 code representing a language. + */ + (NSString *)mgl_dominantScriptForMapboxStreetsLanguage:(NSString *)language; @end diff --git a/platform/ios/src/NSOrthography+MGLAdditions.m b/platform/ios/src/NSOrthography+MGLAdditions.m index f8b4f649b5..99258862cc 100644 --- a/platform/ios/src/NSOrthography+MGLAdditions.m +++ b/platform/ios/src/NSOrthography+MGLAdditions.m @@ -12,17 +12,15 @@ // Manually map Mapbox Streets languages to ISO 15924 script codes. NSSet *latinLanguages = [NSSet setWithObjects:@"de", @"en", @"es", @"fr", @"pt", nil]; - NSSet *hansLanaguages = [NSSet setWithObjects:@"zh", @"zh-Hans", nil]; - NSSet *cyrillicLanguages = [NSSet setWithObjects:@"ru", nil]; - NSSet *arabicLanguages = [NSSet setWithObjects:@"ar", nil]; + NSSet *hansLanguages = [NSSet setWithObjects:@"zh", @"zh-Hans", nil]; if ([latinLanguages containsObject:language]) { return @"Latn"; - } else if ([hansLanaguages containsObject:language]) { + } else if ([hansLanguages containsObject:language]) { return @"Hans"; - } else if ([cyrillicLanguages containsObject:language]) { + } else if ([language isEqualToString:@"ru"]) { return @"Cyrl"; - } else if ([arabicLanguages containsObject:language]) { + } else if ([language isEqualToString:@"ar"]) { return @"Arab"; } else { // Code for undetermined script diff --git a/platform/ios/test/MGLMapAccessibilityElementTests.m b/platform/ios/test/MGLMapAccessibilityElementTests.m index a04b80887c..89a595421e 100644 --- a/platform/ios/test/MGLMapAccessibilityElementTests.m +++ b/platform/ios/test/MGLMapAccessibilityElementTests.m @@ -20,13 +20,15 @@ MGLFeatureAccessibilityElement *element = [[MGLFeatureAccessibilityElement alloc] initWithAccessibilityContainer:self feature:feature]; XCTAssertEqualObjects(element.accessibilityLabel, @"English", @"Accessibility label should be localized."); + feature.attributes = @{ + @"name": @"Цинциннати", + @"name_en": @"Цинциннати", + }; + element = [[MGLFeatureAccessibilityElement alloc] initWithAccessibilityContainer:self feature:feature]; if (@available(iOS 9.0, *)) { - feature.attributes = @{ - @"name": @"Цинциннати", - @"name_en": @"Цинциннати", - }; - element = [[MGLFeatureAccessibilityElement alloc] initWithAccessibilityContainer:self feature:feature]; XCTAssertEqualObjects(element.accessibilityLabel, @"Cincinnati", @"Accessibility label should be romanized."); + } else { + XCTAssertEqualObjects(element.accessibilityLabel, @"Цинциннати", @"Accessibility label should not be romanized."); } } diff --git a/platform/ios/test/MGLNSOrthographyAdditionsTests.m b/platform/ios/test/MGLNSOrthographyAdditionsTests.m new file mode 100644 index 0000000000..351fe4227e --- /dev/null +++ b/platform/ios/test/MGLNSOrthographyAdditionsTests.m @@ -0,0 +1,19 @@ +#import <XCTest/XCTest.h> + +#import "NSOrthography+MGLAdditions.h" +#import "MGLVectorSource_Private.h" + +@interface MGLNSOrthographyAdditionsTests : XCTestCase + +@end + +@implementation MGLNSOrthographyAdditionsTests + +- (void)testStreetsLanguages { + for (NSString *language in [MGLVectorSource mapboxStreetsLanguages]) { + NSString *dominantScript = [NSOrthography mgl_dominantScriptForMapboxStreetsLanguage:language]; + XCTAssertNotEqualObjects(dominantScript, @"Zyyy", @"Mapbox Streets languages should have dominant script"); + } +} + +@end |