summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Wray <jason@mapbox.com>2018-01-10 01:01:14 -0500
committerJason Wray <jason@mapbox.com>2018-01-10 14:25:27 -0500
commita39021086c777c65136ca01da79650a57dfbd9d2 (patch)
tree43a9c15e98f17b5aa6ae981de2bcebf2ef70aed0
parentfe5f5cebf9f3979567b6c42a62ad10a8ee10102c (diff)
downloadqtlocation-mapboxgl-a39021086c777c65136ca01da79650a57dfbd9d2.tar.gz
Refactor, add tests, and document
-rw-r--r--platform/darwin/src/MGLVectorSource_Private.h2
-rw-r--r--platform/darwin/src/NSString+MGLAdditions.h14
-rw-r--r--platform/darwin/src/NSString+MGLAdditions.m19
-rw-r--r--platform/darwin/test/MGLNSStringAdditionsTests.m34
-rw-r--r--platform/ios/ios.xcodeproj/project.pbxproj4
-rw-r--r--platform/ios/src/MGLMapAccessibilityElement.mm17
-rw-r--r--platform/ios/src/NSOrthography+MGLAdditions.h11
-rw-r--r--platform/ios/src/NSOrthography+MGLAdditions.m10
-rw-r--r--platform/ios/test/MGLMapAccessibilityElementTests.m12
-rw-r--r--platform/ios/test/MGLNSOrthographyAdditionsTests.m19
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