1
1
#import " MGLTileSource_Private.h"
2
2
3
- #import " MGLAttributionInfo.h"
3
+ #import " MGLAttributionInfo_Private.h"
4
+ #import " NSString+MGLAdditions.h"
5
+
6
+ #if TARGET_OS_IPHONE
7
+ #import < UIKit/UIKit.h>
8
+ #else
9
+ #import < Cocoa/Cocoa.h>
10
+ #endif
4
11
5
12
#include < mbgl/util/tileset.hpp>
6
13
7
14
const MGLTileSourceOption MGLTileSourceOptionMinimumZoomLevel = @" MGLTileSourceOptionMinimumZoomLevel" ;
8
15
const MGLTileSourceOption MGLTileSourceOptionMaximumZoomLevel = @" MGLTileSourceOptionMaximumZoomLevel" ;
9
- const MGLTileSourceOption MGLTileSourceOptionAttribution = @" MGLTileSourceOptionAttribution" ;
16
+ const MGLTileSourceOption MGLTileSourceOptionAttributionHTMLString = @" MGLTileSourceOptionAttributionHTMLString" ;
17
+ const MGLTileSourceOption MGLTileSourceOptionAttributionInfos = @" MGLTileSourceOptionAttributionInfos" ;
10
18
const MGLTileSourceOption MGLTileSourceOptionTileCoordinateSystem = @" MGLTileSourceOptionTileCoordinateSystem" ;
11
19
12
20
@implementation MGLTileSource
@@ -19,13 +27,17 @@ - (instancetype)initWithIdentifier:(NSString *)identifier tileURLTemplates:(NS_A
19
27
return [super initWithIdentifier: identifier];
20
28
}
21
29
22
- - (nullable NS_ARRAY_OF (MGLAttributionInfo *) *)attributionInfosWithFontSize:(CGFloat )fontSize linkColor:(nullable MGLColor *)linkColor {
23
- return [MGLAttributionInfo attributionInfosFromHTMLString: self .attribution
30
+ - (NS_ARRAY_OF(MGLAttributionInfo *) *)attributionInfos {
31
+ return [self attributionInfosWithFontSize: 0 linkColor: nil ];
32
+ }
33
+
34
+ - (NS_ARRAY_OF(MGLAttributionInfo *) *)attributionInfosWithFontSize : (CGFloat )fontSize linkColor : (nullable MGLColor *)linkColor {
35
+ return [MGLAttributionInfo attributionInfosFromHTMLString: self .attributionHTMLString
24
36
fontSize: fontSize
25
37
linkColor: linkColor];
26
38
}
27
39
28
- - (NSString *)attribution {
40
+ - (NSString *)attributionHTMLString {
29
41
[NSException raise :@" MGLAbstractClassException"
30
42
format: @" MGLTileSource is an abstract class" ];
31
43
return nil ;
@@ -61,14 +73,35 @@ - (NSString *)attribution {
61
73
format: @" MGLTileSourceOptionMinimumZoomLevel must be less than MGLTileSourceOptionMaximumZoomLevel." ];
62
74
}
63
75
64
- if (NSString *attribution = options[MGLTileSourceOptionAttribution ]) {
76
+ if (NSString *attribution = options[MGLTileSourceOptionAttributionHTMLString ]) {
65
77
if (![attribution isKindOfClass: [NSString class ]]) {
66
78
[NSException raise :NSInvalidArgumentException
67
- format: @" MGLTileSourceOptionAttribution must be set to a string." ];
79
+ format: @" MGLTileSourceOptionAttributionHTMLString must be set to a string." ];
68
80
}
69
81
tileSet.attribution = attribution.UTF8String ;
70
82
}
71
83
84
+ if (NSArray *attributionInfos = options[MGLTileSourceOptionAttributionInfos]) {
85
+ if (![attributionInfos isKindOfClass: [NSArray class ]]) {
86
+ [NSException raise :NSInvalidArgumentException
87
+ format: @" MGLTileSourceOptionAttributionInfos must be set to a string." ];
88
+ }
89
+
90
+ NSAttributedString *attributedString = [MGLAttributionInfo attributedStringForAttributionInfos: attributionInfos];
91
+ #if TARGET_OS_IPHONE
92
+ static NSString * const NSExcludedElementsDocumentAttribute = @" ExcludedElements" ;
93
+ #endif
94
+ NSDictionary *documentAttributes = @{
95
+ NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType ,
96
+ NSCharacterEncodingDocumentAttribute : @(NSUTF8StringEncoding),
97
+ // The attribution string is meant to be a simple, inline fragment, not a full-fledged, validating document.
98
+ NSExcludedElementsDocumentAttribute : @[@" XML" , @" DOCTYPE" , @" html" , @" head" , @" meta" , @" title" , @" style" , @" body" , @" p" ],
99
+ };
100
+ NSData *data = [attributedString dataFromRange: attributedString.mgl_wholeRange documentAttributes: documentAttributes error: NULL ];
101
+ NSString *html = [[NSString alloc ] initWithData: data encoding: NSUTF8StringEncoding];
102
+ tileSet.attribution = html.UTF8String ;
103
+ }
104
+
72
105
if (NSNumber *tileCoordinateSystemNumber = options[MGLTileSourceOptionTileCoordinateSystem]) {
73
106
if (![tileCoordinateSystemNumber isKindOfClass: [NSValue class ]]) {
74
107
[NSException raise :NSInvalidArgumentException
0 commit comments